You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2019/10/29 17:18:26 UTC

[camel] 01/01: CAMEL-14110: Nitrite component initial commit

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

janbednar pushed a commit to branch CAMEL-14110
in repository https://gitbox.apache.org/repos/asf/camel.git

commit eb9621750f847223c033f6f3a27de3d678094387
Author: Jan Bednář <ma...@janbednar.eu>
AuthorDate: Tue Oct 29 13:21:50 2019 +0100

    CAMEL-14110: Nitrite component initial commit
---
 apache-camel/pom.xml                               |  10 +
 apache-camel/src/main/descriptors/common-bin.xml   |   2 +
 bom/camel-bom/pom.xml                              |  10 +
 components/camel-nitrite/pom.xml                   |  52 ++
 .../src/main/docs/nitrite-component.adoc           |  86 +++
 .../nitrite/AbstractNitriteOperation.java          |  23 +
 .../camel/component/nitrite/NitriteComponent.java  | 141 +++++
 .../camel/component/nitrite/NitriteConstants.java  |  27 +
 .../camel/component/nitrite/NitriteConsumer.java   |  76 +++
 .../camel/component/nitrite/NitriteEndpoint.java   | 143 +++++
 .../camel/component/nitrite/NitriteProducer.java   |  84 +++
 .../component/nitrite/NitriteTypeConverters.java   |  43 ++
 .../operation/AbstractPayloadAwareOperation.java   |  47 ++
 .../nitrite/operation/CollectionOperation.java     |  20 +
 .../nitrite/operation/CommonOperation.java         |  20 +
 .../nitrite/operation/RepositoryOperation.java     |  20 +
 .../collection/FindCollectionOperation.java        |  56 ++
 .../collection/RemoveCollectionOperation.java      |  51 ++
 .../collection/UpdateCollectionOperation.java      |  79 +++
 .../operation/common/CreateIndexOperation.java     |  38 ++
 .../operation/common/DropIndexOperation.java       |  35 ++
 .../operation/common/ExportDatabaseOperation.java  |  48 ++
 .../operation/common/GetAttributesOperation.java   |  29 +
 .../nitrite/operation/common/GetByIdOperation.java |  35 ++
 .../operation/common/ImportDatabaseOperation.java  |  38 ++
 .../nitrite/operation/common/InsertOperation.java  |  45 ++
 .../operation/common/ListIndicesOperation.java     |  32 ++
 .../operation/common/RebuildIndexOperation.java    |  41 ++
 .../nitrite/operation/common/UpdateOperation.java  |  40 ++
 .../nitrite/operation/common/UpsertOperation.java  |  40 ++
 .../repository/FindRepositoryOperation.java        |  55 ++
 .../repository/RemoveRepositoryOperation.java      |  51 ++
 .../repository/UpdateRepositoryOperation.java      |  58 ++
 .../services/org/apache/camel/component/nitrite    |   1 +
 .../component/nitrite/AbstractNitriteTest.java     |  51 ++
 .../component/nitrite/MyPersistentObject.java      |  76 +++
 .../component/nitrite/NitriteComponentTest.java    |  74 +++
 .../nitrite/NitriteConsumerCollectionTest.java     | 162 ++++++
 .../nitrite/NitriteConsumerRepositoryTest.java     | 145 +++++
 .../nitrite/NitriteProducerCollectionTest.java     | 244 ++++++++
 .../nitrite/NitriteProducerRepositoryTest.java     | 199 +++++++
 .../src/test/resources/log4j2.properties           |  23 +
 components/pom.xml                                 |   1 +
 .../dsl/NitriteEndpointBuilderFactory.java         | 637 +++++++++++++++++++++
 docs/components/modules/ROOT/pages/index.adoc      |   8 +-
 parent/pom.xml                                     |  17 +
 .../karaf/features/src/main/resources/features.xml |   5 +
 .../camel-nitrite-starter/pom.xml                  |  53 ++
 .../NitriteComponentAutoConfiguration.java         | 128 +++++
 .../springboot/NitriteComponentConfiguration.java  |  52 ++
 .../src/main/resources/META-INF/LICENSE.txt        | 203 +++++++
 .../src/main/resources/META-INF/NOTICE.txt         |  11 +
 .../src/main/resources/META-INF/spring.factories   |  19 +
 .../src/main/resources/META-INF/spring.provides    |  17 +
 platforms/spring-boot/components-starter/pom.xml   |   1 +
 .../camel-spring-boot-dependencies/pom.xml         |  10 +
 .../apache/camel/itest/karaf/CamelNitriteTest.java |  33 ++
 .../camel/itest/springboot/CamelNitriteTest.java   |  48 ++
 58 files changed, 3789 insertions(+), 4 deletions(-)

diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml
index 36d78e1..b9c050b 100644
--- a/apache-camel/pom.xml
+++ b/apache-camel/pom.xml
@@ -1083,6 +1083,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-nitrite</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-nsq</artifactId>
       <version>${project.version}</version>
     </dependency>
@@ -2622,6 +2627,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-nitrite-starter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-nsq-starter</artifactId>
       <version>${project.version}</version>
     </dependency>
diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml
index d9df21d..3403f9e 100644
--- a/apache-camel/src/main/descriptors/common-bin.xml
+++ b/apache-camel/src/main/descriptors/common-bin.xml
@@ -237,6 +237,7 @@
         <include>org.apache.camel:camel-nats</include>
         <include>org.apache.camel:camel-netty</include>
         <include>org.apache.camel:camel-netty-http</include>
+        <include>org.apache.camel:camel-nitrite</include>
         <include>org.apache.camel:camel-nsq</include>
         <include>org.apache.camel:camel-ognl</include>
         <include>org.apache.camel:camel-olingo2</include>
@@ -584,6 +585,7 @@
         <include>org.apache.camel:camel-nats-starter</include>
         <include>org.apache.camel:camel-netty-http-starter</include>
         <include>org.apache.camel:camel-netty-starter</include>
+        <include>org.apache.camel:camel-nitrite-starter</include>
         <include>org.apache.camel:camel-nsq-starter</include>
         <include>org.apache.camel:camel-ognl-starter</include>
         <include>org.apache.camel:camel-olingo2-starter</include>
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 992a9e3..7e74d9b 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -2080,6 +2080,16 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-nitrite</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-nitrite-starter</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-nsq</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/components/camel-nitrite/pom.xml b/components/camel-nitrite/pom.xml
new file mode 100644
index 0000000..43f7b2e
--- /dev/null
+++ b/components/camel-nitrite/pom.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>components</artifactId>
+    <version>3.0.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>camel-nitrite</artifactId>
+  <packaging>jar</packaging>
+  <name>Camel :: Nitrite</name>
+  <description>Camel Nitrite component</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core-engine</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.dizitart</groupId>
+      <artifactId>nitrite</artifactId>
+    </dependency>
+
+    <!-- logging -->
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <!-- testing -->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/components/camel-nitrite/src/main/docs/nitrite-component.adoc b/components/camel-nitrite/src/main/docs/nitrite-component.adoc
new file mode 100644
index 0000000..a1dba99
--- /dev/null
+++ b/components/camel-nitrite/src/main/docs/nitrite-component.adoc
@@ -0,0 +1,86 @@
+[[nitrite-component]]
+= Nitrite Component
+[source,xml]
+*Since Camel 3.0*
+
+---------------------------------------------------------------
+*Since Camel 3.0*
+
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-nitrite</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel core version -->
+</dependency>
+---------------------------------------------------------------
+
+== URI format
+
+[source,java]
+---------------------------------
+nitrite://database[?options]
+---------------------------------
+
+== Options
+
+// component options: START
+The Nitrite component supports 1 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *basicPropertyBinding* (advanced) | 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 Nitrite endpoint is configured using URI syntax:
+
+----
+nitrite:database
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *database* | *Required* Path to database file. Will be created if not exists. |  | String
+|===
+
+
+=== Query Parameters (11 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *collection* (common) | Name of Nitrite collection. Cannot be used in combination with repositoryClass option. |  | String
+| *repositoryClass* (common) | Class of Nitrite ObjectRepository. Cannot be used in combination with collection option. |  | Class
+| *repositoryName* (common) | Optional name of ObjectRepository. Can be used in combination with repositoryClass. Otherwise have no effect |  | String
+| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
+| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
+| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
+| *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 [...]
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| *password* (security) | Password for Nitrite database. Required, if option username specified |  | String
+| *username* (security) | Username for Nitrite database. Database is unencrypted if option not specified. |  | String
+|===
+// endpoint options: END
+
+// spring-boot-auto-configure options: START
+// spring-boot-auto-configure options: END
+
+
+== Message Headers
+
+TODO
+
+== Usage
+TODO
\ No newline at end of file
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/AbstractNitriteOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/AbstractNitriteOperation.java
new file mode 100644
index 0000000..dbe7c1c
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/AbstractNitriteOperation.java
@@ -0,0 +1,23 @@
+/*
+ * 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.nitrite;
+
+import org.apache.camel.Exchange;
+
+public abstract class AbstractNitriteOperation {
+    protected abstract void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception;
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteComponent.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteComponent.java
new file mode 100644
index 0000000..06f98b3
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteComponent.java
@@ -0,0 +1,141 @@
+/*
+ * 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.nitrite;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.util.FileUtil;
+import org.dizitart.no2.Nitrite;
+import org.dizitart.no2.NitriteBuilder;
+import org.dizitart.no2.PersistentCollection;
+
+/**
+ * Represents the component that manages {@link NitriteEndpoint}.
+ */
+@Component("nitrite")
+public class NitriteComponent extends DefaultComponent {
+
+    @Metadata(label = "common", description = "Username for Nitrite database. "
+            + "Database is unencrypted if option not specified.")
+    protected String username;
+
+    @Metadata(label = "common", description = "Password for Nitrite database. Required, if option username specified")
+    protected String password;
+
+    private Map<String, Nitrite> databaseCache = new HashMap<>();
+    private Map<CollectionCacheKey, PersistentCollection> collectionCache = new HashMap<>();
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        NitriteEndpoint endpoint = new NitriteEndpoint(uri, this);
+        endpoint.setUsername(username);
+        endpoint.setPassword(password);
+        setProperties(endpoint, parameters);
+        if (endpoint.getCollection() != null && endpoint.getRepositoryClass() != null) {
+            throw new IllegalArgumentException("Options collection and repositoryClass cannot be used together");
+        }
+        if (endpoint.getCollection() == null && endpoint.getRepositoryClass() == null) {
+            throw new IllegalArgumentException("Either collection or repositoryClass option is required");
+        }
+
+        String normalizedPath = FileUtil.compactPath(remaining);
+        endpoint.setDatabase(normalizedPath);
+        Nitrite nitriteDatabase = databaseCache.computeIfAbsent(normalizedPath, path -> {
+            NitriteBuilder builder = Nitrite.builder().compressed().filePath(path);
+            if (endpoint.getUsername() == null && endpoint.getPassword() == null) {
+                return builder.openOrCreate();
+            } else {
+                return builder.openOrCreate(endpoint.getUsername(), endpoint.getPassword());
+            }
+        });
+        endpoint.setNitriteDatabase(nitriteDatabase);
+
+        PersistentCollection nitriteCollection = collectionCache.computeIfAbsent(new CollectionCacheKey(endpoint), key -> {
+            if (key.collection != null) {
+                return nitriteDatabase.getCollection(key.collection);
+            } else {
+                if (key.repositoryName != null) {
+                    return nitriteDatabase.getRepository(key.repositoryName, key.repositoryClass);
+                } else if (key.repositoryClass != null) {
+                    return nitriteDatabase.getRepository(key.repositoryClass);
+                } else {
+                    throw new IllegalArgumentException("Required one of option: collection or repositoryClass");
+                }
+            }
+        });
+        endpoint.setNitriteCollection(nitriteCollection);
+
+        return endpoint;
+    }
+
+    protected void closeDb(String path) {
+        String normalized = FileUtil.compactPath(path);
+        Nitrite db = databaseCache.get(normalized);
+        if (db != null && !db.isClosed()) {
+            db.close();
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+        for (String path: databaseCache.keySet()) {
+            closeDb(path);
+        }
+        databaseCache.clear();
+        collectionCache.clear();
+    }
+
+    private static class CollectionCacheKey {
+        Nitrite database;
+        String collection;
+        String repositoryName;
+        Class<?> repositoryClass;
+
+        CollectionCacheKey(NitriteEndpoint endpoint) {
+            database = endpoint.getNitriteDatabase();
+            collection = endpoint.getCollection();
+            repositoryName = endpoint.getRepositoryName();
+            repositoryClass = endpoint.getRepositoryClass();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            CollectionCacheKey that = (CollectionCacheKey) o;
+            return database.equals(that.database)
+                    && Objects.equals(collection, that.collection)
+                    && Objects.equals(repositoryName, that.repositoryName)
+                    && Objects.equals(repositoryClass, that.repositoryClass);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(database, collection, repositoryName, repositoryClass);
+        }
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteConstants.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteConstants.java
new file mode 100644
index 0000000..a9db3eb
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteConstants.java
@@ -0,0 +1,27 @@
+/*
+ * 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.nitrite;
+
+public final class NitriteConstants {
+    public static final String CHANGE_TIMESTAMP = "CamelNitriteChangeTimestamp";
+    public static final String CHANGE_TYPE = "CamelNitriteChangeType";
+    public static final String OPERATION = "CamelNitriteOperation";
+    public static final String WRITE_RESULT = "CamelNitriteWriteResult";
+
+    private NitriteConstants() {
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteConsumer.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteConsumer.java
new file mode 100644
index 0000000..9a4f6f9
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteConsumer.java
@@ -0,0 +1,76 @@
+/*
+ * 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.nitrite;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.support.DefaultConsumer;
+import org.dizitart.no2.event.ChangeInfo;
+import org.dizitart.no2.event.ChangeListener;
+import org.dizitart.no2.event.ChangedItem;
+
+/**
+ * The Nitrite consumer.
+ */
+public class NitriteConsumer extends DefaultConsumer {
+    private final NitriteEndpoint endpoint;
+    private NitriteChangeListener changeListener;
+
+    public NitriteConsumer(NitriteEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected void doInit() throws Exception {
+        changeListener = new NitriteChangeListener();
+        endpoint.getNitriteCollection().register(changeListener);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (changeListener != null) {
+            endpoint.getNitriteCollection().deregister(changeListener);
+        }
+        super.doStop();
+    }
+
+    private class NitriteChangeListener implements ChangeListener {
+
+        @Override
+        public void onChange(ChangeInfo changeInfo) {
+            for (ChangedItem changedItem: changeInfo.getChangedItems()) {
+                Exchange exchange = endpoint.createExchange();
+                Message message = exchange.getMessage();
+                message.setHeader(NitriteConstants.CHANGE_TIMESTAMP, changedItem.getChangeTimestamp());
+                message.setHeader(NitriteConstants.CHANGE_TYPE, changedItem.getChangeType());
+                message.setBody(changedItem.getDocument());
+
+                try {
+                    getProcessor().process(exchange);
+                } catch (Exception e) {
+                    exchange.setException(e);
+                } finally {
+                    if (exchange.getException() != null) {
+                        getExceptionHandler().handleException("Error processing exchange", exchange, exchange.getException());
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteEndpoint.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteEndpoint.java
new file mode 100644
index 0000000..910dbc3
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteEndpoint.java
@@ -0,0 +1,143 @@
+/*
+ * 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.nitrite;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+import org.dizitart.no2.Nitrite;
+import org.dizitart.no2.PersistentCollection;
+
+/**
+ * Represents a Nitrite endpoint.
+ */
+@UriEndpoint(firstVersion = "3.0.0", scheme = "nitrite", title = "Nitrite", syntax = "nitrite:database",
+             label = "database,nosql")
+public class NitriteEndpoint extends DefaultEndpoint {
+    @UriPath(description = "Path to database file. Will be created if not exists.")
+    @Metadata(required = true)
+    private String database;
+    @UriParam(description = "Name of Nitrite collection. Cannot be used in combination with repositoryClass option.")
+    private String collection;
+    @UriParam(description = "Class of Nitrite ObjectRepository. Cannot be used in combination with collection option.")
+    private Class<?> repositoryClass;
+    @UriParam(description = "Optional name of ObjectRepository. Can be used in combination with repositoryClass. "
+            + "Otherwise have no effect")
+    private String repositoryName;
+    @UriParam(label = "security", description = "Username for Nitrite database. "
+            + "Database is unencrypted if option not specified.")
+    private String username;
+    @UriParam(label = "security", description = "Password for Nitrite database. Required, if option username specified")
+    private String password;
+
+    private Nitrite nitriteDatabase;
+    private PersistentCollection nitriteCollection;
+
+    public NitriteEndpoint() {
+    }
+
+    public NitriteEndpoint(String uri, NitriteComponent component) {
+        super(uri, component);
+    }
+
+
+    public void setNitriteCollection(PersistentCollection collection) {
+        this.nitriteCollection = collection;
+    }
+
+    public void setNitriteDatabase(Nitrite nitriteDatabase) {
+        this.nitriteDatabase = nitriteDatabase;
+    }
+
+    public Producer createProducer() throws Exception {
+        return new NitriteProducer(this);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        return new NitriteConsumer(this, processor);
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    @Override
+    public NitriteComponent getComponent() {
+        return (NitriteComponent)super.getComponent();
+    }
+
+    public PersistentCollection getNitriteCollection() {
+        return nitriteCollection;
+    }
+
+    public Nitrite getNitriteDatabase() {
+        return nitriteDatabase;
+    }
+
+    public void setDatabase(String database) {
+        this.database = database;
+    }
+
+    public String getDatabase() {
+        return database;
+    }
+
+    public String getCollection() {
+        return collection;
+    }
+
+    public void setCollection(String collection) {
+        this.collection = collection;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public Class<?> getRepositoryClass() {
+        return repositoryClass;
+    }
+
+    public void setRepositoryClass(Class<?> repositoryClass) {
+        this.repositoryClass = repositoryClass;
+    }
+
+    public String getRepositoryName() {
+        return repositoryName;
+    }
+
+    public void setRepositoryName(String repositoryName) {
+        this.repositoryName = repositoryName;
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteProducer.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteProducer.java
new file mode 100644
index 0000000..812382d
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteProducer.java
@@ -0,0 +1,84 @@
+/*
+ * 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.nitrite;
+
+import java.util.function.Consumer;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.operation.CollectionOperation;
+import org.apache.camel.component.nitrite.operation.RepositoryOperation;
+import org.apache.camel.component.nitrite.operation.common.UpsertOperation;
+import org.apache.camel.support.DefaultProducer;
+import org.dizitart.no2.NitriteCollection;
+import org.dizitart.no2.objects.ObjectRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Nitrite producer.
+ */
+public class NitriteProducer extends DefaultProducer {
+    private static final Logger LOG = LoggerFactory.getLogger(NitriteProducer.class);
+    private NitriteEndpoint endpoint;
+    private Consumer<AbstractNitriteOperation> operationValidator = (noop) -> { };
+
+    public NitriteProducer(NitriteEndpoint endpoint) {
+        super(endpoint);
+        this.endpoint = endpoint;
+
+        if (endpoint.getNitriteCollection() instanceof ObjectRepository) {
+            operationValidator = operation -> {
+                if (!(operation instanceof RepositoryOperation)) {
+                    throw new IllegalArgumentException(
+                            String.format(
+                                    "Attempted to run Collection-only operation %s on Repository %s",
+                                    operation.getClass(),
+                                    endpoint.getNitriteCollection()
+                            )
+                    );
+                }
+            };
+        }
+
+        if (endpoint.getNitriteCollection() instanceof NitriteCollection) {
+            operationValidator = operation -> {
+                if (!(operation instanceof CollectionOperation)) {
+                    throw new IllegalArgumentException(
+                            String.format(
+                                    "Attempted to run Repository-only operation %s on Collection %s",
+                                    operation.getClass(),
+                                    endpoint.getNitriteCollection()
+                            )
+                    );
+                }
+            };
+        }
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        AbstractNitriteOperation operation = exchange.getIn().getHeader(NitriteConstants.OPERATION, AbstractNitriteOperation.class);
+        if (operation == null) {
+            operation = new UpsertOperation();
+        }
+
+        operationValidator.accept(operation);
+
+        operation.execute(exchange, endpoint);
+        endpoint.getNitriteDatabase().commit();
+    }
+
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteTypeConverters.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteTypeConverters.java
new file mode 100644
index 0000000..9b8da34
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/NitriteTypeConverters.java
@@ -0,0 +1,43 @@
+/*
+ * 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.nitrite;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Converter;
+import org.dizitart.no2.Cursor;
+import org.dizitart.no2.Document;
+
+@Converter(generateLoader = true)
+public final class NitriteTypeConverters {
+    private NitriteTypeConverters() {
+    }
+
+    @Converter
+    @SuppressWarnings("unused") // Called via Camel dynamically
+    public static Document fromMapToDocument(Map<String, Object> map) {
+        return new Document(map);
+    }
+
+    @Converter
+    @SuppressWarnings("unused") // Called via Camel dynamically
+    public static List fromCursorToList(Cursor cursor) {
+        return cursor.toList();
+    }
+
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/AbstractPayloadAwareOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/AbstractPayloadAwareOperation.java
new file mode 100644
index 0000000..b4076dc
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/AbstractPayloadAwareOperation.java
@@ -0,0 +1,47 @@
+/*
+ * 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.nitrite.operation;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.dizitart.no2.Document;
+
+public abstract class AbstractPayloadAwareOperation extends AbstractNitriteOperation {
+    private Expression expression;
+
+    public AbstractPayloadAwareOperation(Object body) {
+        this.expression = ExpressionBuilder.constantExpression(body);
+    }
+
+    public AbstractPayloadAwareOperation(Expression expression) {
+        this.expression = expression;
+    }
+
+    public AbstractPayloadAwareOperation() {
+        this.expression = ExpressionBuilder.bodyExpression();
+    }
+
+    protected Object getPayload(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        Class<?> targetClass = endpoint.getRepositoryClass() != null ? endpoint.getRepositoryClass() : Document.class;
+        Object payload = expression.evaluate(exchange, Object.class);
+
+        return endpoint.getCamelContext().getTypeConverter().mandatoryConvertTo(targetClass, exchange, payload);
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/CollectionOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/CollectionOperation.java
new file mode 100644
index 0000000..bc3d8e6
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/CollectionOperation.java
@@ -0,0 +1,20 @@
+/*
+ * 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.nitrite.operation;
+
+public interface CollectionOperation {
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/CommonOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/CommonOperation.java
new file mode 100644
index 0000000..69a9f35
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/CommonOperation.java
@@ -0,0 +1,20 @@
+/*
+ * 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.nitrite.operation;
+
+public interface CommonOperation extends RepositoryOperation, CollectionOperation {
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/RepositoryOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/RepositoryOperation.java
new file mode 100644
index 0000000..89533d9
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/RepositoryOperation.java
@@ -0,0 +1,20 @@
+/*
+ * 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.nitrite.operation;
+
+public interface RepositoryOperation {
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/FindCollectionOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/FindCollectionOperation.java
new file mode 100644
index 0000000..4472c25
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/FindCollectionOperation.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.nitrite.operation.collection;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CollectionOperation;
+import org.dizitart.no2.Filter;
+import org.dizitart.no2.FindOptions;
+import org.dizitart.no2.NitriteCollection;
+
+public class FindCollectionOperation extends AbstractNitriteOperation implements CollectionOperation {
+
+    Filter filter;
+    FindOptions findOptions;
+
+    public FindCollectionOperation() {
+    }
+
+    public FindCollectionOperation(Filter filter) {
+        this.filter = filter;
+    }
+
+    public FindCollectionOperation(Filter filter, FindOptions findOptions) {
+        this.filter = filter;
+        this.findOptions = findOptions;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        NitriteCollection collection = (NitriteCollection) endpoint.getNitriteCollection();
+        if (filter != null && findOptions != null) {
+            exchange.getMessage().setBody(collection.find(filter, findOptions));
+        } else if (filter != null) {
+            exchange.getMessage().setBody(collection.find(filter));
+        } else {
+            exchange.getMessage().setBody(collection.find());
+        }
+
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/RemoveCollectionOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/RemoveCollectionOperation.java
new file mode 100644
index 0000000..5718c30
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/RemoveCollectionOperation.java
@@ -0,0 +1,51 @@
+/*
+ * 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.nitrite.operation.collection;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CollectionOperation;
+import org.dizitart.no2.Filter;
+import org.dizitart.no2.NitriteCollection;
+import org.dizitart.no2.RemoveOptions;
+
+public class RemoveCollectionOperation extends AbstractNitriteOperation implements CollectionOperation {
+
+    Filter filter;
+    RemoveOptions removeOptions;
+
+    public RemoveCollectionOperation(Filter filter) {
+        this.filter = filter;
+    }
+
+    public RemoveCollectionOperation(Filter filter, RemoveOptions removeOptions) {
+        this.filter = filter;
+        this.removeOptions = removeOptions;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        NitriteCollection collection = (NitriteCollection) endpoint.getNitriteCollection();
+        if (filter != null && removeOptions != null) {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, collection.remove(filter, removeOptions));
+        } else {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, collection.remove(filter));
+        }
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/UpdateCollectionOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/UpdateCollectionOperation.java
new file mode 100644
index 0000000..8199b04
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/collection/UpdateCollectionOperation.java
@@ -0,0 +1,79 @@
+/*
+ * 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.nitrite.operation.collection;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.AbstractPayloadAwareOperation;
+import org.apache.camel.component.nitrite.operation.CollectionOperation;
+import org.dizitart.no2.Document;
+import org.dizitart.no2.Filter;
+import org.dizitart.no2.NitriteCollection;
+import org.dizitart.no2.UpdateOptions;
+
+public class UpdateCollectionOperation extends AbstractPayloadAwareOperation implements CollectionOperation {
+
+    Filter filter;
+    UpdateOptions updateOptions;
+
+    public UpdateCollectionOperation(Filter filter) {
+        super();
+        this.filter = filter;
+    }
+
+    public UpdateCollectionOperation(Filter filter, UpdateOptions updateOptions) {
+        super();
+        this.filter = filter;
+        this.updateOptions = updateOptions;
+    }
+
+    public UpdateCollectionOperation(Filter filter, Document document) {
+        super(document);
+        this.filter = filter;
+    }
+
+    public UpdateCollectionOperation(Filter filter, UpdateOptions updateOptions, Document document) {
+        super(document);
+        this.filter = filter;
+        this.updateOptions = updateOptions;
+    }
+
+    public UpdateCollectionOperation(Filter filter, Expression documentExpression) {
+        super(documentExpression);
+        this.filter = filter;
+    }
+
+    public UpdateCollectionOperation(Filter filter, UpdateOptions updateOptions, Expression documentExpression) {
+        super(documentExpression);
+        this.filter = filter;
+        this.updateOptions = updateOptions;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        NitriteCollection collection = (NitriteCollection) endpoint.getNitriteCollection();
+        Document payload = (Document) getPayload(exchange, endpoint);
+        if (filter != null && updateOptions != null) {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, collection.update(filter, payload, updateOptions));
+        } else {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, collection.update(filter, payload));
+        }
+    }
+
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/CreateIndexOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/CreateIndexOperation.java
new file mode 100644
index 0000000..d05e1e1
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/CreateIndexOperation.java
@@ -0,0 +1,38 @@
+/*
+ * 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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+import org.dizitart.no2.IndexOptions;
+
+public class CreateIndexOperation extends AbstractNitriteOperation implements CommonOperation {
+    private String field;
+    private IndexOptions indexOptions;
+
+    public CreateIndexOperation(String field, IndexOptions indexOptions) {
+        this.field = field;
+        this.indexOptions = indexOptions;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        endpoint.getNitriteCollection().createIndex(field, indexOptions);
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/DropIndexOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/DropIndexOperation.java
new file mode 100644
index 0000000..ce9aa48
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/DropIndexOperation.java
@@ -0,0 +1,35 @@
+/*
+ * 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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class DropIndexOperation extends AbstractNitriteOperation implements CommonOperation {
+    private String field;
+
+    public DropIndexOperation(String field) {
+        this.field = field;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        endpoint.getNitriteCollection().dropIndex(field);
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ExportDatabaseOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ExportDatabaseOperation.java
new file mode 100644
index 0000000..6f1baa8
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ExportDatabaseOperation.java
@@ -0,0 +1,48 @@
+/*
+ * 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.nitrite.operation.common;
+
+import java.io.ByteArrayOutputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+import org.dizitart.no2.tool.ExportOptions;
+import org.dizitart.no2.tool.Exporter;
+
+public class ExportDatabaseOperation extends AbstractNitriteOperation implements CommonOperation {
+    private ExportOptions options;
+
+    public ExportDatabaseOperation() {
+    }
+
+    public ExportDatabaseOperation(ExportOptions options) {
+        this.options = options;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        Exporter exporter = Exporter.of(endpoint.getNitriteDatabase());
+        if (options != null) {
+            exporter.withOptions(options);
+        }
+        exporter.exportTo(stream);
+        exchange.getMessage().setBody(stream.toByteArray());
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/GetAttributesOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/GetAttributesOperation.java
new file mode 100644
index 0000000..93f9a82
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/GetAttributesOperation.java
@@ -0,0 +1,29 @@
+/*
+ * 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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class GetAttributesOperation extends AbstractNitriteOperation implements CommonOperation {
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        exchange.getMessage().setBody(endpoint.getNitriteCollection().getAttributes());
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/GetByIdOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/GetByIdOperation.java
new file mode 100644
index 0000000..81d7a56
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/GetByIdOperation.java
@@ -0,0 +1,35 @@
+/*
+ * 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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+import org.dizitart.no2.NitriteId;
+
+public class GetByIdOperation extends AbstractNitriteOperation implements CommonOperation {
+    NitriteId id;
+    public GetByIdOperation(NitriteId id) {
+        this.id = id;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        exchange.getMessage().setBody(endpoint.getNitriteCollection().getById(id));
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ImportDatabaseOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ImportDatabaseOperation.java
new file mode 100644
index 0000000..05de35a
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ImportDatabaseOperation.java
@@ -0,0 +1,38 @@
+/*
+ * 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.nitrite.operation.common;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+import org.dizitart.no2.tool.Importer;
+
+public class ImportDatabaseOperation extends AbstractNitriteOperation implements CommonOperation {
+    public ImportDatabaseOperation() {
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        InputStream stream = new ByteArrayInputStream(exchange.getMessage().getBody(byte[].class));
+        Importer.of(endpoint.getNitriteDatabase())
+                .importFrom(stream);
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/InsertOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/InsertOperation.java
new file mode 100644
index 0000000..1f9a083
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/InsertOperation.java
@@ -0,0 +1,45 @@
+/*
+ * 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.nitrite.operation.common;
+
+import java.lang.reflect.Array;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.AbstractPayloadAwareOperation;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class InsertOperation extends AbstractPayloadAwareOperation implements CommonOperation {
+    public InsertOperation(Object body) {
+        super(body);
+    }
+
+    public InsertOperation() {
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        Object payload = getPayload(exchange, endpoint);
+        Object[] payloadArray = (Object[])Array.newInstance(payload.getClass(), 1);
+        payloadArray[0] = payload;
+        exchange.getMessage().setHeader(
+                NitriteConstants.WRITE_RESULT,
+                endpoint.getNitriteCollection().insert(payloadArray)
+        );
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ListIndicesOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ListIndicesOperation.java
new file mode 100644
index 0000000..d880eb6
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/ListIndicesOperation.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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class ListIndicesOperation extends AbstractNitriteOperation implements CommonOperation {
+    public ListIndicesOperation() {
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        exchange.getMessage().setBody(endpoint.getNitriteCollection().listIndices());
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/RebuildIndexOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/RebuildIndexOperation.java
new file mode 100644
index 0000000..9e27da0
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/RebuildIndexOperation.java
@@ -0,0 +1,41 @@
+/*
+ * 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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class RebuildIndexOperation extends AbstractNitriteOperation implements CommonOperation {
+    private String field;
+    private boolean async;
+
+    public RebuildIndexOperation(String field) {
+        this.field = field;
+    }
+
+    public RebuildIndexOperation(String field, boolean async) {
+        this.field = field;
+        this.async = async;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        endpoint.getNitriteCollection().rebuildIndex(field, async);
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/UpdateOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/UpdateOperation.java
new file mode 100644
index 0000000..40e9fe2
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/UpdateOperation.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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.AbstractPayloadAwareOperation;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class UpdateOperation extends AbstractPayloadAwareOperation implements CommonOperation {
+    public UpdateOperation(Object body) {
+        super(body);
+    }
+
+    public UpdateOperation() {
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        exchange.getMessage().setHeader(
+                NitriteConstants.WRITE_RESULT,
+                endpoint.getNitriteCollection().update(getPayload(exchange, endpoint), false)
+        );
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/UpsertOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/UpsertOperation.java
new file mode 100644
index 0000000..52c6702
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/common/UpsertOperation.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.nitrite.operation.common;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.AbstractPayloadAwareOperation;
+import org.apache.camel.component.nitrite.operation.CommonOperation;
+
+public class UpsertOperation extends AbstractPayloadAwareOperation implements CommonOperation {
+    public UpsertOperation(Object body) {
+        super(body);
+    }
+
+    public UpsertOperation() {
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        exchange.getMessage().setHeader(
+                NitriteConstants.WRITE_RESULT,
+                endpoint.getNitriteCollection().update(getPayload(exchange, endpoint), true)
+        );
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/FindRepositoryOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/FindRepositoryOperation.java
new file mode 100644
index 0000000..6cefcdd
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/FindRepositoryOperation.java
@@ -0,0 +1,55 @@
+/*
+ * 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.nitrite.operation.repository;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.RepositoryOperation;
+import org.dizitart.no2.FindOptions;
+import org.dizitart.no2.objects.ObjectFilter;
+import org.dizitart.no2.objects.ObjectRepository;
+
+public class FindRepositoryOperation extends AbstractNitriteOperation implements RepositoryOperation {
+
+    ObjectFilter objectFilter;
+    FindOptions findOptions;
+
+    public FindRepositoryOperation() {
+    }
+
+    public FindRepositoryOperation(ObjectFilter objectFilter) {
+        this.objectFilter = objectFilter;
+    }
+
+    public FindRepositoryOperation(ObjectFilter objectFilter, FindOptions findOptions) {
+        this.objectFilter = objectFilter;
+        this.findOptions = findOptions;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        ObjectRepository repository = (ObjectRepository) endpoint.getNitriteCollection();
+        if (objectFilter != null && findOptions != null) {
+            exchange.getMessage().setBody(repository.find(objectFilter, findOptions));
+        } else if (objectFilter != null) {
+            exchange.getMessage().setBody(repository.find(objectFilter));
+        } else {
+            exchange.getMessage().setBody(repository.find());
+        }
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/RemoveRepositoryOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/RemoveRepositoryOperation.java
new file mode 100644
index 0000000..a03561f
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/RemoveRepositoryOperation.java
@@ -0,0 +1,51 @@
+/*
+ * 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.nitrite.operation.repository;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.AbstractNitriteOperation;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.RepositoryOperation;
+import org.dizitart.no2.RemoveOptions;
+import org.dizitart.no2.objects.ObjectFilter;
+import org.dizitart.no2.objects.ObjectRepository;
+
+public class RemoveRepositoryOperation extends AbstractNitriteOperation implements RepositoryOperation {
+
+    ObjectFilter filter;
+    RemoveOptions removeOptions;
+
+    public RemoveRepositoryOperation(ObjectFilter filter) {
+        this.filter = filter;
+    }
+
+    public RemoveRepositoryOperation(ObjectFilter filter, RemoveOptions removeOptions) {
+        this.filter = filter;
+        this.removeOptions = removeOptions;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        ObjectRepository repository = (ObjectRepository) endpoint.getNitriteCollection();
+        if (filter != null && removeOptions != null) {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, repository.remove(filter, removeOptions));
+        } else {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, repository.remove(filter));
+        }
+    }
+}
diff --git a/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/UpdateRepositoryOperation.java b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/UpdateRepositoryOperation.java
new file mode 100644
index 0000000..d8e5994
--- /dev/null
+++ b/components/camel-nitrite/src/main/java/org/apache/camel/component/nitrite/operation/repository/UpdateRepositoryOperation.java
@@ -0,0 +1,58 @@
+/*
+ * 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.nitrite.operation.repository;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.component.nitrite.NitriteConstants;
+import org.apache.camel.component.nitrite.NitriteEndpoint;
+import org.apache.camel.component.nitrite.operation.AbstractPayloadAwareOperation;
+import org.apache.camel.component.nitrite.operation.RepositoryOperation;
+import org.dizitart.no2.Document;
+import org.dizitart.no2.objects.ObjectFilter;
+import org.dizitart.no2.objects.ObjectRepository;
+
+public class UpdateRepositoryOperation extends AbstractPayloadAwareOperation implements RepositoryOperation {
+
+    ObjectFilter filter;
+
+    public UpdateRepositoryOperation(ObjectFilter filter) {
+        super();
+        this.filter = filter;
+    }
+
+    public UpdateRepositoryOperation(ObjectFilter filter, Document document) {
+        super(document);
+        this.filter = filter;
+    }
+    public UpdateRepositoryOperation(ObjectFilter filter, Expression documentExpression) {
+        super(documentExpression);
+        this.filter = filter;
+    }
+
+    @Override
+    protected void execute(Exchange exchange, NitriteEndpoint endpoint) throws Exception {
+        ObjectRepository repository = (ObjectRepository) endpoint.getNitriteCollection();
+        Object payload = getPayload(exchange, endpoint);
+        if (filter != null) {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, repository.update(filter, payload));
+        } else {
+            exchange.getMessage().setHeader(NitriteConstants.WRITE_RESULT, repository.update(payload));
+        }
+    }
+
+}
diff --git a/components/camel-nitrite/src/main/resources/META-INF/services/org/apache/camel/component/nitrite b/components/camel-nitrite/src/main/resources/META-INF/services/org/apache/camel/component/nitrite
new file mode 100644
index 0000000..be66e75
--- /dev/null
+++ b/components/camel-nitrite/src/main/resources/META-INF/services/org/apache/camel/component/nitrite
@@ -0,0 +1 @@
+class=org.apache.camel.component.nitrite.NitriteComponent
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/AbstractNitriteTest.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/AbstractNitriteTest.java
new file mode 100644
index 0000000..0314761
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/AbstractNitriteTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.nitrite;
+
+import java.io.File;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.FileUtil;
+
+public class AbstractNitriteTest extends CamelTestSupport {
+
+    @Override
+    protected void doPreSetup() throws Exception {
+        super.doPreSetup();
+        FileUtil.deleteFile(new File(testPath()));
+    }
+
+    protected String testPath() {
+        return "target/" + getClass().getSimpleName() + "_" + getTestMethodName() + ".db";
+    }
+
+    protected List<Exchange> sortByChangeTimestamp(List<Exchange> input) {
+        return input.stream().sorted((e1, e2) -> {
+            Long timestamp1 = e1.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP, Long.class);
+            Long timestamp2 = e2.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP, Long.class);
+            if (timestamp1 == null || timestamp2 == null) {
+                return 0;
+            }
+            return Long.compare(timestamp1, timestamp2);
+        }).collect(Collectors.toList());
+    }
+
+}
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/MyPersistentObject.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/MyPersistentObject.java
new file mode 100644
index 0000000..4eb7667
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/MyPersistentObject.java
@@ -0,0 +1,76 @@
+/*
+ * 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.nitrite;
+
+import org.dizitart.no2.IndexType;
+import org.dizitart.no2.objects.Id;
+import org.dizitart.no2.objects.Index;
+import org.dizitart.no2.objects.Indices;
+
+@Indices({
+        @Index(value = "key1", type = IndexType.NonUnique),
+        @Index(value = "key2", type = IndexType.Unique)
+})
+public class MyPersistentObject {
+    @Id
+    private long id;
+    private String key1;
+    private String key2;
+    private String key3;
+
+    public MyPersistentObject() {
+    }
+
+    public MyPersistentObject(long id, String key1, String key2, String key3) {
+        this.id = id;
+        this.key1 = key1;
+        this.key2 = key2;
+        this.key3 = key3;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getKey1() {
+        return key1;
+    }
+
+    public void setKey1(String key1) {
+        this.key1 = key1;
+    }
+
+    public String getKey2() {
+        return key2;
+    }
+
+    public void setKey2(String key2) {
+        this.key2 = key2;
+    }
+
+    public String getKey3() {
+        return key3;
+    }
+
+    public void setKey3(String key3) {
+        this.key3 = key3;
+    }
+}
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteComponentTest.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteComponentTest.java
new file mode 100644
index 0000000..e3b5431
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteComponentTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.nitrite;
+
+import java.io.File;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.util.FileUtil;
+import org.dizitart.no2.Document;
+import org.junit.Test;
+
+public class NitriteComponentTest extends AbstractNitriteTest {
+
+    @Test
+    public void testMultipleDatabases() throws Exception {
+        MockEndpoint mockA = getMockEndpoint("mock:dbA");
+        MockEndpoint mockB = getMockEndpoint("mock:dbB");
+        MockEndpoint mockC = getMockEndpoint("mock:dbC");
+        mockA.setExpectedMessageCount(1);
+        mockB.setExpectedMessageCount(1);
+        mockC.setExpectedMessageCount(1);
+
+
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath() + ".a.db"),
+                Document.createDocument("key1", "db_a")
+        );
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath() + ".b.db"),
+                Document.createDocument("key1", "db_b")
+        );
+        template.sendBody(String.format("nitrite://%s?collection=collection2", testPath() + ".c.db"),
+                Document.createDocument("key1", "db_c")
+        );
+
+        mockA.assertIsSatisfied(60000);
+        mockB.assertIsSatisfied(60000);
+        mockC.assertIsSatisfied(60000);
+    }
+
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                FileUtil.deleteFile(new File(testPath() + ".a.db"));
+                FileUtil.deleteFile(new File(testPath() + ".b.db"));
+                FileUtil.deleteFile(new File(testPath() + ".c.db"));
+                fromF("nitrite://%s?collection=collection", testPath() + ".a.db")
+                        .to("log:a")
+                        .to("mock:dbA");
+                fromF("nitrite://%s?collection=collection&username=login&password=secret", testPath() + ".b.db")
+                        .to("log:b")
+                        .to("mock:dbB");
+                fromF("nitrite://%s?collection=collection2&username=login2&password=s3cr3t", testPath() + ".c.db")
+                        .to("log:c")
+                        .to("mock:dbC");
+            }
+        };
+    }
+}
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteConsumerCollectionTest.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteConsumerCollectionTest.java
new file mode 100644
index 0000000..a860d33
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteConsumerCollectionTest.java
@@ -0,0 +1,162 @@
+/*
+ * 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.nitrite;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.nitrite.operation.collection.FindCollectionOperation;
+import org.apache.camel.component.nitrite.operation.collection.RemoveCollectionOperation;
+import org.apache.camel.component.nitrite.operation.common.InsertOperation;
+import org.dizitart.no2.Document;
+import org.dizitart.no2.event.ChangeType;
+import org.dizitart.no2.filters.Filters;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NitriteConsumerCollectionTest extends AbstractNitriteTest {
+
+    @Test
+    public void testCollectionUpsertInsert() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1")
+        );
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key2", "value2")
+        );
+
+        mock.assertIsSatisfied();
+
+        List<Exchange> sorted = sortByChangeTimestamp(mock.getExchanges());
+        Exchange change1 = sorted.get(0);
+        Exchange change2 = sorted.get(1);
+
+        Assert.assertEquals(ChangeType.INSERT, change1.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+        Assert.assertEquals(ChangeType.INSERT, change2.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(change1.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+        Assert.assertNotNull(change2.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+
+        Assert.assertNotNull(change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertEquals("value1", change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertNotNull(change2.getMessage().getBody(Map.class).get("key2"));
+        Assert.assertEquals("value2", change2.getMessage().getBody(Map.class).get("key2"));
+    }
+
+    @Test
+    public void testCollectionUpsertUpdate() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1").put("_id", 123L)
+        );
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key2", "value2").put("_id", 123L)
+        );
+        mock.assertIsSatisfied();
+
+        List<Exchange> sorted = sortByChangeTimestamp(mock.getExchanges());
+        Exchange change1 = sorted.get(0);
+        Exchange change2 = sorted.get(1);
+
+        Assert.assertEquals(ChangeType.INSERT, change1.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+        Assert.assertEquals(ChangeType.UPDATE, change2.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(change1.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+        Assert.assertNotNull(change2.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+
+        Assert.assertNotNull(change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertEquals("value1", change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertNotNull(change2.getMessage().getBody(Map.class).get("key2"));
+        Assert.assertEquals("value2", change2.getMessage().getBody(Map.class).get("key2"));
+    }
+
+    @Test
+    public void testCollectionInsert() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(1);
+
+        template.sendBodyAndHeader(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1"),
+                NitriteConstants.OPERATION, new InsertOperation()
+        );
+
+        mock.assertIsSatisfied();
+
+        Exchange change1 = mock.getExchanges().get(0);
+
+        Assert.assertEquals(ChangeType.INSERT, change1.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(change1.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+
+        Assert.assertNotNull(change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertEquals("value1", change1.getMessage().getBody(Map.class).get("key1"));
+    }
+
+    @Test
+    public void testCollectionRemove() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        template.sendBodyAndHeader(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1"),
+                NitriteConstants.OPERATION, new InsertOperation()
+        );
+        template.sendBodyAndHeader(String.format("nitrite://%s?collection=collection", testPath()),
+                null,
+                NitriteConstants.OPERATION, new RemoveCollectionOperation(Filters.eq("key1", "value1"))
+        );
+
+        Assert.assertEquals(
+                0,
+                template.requestBody("direct:listAll", null, List.class).size()
+        );
+
+        mock.assertIsSatisfied();
+
+        List<Exchange> sorted = sortByChangeTimestamp(mock.getExchanges());
+        Exchange insert = sorted.get(0);
+        Exchange remove = sorted.get(1);
+
+        Assert.assertEquals(ChangeType.INSERT, insert.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+        Assert.assertEquals(ChangeType.REMOVE, remove.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(insert.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+        Assert.assertNotNull(remove.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                fromF("nitrite://%s?collection=collection", testPath())
+                        .to("mock:result");
+
+                from("direct:listAll")
+                        .setHeader(NitriteConstants.OPERATION, constant(new FindCollectionOperation()))
+                        .toF("nitrite://%s?collection=collection", testPath());
+            }
+        };
+    }
+}
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteConsumerRepositoryTest.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteConsumerRepositoryTest.java
new file mode 100644
index 0000000..ecf47ba
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteConsumerRepositoryTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.nitrite;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.nitrite.operation.common.InsertOperation;
+import org.apache.camel.component.nitrite.operation.repository.FindRepositoryOperation;
+import org.apache.camel.component.nitrite.operation.repository.RemoveRepositoryOperation;
+import org.dizitart.no2.event.ChangeType;
+import org.dizitart.no2.objects.filters.ObjectFilters;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NitriteConsumerRepositoryTest extends AbstractNitriteTest {
+
+    @Test
+    public void testRepositoryUpsertInsert() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(1L, "val1", "val2", "")
+        );
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(2L, "val3", "val4", "")
+        );
+
+        mock.assertIsSatisfied();
+
+        List<Exchange> sorted = sortByChangeTimestamp(mock.getExchanges());
+        Exchange change1 = sorted.get(0);
+        Exchange change2 = sorted.get(1);
+
+        Assert.assertEquals(ChangeType.INSERT, change1.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+        Assert.assertEquals(ChangeType.INSERT, change2.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(change1.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+        Assert.assertNotNull(change2.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+
+        Assert.assertNotNull(change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertEquals("val1", change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertNotNull(change2.getMessage().getBody(Map.class).get("key2"));
+        Assert.assertEquals("val4", change2.getMessage().getBody(Map.class).get("key2"));
+    }
+
+    @Test
+    public void testRepositoryUpsertUpdate() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(123L, "val1", "val2", "")
+        );
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(123L, "val3", "val4", "")
+        );
+
+        mock.assertIsSatisfied();
+
+        Assert.assertEquals(
+                1,
+                template.requestBody("direct:listAll", null, List.class).size()
+        );
+
+        List<Exchange> sorted = sortByChangeTimestamp(mock.getExchanges());
+        Exchange change1 = sorted.get(0);
+        Exchange change2 = sorted.get(1);
+
+        Assert.assertEquals(ChangeType.INSERT, change1.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+        Assert.assertEquals(ChangeType.UPDATE, change2.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(change1.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+        Assert.assertNotNull(change2.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+
+        Assert.assertNotNull(change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertEquals("val1", change1.getMessage().getBody(Map.class).get("key1"));
+        Assert.assertNotNull(change2.getMessage().getBody(Map.class).get("key2"));
+        Assert.assertEquals("val4", change2.getMessage().getBody(Map.class).get("key2"));
+    }
+
+    @Test
+    public void testRepositoryRemove() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(2);
+
+        template.sendBodyAndHeader(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(123L, "val1", "val2", ""),
+                NitriteConstants.OPERATION, new InsertOperation()
+        );
+        template.sendBodyAndHeader(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                null,
+                NitriteConstants.OPERATION, new RemoveRepositoryOperation(ObjectFilters.eq("key1", "val1"))
+        );
+
+        Assert.assertEquals(
+                0,
+                template.requestBody("direct:listAll", null, List.class).size()
+        );
+
+        mock.assertIsSatisfied();
+
+        List<Exchange> sorted = sortByChangeTimestamp(mock.getExchanges());
+        Exchange insert = sorted.get(0);
+        Exchange remove = sorted.get(1);
+
+        Assert.assertEquals(ChangeType.INSERT, insert.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+        Assert.assertEquals(ChangeType.REMOVE, remove.getMessage().getHeader(NitriteConstants.CHANGE_TYPE));
+
+        Assert.assertNotNull(insert.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+        Assert.assertNotNull(remove.getMessage().getHeader(NitriteConstants.CHANGE_TIMESTAMP));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                fromF("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName())
+                        .to("mock:result");
+
+                from("direct:listAll")
+                        .setHeader(NitriteConstants.OPERATION, constant(new FindRepositoryOperation()))
+                        .toF("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName());
+            }
+        };
+    }
+}
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteProducerCollectionTest.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteProducerCollectionTest.java
new file mode 100644
index 0000000..b9d0f13
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteProducerCollectionTest.java
@@ -0,0 +1,244 @@
+/*
+ * 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.nitrite;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.operation.collection.FindCollectionOperation;
+import org.apache.camel.component.nitrite.operation.collection.RemoveCollectionOperation;
+import org.apache.camel.component.nitrite.operation.collection.UpdateCollectionOperation;
+import org.apache.camel.component.nitrite.operation.common.CreateIndexOperation;
+import org.apache.camel.component.nitrite.operation.common.DropIndexOperation;
+import org.apache.camel.component.nitrite.operation.common.ExportDatabaseOperation;
+import org.apache.camel.component.nitrite.operation.common.GetAttributesOperation;
+import org.apache.camel.component.nitrite.operation.common.GetByIdOperation;
+import org.apache.camel.component.nitrite.operation.common.ImportDatabaseOperation;
+import org.apache.camel.component.nitrite.operation.common.InsertOperation;
+import org.apache.camel.component.nitrite.operation.common.ListIndicesOperation;
+import org.apache.camel.component.nitrite.operation.common.RebuildIndexOperation;
+import org.apache.camel.component.nitrite.operation.common.UpdateOperation;
+import org.apache.camel.component.nitrite.operation.common.UpsertOperation;
+import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.util.FileUtil;
+import org.dizitart.no2.Document;
+import org.dizitart.no2.IndexOptions;
+import org.dizitart.no2.IndexType;
+import org.dizitart.no2.NitriteId;
+import org.dizitart.no2.WriteResult;
+import org.dizitart.no2.filters.Filters;
+import org.dizitart.no2.meta.Attributes;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NitriteProducerCollectionTest extends AbstractNitriteTest {
+
+    @Before
+    public void insertData() {
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1-a").put("key2", "value2-a").put("key3", "value3-a").put("_id", 1L)
+        );
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1-b").put("key2", "value2-b").put("key3", "value3-b").put("_id", 2L)
+        );
+        template.sendBody(String.format("nitrite://%s?collection=collection", testPath()),
+                Document.createDocument("key1", "value1-c").put("key2", "value2-c").put("key3", "value3-c").put("_id", 3L)
+        );
+    }
+
+    @Test
+    public void findCollectionOperation() throws Exception {
+        List<Document> result = template.requestBodyAndHeader(
+                String.format("nitrite://%s?collection=collection", testPath()),
+                null,
+                NitriteConstants.OPERATION, new FindCollectionOperation(Filters.eq("key1", "value1-a")),
+                List.class
+        );
+
+        Assert.assertEquals(1, result.size());
+        Assert.assertEquals("value1-a", result.get(0).get("key1"));
+        Assert.assertEquals("value2-a", result.get(0).get("key2"));
+        Assert.assertEquals("value3-a", result.get(0).get("key3"));
+    }
+
+    @Test
+    public void removeCollectionOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new RemoveCollectionOperation(Filters.eq("key2", "value2-b")));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void updateCollectionOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new UpdateCollectionOperation(Filters.eq("key2", "value2-b")));
+        exchange.getMessage().setBody(Document.createDocument("key3", "updatedValue"));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void createIndexOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new CreateIndexOperation("key3", IndexOptions.indexOptions(IndexType.Unique)));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+
+        Exchange listIndices = new DefaultExchange(context);
+        listIndices.getMessage().setHeader(NitriteConstants.OPERATION, new ListIndicesOperation());
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), listIndices);
+
+        Assert.assertEquals(1, listIndices.getMessage().getBody(List.class).size());
+    }
+
+    @Test
+    public void dropIndexOperation() throws Exception {
+        createIndexOperation();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new DropIndexOperation("key3"));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+
+        Exchange listIndices = new DefaultExchange(context);
+        listIndices.getMessage().setHeader(NitriteConstants.OPERATION, new ListIndicesOperation());
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), listIndices);
+
+        Assert.assertEquals(0, listIndices.getMessage().getBody(List.class).size());
+    }
+
+    @Test
+    public void getAttributesOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new GetAttributesOperation());
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertNotNull(exchange.getMessage().getBody(Attributes.class));
+    }
+
+    @Test
+    public void getByIdOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new GetByIdOperation(NitriteId.createId(1L)));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertNotNull(exchange.getMessage().getBody(Document.class));
+    }
+
+    @Test
+    public void insertOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new InsertOperation(
+                Document.createDocument("a", "b")
+        ));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void listIndicesOperation() throws Exception {
+        createIndexOperation();
+
+        Exchange listIndices = new DefaultExchange(context);
+        listIndices.getMessage().setHeader(NitriteConstants.OPERATION, new ListIndicesOperation());
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), listIndices);
+
+        Assert.assertEquals(1, listIndices.getMessage().getBody(List.class).size());
+    }
+
+    @Test
+    public void rebuildIndexOperation() throws Exception {
+        createIndexOperation();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new RebuildIndexOperation(
+                "key3"
+        ));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+
+    }
+
+    @Test
+    public void updateOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new UpdateOperation(
+                Document.createDocument("a", "b").put("_id", 1L)
+        ));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void upsertOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new UpsertOperation(
+                Document.createDocument("a", "b").put("_id", 1L)
+        ));
+
+        template.send(String.format("nitrite://%s?collection=collection", testPath()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void importDatabaseOperation() throws Exception {
+        FileUtil.deleteFile(new File(testPath() + "clone"));
+        byte[] ddl = template.requestBodyAndHeader(
+                String.format("nitrite://%s?collection=collection", testPath()),
+                null,
+                NitriteConstants.OPERATION, new ExportDatabaseOperation(),
+                byte[].class
+        );
+
+        Assert.assertNotNull(ddl);
+
+        template.sendBodyAndHeader(
+                String.format("nitrite://%s?collection=collection", testPath() + "clone"),
+                ddl,
+                NitriteConstants.OPERATION, new ImportDatabaseOperation()
+        );
+
+        Assert.assertEquals(3,
+                template.requestBodyAndHeader(
+                        String.format("nitrite://%s?collection=collection", testPath() + "clone"),
+                        null,
+                        NitriteConstants.OPERATION, new FindCollectionOperation(),
+                        List.class
+                        ).size()
+        );
+    }
+}
diff --git a/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteProducerRepositoryTest.java b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteProducerRepositoryTest.java
new file mode 100644
index 0000000..608f617
--- /dev/null
+++ b/components/camel-nitrite/src/test/java/org/apache/camel/component/nitrite/NitriteProducerRepositoryTest.java
@@ -0,0 +1,199 @@
+/*
+ * 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.nitrite;
+
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.nitrite.operation.common.CreateIndexOperation;
+import org.apache.camel.component.nitrite.operation.common.DropIndexOperation;
+import org.apache.camel.component.nitrite.operation.common.GetAttributesOperation;
+import org.apache.camel.component.nitrite.operation.common.InsertOperation;
+import org.apache.camel.component.nitrite.operation.common.ListIndicesOperation;
+import org.apache.camel.component.nitrite.operation.common.RebuildIndexOperation;
+import org.apache.camel.component.nitrite.operation.common.UpdateOperation;
+import org.apache.camel.component.nitrite.operation.common.UpsertOperation;
+import org.apache.camel.component.nitrite.operation.repository.FindRepositoryOperation;
+import org.apache.camel.component.nitrite.operation.repository.RemoveRepositoryOperation;
+import org.apache.camel.component.nitrite.operation.repository.UpdateRepositoryOperation;
+import org.apache.camel.support.DefaultExchange;
+import org.dizitart.no2.IndexOptions;
+import org.dizitart.no2.IndexType;
+import org.dizitart.no2.WriteResult;
+import org.dizitart.no2.meta.Attributes;
+import org.dizitart.no2.objects.filters.ObjectFilters;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class NitriteProducerRepositoryTest extends AbstractNitriteTest {
+
+    @Before
+    public void insertData() {
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(1, "a", "b", "")
+        );
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(2, "c", "d", "")
+        );
+        template.sendBody(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                new MyPersistentObject(3, "e", "f", "")
+        );
+    }
+
+    @Test
+    public void findRepositoryOperation() throws Exception {
+        List<MyPersistentObject> result = template.requestBodyAndHeader(
+                String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()),
+                null,
+                NitriteConstants.OPERATION, new FindRepositoryOperation(ObjectFilters.eq("key1", "c")),
+                List.class
+        );
+
+        Assert.assertEquals(1, result.size());
+        Assert.assertEquals("c", result.get(0).getKey1());
+        Assert.assertEquals("d", result.get(0).getKey2());
+    }
+
+    @Test
+    public void removeRepositoryOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new RemoveRepositoryOperation(ObjectFilters.eq("key2", "b")));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void updateRepositoryOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new UpdateRepositoryOperation(ObjectFilters.eq("key2", "f")));
+        exchange.getMessage().setBody(new MyPersistentObject(3, "updatedA", "updatedB", ""));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void createIndexOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new CreateIndexOperation("key3", IndexOptions.indexOptions(IndexType.Unique)));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+
+        Exchange listIndices = new DefaultExchange(context);
+        listIndices.getMessage().setHeader(NitriteConstants.OPERATION, new ListIndicesOperation());
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), listIndices);
+
+        Assert.assertEquals(4, listIndices.getMessage().getBody(List.class).size());
+    }
+
+    @Test
+    public void dropIndexOperation() throws Exception {
+        createIndexOperation();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new DropIndexOperation("key3"));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+
+        Exchange listIndices = new DefaultExchange(context);
+        listIndices.getMessage().setHeader(NitriteConstants.OPERATION, new ListIndicesOperation());
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), listIndices);
+
+        Assert.assertEquals(3, listIndices.getMessage().getBody(List.class).size());
+    }
+
+    @Test
+    public void getAttributesOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new GetAttributesOperation());
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+        Assert.assertNotNull(exchange.getMessage().getBody(Attributes.class));
+    }
+
+    @Test
+    public void insertOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new InsertOperation(
+                new MyPersistentObject(123, "", "", "")
+        ));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void listIndicesOperation() throws Exception {
+        createIndexOperation();
+
+        Exchange listIndices = new DefaultExchange(context);
+        listIndices.getMessage().setHeader(NitriteConstants.OPERATION, new ListIndicesOperation());
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), listIndices);
+
+        Assert.assertEquals(4, listIndices.getMessage().getBody(List.class).size());
+    }
+
+    @Test
+    public void rebuildIndexOperation() throws Exception {
+        createIndexOperation();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new RebuildIndexOperation(
+                "key3"
+        ));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+
+    }
+
+    @Test
+    public void updateOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new UpdateOperation(
+                new MyPersistentObject(1, "", "", "")
+        ));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+
+    @Test
+    public void upsertOperation() throws Exception {
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getMessage().setHeader(NitriteConstants.OPERATION, new UpsertOperation(
+                new MyPersistentObject(1, "", "", "")
+        ));
+
+        template.send(String.format("nitrite://%s?repositoryClass=%s", testPath(), MyPersistentObject.class.getCanonicalName()), exchange);
+        Assert.assertEquals(
+                1,
+                exchange.getMessage().getHeader(NitriteConstants.WRITE_RESULT, WriteResult.class).getAffectedCount()
+        );
+    }
+}
diff --git a/components/camel-nitrite/src/test/resources/log4j2.properties b/components/camel-nitrite/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..af1a874
--- /dev/null
+++ b/components/camel-nitrite/src/test/resources/log4j2.properties
@@ -0,0 +1,23 @@
+## ---------------------------------------------------------------------------
+## 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-nitrite-test.log
+appender.file.layout.type=PatternLayout
+appender.file.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level=INFO
+rootLogger.appenderRef.file.ref=file
diff --git a/components/pom.xml b/components/pom.xml
index 8d3e752e..0d4bdad 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -256,6 +256,7 @@
         <module>camel-nats</module>
         <module>camel-netty</module>
         <module>camel-netty-http</module>
+        <module>camel-nitrite</module>
         <module>camel-nsq</module>
         <module>camel-ognl</module>
         <module>camel-olingo2</module>
diff --git a/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/NitriteEndpointBuilderFactory.java b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/NitriteEndpointBuilderFactory.java
new file mode 100644
index 0000000..c809348
--- /dev/null
+++ b/core/camel-endpointdsl/src/main/java/org/apache/camel/builder/endpoint/dsl/NitriteEndpointBuilderFactory.java
@@ -0,0 +1,637 @@
+/*
+ * 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.ExchangePattern;
+import org.apache.camel.builder.EndpointConsumerBuilder;
+import org.apache.camel.builder.EndpointProducerBuilder;
+import org.apache.camel.builder.endpoint.AbstractEndpointBuilder;
+import org.apache.camel.spi.ExceptionHandler;
+
+/**
+ * Represents a Nitrite endpoint.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointDslMojo")
+public interface NitriteEndpointBuilderFactory {
+
+
+    /**
+     * Builder for endpoint consumers for the Nitrite component.
+     */
+    public interface NitriteEndpointConsumerBuilder
+            extends
+                EndpointConsumerBuilder {
+        default AdvancedNitriteEndpointConsumerBuilder advanced() {
+            return (AdvancedNitriteEndpointConsumerBuilder) this;
+        }
+        /**
+         * Name of Nitrite collection. Cannot be used in combination with
+         * repositoryClass option.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointConsumerBuilder collection(String collection) {
+            doSetProperty("collection", collection);
+            return this;
+        }
+        /**
+         * Class of Nitrite ObjectRepository. Cannot be used in combination with
+         * collection option.
+         * 
+         * The option is a: <code>java.lang.Class&lt;java.lang.Object&gt;</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointConsumerBuilder repositoryClass(
+                Class<Object> repositoryClass) {
+            doSetProperty("repositoryClass", repositoryClass);
+            return this;
+        }
+        /**
+         * Class of Nitrite ObjectRepository. Cannot be used in combination with
+         * collection option.
+         * 
+         * The option will be converted to a
+         * <code>java.lang.Class&lt;java.lang.Object&gt;</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointConsumerBuilder repositoryClass(
+                String repositoryClass) {
+            doSetProperty("repositoryClass", repositoryClass);
+            return this;
+        }
+        /**
+         * Optional name of ObjectRepository. Can be used in combination with
+         * repositoryClass. Otherwise have no effect.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointConsumerBuilder repositoryName(
+                String repositoryName) {
+            doSetProperty("repositoryName", repositoryName);
+            return this;
+        }
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Group: consumer
+         */
+        default NitriteEndpointConsumerBuilder bridgeErrorHandler(
+                boolean bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Allows for bridging the consumer to the Camel routing Error Handler,
+         * which mean any exceptions occurred while the consumer is trying to
+         * pickup incoming messages, or the likes, will now be processed as a
+         * message and handled by the routing Error Handler. By default the
+         * consumer will use the org.apache.camel.spi.ExceptionHandler to deal
+         * with exceptions, that will be logged at WARN or ERROR level and
+         * ignored.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Group: consumer
+         */
+        default NitriteEndpointConsumerBuilder bridgeErrorHandler(
+                String bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Password for Nitrite database. Required, if option username
+         * specified.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default NitriteEndpointConsumerBuilder password(String password) {
+            doSetProperty("password", password);
+            return this;
+        }
+        /**
+         * Username for Nitrite database. Database is unencrypted if option not
+         * specified.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default NitriteEndpointConsumerBuilder username(String username) {
+            doSetProperty("username", username);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint consumers for the Nitrite component.
+     */
+    public interface AdvancedNitriteEndpointConsumerBuilder
+            extends
+                EndpointConsumerBuilder {
+        default NitriteEndpointConsumerBuilder basic() {
+            return (NitriteEndpointConsumerBuilder) this;
+        }
+        /**
+         * To let the consumer use a custom ExceptionHandler. Notice if the
+         * option bridgeErrorHandler is enabled then this option is not in use.
+         * By default the consumer will deal with exceptions, that will be
+         * logged at WARN or ERROR level and ignored.
+         * 
+         * The option is a: <code>org.apache.camel.spi.ExceptionHandler</code>
+         * type.
+         * 
+         * Group: consumer (advanced)
+         */
+        default AdvancedNitriteEndpointConsumerBuilder exceptionHandler(
+                ExceptionHandler exceptionHandler) {
+            doSetProperty("exceptionHandler", exceptionHandler);
+            return this;
+        }
+        /**
+         * To let the consumer use a custom ExceptionHandler. Notice if the
+         * option bridgeErrorHandler is enabled then this option is not in use.
+         * By default the consumer will deal with exceptions, that will be
+         * logged at WARN or ERROR level and ignored.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.spi.ExceptionHandler</code> type.
+         * 
+         * Group: consumer (advanced)
+         */
+        default AdvancedNitriteEndpointConsumerBuilder exceptionHandler(
+                String exceptionHandler) {
+            doSetProperty("exceptionHandler", exceptionHandler);
+            return this;
+        }
+        /**
+         * Sets the exchange pattern when the consumer creates an exchange.
+         * 
+         * The option is a: <code>org.apache.camel.ExchangePattern</code> type.
+         * 
+         * Group: consumer (advanced)
+         */
+        default AdvancedNitriteEndpointConsumerBuilder exchangePattern(
+                ExchangePattern exchangePattern) {
+            doSetProperty("exchangePattern", exchangePattern);
+            return this;
+        }
+        /**
+         * Sets the exchange pattern when the consumer creates an exchange.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.ExchangePattern</code> type.
+         * 
+         * Group: consumer (advanced)
+         */
+        default AdvancedNitriteEndpointConsumerBuilder exchangePattern(
+                String exchangePattern) {
+            doSetProperty("exchangePattern", exchangePattern);
+            return 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointConsumerBuilder 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointConsumerBuilder basicPropertyBinding(
+                String basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointConsumerBuilder 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointConsumerBuilder synchronous(
+                String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+
+    /**
+     * Builder for endpoint producers for the Nitrite component.
+     */
+    public interface NitriteEndpointProducerBuilder
+            extends
+                EndpointProducerBuilder {
+        default AdvancedNitriteEndpointProducerBuilder advanced() {
+            return (AdvancedNitriteEndpointProducerBuilder) this;
+        }
+        /**
+         * Name of Nitrite collection. Cannot be used in combination with
+         * repositoryClass option.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointProducerBuilder collection(String collection) {
+            doSetProperty("collection", collection);
+            return this;
+        }
+        /**
+         * Class of Nitrite ObjectRepository. Cannot be used in combination with
+         * collection option.
+         * 
+         * The option is a: <code>java.lang.Class&lt;java.lang.Object&gt;</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointProducerBuilder repositoryClass(
+                Class<Object> repositoryClass) {
+            doSetProperty("repositoryClass", repositoryClass);
+            return this;
+        }
+        /**
+         * Class of Nitrite ObjectRepository. Cannot be used in combination with
+         * collection option.
+         * 
+         * The option will be converted to a
+         * <code>java.lang.Class&lt;java.lang.Object&gt;</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointProducerBuilder repositoryClass(
+                String repositoryClass) {
+            doSetProperty("repositoryClass", repositoryClass);
+            return this;
+        }
+        /**
+         * Optional name of ObjectRepository. Can be used in combination with
+         * repositoryClass. Otherwise have no effect.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointProducerBuilder repositoryName(
+                String repositoryName) {
+            doSetProperty("repositoryName", repositoryName);
+            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.
+         * 
+         * Group: producer
+         */
+        default NitriteEndpointProducerBuilder 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.
+         * 
+         * Group: producer
+         */
+        default NitriteEndpointProducerBuilder lazyStartProducer(
+                String lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Password for Nitrite database. Required, if option username
+         * specified.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default NitriteEndpointProducerBuilder password(String password) {
+            doSetProperty("password", password);
+            return this;
+        }
+        /**
+         * Username for Nitrite database. Database is unencrypted if option not
+         * specified.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default NitriteEndpointProducerBuilder username(String username) {
+            doSetProperty("username", username);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint producers for the Nitrite component.
+     */
+    public interface AdvancedNitriteEndpointProducerBuilder
+            extends
+                EndpointProducerBuilder {
+        default NitriteEndpointProducerBuilder basic() {
+            return (NitriteEndpointProducerBuilder) 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointProducerBuilder 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointProducerBuilder basicPropertyBinding(
+                String basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointProducerBuilder 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointProducerBuilder synchronous(
+                String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+
+    /**
+     * Builder for endpoint for the Nitrite component.
+     */
+    public interface NitriteEndpointBuilder
+            extends
+                NitriteEndpointConsumerBuilder, NitriteEndpointProducerBuilder {
+        default AdvancedNitriteEndpointBuilder advanced() {
+            return (AdvancedNitriteEndpointBuilder) this;
+        }
+        /**
+         * Name of Nitrite collection. Cannot be used in combination with
+         * repositoryClass option.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointBuilder collection(String collection) {
+            doSetProperty("collection", collection);
+            return this;
+        }
+        /**
+         * Class of Nitrite ObjectRepository. Cannot be used in combination with
+         * collection option.
+         * 
+         * The option is a: <code>java.lang.Class&lt;java.lang.Object&gt;</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointBuilder repositoryClass(
+                Class<Object> repositoryClass) {
+            doSetProperty("repositoryClass", repositoryClass);
+            return this;
+        }
+        /**
+         * Class of Nitrite ObjectRepository. Cannot be used in combination with
+         * collection option.
+         * 
+         * The option will be converted to a
+         * <code>java.lang.Class&lt;java.lang.Object&gt;</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointBuilder repositoryClass(String repositoryClass) {
+            doSetProperty("repositoryClass", repositoryClass);
+            return this;
+        }
+        /**
+         * Optional name of ObjectRepository. Can be used in combination with
+         * repositoryClass. Otherwise have no effect.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default NitriteEndpointBuilder repositoryName(String repositoryName) {
+            doSetProperty("repositoryName", repositoryName);
+            return this;
+        }
+        /**
+         * Password for Nitrite database. Required, if option username
+         * specified.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default NitriteEndpointBuilder password(String password) {
+            doSetProperty("password", password);
+            return this;
+        }
+        /**
+         * Username for Nitrite database. Database is unencrypted if option not
+         * specified.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default NitriteEndpointBuilder username(String username) {
+            doSetProperty("username", username);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint for the Nitrite component.
+     */
+    public interface AdvancedNitriteEndpointBuilder
+            extends
+                AdvancedNitriteEndpointConsumerBuilder, AdvancedNitriteEndpointProducerBuilder {
+        default NitriteEndpointBuilder basic() {
+            return (NitriteEndpointBuilder) 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointBuilder 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointBuilder basicPropertyBinding(
+                String basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointBuilder 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.
+         * 
+         * Group: advanced
+         */
+        default AdvancedNitriteEndpointBuilder synchronous(String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+    /**
+     * Nitrite (camel-nitrite)
+     * Represents a Nitrite endpoint.
+     * 
+     * Category: database,nosql
+     * Available as of version: 3.0
+     * Maven coordinates: org.apache.camel:camel-nitrite
+     * 
+     * Syntax: <code>nitrite:database</code>
+     * 
+     * Path parameter: database (required)
+     * Path to database file. Will be created if not exists.
+     */
+    default NitriteEndpointBuilder nitrite(String path) {
+        class NitriteEndpointBuilderImpl extends AbstractEndpointBuilder implements NitriteEndpointBuilder, AdvancedNitriteEndpointBuilder {
+            public NitriteEndpointBuilderImpl(String path) {
+                super("nitrite", path);
+            }
+        }
+        return new NitriteEndpointBuilderImpl(path);
+    }
+}
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index 3134560..af7d036 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -6,7 +6,7 @@ The following Apache Camel artifacts are provided:
 == Components
 
 // components: START
-Number of Components: 299 in 237 JAR artifacts (0 deprecated)
+Number of Components: 300 in 238 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -416,6 +416,8 @@ Number of Components: 299 in 237 JAR artifacts (0 deprecated)
 
 | xref:netty-http-component.adoc[Netty HTTP] (camel-netty-http) | 2.14 | Netty HTTP server and client using the Netty 4.x library.
 
+| xref:nitrite-component.adoc[Nitrite] (camel-nitrite) | 3.0 | Represents a Nitrite endpoint.
+
 | xref:nsq-component.adoc[NSQ] (camel-nsq) | 2.23 | Represents a nsq endpoint.
 
 | xref:olingo2-component.adoc[Olingo2] (camel-olingo2) | 2.14 | Communicates with OData 2.0 services using Apache Olingo.
@@ -762,7 +764,7 @@ Number of Languages: 17 in 11 JAR artifacts (0 deprecated)
 == Miscellaneous Components
 
 // others: START
-Number of Miscellaneous Components: 39 in 39 JAR artifacts (0 deprecated)
+Number of Miscellaneous Components: 38 in 38 JAR artifacts (0 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -776,8 +778,6 @@ Number of Miscellaneous Components: 39 in 39 JAR artifacts (0 deprecated)
 
 | xref:cdi.adoc[CDI] (camel-cdi) | 2.10 | Using Camel with CDI
 
-| xref:consul.adoc[Consul] (camel-consul) |  | Camel Consul support
-
 | xref:cxf-transport.adoc[CXF Transport] (camel-cxf-transport) | 2.8 | Camel Transport for Apache CXF
 
 | xref:hystrix.adoc[Hystrix] (camel-hystrix) | 2.18 | Circuit Breaker EIP using Netflix Hystrix
diff --git a/parent/pom.xml b/parent/pom.xml
index 1185294..d7aa7cc 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -482,6 +482,7 @@
         <netty-reactive-streams-version>2.0.3</netty-reactive-streams-version>
         <netty40-version>4.0.56.Final</netty40-version>
         <networknt-json-schema-validator-version>1.0.11</networknt-json-schema-validator-version>
+        <nitrite-version>3.3.0</nitrite-version>
         <noggit-bundle-version>0.5_1</noggit-bundle-version>
         <objenesis-version>2.6</objenesis-version>
         <!-- should be in-sync with deltaspike -->
@@ -1814,6 +1815,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-nitrite</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-nsq</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -3383,6 +3389,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-nitrite-starter</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-nsq-starter</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -5128,6 +5139,12 @@
                 <scope>import</scope>
             </dependency>
 
+            <!-- optional Nitrite dependencies -->
+            <dependency>
+                <groupId>org.dizitart</groupId>
+                <artifactId>nitrite</artifactId>
+                <version>${nitrite-version}</version>
+            </dependency>
             <!-- blueprint -->
             <dependency>
                 <groupId>org.apache.aries.blueprint</groupId>
diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml
index 979d917..e7cf7d6 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -1887,6 +1887,11 @@
     <bundle dependency='true'>mvn:io.netty/netty-codec-http/${netty-version}</bundle>
     <bundle>mvn:org.apache.camel/camel-netty-http/${project.version}</bundle>
   </feature>
+  <feature name='camel-nitrite' version='${project.version}' start-level='50'>
+    <feature version='${project.version}'>camel-nitrite</feature>
+    <bundle dependency='true'>wrap:mvn:org.dizitart/nitrite/${nitrite-version}</bundle>
+    <bundle>mvn:org.apache.camel/camel-nitrite/${project.version}</bundle>
+  </feature>
   <feature name='camel-nsq' version='${project.version}' start-level='50'>
     <feature version='${project.version}'>camel-core</feature>
     <bundle dependency='true'>wrap:mvn:com.github.brainlag/nsq-client/${nsq-client-version}</bundle>
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/pom.xml b/platforms/spring-boot/components-starter/camel-nitrite-starter/pom.xml
new file mode 100644
index 0000000..537824d
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/pom.xml
@@ -0,0 +1,53 @@
+<?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-starter</artifactId>
+    <version>3.0.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>camel-nitrite-starter</artifactId>
+  <packaging>jar</packaging>
+  <name>Spring-Boot Starter :: Camel :: Nitrite</name>
+  <description>Spring-Boot Starter for Camel Nitrite component</description>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+      <version>${spring-boot-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-nitrite</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <!--START OF GENERATED CODE-->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-spring-boot-starter</artifactId>
+    </dependency>
+    <!--END OF GENERATED CODE-->
+  </dependencies>
+</project>
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/java/org/apache/camel/component/nitrite/springboot/NitriteComponentAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/java/org/apache/camel/component/nitrite/springboot/NitriteComponentAutoConfiguration.java
new file mode 100644
index 0000000..eb335dc
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/java/org/apache/camel/component/nitrite/springboot/NitriteComponentAutoConfiguration.java
@@ -0,0 +1,128 @@
+/*
+ * 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.nitrite.springboot;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Generated;
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.nitrite.NitriteComponent;
+import org.apache.camel.spi.ComponentCustomizer;
+import org.apache.camel.spi.HasId;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.spring.boot.ComponentConfigurationProperties;
+import org.apache.camel.spring.boot.util.CamelPropertiesHelper;
+import org.apache.camel.spring.boot.util.ConditionalOnCamelContextAndAutoConfigurationBeans;
+import org.apache.camel.spring.boot.util.GroupCondition;
+import org.apache.camel.spring.boot.util.HierarchicalPropertiesEvaluator;
+import org.apache.camel.support.IntrospectionSupport;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+/**
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo")
+@Configuration
+@Conditional({ConditionalOnCamelContextAndAutoConfigurationBeans.class,
+        NitriteComponentAutoConfiguration.GroupConditions.class})
+@AutoConfigureAfter(CamelAutoConfiguration.class)
+@EnableConfigurationProperties({ComponentConfigurationProperties.class,
+        NitriteComponentConfiguration.class})
+public class NitriteComponentAutoConfiguration {
+
+    private static final Logger LOGGER = LoggerFactory
+            .getLogger(NitriteComponentAutoConfiguration.class);
+    @Autowired
+    private ApplicationContext applicationContext;
+    @Autowired
+    private CamelContext camelContext;
+    @Autowired
+    private NitriteComponentConfiguration configuration;
+    @Autowired(required = false)
+    private List<ComponentCustomizer<NitriteComponent>> customizers;
+
+    static class GroupConditions extends GroupCondition {
+        public GroupConditions() {
+            super("camel.component", "camel.component.nitrite");
+        }
+    }
+
+    @Lazy
+    @Bean(name = "nitrite-component")
+    @ConditionalOnMissingBean(NitriteComponent.class)
+    public NitriteComponent configureNitriteComponent() throws Exception {
+        NitriteComponent component = new NitriteComponent();
+        component.setCamelContext(camelContext);
+        Map<String, Object> parameters = new HashMap<>();
+        IntrospectionSupport.getProperties(configuration, parameters, null,
+                false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    CamelPropertiesHelper.setCamelProperties(camelContext,
+                            nestedProperty, nestedParameters, false);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
+        CamelPropertiesHelper.setCamelProperties(camelContext, component,
+                parameters, false);
+        if (ObjectHelper.isNotEmpty(customizers)) {
+            for (ComponentCustomizer<NitriteComponent> customizer : customizers) {
+                boolean useCustomizer = (customizer instanceof HasId)
+                        ? HierarchicalPropertiesEvaluator.evaluate(
+                                applicationContext.getEnvironment(),
+                                "camel.component.customizer",
+                                "camel.component.nitrite.customizer",
+                                ((HasId) customizer).getId())
+                        : HierarchicalPropertiesEvaluator.evaluate(
+                                applicationContext.getEnvironment(),
+                                "camel.component.customizer",
+                                "camel.component.nitrite.customizer");
+                if (useCustomizer) {
+                    LOGGER.debug("Configure component {}, with customizer {}",
+                            component, customizer);
+                    customizer.customize(component);
+                }
+            }
+        }
+        return component;
+    }
+}
\ No newline at end of file
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/java/org/apache/camel/component/nitrite/springboot/NitriteComponentConfiguration.java b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/java/org/apache/camel/component/nitrite/springboot/NitriteComponentConfiguration.java
new file mode 100644
index 0000000..f76e5d2
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/java/org/apache/camel/component/nitrite/springboot/NitriteComponentConfiguration.java
@@ -0,0 +1,52 @@
+/*
+ * 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.nitrite.springboot;
+
+import javax.annotation.Generated;
+import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Represents a Nitrite endpoint.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo")
+@ConfigurationProperties(prefix = "camel.component.nitrite")
+public class NitriteComponentConfiguration
+        extends
+            ComponentConfigurationPropertiesCommon {
+
+    /**
+     * Whether to enable auto configuration of the nitrite component. This is
+     * enabled by default.
+     */
+    private Boolean enabled;
+    /**
+     * Whether the component should use basic property binding (Camel 2.x) or
+     * the newer property binding with additional capabilities
+     */
+    private Boolean basicPropertyBinding = false;
+
+    public Boolean getBasicPropertyBinding() {
+        return basicPropertyBinding;
+    }
+
+    public void setBasicPropertyBinding(Boolean basicPropertyBinding) {
+        this.basicPropertyBinding = basicPropertyBinding;
+    }
+}
\ No newline at end of file
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/LICENSE.txt b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/NOTICE.txt b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/spring.factories b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..02ce154
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,19 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.apache.camel.component.nitrite.springboot.NitriteComponentAutoConfiguration
diff --git a/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/spring.provides b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/spring.provides
new file mode 100644
index 0000000..0814654
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-nitrite-starter/src/main/resources/META-INF/spring.provides
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+provides: camel-nitrite
diff --git a/platforms/spring-boot/components-starter/pom.xml b/platforms/spring-boot/components-starter/pom.xml
index 066cf04..97390a7 100644
--- a/platforms/spring-boot/components-starter/pom.xml
+++ b/platforms/spring-boot/components-starter/pom.xml
@@ -286,6 +286,7 @@
     <module>camel-nats-starter</module>
     <module>camel-netty-http-starter</module>
     <module>camel-netty-starter</module>
+    <module>camel-nitrite-starter</module>
     <module>camel-nsq-starter</module>
     <module>camel-ognl-starter</module>
     <module>camel-olingo2-starter</module>
diff --git a/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml b/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml
index 5342f24..35df2a7 100644
--- a/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml
+++ b/platforms/spring-boot/spring-boot-dm/camel-spring-boot-dependencies/pom.xml
@@ -3816,6 +3816,11 @@
         </exclusions>
       </dependency>
       <dependency>
+        <groupId>org.dizitart</groupId>
+        <artifactId>nitrite</artifactId>
+        <version>3.3.0</version>
+      </dependency>
+      <dependency>
         <groupId>org.eclipse.rdf4j</groupId>
         <artifactId>rdf4j-model</artifactId>
         <version>2.4.4</version>
@@ -4209,6 +4214,11 @@
         <version>2.5.3</version>
       </dependency>
       <dependency>
+        <groupId>org.testcontainers</groupId>
+        <artifactId>junit-jupiter</artifactId>
+        <version>1.12.3</version>
+      </dependency>
+      <dependency>
         <groupId>rhino</groupId>
         <artifactId>js</artifactId>
         <version>1.7R2</version>
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelNitriteTest.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelNitriteTest.java
new file mode 100644
index 0000000..888bb6a
--- /dev/null
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelNitriteTest.java
@@ -0,0 +1,33 @@
+/*
+ * 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.itest.karaf;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.junit.PaxExam;
+
+@RunWith(PaxExam.class)
+public class CamelNitriteTest extends BaseKarafTest {
+
+    public static final String COMPONENT = extractName(CamelNitriteTest.class);
+
+    @Test
+    public void test() throws Exception {
+        testComponent(COMPONENT);
+    }
+
+}
diff --git a/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelNitriteTest.java b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelNitriteTest.java
new file mode 100644
index 0000000..b670967
--- /dev/null
+++ b/tests/camel-itest-spring-boot/src/test/java/org/apache/camel/itest/springboot/CamelNitriteTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.itest.springboot;
+
+import org.apache.camel.itest.springboot.util.ArquillianPackager;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+@RunWith(Arquillian.class)
+public class CamelNitriteTest extends AbstractSpringBootTestSupport {
+
+    @Deployment
+    public static Archive<?> createSpringBootPackage() throws Exception {
+        return ArquillianPackager.springBootPackage(createTestConfig());
+    }
+
+    public static ITestConfig createTestConfig() {
+        return new ITestConfigBuilder()
+                .module(inferModuleName(CamelNitriteTest.class))
+                .build();
+    }
+
+    @Test
+    public void componentTests() throws Exception {
+        this.runComponentTest(config);
+        this.runModuleUnitTestsIfEnabled(config);
+    }
+
+
+}