CAMEL-13934 camel-minio - Component to store/load files from blob store (#3897)

diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml
index 917e803..7c64675 100644
--- a/apache-camel/src/main/descriptors/common-bin.xml
+++ b/apache-camel/src/main/descriptors/common-bin.xml
@@ -264,6 +264,7 @@
         <include>org.apache.camel:camel-microprofile-metrics</include>
         <include>org.apache.camel:camel-milo</include>
         <include>org.apache.camel:camel-mina</include>
+        <include>org.apache.camel:camel-minio</include>
         <include>org.apache.camel:camel-mllp</include>
         <include>org.apache.camel:camel-mock</include>
         <include>org.apache.camel:camel-mongodb</include>
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 87c701d..735df30 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -1235,6 +1235,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-minio</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-mllp</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml
index 220a8dd..ef9f156 100644
--- a/camel-dependencies/pom.xml
+++ b/camel-dependencies/pom.xml
@@ -430,6 +430,7 @@
     <mina-version>2.1.3</mina-version>
     <minidns-version>0.3.4</minidns-version>
     <minimal-json-version>0.9.5</minimal-json-version>
+    <minio-version>7.1.0</minio-version>
     <mock-javamail-version>1.9</mock-javamail-version>
     <mockito-version>3.3.3</mockito-version>
     <mockwebserver-version>0.1.8</mockwebserver-version>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index c249a32..6b2a718 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -228,6 +228,7 @@
 milo-client
 milo-server
 mina
+minio
 mllp
 mock
 mongodb
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/minio.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/minio.json
new file mode 100644
index 0000000..f976da7
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/minio.json
@@ -0,0 +1,139 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "minio",
+    "title": "Minio Storage Service",
+    "description": "Store and retrieve objects from Minio Storage Service using Minio SDK.",
+    "deprecated": false,
+    "firstVersion": "3.5.0",
+    "label": "cloud,file",
+    "javaType": "org.apache.camel.component.minio.MinioComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-minio",
+    "version": "3.5.0-SNAPSHOT",
+    "scheme": "minio",
+    "extendsScheme": "",
+    "syntax": "minio:\/\/bucketName",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "autoCreateBucket": { "kind": "property", "displayName": "Auto Create Bucket", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the autocreation of the bucket if bucket name not exist." },
+    "bucketName": { "kind": "property", "displayName": "Bucket Name", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Name of the bucket. The bucket will be created if it doesn't already exists." },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.minio.MinioConfiguration", "deprecated": false, "secret": false, "description": "The component configuration" },
+    "customHttpClient": { "kind": "property", "displayName": "Custom Http Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "okhttp3.OkHttpClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set custom HTTP client for authenticated access." },
+    "endpoint": { "kind": "property", "displayName": "Endpoint", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Endpoint can be an URL, domain name, IPv4 address or IPv6 address." },
+    "minioClient": { "kind": "property", "displayName": "Minio Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.MinioClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Reference to a Minio Client object in the registry." },
+    "objectLock": { "kind": "property", "displayName": "Object Lock", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set when creating new bucket." },
+    "policy": { "kind": "property", "displayName": "Policy", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The policy for this queue to set in the method." },
+    "proxyPort": { "kind": "property", "displayName": "Proxy Port", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "TCP\/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS." },
+    "region": { "kind": "property", "displayName": "Region", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id()" },
+    "secure": { "kind": "property", "displayName": "Secure", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Flag to indicate to use secure connection to minio service or not." },
+    "serverSideEncryption": { "kind": "property", "displayName": "Server Side Encryption", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryption", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption." },
+    "serverSideEncryptionCustomerKey": { "kind": "property", "displayName": "Server Side Encryption Customer Key", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryptionCustomerKey", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption for source object while copy\/move objects." },
+    "autoCloseBody": { "kind": "property", "displayName": "Auto Close Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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." },
+    "bypassGovernanceMode": { "kind": "property", "displayName": "Bypass Governance Mode", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set this flag if you want to bypassGovernanceMode when deleting a particular object." },
+    "deleteAfterRead": { "kind": "property", "displayName": "Delete After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header." },
+    "delimiter": { "kind": "property", "displayName": "Delimiter", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in." },
+    "destinationBucketName": { "kind": "property", "displayName": "Destination Bucket Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source bucket name." },
+    "destinationObjectName": { "kind": "property", "displayName": "Destination Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source object name." },
+    "includeBody": { "kind": "property", "displayName": "Include Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "includeFolders": { "kind": "property", "displayName": "Include Folders", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to set include folders." },
+    "includeUserMetadata": { "kind": "property", "displayName": "Include User Metadata", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with user meta data." },
+    "includeVersions": { "kind": "property", "displayName": "Include Versions", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with versioning." },
+    "length": { "kind": "property", "displayName": "Length", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Number of bytes of object data from offset." },
+    "matchETag": { "kind": "property", "displayName": "Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set match ETag parameter for get object(s)." },
+    "modifiedSince": { "kind": "property", "displayName": "Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set modified since parameter for get object(s)." },
+    "moveAfterRead": { "kind": "property", "displayName": "Move After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved." },
+    "notMatchETag": { "kind": "property", "displayName": "Not Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set not match ETag parameter for get object(s)." },
+    "objectName": { "kind": "property", "displayName": "Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "To get the object from the bucket with the given object name." },
+    "offset": { "kind": "property", "displayName": "Offset", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Start byte position of object data." },
+    "prefix": { "kind": "property", "displayName": "Prefix", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Object name starts with prefix." },
+    "recursive": { "kind": "property", "displayName": "Recursive", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "List recursively than directory structure emulation." },
+    "startAfter": { "kind": "property", "displayName": "Start After", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "list objects in bucket after this object name." },
+    "unModifiedSince": { "kind": "property", "displayName": "Un Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set un modified since parameter for get object(s)." },
+    "useVersion1": { "kind": "property", "displayName": "Use Version1", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "when true, version 1 of REST API is used." },
+    "versionId": { "kind": "property", "displayName": "Version Id", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set specific version_ID of a object when deleting the object." },
+    "deleteAfterWrite": { "kind": "property", "displayName": "Delete After Write", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete file object after the Minio file has been uploaded." },
+    "keyName": { "kind": "property", "displayName": "Key Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the key name for an element in the bucket through endpoint parameter." },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the 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." },
+    "operation": { "kind": "property", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.minio.MinioOperations", "enum": [ "copyObject", "listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", "getObject", "getObjectRange" ], "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The operation to do in case the user don't want to do only an upload." },
+    "pojoRequest": { "kind": "property", "displayName": "Pojo Request", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not." },
+    "storageClass": { "kind": "property", "displayName": "Storage Class", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The storage class to set in the request." },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access." },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access." }
+  },
+  "properties": {
+    "bucketName": { "kind": "path", "displayName": "Bucket Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Bucket name" },
+    "autoCreateBucket": { "kind": "parameter", "displayName": "Auto Create Bucket", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the autocreation of the bucket if bucket name not exist." },
+    "customHttpClient": { "kind": "parameter", "displayName": "Custom Http Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "okhttp3.OkHttpClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set custom HTTP client for authenticated access." },
+    "endpoint": { "kind": "parameter", "displayName": "Endpoint", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Endpoint can be an URL, domain name, IPv4 address or IPv6 address." },
+    "minioClient": { "kind": "parameter", "displayName": "Minio Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.MinioClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Reference to a Minio Client object in the registry." },
+    "objectLock": { "kind": "parameter", "displayName": "Object Lock", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set when creating new bucket." },
+    "policy": { "kind": "parameter", "displayName": "Policy", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The policy for this queue to set in the method." },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "TCP\/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS." },
+    "region": { "kind": "parameter", "displayName": "Region", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id()" },
+    "secure": { "kind": "parameter", "displayName": "Secure", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Flag to indicate to use secure connection to minio service or not." },
+    "serverSideEncryption": { "kind": "parameter", "displayName": "Server Side Encryption", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryption", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption." },
+    "serverSideEncryptionCustomerKey": { "kind": "parameter", "displayName": "Server Side Encryption Customer Key", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryptionCustomerKey", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption for source object while copy\/move objects." },
+    "autoCloseBody": { "kind": "parameter", "displayName": "Auto Close Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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." },
+    "bypassGovernanceMode": { "kind": "parameter", "displayName": "Bypass Governance Mode", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set this flag if you want to bypassGovernanceMode when deleting a particular object." },
+    "deleteAfterRead": { "kind": "parameter", "displayName": "Delete After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header." },
+    "delimiter": { "kind": "parameter", "displayName": "Delimiter", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in." },
+    "destinationBucketName": { "kind": "parameter", "displayName": "Destination Bucket Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source bucket name." },
+    "destinationObjectName": { "kind": "parameter", "displayName": "Destination Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source object name." },
+    "includeBody": { "kind": "parameter", "displayName": "Include Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "includeFolders": { "kind": "parameter", "displayName": "Include Folders", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to set include folders." },
+    "includeUserMetadata": { "kind": "parameter", "displayName": "Include User Metadata", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with user meta data." },
+    "includeVersions": { "kind": "parameter", "displayName": "Include Versions", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with versioning." },
+    "length": { "kind": "parameter", "displayName": "Length", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Number of bytes of object data from offset." },
+    "matchETag": { "kind": "parameter", "displayName": "Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set match ETag parameter for get object(s)." },
+    "maxConnections": { "kind": "parameter", "displayName": "Max Connections", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "defaultValue": "60", "description": "Set the maxConnections parameter in the minio client configuration" },
+    "maxMessagesPerPoll": { "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "defaultValue": "10", "description": "Gets the maximum number of messages as a limit to poll at each polling. Gets the maximum number of messages as a limit to poll at each polling. The default value is 10. Use 0 or a negative number to set it as unlimited." },
+    "modifiedSince": { "kind": "parameter", "displayName": "Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set modified since parameter for get object(s)." },
+    "moveAfterRead": { "kind": "parameter", "displayName": "Move After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved." },
+    "notMatchETag": { "kind": "parameter", "displayName": "Not Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set not match ETag parameter for get object(s)." },
+    "objectName": { "kind": "parameter", "displayName": "Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "To get the object from the bucket with the given object name." },
+    "offset": { "kind": "parameter", "displayName": "Offset", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Start byte position of object data." },
+    "prefix": { "kind": "parameter", "displayName": "Prefix", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Object name starts with prefix." },
+    "recursive": { "kind": "parameter", "displayName": "Recursive", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "List recursively than directory structure emulation." },
+    "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
+    "startAfter": { "kind": "parameter", "displayName": "Start After", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "list objects in bucket after this object name." },
+    "unModifiedSince": { "kind": "parameter", "displayName": "Un Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set un modified since parameter for get object(s)." },
+    "useVersion1": { "kind": "parameter", "displayName": "Use Version1", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "when true, version 1 of REST API is used." },
+    "versionId": { "kind": "parameter", "displayName": "Version Id", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set specific version_ID of a object when deleting the object." },
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "secret": false, "description": "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." },
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "pollStrategy": { "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel." },
+    "deleteAfterWrite": { "kind": "parameter", "displayName": "Delete After Write", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete file object after the Minio file has been uploaded." },
+    "keyName": { "kind": "parameter", "displayName": "Key Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the key name for an element in the bucket through endpoint parameter." },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the 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." },
+    "operation": { "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.minio.MinioOperations", "enum": [ "copyObject", "listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", "getObject", "getObjectRange" ], "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The operation to do in case the user don't want to do only an upload." },
+    "pojoRequest": { "kind": "parameter", "displayName": "Pojo Request", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not." },
+    "storageClass": { "kind": "parameter", "displayName": "Storage Class", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The storage class to set in the request." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "backoffErrorThreshold": { "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." },
+    "backoffIdleThreshold": { "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." },
+    "backoffMultiplier": { "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and\/or backoffErrorThreshold must also be configured." },
+    "delay": { "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": "500", "description": "Milliseconds before the next poll." },
+    "greedy": { "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." },
+    "initialDelay": { "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": "1000", "description": "Milliseconds before the first poll starts." },
+    "repeatCount": { "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": "0", "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." },
+    "runLoggingLevel": { "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the logging level for that." },
+    "scheduledExecutorService": { "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." },
+    "scheduler": { "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "none", "spring", "quartz" ], "deprecated": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component" },
+    "schedulerProperties": { "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler." },
+    "startScheduler": { "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "description": "Whether the scheduler should be auto started." },
+    "timeUnit": { "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." },
+    "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access." },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access." }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
index be76b29..c93fffd 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
@@ -329,6 +329,7 @@
 milo-server-component
 mime-multipart-dataformat
 mina-component
+minio-component
 mllp-component
 mock-component
 mongodb-component
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/minio-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/minio-component.adoc
new file mode 100644
index 0000000..354accf
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/minio-component.adoc
@@ -0,0 +1,506 @@
+[[minio-component]]
+= Minio Storage Service Component
+:docTitle: Minio Storage Service
+:artifactId: camel-minio
+:description: Store and retrieve objects from Minio Storage Service using Minio SDK.
+:since: 3.5
+:supportLevel: Preview
+:component-header: Both producer and consumer are supported
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The Minio component supports storing and retrieving objects from/to
+https://min.io/[Minio] service.
+
+Prerequisites
+
+You must have valid credentials for authorized access to the buckets/folders. More information is available at
+https://min.io/[Minio].
+
+== URI Format
+
+[source,java]
+------------------------------
+minio://bucketName[?options]
+------------------------------
+
+The bucket will be created if it doesn't already exist. +
+You can append query options to the URI in the following format,
+?options=value&option2=value&...
+
+For example in order to read file `hello.txt` from the bucket `helloBucket`, use the following snippet:
+
+[source,java]
+--------------------------------------------------------------------------------
+from("minio://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt")
+  .to("file:/var/downloaded");
+--------------------------------------------------------------------------------
+
+== URI Options
+
+// component options: START
+The Minio Storage Service component supports 46 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *autoCreateBucket* (common) | Setting the autocreation of the bucket if bucket name not exist. | true | boolean
+| *bucketName* (common) | Name of the bucket. The bucket will be created if it doesn't already exists. | false | String
+| *configuration* (common) | The component configuration |  | MinioConfiguration
+| *customHttpClient* (common) | Set custom HTTP client for authenticated access. |  | OkHttpClient
+| *endpoint* (common) | Endpoint can be an URL, domain name, IPv4 address or IPv6 address. |  | String
+| *minioClient* (common) | Reference to a Minio Client object in the registry. |  | MinioClient
+| *objectLock* (common) | Set when creating new bucket. | false | boolean
+| *policy* (common) | The policy for this queue to set in the method. |  | String
+| *proxyPort* (common) | TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS. |  | Integer
+| *region* (common) | The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id() |  | String
+| *secure* (common) | Flag to indicate to use secure connection to minio service or not. | false | boolean
+| *serverSideEncryption* (common) | Server-side encryption. |  | ServerSideEncryption
+| *serverSideEncryptionCustomer Key* (common) | Server-side encryption for source object while copy/move objects. |  | ServerSideEncryptionCustomerKey
+| *autoCloseBody* (consumer) | If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *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
+| *bypassGovernanceMode* (consumer) | Set this flag if you want to bypassGovernanceMode when deleting a particular object. | false | boolean
+| *deleteAfterRead* (consumer) | Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header. | true | boolean
+| *delimiter* (consumer) | The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in. |  | String
+| *destinationBucketName* (consumer) | Source bucket name. |  | String
+| *destinationObjectName* (consumer) | Source object name. |  | String
+| *includeBody* (consumer) | If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *includeFolders* (consumer) | The flag which is used in the ListObjectsRequest to set include folders. | false | boolean
+| *includeUserMetadata* (consumer) | The flag which is used in the ListObjectsRequest to get objects with user meta data. | false | boolean
+| *includeVersions* (consumer) | The flag which is used in the ListObjectsRequest to get objects with versioning. | false | boolean
+| *length* (consumer) | Number of bytes of object data from offset. |  | long
+| *matchETag* (consumer) | Set match ETag parameter for get object(s). |  | String
+| *modifiedSince* (consumer) | Set modified since parameter for get object(s). |  | ZonedDateTime
+| *moveAfterRead* (consumer) | Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved. | false | boolean
+| *notMatchETag* (consumer) | Set not match ETag parameter for get object(s). |  | String
+| *objectName* (consumer) | To get the object from the bucket with the given object name. |  | String
+| *offset* (consumer) | Start byte position of object data. |  | long
+| *prefix* (consumer) | Object name starts with prefix. |  | String
+| *recursive* (consumer) | List recursively than directory structure emulation. | false | boolean
+| *startAfter* (consumer) | list objects in bucket after this object name. |  | String
+| *unModifiedSince* (consumer) | Set un modified since parameter for get object(s). |  | ZonedDateTime
+| *useVersion1* (consumer) | when true, version 1 of REST API is used. | false | boolean
+| *versionId* (consumer) | Set specific version_ID of a object when deleting the object. |  | String
+| *deleteAfterWrite* (producer) | Delete file object after the Minio file has been uploaded. | false | boolean
+| *keyName* (producer) | Setting the key name for an element in the bucket through endpoint parameter. |  | String
+| *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 starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
+| *operation* (producer) | The operation to do in case the user don't want to do only an upload. The value can be one of: copyObject, listObjects, deleteObject, deleteObjects, deleteBucket, listBuckets, getObject, getObjectRange |  | MinioOperations
+| *pojoRequest* (producer) | If we want to use a POJO request as body or not. | false | boolean
+| *storageClass* (producer) | The storage class to set in the request. |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *accessKey* (security) | Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access. |  | String
+| *secretKey* (security) | Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access. |  | String
+|===
+// component options: END
+
+// endpoint options: START
+The Minio Storage Service endpoint is configured using URI syntax:
+
+----
+minio://bucketName
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bucketName* | *Required* Bucket name |  | String
+|===
+
+
+=== Query Parameters (65 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *autoCreateBucket* (common) | Setting the autocreation of the bucket if bucket name not exist. | true | boolean
+| *customHttpClient* (common) | Set custom HTTP client for authenticated access. |  | OkHttpClient
+| *endpoint* (common) | Endpoint can be an URL, domain name, IPv4 address or IPv6 address. |  | String
+| *minioClient* (common) | Reference to a Minio Client object in the registry. |  | MinioClient
+| *objectLock* (common) | Set when creating new bucket. | false | boolean
+| *policy* (common) | The policy for this queue to set in the method. |  | String
+| *proxyPort* (common) | TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS. |  | Integer
+| *region* (common) | The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id() |  | String
+| *secure* (common) | Flag to indicate to use secure connection to minio service or not. | false | boolean
+| *serverSideEncryption* (common) | Server-side encryption. |  | ServerSideEncryption
+| *serverSideEncryptionCustomer Key* (common) | Server-side encryption for source object while copy/move objects. |  | ServerSideEncryptionCustomerKey
+| *autoCloseBody* (consumer) | If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *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
+| *bypassGovernanceMode* (consumer) | Set this flag if you want to bypassGovernanceMode when deleting a particular object. | false | boolean
+| *deleteAfterRead* (consumer) | Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header. | true | boolean
+| *delimiter* (consumer) | The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in. |  | String
+| *destinationBucketName* (consumer) | Source bucket name. |  | String
+| *destinationObjectName* (consumer) | Source object name. |  | String
+| *includeBody* (consumer) | If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *includeFolders* (consumer) | The flag which is used in the ListObjectsRequest to set include folders. | false | boolean
+| *includeUserMetadata* (consumer) | The flag which is used in the ListObjectsRequest to get objects with user meta data. | false | boolean
+| *includeVersions* (consumer) | The flag which is used in the ListObjectsRequest to get objects with versioning. | false | boolean
+| *length* (consumer) | Number of bytes of object data from offset. |  | long
+| *matchETag* (consumer) | Set match ETag parameter for get object(s). |  | String
+| *maxConnections* (consumer) | Set the maxConnections parameter in the minio client configuration | 60 | int
+| *maxMessagesPerPoll* (consumer) | Gets the maximum number of messages as a limit to poll at each polling. Gets the maximum number of messages as a limit to poll at each polling. The default value is 10. Use 0 or a negative number to set it as unlimited. | 10 | int
+| *modifiedSince* (consumer) | Set modified since parameter for get object(s). |  | ZonedDateTime
+| *moveAfterRead* (consumer) | Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved. | false | boolean
+| *notMatchETag* (consumer) | Set not match ETag parameter for get object(s). |  | String
+| *objectName* (consumer) | To get the object from the bucket with the given object name. |  | String
+| *offset* (consumer) | Start byte position of object data. |  | long
+| *prefix* (consumer) | Object name starts with prefix. |  | String
+| *recursive* (consumer) | List recursively than directory structure emulation. | false | boolean
+| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
+| *startAfter* (consumer) | list objects in bucket after this object name. |  | String
+| *unModifiedSince* (consumer) | Set un modified since parameter for get object(s). |  | ZonedDateTime
+| *useVersion1* (consumer) | when true, version 1 of REST API is used. | false | boolean
+| *versionId* (consumer) | Set specific version_ID of a object when deleting the object. |  | String
+| *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. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
+| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
+| *deleteAfterWrite* (producer) | Delete file object after the Minio file has been uploaded. | false | boolean
+| *keyName* (producer) | Setting the key name for an element in the bucket through endpoint parameter. |  | String
+| *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 starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
+| *operation* (producer) | The operation to do in case the user don't want to do only an upload. The value can be one of: copyObject, listObjects, deleteObject, deleteObjects, deleteBucket, listBuckets, getObject, getObjectRange |  | MinioOperations
+| *pojoRequest* (producer) | If we want to use a POJO request as body or not. | false | boolean
+| *storageClass* (producer) | The storage class to set in the request. |  | String
+| *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
+| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
+| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
+| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
+| *delay* (scheduler) | Milliseconds before the next poll. | 500 | long
+| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
+| *initialDelay* (scheduler) | Milliseconds before the first poll starts. | 1000 | long
+| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
+| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | TRACE | LoggingLevel
+| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
+| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component. The value can be one of: none, spring, quartz | none | String
+| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
+| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
+| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. The value can be one of: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS | MILLISECONDS | TimeUnit
+| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
+| *accessKey* (security) | Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access. |  | String
+| *secretKey* (security) | Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access. |  | String
+|===
+// endpoint options: END
+
+Required Minio component options
+
+You have to provide the minioClient in the
+Registry or your accessKey and secretKey to access
+the https://min.io/[Minio].
+
+== Batch Consumer
+
+This component implements the Batch Consumer.
+
+This allows you for instance to know how many messages exists in this
+batch and for instance let the Aggregator
+aggregate this number of messages.
+
+== Usage
+
+=== Message headers evaluated by the Minio producer
+
+[width="100%",cols="10%,10%,80%",options="header"]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelMinioBucketName` |`String` |The bucket Name which this object will be stored or which will be used for the current operation
+
+|`CamelMinioDestinationBucketName` |`String` |The bucket Destination Name which will be used for the current operation
+
+|`CamelMinioContentLength` |`Long` |The content length of this object.
+
+|`CamelMinioContentType` |`String` |The content type of this object.
+
+|`CamelMinioContentControl` |`String` |The content control of this object.
+
+|`CamelMinioContentDisposition` |`String` |The content disposition of this object.
+
+|`CamelMinioContentEncoding` |`String` |The content encoding of this object.
+
+|`CamelMinioContentMD5` |`String` |The md5 checksum of this object.
+
+|`CamelMinioDestinationObjectName` |`String` |The Destination key which will be used for the current operation
+
+|`CamelMinioObjectName` |`String` |The key under which this object will be stored or which will be used for the current operation
+
+|`CamelMinioLastModified` |`java.util.Date` |The last modified timestamp of this object.
+
+|`CamelMinioOperation` |`String` |The operation to perform. Permitted values are copyObject, deleteObject, deleteObjects, listBuckets, deleteBucket, downloadLink, listObjects
+
+|`CamelMinioStorageClass` |`String` |The storage class of this object.
+
+|`CamelMinioCannedAcl` |`String` |The canned acl that will be applied to the object. see
+`com.amazonaws.services.s3.model.CannedAccessControlList` for allowed
+values.
+
+//|`CamelMinioHeaders` |`Map<String,String>` |Support to get or set custom objectMetadata headers.
+
+|`CamelMinioServerSideEncryption` |String |Sets the server-side encryption algorithm when encrypting
+the object using Minio-managed keys. For example use AES256.
+
+|`CamelMinioVersionId` |`String` |The version Id of the object to be stored or returned from the current operation
+|=======================================================================
+
+=== Message headers set by the Minio producer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+|`CamelMinioETag` |`String` |The ETag value for the newly uploaded object.
+
+|`CamelMinioVersionId` |`String` |The *optional* version ID of the newly uploaded object.
+
+//|`CamelMinioDownloadLinkExpiration` | `String` | The expiration (millis) of URL download link. The link will be stored into *CamelMinioDownloadLink* response header.
+
+|=======================================================================
+
+=== Message headers set by the Minio consumer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelMinioObjectName` |`String` |The key under which this object is stored.
+
+|`CamelMinioBucketName` |`String` |The name of the bucket in which this object is contained.
+
+|`CamelMinioETag` |`String` |The hex encoded 128-bit MD5 digest of the associated object according to
+RFC 1864. This data is used as an integrity check to verify that the
+data received by the caller is the same data that was sent by Minio
+
+|`CamelMinioLastModified` |`Date` |The value of the Last-Modified header, indicating the date and time at
+which Minio last recorded a modification to the associated object.
+
+|`CamelMinioVersionId` |`String` |The version ID of the associated Minio object if available. Version
+IDs are only assigned to objects when an object is uploaded to an Minio bucket that has object versioning enabled.
+
+|`CamelMinioContentType` |`String` |The Content-Type HTTP header, which indicates the type of content stored
+in the associated object. The value of this header is a standard MIME
+type.
+
+|`CamelMinioContentMD5` |`String` |The base64 encoded 128-bit MD5 digest of the associated object (content
+- not including headers) according to RFC 1864. This data is used as a
+message integrity check to verify that the data received by Minio is
+the same data that the caller sent.
+
+|`CamelMinioContentLength` |`Long` |The Content-Length HTTP header indicating the size of the associated
+object in bytes.
+
+|`CamelMinioContentEncoding` |`String` |The *optional* Content-Encoding HTTP header specifying what content
+encodings have been applied to the object and what decoding mechanisms
+must be applied in order to obtain the media-type referenced by the
+Content-Type field.
+
+|`CamelMinioContentDisposition` |`String` |The *optional* Content-Disposition HTTP header, which specifies
+presentational information such as the recommended filename for the
+object to be saved as.
+
+|`CamelMinioContentControl` |`String` |The *optional* Cache-Control HTTP header which allows the user to
+specify caching behavior along the HTTP request/reply chain.
+
+|`CamelMinioServerSideEncryption` |String |The server-side encryption algorithm when encrypting the
+object using Minio-managed keys.
+|=======================================================================
+
+=== Minio Producer operations
+
+Camel-Minio component provides the following operation on the producer side:
+
+- copyObject
+- deleteObject
+- deleteObjects
+- listBuckets
+- deleteBucket
+- listObjects
+- getObject (this will return a MinioObject instance)
+- getObjectRange (this will return a MinioObject instance)
+
+=== Advanced Minio configuration
+
+If your Camel Application is running behind a firewall or if you need to
+have more control over the `MinioClient` instance configuration, you can
+create your own instance and refer to it in your Camel minio component configuration:
+
+[source,java]
+--------------------------------------------------------------------------------
+from("minio://MyBucket?minioClient=#client&delay=5000&maxMessagesPerPoll=5")
+.to("mock:result");
+--------------------------------------------------------------------------------
+
+=== Minio Producer Operation examples
+
+- CopyObject: this operation copy an object from one bucket to a different one
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.DESTINATION_BUCKET_NAME, "camelDestinationBucket");
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+          exchange.getIn().setHeader(MinioConstants.DESTINATION_OBJECT_NAME, "camelDestinationKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=copyObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will copy the object with the name expressed in the header camelDestinationKey to the camelDestinationBucket bucket, from the bucket mycamelbucket.
+
+- DeleteObject: this operation deletes an object from a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will delete the object camelKey from the bucket mycamelbucket.
+
+- ListBuckets: this operation list the buckets for this account in this region
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=listBuckets")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will list the buckets for this account
+
+- DeleteBucket: this operation delete the bucket specified as URI parameter or header
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteBucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will delete the bucket mycamelbucket
+
+- ListObjects: this operation list object in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=listObjects")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will list the objects in the mycamelbucket bucket
+
+- GetObject: this operation get a single object in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will return an MinioObject instance related to the camelKey object in mycamelbucket bucket.
+
+- GetObjectRange: this operation get a single object range in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+          exchange.getIn().setHeader(MinioConstants.OFFSET, "0");
+          exchange.getIn().setHeader(MinioConstants.LENGTH, "9");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObjectRange")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will return an MinioObject instance related to the camelKey object in mycamelbucket bucket, containing bytes from 0 to 9.
+
+== Bucket Autocreation
+
+With the option `autoCreateBucket` users are able to avoid the autocreation of a Minio Bucket in case it doesn't exist. The default for this option is `true`.
+If set to false any operation on a not-existent bucket in Minio won't be successful, and an error will be returned.
+
+== Automatic detection of Minio client in registry
+
+The component is capable of detecting the presence of a Minio bean into the registry.
+If it's the only instance of that type it will be used as client, and you won't have to define it as uri parameter, like the example above.
+This may be really useful for smarter configuration of the endpoint.
+
+== Moving stuff between a bucket and another bucket
+
+Some users like to consume stuff from a bucket and move the content in a different one without using the copyObject feature of this component.
+If this is case for you, don't forget to remove the bucketName header from the incoming exchange of the consumer, otherwise the file will always be overwritten on the same
+original bucket.
+
+== MoveAfterRead consumer option
+
+In addition to deleteAfterRead it has been added another option, moveAfterRead. With this option enabled the consumed object will be moved to a target destinationBucket instead of being only deleted.
+This will require specifying the destinationBucket option. As example:
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("minio://mycamelbucket?minioClient=#minioClient&moveAfterRead=true&destinationBucketName=myothercamelbucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+In this case the objects consumed will be moved to myothercamelbucket bucket and deleted from the original one (because of deleteAfterRead set to true as default).
+
+== Using a POJO as body
+
+Sometimes build a Minio Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
+In Minio there are multiple operations you can submit, as an example for List brokers request, you can do something like:
+
+------------------------------------------------------------------------------------------------------
+from("direct:minio")
+     .setBody(ListObjectsArgs.builder()
+                    .bucket(bucketName)
+                    .recursive(getConfiguration().isRecursive())))
+     .to("minio://test?minioClient=#minioClient&operation=listObjects&pojoRequest=true")
+------------------------------------------------------------------------------------------------------
+
+In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.
+
+== Dependencies
+
+Maven users will need to add the following dependency to their pom.xml.
+
+*pom.xml*
+
+[source,xml]
+---------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-minio</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `$\{camel-version\}` must be replaced by the actual version of Camel.
diff --git a/components/camel-minio/pom.xml b/components/camel-minio/pom.xml
new file mode 100644
index 0000000..0b06826
--- /dev/null
+++ b/components/camel-minio/pom.xml
@@ -0,0 +1,147 @@
+<?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:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         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.5.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-minio</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: MinIO</name>
+    <description>A Camel MinIO cloud storage server Component</description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <camel.osgi.export.pkg>org.apache.camel.component.minio.*</camel.osgi.export.pkg>
+        <camel.osgi.export.service>
+            org.apache.camel.spi.ComponentResolver;component=minio
+        </camel.osgi.export.service>
+    </properties>
+
+    <dependencies>
+        <!-- camel -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>${minio-version}</version>
+        </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>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+
+            <!-- generate camel meta-data -->
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-component-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>initialize</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                            <goal>add-resource</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/generated/java</source>
+                            </sources>
+                            <resources>
+                                <resource>
+                                    <directory>src/generated/resources</directory>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/components/camel-minio/src/generated/java/org/apache/camel/component/minio/MinioComponentConfigurer.java b/components/camel-minio/src/generated/java/org/apache/camel/component/minio/MinioComponentConfigurer.java
new file mode 100644
index 0000000..15288fe
--- /dev/null
+++ b/components/camel-minio/src/generated/java/org/apache/camel/component/minio/MinioComponentConfigurer.java
@@ -0,0 +1,255 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.minio;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class MinioComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    private org.apache.camel.component.minio.MinioConfiguration getOrCreateConfiguration(MinioComponent target) {
+        if (target.getConfiguration() == null) {
+            target.setConfiguration(new org.apache.camel.component.minio.MinioConfiguration());
+        }
+        return target.getConfiguration();
+    }
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        MinioComponent target = (MinioComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": getOrCreateConfiguration(target).setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "autoclosebody":
+        case "autoCloseBody": getOrCreateConfiguration(target).setAutoCloseBody(property(camelContext, boolean.class, value)); return true;
+        case "autocreatebucket":
+        case "autoCreateBucket": getOrCreateConfiguration(target).setAutoCreateBucket(property(camelContext, boolean.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "bucketname":
+        case "bucketName": getOrCreateConfiguration(target).setBucketName(property(camelContext, java.lang.String.class, value)); return true;
+        case "bypassgovernancemode":
+        case "bypassGovernanceMode": getOrCreateConfiguration(target).setBypassGovernanceMode(property(camelContext, boolean.class, value)); return true;
+        case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.minio.MinioConfiguration.class, value)); return true;
+        case "customhttpclient":
+        case "customHttpClient": getOrCreateConfiguration(target).setCustomHttpClient(property(camelContext, okhttp3.OkHttpClient.class, value)); return true;
+        case "deleteafterread":
+        case "deleteAfterRead": getOrCreateConfiguration(target).setDeleteAfterRead(property(camelContext, boolean.class, value)); return true;
+        case "deleteafterwrite":
+        case "deleteAfterWrite": getOrCreateConfiguration(target).setDeleteAfterWrite(property(camelContext, boolean.class, value)); return true;
+        case "delimiter": getOrCreateConfiguration(target).setDelimiter(property(camelContext, java.lang.String.class, value)); return true;
+        case "destinationbucketname":
+        case "destinationBucketName": getOrCreateConfiguration(target).setDestinationBucketName(property(camelContext, java.lang.String.class, value)); return true;
+        case "destinationobjectname":
+        case "destinationObjectName": getOrCreateConfiguration(target).setDestinationObjectName(property(camelContext, java.lang.String.class, value)); return true;
+        case "endpoint": getOrCreateConfiguration(target).setEndpoint(property(camelContext, java.lang.String.class, value)); return true;
+        case "includebody":
+        case "includeBody": getOrCreateConfiguration(target).setIncludeBody(property(camelContext, boolean.class, value)); return true;
+        case "includefolders":
+        case "includeFolders": getOrCreateConfiguration(target).setIncludeFolders(property(camelContext, boolean.class, value)); return true;
+        case "includeusermetadata":
+        case "includeUserMetadata": getOrCreateConfiguration(target).setIncludeUserMetadata(property(camelContext, boolean.class, value)); return true;
+        case "includeversions":
+        case "includeVersions": getOrCreateConfiguration(target).setIncludeVersions(property(camelContext, boolean.class, value)); return true;
+        case "keyname":
+        case "keyName": getOrCreateConfiguration(target).setKeyName(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "length": getOrCreateConfiguration(target).setLength(property(camelContext, long.class, value)); return true;
+        case "matchetag":
+        case "matchETag": getOrCreateConfiguration(target).setMatchETag(property(camelContext, java.lang.String.class, value)); return true;
+        case "minioclient":
+        case "minioClient": getOrCreateConfiguration(target).setMinioClient(property(camelContext, io.minio.MinioClient.class, value)); return true;
+        case "modifiedsince":
+        case "modifiedSince": getOrCreateConfiguration(target).setModifiedSince(property(camelContext, java.time.ZonedDateTime.class, value)); return true;
+        case "moveafterread":
+        case "moveAfterRead": getOrCreateConfiguration(target).setMoveAfterRead(property(camelContext, boolean.class, value)); return true;
+        case "notmatchetag":
+        case "notMatchETag": getOrCreateConfiguration(target).setNotMatchETag(property(camelContext, java.lang.String.class, value)); return true;
+        case "objectlock":
+        case "objectLock": getOrCreateConfiguration(target).setObjectLock(property(camelContext, boolean.class, value)); return true;
+        case "objectname":
+        case "objectName": getOrCreateConfiguration(target).setObjectName(property(camelContext, java.lang.String.class, value)); return true;
+        case "offset": getOrCreateConfiguration(target).setOffset(property(camelContext, long.class, value)); return true;
+        case "operation": getOrCreateConfiguration(target).setOperation(property(camelContext, org.apache.camel.component.minio.MinioOperations.class, value)); return true;
+        case "pojorequest":
+        case "pojoRequest": getOrCreateConfiguration(target).setPojoRequest(property(camelContext, boolean.class, value)); return true;
+        case "policy": getOrCreateConfiguration(target).setPolicy(property(camelContext, java.lang.String.class, value)); return true;
+        case "prefix": getOrCreateConfiguration(target).setPrefix(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": getOrCreateConfiguration(target).setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "recursive": getOrCreateConfiguration(target).setRecursive(property(camelContext, boolean.class, value)); return true;
+        case "region": getOrCreateConfiguration(target).setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": getOrCreateConfiguration(target).setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "secure": getOrCreateConfiguration(target).setSecure(property(camelContext, boolean.class, value)); return true;
+        case "serversideencryption":
+        case "serverSideEncryption": getOrCreateConfiguration(target).setServerSideEncryption(property(camelContext, io.minio.ServerSideEncryption.class, value)); return true;
+        case "serversideencryptioncustomerkey":
+        case "serverSideEncryptionCustomerKey": getOrCreateConfiguration(target).setServerSideEncryptionCustomerKey(property(camelContext, io.minio.ServerSideEncryptionCustomerKey.class, value)); return true;
+        case "startafter":
+        case "startAfter": getOrCreateConfiguration(target).setStartAfter(property(camelContext, java.lang.String.class, value)); return true;
+        case "storageclass":
+        case "storageClass": getOrCreateConfiguration(target).setStorageClass(property(camelContext, java.lang.String.class, value)); return true;
+        case "unmodifiedsince":
+        case "unModifiedSince": getOrCreateConfiguration(target).setUnModifiedSince(property(camelContext, java.time.ZonedDateTime.class, value)); return true;
+        case "useversion1":
+        case "useVersion1": getOrCreateConfiguration(target).setUseVersion1(property(camelContext, boolean.class, value)); return true;
+        case "versionid":
+        case "versionId": getOrCreateConfiguration(target).setVersionId(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        Map<String, Object> answer = new CaseInsensitiveMap();
+        answer.put("accessKey", java.lang.String.class);
+        answer.put("autoCloseBody", boolean.class);
+        answer.put("autoCreateBucket", boolean.class);
+        answer.put("basicPropertyBinding", boolean.class);
+        answer.put("bridgeErrorHandler", boolean.class);
+        answer.put("bucketName", java.lang.String.class);
+        answer.put("bypassGovernanceMode", boolean.class);
+        answer.put("configuration", org.apache.camel.component.minio.MinioConfiguration.class);
+        answer.put("customHttpClient", okhttp3.OkHttpClient.class);
+        answer.put("deleteAfterRead", boolean.class);
+        answer.put("deleteAfterWrite", boolean.class);
+        answer.put("delimiter", java.lang.String.class);
+        answer.put("destinationBucketName", java.lang.String.class);
+        answer.put("destinationObjectName", java.lang.String.class);
+        answer.put("endpoint", java.lang.String.class);
+        answer.put("includeBody", boolean.class);
+        answer.put("includeFolders", boolean.class);
+        answer.put("includeUserMetadata", boolean.class);
+        answer.put("includeVersions", boolean.class);
+        answer.put("keyName", java.lang.String.class);
+        answer.put("lazyStartProducer", boolean.class);
+        answer.put("length", long.class);
+        answer.put("matchETag", java.lang.String.class);
+        answer.put("minioClient", io.minio.MinioClient.class);
+        answer.put("modifiedSince", java.time.ZonedDateTime.class);
+        answer.put("moveAfterRead", boolean.class);
+        answer.put("notMatchETag", java.lang.String.class);
+        answer.put("objectLock", boolean.class);
+        answer.put("objectName", java.lang.String.class);
+        answer.put("offset", long.class);
+        answer.put("operation", org.apache.camel.component.minio.MinioOperations.class);
+        answer.put("pojoRequest", boolean.class);
+        answer.put("policy", java.lang.String.class);
+        answer.put("prefix", java.lang.String.class);
+        answer.put("proxyPort", java.lang.Integer.class);
+        answer.put("recursive", boolean.class);
+        answer.put("region", java.lang.String.class);
+        answer.put("secretKey", java.lang.String.class);
+        answer.put("secure", boolean.class);
+        answer.put("serverSideEncryption", io.minio.ServerSideEncryption.class);
+        answer.put("serverSideEncryptionCustomerKey", io.minio.ServerSideEncryptionCustomerKey.class);
+        answer.put("startAfter", java.lang.String.class);
+        answer.put("storageClass", java.lang.String.class);
+        answer.put("unModifiedSince", java.time.ZonedDateTime.class);
+        answer.put("useVersion1", boolean.class);
+        answer.put("versionId", java.lang.String.class);
+        return answer;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        MinioComponent target = (MinioComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": return getOrCreateConfiguration(target).getAccessKey();
+        case "autoclosebody":
+        case "autoCloseBody": return getOrCreateConfiguration(target).isAutoCloseBody();
+        case "autocreatebucket":
+        case "autoCreateBucket": return getOrCreateConfiguration(target).isAutoCreateBucket();
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "bucketname":
+        case "bucketName": return getOrCreateConfiguration(target).getBucketName();
+        case "bypassgovernancemode":
+        case "bypassGovernanceMode": return getOrCreateConfiguration(target).isBypassGovernanceMode();
+        case "configuration": return target.getConfiguration();
+        case "customhttpclient":
+        case "customHttpClient": return getOrCreateConfiguration(target).getCustomHttpClient();
+        case "deleteafterread":
+        case "deleteAfterRead": return getOrCreateConfiguration(target).isDeleteAfterRead();
+        case "deleteafterwrite":
+        case "deleteAfterWrite": return getOrCreateConfiguration(target).isDeleteAfterWrite();
+        case "delimiter": return getOrCreateConfiguration(target).getDelimiter();
+        case "destinationbucketname":
+        case "destinationBucketName": return getOrCreateConfiguration(target).getDestinationBucketName();
+        case "destinationobjectname":
+        case "destinationObjectName": return getOrCreateConfiguration(target).getDestinationObjectName();
+        case "endpoint": return getOrCreateConfiguration(target).getEndpoint();
+        case "includebody":
+        case "includeBody": return getOrCreateConfiguration(target).isIncludeBody();
+        case "includefolders":
+        case "includeFolders": return getOrCreateConfiguration(target).isIncludeFolders();
+        case "includeusermetadata":
+        case "includeUserMetadata": return getOrCreateConfiguration(target).isIncludeUserMetadata();
+        case "includeversions":
+        case "includeVersions": return getOrCreateConfiguration(target).isIncludeVersions();
+        case "keyname":
+        case "keyName": return getOrCreateConfiguration(target).getKeyName();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "length": return getOrCreateConfiguration(target).getLength();
+        case "matchetag":
+        case "matchETag": return getOrCreateConfiguration(target).getMatchETag();
+        case "minioclient":
+        case "minioClient": return getOrCreateConfiguration(target).getMinioClient();
+        case "modifiedsince":
+        case "modifiedSince": return getOrCreateConfiguration(target).getModifiedSince();
+        case "moveafterread":
+        case "moveAfterRead": return getOrCreateConfiguration(target).isMoveAfterRead();
+        case "notmatchetag":
+        case "notMatchETag": return getOrCreateConfiguration(target).getNotMatchETag();
+        case "objectlock":
+        case "objectLock": return getOrCreateConfiguration(target).isObjectLock();
+        case "objectname":
+        case "objectName": return getOrCreateConfiguration(target).getObjectName();
+        case "offset": return getOrCreateConfiguration(target).getOffset();
+        case "operation": return getOrCreateConfiguration(target).getOperation();
+        case "pojorequest":
+        case "pojoRequest": return getOrCreateConfiguration(target).isPojoRequest();
+        case "policy": return getOrCreateConfiguration(target).getPolicy();
+        case "prefix": return getOrCreateConfiguration(target).getPrefix();
+        case "proxyport":
+        case "proxyPort": return getOrCreateConfiguration(target).getProxyPort();
+        case "recursive": return getOrCreateConfiguration(target).isRecursive();
+        case "region": return getOrCreateConfiguration(target).getRegion();
+        case "secretkey":
+        case "secretKey": return getOrCreateConfiguration(target).getSecretKey();
+        case "secure": return getOrCreateConfiguration(target).isSecure();
+        case "serversideencryption":
+        case "serverSideEncryption": return getOrCreateConfiguration(target).getServerSideEncryption();
+        case "serversideencryptioncustomerkey":
+        case "serverSideEncryptionCustomerKey": return getOrCreateConfiguration(target).getServerSideEncryptionCustomerKey();
+        case "startafter":
+        case "startAfter": return getOrCreateConfiguration(target).getStartAfter();
+        case "storageclass":
+        case "storageClass": return getOrCreateConfiguration(target).getStorageClass();
+        case "unmodifiedsince":
+        case "unModifiedSince": return getOrCreateConfiguration(target).getUnModifiedSince();
+        case "useversion1":
+        case "useVersion1": return getOrCreateConfiguration(target).isUseVersion1();
+        case "versionid":
+        case "versionId": return getOrCreateConfiguration(target).getVersionId();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-minio/src/generated/java/org/apache/camel/component/minio/MinioEndpointConfigurer.java b/components/camel-minio/src/generated/java/org/apache/camel/component/minio/MinioEndpointConfigurer.java
new file mode 100644
index 0000000..d76cb8c
--- /dev/null
+++ b/components/camel-minio/src/generated/java/org/apache/camel/component/minio/MinioEndpointConfigurer.java
@@ -0,0 +1,337 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.minio;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class MinioEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        MinioEndpoint target = (MinioEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": target.getConfiguration().setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "autoclosebody":
+        case "autoCloseBody": target.getConfiguration().setAutoCloseBody(property(camelContext, boolean.class, value)); return true;
+        case "autocreatebucket":
+        case "autoCreateBucket": target.getConfiguration().setAutoCreateBucket(property(camelContext, boolean.class, value)); return true;
+        case "backofferrorthreshold":
+        case "backoffErrorThreshold": target.setBackoffErrorThreshold(property(camelContext, int.class, value)); return true;
+        case "backoffidlethreshold":
+        case "backoffIdleThreshold": target.setBackoffIdleThreshold(property(camelContext, int.class, value)); return true;
+        case "backoffmultiplier":
+        case "backoffMultiplier": target.setBackoffMultiplier(property(camelContext, int.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "bypassgovernancemode":
+        case "bypassGovernanceMode": target.getConfiguration().setBypassGovernanceMode(property(camelContext, boolean.class, value)); return true;
+        case "customhttpclient":
+        case "customHttpClient": target.getConfiguration().setCustomHttpClient(property(camelContext, okhttp3.OkHttpClient.class, value)); return true;
+        case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "deleteafterread":
+        case "deleteAfterRead": target.getConfiguration().setDeleteAfterRead(property(camelContext, boolean.class, value)); return true;
+        case "deleteafterwrite":
+        case "deleteAfterWrite": target.getConfiguration().setDeleteAfterWrite(property(camelContext, boolean.class, value)); return true;
+        case "delimiter": target.getConfiguration().setDelimiter(property(camelContext, java.lang.String.class, value)); return true;
+        case "destinationbucketname":
+        case "destinationBucketName": target.getConfiguration().setDestinationBucketName(property(camelContext, java.lang.String.class, value)); return true;
+        case "destinationobjectname":
+        case "destinationObjectName": target.getConfiguration().setDestinationObjectName(property(camelContext, java.lang.String.class, value)); return true;
+        case "endpoint": target.getConfiguration().setEndpoint(property(camelContext, java.lang.String.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "greedy": target.setGreedy(property(camelContext, boolean.class, value)); return true;
+        case "includebody":
+        case "includeBody": target.getConfiguration().setIncludeBody(property(camelContext, boolean.class, value)); return true;
+        case "includefolders":
+        case "includeFolders": target.getConfiguration().setIncludeFolders(property(camelContext, boolean.class, value)); return true;
+        case "includeusermetadata":
+        case "includeUserMetadata": target.getConfiguration().setIncludeUserMetadata(property(camelContext, boolean.class, value)); return true;
+        case "includeversions":
+        case "includeVersions": target.getConfiguration().setIncludeVersions(property(camelContext, boolean.class, value)); return true;
+        case "initialdelay":
+        case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyname":
+        case "keyName": target.getConfiguration().setKeyName(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "length": target.getConfiguration().setLength(property(camelContext, long.class, value)); return true;
+        case "matchetag":
+        case "matchETag": target.getConfiguration().setMatchETag(property(camelContext, java.lang.String.class, value)); return true;
+        case "maxconnections":
+        case "maxConnections": target.setMaxConnections(property(camelContext, int.class, value)); return true;
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": target.setMaxMessagesPerPoll(property(camelContext, int.class, value)); return true;
+        case "minioclient":
+        case "minioClient": target.getConfiguration().setMinioClient(property(camelContext, io.minio.MinioClient.class, value)); return true;
+        case "modifiedsince":
+        case "modifiedSince": target.getConfiguration().setModifiedSince(property(camelContext, java.time.ZonedDateTime.class, value)); return true;
+        case "moveafterread":
+        case "moveAfterRead": target.getConfiguration().setMoveAfterRead(property(camelContext, boolean.class, value)); return true;
+        case "notmatchetag":
+        case "notMatchETag": target.getConfiguration().setNotMatchETag(property(camelContext, java.lang.String.class, value)); return true;
+        case "objectlock":
+        case "objectLock": target.getConfiguration().setObjectLock(property(camelContext, boolean.class, value)); return true;
+        case "objectname":
+        case "objectName": target.getConfiguration().setObjectName(property(camelContext, java.lang.String.class, value)); return true;
+        case "offset": target.getConfiguration().setOffset(property(camelContext, long.class, value)); return true;
+        case "operation": target.getConfiguration().setOperation(property(camelContext, org.apache.camel.component.minio.MinioOperations.class, value)); return true;
+        case "pojorequest":
+        case "pojoRequest": target.getConfiguration().setPojoRequest(property(camelContext, boolean.class, value)); return true;
+        case "policy": target.getConfiguration().setPolicy(property(camelContext, java.lang.String.class, value)); return true;
+        case "pollstrategy":
+        case "pollStrategy": target.setPollStrategy(property(camelContext, org.apache.camel.spi.PollingConsumerPollStrategy.class, value)); return true;
+        case "prefix": target.getConfiguration().setPrefix(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": target.getConfiguration().setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "recursive": target.getConfiguration().setRecursive(property(camelContext, boolean.class, value)); return true;
+        case "region": target.getConfiguration().setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "repeatcount":
+        case "repeatCount": target.setRepeatCount(property(camelContext, long.class, value)); return true;
+        case "runlogginglevel":
+        case "runLoggingLevel": target.setRunLoggingLevel(property(camelContext, org.apache.camel.LoggingLevel.class, value)); return true;
+        case "scheduledexecutorservice":
+        case "scheduledExecutorService": target.setScheduledExecutorService(property(camelContext, java.util.concurrent.ScheduledExecutorService.class, value)); return true;
+        case "scheduler": target.setScheduler(property(camelContext, java.lang.String.class, value)); return true;
+        case "schedulerproperties":
+        case "schedulerProperties": target.setSchedulerProperties(property(camelContext, java.util.Map.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.getConfiguration().setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "secure": target.getConfiguration().setSecure(property(camelContext, boolean.class, value)); return true;
+        case "sendemptymessagewhenidle":
+        case "sendEmptyMessageWhenIdle": target.setSendEmptyMessageWhenIdle(property(camelContext, boolean.class, value)); return true;
+        case "serversideencryption":
+        case "serverSideEncryption": target.getConfiguration().setServerSideEncryption(property(camelContext, io.minio.ServerSideEncryption.class, value)); return true;
+        case "serversideencryptioncustomerkey":
+        case "serverSideEncryptionCustomerKey": target.getConfiguration().setServerSideEncryptionCustomerKey(property(camelContext, io.minio.ServerSideEncryptionCustomerKey.class, value)); return true;
+        case "startafter":
+        case "startAfter": target.getConfiguration().setStartAfter(property(camelContext, java.lang.String.class, value)); return true;
+        case "startscheduler":
+        case "startScheduler": target.setStartScheduler(property(camelContext, boolean.class, value)); return true;
+        case "storageclass":
+        case "storageClass": target.getConfiguration().setStorageClass(property(camelContext, java.lang.String.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "timeunit":
+        case "timeUnit": target.setTimeUnit(property(camelContext, java.util.concurrent.TimeUnit.class, value)); return true;
+        case "unmodifiedsince":
+        case "unModifiedSince": target.getConfiguration().setUnModifiedSince(property(camelContext, java.time.ZonedDateTime.class, value)); return true;
+        case "usefixeddelay":
+        case "useFixedDelay": target.setUseFixedDelay(property(camelContext, boolean.class, value)); return true;
+        case "useversion1":
+        case "useVersion1": target.getConfiguration().setUseVersion1(property(camelContext, boolean.class, value)); return true;
+        case "versionid":
+        case "versionId": target.getConfiguration().setVersionId(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        Map<String, Object> answer = new CaseInsensitiveMap();
+        answer.put("accessKey", java.lang.String.class);
+        answer.put("autoCloseBody", boolean.class);
+        answer.put("autoCreateBucket", boolean.class);
+        answer.put("backoffErrorThreshold", int.class);
+        answer.put("backoffIdleThreshold", int.class);
+        answer.put("backoffMultiplier", int.class);
+        answer.put("basicPropertyBinding", boolean.class);
+        answer.put("bridgeErrorHandler", boolean.class);
+        answer.put("bypassGovernanceMode", boolean.class);
+        answer.put("customHttpClient", okhttp3.OkHttpClient.class);
+        answer.put("delay", long.class);
+        answer.put("deleteAfterRead", boolean.class);
+        answer.put("deleteAfterWrite", boolean.class);
+        answer.put("delimiter", java.lang.String.class);
+        answer.put("destinationBucketName", java.lang.String.class);
+        answer.put("destinationObjectName", java.lang.String.class);
+        answer.put("endpoint", java.lang.String.class);
+        answer.put("exceptionHandler", org.apache.camel.spi.ExceptionHandler.class);
+        answer.put("exchangePattern", org.apache.camel.ExchangePattern.class);
+        answer.put("greedy", boolean.class);
+        answer.put("includeBody", boolean.class);
+        answer.put("includeFolders", boolean.class);
+        answer.put("includeUserMetadata", boolean.class);
+        answer.put("includeVersions", boolean.class);
+        answer.put("initialDelay", long.class);
+        answer.put("keyName", java.lang.String.class);
+        answer.put("lazyStartProducer", boolean.class);
+        answer.put("length", long.class);
+        answer.put("matchETag", java.lang.String.class);
+        answer.put("maxConnections", int.class);
+        answer.put("maxMessagesPerPoll", int.class);
+        answer.put("minioClient", io.minio.MinioClient.class);
+        answer.put("modifiedSince", java.time.ZonedDateTime.class);
+        answer.put("moveAfterRead", boolean.class);
+        answer.put("notMatchETag", java.lang.String.class);
+        answer.put("objectLock", boolean.class);
+        answer.put("objectName", java.lang.String.class);
+        answer.put("offset", long.class);
+        answer.put("operation", org.apache.camel.component.minio.MinioOperations.class);
+        answer.put("pojoRequest", boolean.class);
+        answer.put("policy", java.lang.String.class);
+        answer.put("pollStrategy", org.apache.camel.spi.PollingConsumerPollStrategy.class);
+        answer.put("prefix", java.lang.String.class);
+        answer.put("proxyPort", java.lang.Integer.class);
+        answer.put("recursive", boolean.class);
+        answer.put("region", java.lang.String.class);
+        answer.put("repeatCount", long.class);
+        answer.put("runLoggingLevel", org.apache.camel.LoggingLevel.class);
+        answer.put("scheduledExecutorService", java.util.concurrent.ScheduledExecutorService.class);
+        answer.put("scheduler", java.lang.String.class);
+        answer.put("schedulerProperties", java.util.Map.class);
+        answer.put("secretKey", java.lang.String.class);
+        answer.put("secure", boolean.class);
+        answer.put("sendEmptyMessageWhenIdle", boolean.class);
+        answer.put("serverSideEncryption", io.minio.ServerSideEncryption.class);
+        answer.put("serverSideEncryptionCustomerKey", io.minio.ServerSideEncryptionCustomerKey.class);
+        answer.put("startAfter", java.lang.String.class);
+        answer.put("startScheduler", boolean.class);
+        answer.put("storageClass", java.lang.String.class);
+        answer.put("synchronous", boolean.class);
+        answer.put("timeUnit", java.util.concurrent.TimeUnit.class);
+        answer.put("unModifiedSince", java.time.ZonedDateTime.class);
+        answer.put("useFixedDelay", boolean.class);
+        answer.put("useVersion1", boolean.class);
+        answer.put("versionId", java.lang.String.class);
+        return answer;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        MinioEndpoint target = (MinioEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": return target.getConfiguration().getAccessKey();
+        case "autoclosebody":
+        case "autoCloseBody": return target.getConfiguration().isAutoCloseBody();
+        case "autocreatebucket":
+        case "autoCreateBucket": return target.getConfiguration().isAutoCreateBucket();
+        case "backofferrorthreshold":
+        case "backoffErrorThreshold": return target.getBackoffErrorThreshold();
+        case "backoffidlethreshold":
+        case "backoffIdleThreshold": return target.getBackoffIdleThreshold();
+        case "backoffmultiplier":
+        case "backoffMultiplier": return target.getBackoffMultiplier();
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "bypassgovernancemode":
+        case "bypassGovernanceMode": return target.getConfiguration().isBypassGovernanceMode();
+        case "customhttpclient":
+        case "customHttpClient": return target.getConfiguration().getCustomHttpClient();
+        case "delay": return target.getDelay();
+        case "deleteafterread":
+        case "deleteAfterRead": return target.getConfiguration().isDeleteAfterRead();
+        case "deleteafterwrite":
+        case "deleteAfterWrite": return target.getConfiguration().isDeleteAfterWrite();
+        case "delimiter": return target.getConfiguration().getDelimiter();
+        case "destinationbucketname":
+        case "destinationBucketName": return target.getConfiguration().getDestinationBucketName();
+        case "destinationobjectname":
+        case "destinationObjectName": return target.getConfiguration().getDestinationObjectName();
+        case "endpoint": return target.getConfiguration().getEndpoint();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "greedy": return target.isGreedy();
+        case "includebody":
+        case "includeBody": return target.getConfiguration().isIncludeBody();
+        case "includefolders":
+        case "includeFolders": return target.getConfiguration().isIncludeFolders();
+        case "includeusermetadata":
+        case "includeUserMetadata": return target.getConfiguration().isIncludeUserMetadata();
+        case "includeversions":
+        case "includeVersions": return target.getConfiguration().isIncludeVersions();
+        case "initialdelay":
+        case "initialDelay": return target.getInitialDelay();
+        case "keyname":
+        case "keyName": return target.getConfiguration().getKeyName();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "length": return target.getConfiguration().getLength();
+        case "matchetag":
+        case "matchETag": return target.getConfiguration().getMatchETag();
+        case "maxconnections":
+        case "maxConnections": return target.getMaxConnections();
+        case "maxmessagesperpoll":
+        case "maxMessagesPerPoll": return target.getMaxMessagesPerPoll();
+        case "minioclient":
+        case "minioClient": return target.getConfiguration().getMinioClient();
+        case "modifiedsince":
+        case "modifiedSince": return target.getConfiguration().getModifiedSince();
+        case "moveafterread":
+        case "moveAfterRead": return target.getConfiguration().isMoveAfterRead();
+        case "notmatchetag":
+        case "notMatchETag": return target.getConfiguration().getNotMatchETag();
+        case "objectlock":
+        case "objectLock": return target.getConfiguration().isObjectLock();
+        case "objectname":
+        case "objectName": return target.getConfiguration().getObjectName();
+        case "offset": return target.getConfiguration().getOffset();
+        case "operation": return target.getConfiguration().getOperation();
+        case "pojorequest":
+        case "pojoRequest": return target.getConfiguration().isPojoRequest();
+        case "policy": return target.getConfiguration().getPolicy();
+        case "pollstrategy":
+        case "pollStrategy": return target.getPollStrategy();
+        case "prefix": return target.getConfiguration().getPrefix();
+        case "proxyport":
+        case "proxyPort": return target.getConfiguration().getProxyPort();
+        case "recursive": return target.getConfiguration().isRecursive();
+        case "region": return target.getConfiguration().getRegion();
+        case "repeatcount":
+        case "repeatCount": return target.getRepeatCount();
+        case "runlogginglevel":
+        case "runLoggingLevel": return target.getRunLoggingLevel();
+        case "scheduledexecutorservice":
+        case "scheduledExecutorService": return target.getScheduledExecutorService();
+        case "scheduler": return target.getScheduler();
+        case "schedulerproperties":
+        case "schedulerProperties": return target.getSchedulerProperties();
+        case "secretkey":
+        case "secretKey": return target.getConfiguration().getSecretKey();
+        case "secure": return target.getConfiguration().isSecure();
+        case "sendemptymessagewhenidle":
+        case "sendEmptyMessageWhenIdle": return target.isSendEmptyMessageWhenIdle();
+        case "serversideencryption":
+        case "serverSideEncryption": return target.getConfiguration().getServerSideEncryption();
+        case "serversideencryptioncustomerkey":
+        case "serverSideEncryptionCustomerKey": return target.getConfiguration().getServerSideEncryptionCustomerKey();
+        case "startafter":
+        case "startAfter": return target.getConfiguration().getStartAfter();
+        case "startscheduler":
+        case "startScheduler": return target.isStartScheduler();
+        case "storageclass":
+        case "storageClass": return target.getConfiguration().getStorageClass();
+        case "synchronous": return target.isSynchronous();
+        case "timeunit":
+        case "timeUnit": return target.getTimeUnit();
+        case "unmodifiedsince":
+        case "unModifiedSince": return target.getConfiguration().getUnModifiedSince();
+        case "usefixeddelay":
+        case "useFixedDelay": return target.isUseFixedDelay();
+        case "useversion1":
+        case "useVersion1": return target.getConfiguration().isUseVersion1();
+        case "versionid":
+        case "versionId": return target.getConfiguration().getVersionId();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..17efe33
--- /dev/null
+++ b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=minio
+groupId=org.apache.camel
+artifactId=camel-minio
+version=3.5.0-SNAPSHOT
+projectName=Camel :: MinIO
+projectDescription=A Camel MinIO cloud storage server Component
diff --git a/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/component/minio b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/component/minio
new file mode 100644
index 0000000..df28dc9
--- /dev/null
+++ b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/component/minio
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.minio.MinioComponent
diff --git a/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/configurer/minio-component b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/configurer/minio-component
new file mode 100644
index 0000000..0e0f7bb
--- /dev/null
+++ b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/configurer/minio-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.minio.MinioComponentConfigurer
diff --git a/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/configurer/minio-endpoint b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/configurer/minio-endpoint
new file mode 100644
index 0000000..2108d29
--- /dev/null
+++ b/components/camel-minio/src/generated/resources/META-INF/services/org/apache/camel/configurer/minio-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.minio.MinioEndpointConfigurer
diff --git a/components/camel-minio/src/generated/resources/org/apache/camel/component/minio/minio.json b/components/camel-minio/src/generated/resources/org/apache/camel/component/minio/minio.json
new file mode 100644
index 0000000..f976da7
--- /dev/null
+++ b/components/camel-minio/src/generated/resources/org/apache/camel/component/minio/minio.json
@@ -0,0 +1,139 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "minio",
+    "title": "Minio Storage Service",
+    "description": "Store and retrieve objects from Minio Storage Service using Minio SDK.",
+    "deprecated": false,
+    "firstVersion": "3.5.0",
+    "label": "cloud,file",
+    "javaType": "org.apache.camel.component.minio.MinioComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-minio",
+    "version": "3.5.0-SNAPSHOT",
+    "scheme": "minio",
+    "extendsScheme": "",
+    "syntax": "minio:\/\/bucketName",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "autoCreateBucket": { "kind": "property", "displayName": "Auto Create Bucket", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the autocreation of the bucket if bucket name not exist." },
+    "bucketName": { "kind": "property", "displayName": "Bucket Name", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Name of the bucket. The bucket will be created if it doesn't already exists." },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.minio.MinioConfiguration", "deprecated": false, "secret": false, "description": "The component configuration" },
+    "customHttpClient": { "kind": "property", "displayName": "Custom Http Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "okhttp3.OkHttpClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set custom HTTP client for authenticated access." },
+    "endpoint": { "kind": "property", "displayName": "Endpoint", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Endpoint can be an URL, domain name, IPv4 address or IPv6 address." },
+    "minioClient": { "kind": "property", "displayName": "Minio Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.MinioClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Reference to a Minio Client object in the registry." },
+    "objectLock": { "kind": "property", "displayName": "Object Lock", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set when creating new bucket." },
+    "policy": { "kind": "property", "displayName": "Policy", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The policy for this queue to set in the method." },
+    "proxyPort": { "kind": "property", "displayName": "Proxy Port", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "TCP\/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS." },
+    "region": { "kind": "property", "displayName": "Region", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id()" },
+    "secure": { "kind": "property", "displayName": "Secure", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Flag to indicate to use secure connection to minio service or not." },
+    "serverSideEncryption": { "kind": "property", "displayName": "Server Side Encryption", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryption", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption." },
+    "serverSideEncryptionCustomerKey": { "kind": "property", "displayName": "Server Side Encryption Customer Key", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryptionCustomerKey", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption for source object while copy\/move objects." },
+    "autoCloseBody": { "kind": "property", "displayName": "Auto Close Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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." },
+    "bypassGovernanceMode": { "kind": "property", "displayName": "Bypass Governance Mode", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set this flag if you want to bypassGovernanceMode when deleting a particular object." },
+    "deleteAfterRead": { "kind": "property", "displayName": "Delete After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header." },
+    "delimiter": { "kind": "property", "displayName": "Delimiter", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in." },
+    "destinationBucketName": { "kind": "property", "displayName": "Destination Bucket Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source bucket name." },
+    "destinationObjectName": { "kind": "property", "displayName": "Destination Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source object name." },
+    "includeBody": { "kind": "property", "displayName": "Include Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "includeFolders": { "kind": "property", "displayName": "Include Folders", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to set include folders." },
+    "includeUserMetadata": { "kind": "property", "displayName": "Include User Metadata", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with user meta data." },
+    "includeVersions": { "kind": "property", "displayName": "Include Versions", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with versioning." },
+    "length": { "kind": "property", "displayName": "Length", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Number of bytes of object data from offset." },
+    "matchETag": { "kind": "property", "displayName": "Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set match ETag parameter for get object(s)." },
+    "modifiedSince": { "kind": "property", "displayName": "Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set modified since parameter for get object(s)." },
+    "moveAfterRead": { "kind": "property", "displayName": "Move After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved." },
+    "notMatchETag": { "kind": "property", "displayName": "Not Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set not match ETag parameter for get object(s)." },
+    "objectName": { "kind": "property", "displayName": "Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "To get the object from the bucket with the given object name." },
+    "offset": { "kind": "property", "displayName": "Offset", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Start byte position of object data." },
+    "prefix": { "kind": "property", "displayName": "Prefix", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Object name starts with prefix." },
+    "recursive": { "kind": "property", "displayName": "Recursive", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "List recursively than directory structure emulation." },
+    "startAfter": { "kind": "property", "displayName": "Start After", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "list objects in bucket after this object name." },
+    "unModifiedSince": { "kind": "property", "displayName": "Un Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set un modified since parameter for get object(s)." },
+    "useVersion1": { "kind": "property", "displayName": "Use Version1", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "when true, version 1 of REST API is used." },
+    "versionId": { "kind": "property", "displayName": "Version Id", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set specific version_ID of a object when deleting the object." },
+    "deleteAfterWrite": { "kind": "property", "displayName": "Delete After Write", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete file object after the Minio file has been uploaded." },
+    "keyName": { "kind": "property", "displayName": "Key Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the key name for an element in the bucket through endpoint parameter." },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the 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." },
+    "operation": { "kind": "property", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.minio.MinioOperations", "enum": [ "copyObject", "listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", "getObject", "getObjectRange" ], "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The operation to do in case the user don't want to do only an upload." },
+    "pojoRequest": { "kind": "property", "displayName": "Pojo Request", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not." },
+    "storageClass": { "kind": "property", "displayName": "Storage Class", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The storage class to set in the request." },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access." },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access." }
+  },
+  "properties": {
+    "bucketName": { "kind": "path", "displayName": "Bucket Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Bucket name" },
+    "autoCreateBucket": { "kind": "parameter", "displayName": "Auto Create Bucket", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the autocreation of the bucket if bucket name not exist." },
+    "customHttpClient": { "kind": "parameter", "displayName": "Custom Http Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "okhttp3.OkHttpClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set custom HTTP client for authenticated access." },
+    "endpoint": { "kind": "parameter", "displayName": "Endpoint", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Endpoint can be an URL, domain name, IPv4 address or IPv6 address." },
+    "minioClient": { "kind": "parameter", "displayName": "Minio Client", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.MinioClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Reference to a Minio Client object in the registry." },
+    "objectLock": { "kind": "parameter", "displayName": "Object Lock", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set when creating new bucket." },
+    "policy": { "kind": "parameter", "displayName": "Policy", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The policy for this queue to set in the method." },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "TCP\/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS." },
+    "region": { "kind": "parameter", "displayName": "Region", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id()" },
+    "secure": { "kind": "parameter", "displayName": "Secure", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Flag to indicate to use secure connection to minio service or not." },
+    "serverSideEncryption": { "kind": "parameter", "displayName": "Server Side Encryption", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryption", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption." },
+    "serverSideEncryptionCustomerKey": { "kind": "parameter", "displayName": "Server Side Encryption Customer Key", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "io.minio.ServerSideEncryptionCustomerKey", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Server-side encryption for source object while copy\/move objects." },
+    "autoCloseBody": { "kind": "parameter", "displayName": "Auto Close Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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." },
+    "bypassGovernanceMode": { "kind": "parameter", "displayName": "Bypass Governance Mode", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set this flag if you want to bypassGovernanceMode when deleting a particular object." },
+    "deleteAfterRead": { "kind": "parameter", "displayName": "Delete After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header." },
+    "delimiter": { "kind": "parameter", "displayName": "Delimiter", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in." },
+    "destinationBucketName": { "kind": "parameter", "displayName": "Destination Bucket Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source bucket name." },
+    "destinationObjectName": { "kind": "parameter", "displayName": "Destination Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Source object name." },
+    "includeBody": { "kind": "parameter", "displayName": "Include Body", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically." },
+    "includeFolders": { "kind": "parameter", "displayName": "Include Folders", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to set include folders." },
+    "includeUserMetadata": { "kind": "parameter", "displayName": "Include User Metadata", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with user meta data." },
+    "includeVersions": { "kind": "parameter", "displayName": "Include Versions", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The flag which is used in the ListObjectsRequest to get objects with versioning." },
+    "length": { "kind": "parameter", "displayName": "Length", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Number of bytes of object data from offset." },
+    "matchETag": { "kind": "parameter", "displayName": "Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set match ETag parameter for get object(s)." },
+    "maxConnections": { "kind": "parameter", "displayName": "Max Connections", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "defaultValue": "60", "description": "Set the maxConnections parameter in the minio client configuration" },
+    "maxMessagesPerPoll": { "kind": "parameter", "displayName": "Max Messages Per Poll", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "defaultValue": "10", "description": "Gets the maximum number of messages as a limit to poll at each polling. Gets the maximum number of messages as a limit to poll at each polling. The default value is 10. Use 0 or a negative number to set it as unlimited." },
+    "modifiedSince": { "kind": "parameter", "displayName": "Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set modified since parameter for get object(s)." },
+    "moveAfterRead": { "kind": "parameter", "displayName": "Move After Read", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved." },
+    "notMatchETag": { "kind": "parameter", "displayName": "Not Match ETag", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set not match ETag parameter for get object(s)." },
+    "objectName": { "kind": "parameter", "displayName": "Object Name", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "To get the object from the bucket with the given object name." },
+    "offset": { "kind": "parameter", "displayName": "Offset", "group": "consumer", "label": "consumer", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Start byte position of object data." },
+    "prefix": { "kind": "parameter", "displayName": "Prefix", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Object name starts with prefix." },
+    "recursive": { "kind": "parameter", "displayName": "Recursive", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "List recursively than directory structure emulation." },
+    "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
+    "startAfter": { "kind": "parameter", "displayName": "Start After", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "list objects in bucket after this object name." },
+    "unModifiedSince": { "kind": "parameter", "displayName": "Un Modified Since", "group": "consumer", "label": "consumer", "required": false, "type": "object", "javaType": "java.time.ZonedDateTime", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set un modified since parameter for get object(s)." },
+    "useVersion1": { "kind": "parameter", "displayName": "Use Version1", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "when true, version 1 of REST API is used." },
+    "versionId": { "kind": "parameter", "displayName": "Version Id", "group": "consumer", "label": "consumer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Set specific version_ID of a object when deleting the object." },
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "secret": false, "description": "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." },
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "pollStrategy": { "kind": "parameter", "displayName": "Poll Strategy", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.PollingConsumerPollStrategy", "deprecated": false, "secret": false, "description": "A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel." },
+    "deleteAfterWrite": { "kind": "parameter", "displayName": "Delete After Write", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Delete file object after the Minio file has been uploaded." },
+    "keyName": { "kind": "parameter", "displayName": "Key Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Setting the key name for an element in the bucket through endpoint parameter." },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the 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." },
+    "operation": { "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "producer", "required": false, "type": "object", "javaType": "org.apache.camel.component.minio.MinioOperations", "enum": [ "copyObject", "listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", "getObject", "getObjectRange" ], "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The operation to do in case the user don't want to do only an upload." },
+    "pojoRequest": { "kind": "parameter", "displayName": "Pojo Request", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "If we want to use a POJO request as body or not." },
+    "storageClass": { "kind": "parameter", "displayName": "Storage Class", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "The storage class to set in the request." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "backoffErrorThreshold": { "kind": "parameter", "displayName": "Backoff Error Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "description": "The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in." },
+    "backoffIdleThreshold": { "kind": "parameter", "displayName": "Backoff Idle Threshold", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "description": "The number of subsequent idle polls that should happen before the backoffMultipler should kick-in." },
+    "backoffMultiplier": { "kind": "parameter", "displayName": "Backoff Multiplier", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "secret": false, "description": "To let the scheduled polling consumer backoff if there has been a number of subsequent idles\/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and\/or backoffErrorThreshold must also be configured." },
+    "delay": { "kind": "parameter", "displayName": "Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": "500", "description": "Milliseconds before the next poll." },
+    "greedy": { "kind": "parameter", "displayName": "Greedy", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages." },
+    "initialDelay": { "kind": "parameter", "displayName": "Initial Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": "1000", "description": "Milliseconds before the first poll starts." },
+    "repeatCount": { "kind": "parameter", "displayName": "Repeat Count", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "secret": false, "defaultValue": "0", "description": "Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever." },
+    "runLoggingLevel": { "kind": "parameter", "displayName": "Run Logging Level", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF" ], "deprecated": false, "secret": false, "defaultValue": "TRACE", "description": "The consumer logs a start\/complete log line when it polls. This option allows you to configure the logging level for that." },
+    "scheduledExecutorService": { "kind": "parameter", "displayName": "Scheduled Executor Service", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "secret": false, "description": "Allows for configuring a custom\/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool." },
+    "scheduler": { "kind": "parameter", "displayName": "Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "none", "spring", "quartz" ], "deprecated": false, "secret": false, "defaultValue": "none", "description": "To use a cron scheduler from either camel-spring or camel-quartz component" },
+    "schedulerProperties": { "kind": "parameter", "displayName": "Scheduler Properties", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": "scheduler.", "multiValue": true, "deprecated": false, "secret": false, "description": "To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler." },
+    "startScheduler": { "kind": "parameter", "displayName": "Start Scheduler", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "description": "Whether the scheduler should be auto started." },
+    "timeUnit": { "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." },
+    "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "true", "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access." },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.minio.MinioConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access." }
+  }
+}
diff --git a/components/camel-minio/src/main/docs/minio-component.adoc b/components/camel-minio/src/main/docs/minio-component.adoc
new file mode 100644
index 0000000..354accf
--- /dev/null
+++ b/components/camel-minio/src/main/docs/minio-component.adoc
@@ -0,0 +1,506 @@
+[[minio-component]]
+= Minio Storage Service Component
+:docTitle: Minio Storage Service
+:artifactId: camel-minio
+:description: Store and retrieve objects from Minio Storage Service using Minio SDK.
+:since: 3.5
+:supportLevel: Preview
+:component-header: Both producer and consumer are supported
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The Minio component supports storing and retrieving objects from/to
+https://min.io/[Minio] service.
+
+Prerequisites
+
+You must have valid credentials for authorized access to the buckets/folders. More information is available at
+https://min.io/[Minio].
+
+== URI Format
+
+[source,java]
+------------------------------
+minio://bucketName[?options]
+------------------------------
+
+The bucket will be created if it doesn't already exist. +
+You can append query options to the URI in the following format,
+?options=value&option2=value&...
+
+For example in order to read file `hello.txt` from the bucket `helloBucket`, use the following snippet:
+
+[source,java]
+--------------------------------------------------------------------------------
+from("minio://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt")
+  .to("file:/var/downloaded");
+--------------------------------------------------------------------------------
+
+== URI Options
+
+// component options: START
+The Minio Storage Service component supports 46 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *autoCreateBucket* (common) | Setting the autocreation of the bucket if bucket name not exist. | true | boolean
+| *bucketName* (common) | Name of the bucket. The bucket will be created if it doesn't already exists. | false | String
+| *configuration* (common) | The component configuration |  | MinioConfiguration
+| *customHttpClient* (common) | Set custom HTTP client for authenticated access. |  | OkHttpClient
+| *endpoint* (common) | Endpoint can be an URL, domain name, IPv4 address or IPv6 address. |  | String
+| *minioClient* (common) | Reference to a Minio Client object in the registry. |  | MinioClient
+| *objectLock* (common) | Set when creating new bucket. | false | boolean
+| *policy* (common) | The policy for this queue to set in the method. |  | String
+| *proxyPort* (common) | TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS. |  | Integer
+| *region* (common) | The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id() |  | String
+| *secure* (common) | Flag to indicate to use secure connection to minio service or not. | false | boolean
+| *serverSideEncryption* (common) | Server-side encryption. |  | ServerSideEncryption
+| *serverSideEncryptionCustomer Key* (common) | Server-side encryption for source object while copy/move objects. |  | ServerSideEncryptionCustomerKey
+| *autoCloseBody* (consumer) | If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *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
+| *bypassGovernanceMode* (consumer) | Set this flag if you want to bypassGovernanceMode when deleting a particular object. | false | boolean
+| *deleteAfterRead* (consumer) | Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header. | true | boolean
+| *delimiter* (consumer) | The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in. |  | String
+| *destinationBucketName* (consumer) | Source bucket name. |  | String
+| *destinationObjectName* (consumer) | Source object name. |  | String
+| *includeBody* (consumer) | If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *includeFolders* (consumer) | The flag which is used in the ListObjectsRequest to set include folders. | false | boolean
+| *includeUserMetadata* (consumer) | The flag which is used in the ListObjectsRequest to get objects with user meta data. | false | boolean
+| *includeVersions* (consumer) | The flag which is used in the ListObjectsRequest to get objects with versioning. | false | boolean
+| *length* (consumer) | Number of bytes of object data from offset. |  | long
+| *matchETag* (consumer) | Set match ETag parameter for get object(s). |  | String
+| *modifiedSince* (consumer) | Set modified since parameter for get object(s). |  | ZonedDateTime
+| *moveAfterRead* (consumer) | Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved. | false | boolean
+| *notMatchETag* (consumer) | Set not match ETag parameter for get object(s). |  | String
+| *objectName* (consumer) | To get the object from the bucket with the given object name. |  | String
+| *offset* (consumer) | Start byte position of object data. |  | long
+| *prefix* (consumer) | Object name starts with prefix. |  | String
+| *recursive* (consumer) | List recursively than directory structure emulation. | false | boolean
+| *startAfter* (consumer) | list objects in bucket after this object name. |  | String
+| *unModifiedSince* (consumer) | Set un modified since parameter for get object(s). |  | ZonedDateTime
+| *useVersion1* (consumer) | when true, version 1 of REST API is used. | false | boolean
+| *versionId* (consumer) | Set specific version_ID of a object when deleting the object. |  | String
+| *deleteAfterWrite* (producer) | Delete file object after the Minio file has been uploaded. | false | boolean
+| *keyName* (producer) | Setting the key name for an element in the bucket through endpoint parameter. |  | String
+| *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 starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
+| *operation* (producer) | The operation to do in case the user don't want to do only an upload. The value can be one of: copyObject, listObjects, deleteObject, deleteObjects, deleteBucket, listBuckets, getObject, getObjectRange |  | MinioOperations
+| *pojoRequest* (producer) | If we want to use a POJO request as body or not. | false | boolean
+| *storageClass* (producer) | The storage class to set in the request. |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *accessKey* (security) | Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access. |  | String
+| *secretKey* (security) | Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access. |  | String
+|===
+// component options: END
+
+// endpoint options: START
+The Minio Storage Service endpoint is configured using URI syntax:
+
+----
+minio://bucketName
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bucketName* | *Required* Bucket name |  | String
+|===
+
+
+=== Query Parameters (65 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *autoCreateBucket* (common) | Setting the autocreation of the bucket if bucket name not exist. | true | boolean
+| *customHttpClient* (common) | Set custom HTTP client for authenticated access. |  | OkHttpClient
+| *endpoint* (common) | Endpoint can be an URL, domain name, IPv4 address or IPv6 address. |  | String
+| *minioClient* (common) | Reference to a Minio Client object in the registry. |  | MinioClient
+| *objectLock* (common) | Set when creating new bucket. | false | boolean
+| *policy* (common) | The policy for this queue to set in the method. |  | String
+| *proxyPort* (common) | TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS. |  | Integer
+| *region* (common) | The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id() |  | String
+| *secure* (common) | Flag to indicate to use secure connection to minio service or not. | false | boolean
+| *serverSideEncryption* (common) | Server-side encryption. |  | ServerSideEncryption
+| *serverSideEncryptionCustomer Key* (common) | Server-side encryption for source object while copy/move objects. |  | ServerSideEncryptionCustomerKey
+| *autoCloseBody* (consumer) | If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *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
+| *bypassGovernanceMode* (consumer) | Set this flag if you want to bypassGovernanceMode when deleting a particular object. | false | boolean
+| *deleteAfterRead* (consumer) | Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header. | true | boolean
+| *delimiter* (consumer) | The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in. |  | String
+| *destinationBucketName* (consumer) | Source bucket name. |  | String
+| *destinationObjectName* (consumer) | Source object name. |  | String
+| *includeBody* (consumer) | If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *includeFolders* (consumer) | The flag which is used in the ListObjectsRequest to set include folders. | false | boolean
+| *includeUserMetadata* (consumer) | The flag which is used in the ListObjectsRequest to get objects with user meta data. | false | boolean
+| *includeVersions* (consumer) | The flag which is used in the ListObjectsRequest to get objects with versioning. | false | boolean
+| *length* (consumer) | Number of bytes of object data from offset. |  | long
+| *matchETag* (consumer) | Set match ETag parameter for get object(s). |  | String
+| *maxConnections* (consumer) | Set the maxConnections parameter in the minio client configuration | 60 | int
+| *maxMessagesPerPoll* (consumer) | Gets the maximum number of messages as a limit to poll at each polling. Gets the maximum number of messages as a limit to poll at each polling. The default value is 10. Use 0 or a negative number to set it as unlimited. | 10 | int
+| *modifiedSince* (consumer) | Set modified since parameter for get object(s). |  | ZonedDateTime
+| *moveAfterRead* (consumer) | Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved. | false | boolean
+| *notMatchETag* (consumer) | Set not match ETag parameter for get object(s). |  | String
+| *objectName* (consumer) | To get the object from the bucket with the given object name. |  | String
+| *offset* (consumer) | Start byte position of object data. |  | long
+| *prefix* (consumer) | Object name starts with prefix. |  | String
+| *recursive* (consumer) | List recursively than directory structure emulation. | false | boolean
+| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
+| *startAfter* (consumer) | list objects in bucket after this object name. |  | String
+| *unModifiedSince* (consumer) | Set un modified since parameter for get object(s). |  | ZonedDateTime
+| *useVersion1* (consumer) | when true, version 1 of REST API is used. | false | boolean
+| *versionId* (consumer) | Set specific version_ID of a object when deleting the object. |  | String
+| *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. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
+| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
+| *deleteAfterWrite* (producer) | Delete file object after the Minio file has been uploaded. | false | boolean
+| *keyName* (producer) | Setting the key name for an element in the bucket through endpoint parameter. |  | String
+| *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 starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
+| *operation* (producer) | The operation to do in case the user don't want to do only an upload. The value can be one of: copyObject, listObjects, deleteObject, deleteObjects, deleteBucket, listBuckets, getObject, getObjectRange |  | MinioOperations
+| *pojoRequest* (producer) | If we want to use a POJO request as body or not. | false | boolean
+| *storageClass* (producer) | The storage class to set in the request. |  | String
+| *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
+| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
+| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
+| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
+| *delay* (scheduler) | Milliseconds before the next poll. | 500 | long
+| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
+| *initialDelay* (scheduler) | Milliseconds before the first poll starts. | 1000 | long
+| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
+| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | TRACE | LoggingLevel
+| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
+| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component. The value can be one of: none, spring, quartz | none | String
+| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
+| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
+| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. The value can be one of: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS | MILLISECONDS | TimeUnit
+| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
+| *accessKey* (security) | Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access. |  | String
+| *secretKey* (security) | Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access. |  | String
+|===
+// endpoint options: END
+
+Required Minio component options
+
+You have to provide the minioClient in the
+Registry or your accessKey and secretKey to access
+the https://min.io/[Minio].
+
+== Batch Consumer
+
+This component implements the Batch Consumer.
+
+This allows you for instance to know how many messages exists in this
+batch and for instance let the Aggregator
+aggregate this number of messages.
+
+== Usage
+
+=== Message headers evaluated by the Minio producer
+
+[width="100%",cols="10%,10%,80%",options="header"]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelMinioBucketName` |`String` |The bucket Name which this object will be stored or which will be used for the current operation
+
+|`CamelMinioDestinationBucketName` |`String` |The bucket Destination Name which will be used for the current operation
+
+|`CamelMinioContentLength` |`Long` |The content length of this object.
+
+|`CamelMinioContentType` |`String` |The content type of this object.
+
+|`CamelMinioContentControl` |`String` |The content control of this object.
+
+|`CamelMinioContentDisposition` |`String` |The content disposition of this object.
+
+|`CamelMinioContentEncoding` |`String` |The content encoding of this object.
+
+|`CamelMinioContentMD5` |`String` |The md5 checksum of this object.
+
+|`CamelMinioDestinationObjectName` |`String` |The Destination key which will be used for the current operation
+
+|`CamelMinioObjectName` |`String` |The key under which this object will be stored or which will be used for the current operation
+
+|`CamelMinioLastModified` |`java.util.Date` |The last modified timestamp of this object.
+
+|`CamelMinioOperation` |`String` |The operation to perform. Permitted values are copyObject, deleteObject, deleteObjects, listBuckets, deleteBucket, downloadLink, listObjects
+
+|`CamelMinioStorageClass` |`String` |The storage class of this object.
+
+|`CamelMinioCannedAcl` |`String` |The canned acl that will be applied to the object. see
+`com.amazonaws.services.s3.model.CannedAccessControlList` for allowed
+values.
+
+//|`CamelMinioHeaders` |`Map<String,String>` |Support to get or set custom objectMetadata headers.
+
+|`CamelMinioServerSideEncryption` |String |Sets the server-side encryption algorithm when encrypting
+the object using Minio-managed keys. For example use AES256.
+
+|`CamelMinioVersionId` |`String` |The version Id of the object to be stored or returned from the current operation
+|=======================================================================
+
+=== Message headers set by the Minio producer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+|`CamelMinioETag` |`String` |The ETag value for the newly uploaded object.
+
+|`CamelMinioVersionId` |`String` |The *optional* version ID of the newly uploaded object.
+
+//|`CamelMinioDownloadLinkExpiration` | `String` | The expiration (millis) of URL download link. The link will be stored into *CamelMinioDownloadLink* response header.
+
+|=======================================================================
+
+=== Message headers set by the Minio consumer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelMinioObjectName` |`String` |The key under which this object is stored.
+
+|`CamelMinioBucketName` |`String` |The name of the bucket in which this object is contained.
+
+|`CamelMinioETag` |`String` |The hex encoded 128-bit MD5 digest of the associated object according to
+RFC 1864. This data is used as an integrity check to verify that the
+data received by the caller is the same data that was sent by Minio
+
+|`CamelMinioLastModified` |`Date` |The value of the Last-Modified header, indicating the date and time at
+which Minio last recorded a modification to the associated object.
+
+|`CamelMinioVersionId` |`String` |The version ID of the associated Minio object if available. Version
+IDs are only assigned to objects when an object is uploaded to an Minio bucket that has object versioning enabled.
+
+|`CamelMinioContentType` |`String` |The Content-Type HTTP header, which indicates the type of content stored
+in the associated object. The value of this header is a standard MIME
+type.
+
+|`CamelMinioContentMD5` |`String` |The base64 encoded 128-bit MD5 digest of the associated object (content
+- not including headers) according to RFC 1864. This data is used as a
+message integrity check to verify that the data received by Minio is
+the same data that the caller sent.
+
+|`CamelMinioContentLength` |`Long` |The Content-Length HTTP header indicating the size of the associated
+object in bytes.
+
+|`CamelMinioContentEncoding` |`String` |The *optional* Content-Encoding HTTP header specifying what content
+encodings have been applied to the object and what decoding mechanisms
+must be applied in order to obtain the media-type referenced by the
+Content-Type field.
+
+|`CamelMinioContentDisposition` |`String` |The *optional* Content-Disposition HTTP header, which specifies
+presentational information such as the recommended filename for the
+object to be saved as.
+
+|`CamelMinioContentControl` |`String` |The *optional* Cache-Control HTTP header which allows the user to
+specify caching behavior along the HTTP request/reply chain.
+
+|`CamelMinioServerSideEncryption` |String |The server-side encryption algorithm when encrypting the
+object using Minio-managed keys.
+|=======================================================================
+
+=== Minio Producer operations
+
+Camel-Minio component provides the following operation on the producer side:
+
+- copyObject
+- deleteObject
+- deleteObjects
+- listBuckets
+- deleteBucket
+- listObjects
+- getObject (this will return a MinioObject instance)
+- getObjectRange (this will return a MinioObject instance)
+
+=== Advanced Minio configuration
+
+If your Camel Application is running behind a firewall or if you need to
+have more control over the `MinioClient` instance configuration, you can
+create your own instance and refer to it in your Camel minio component configuration:
+
+[source,java]
+--------------------------------------------------------------------------------
+from("minio://MyBucket?minioClient=#client&delay=5000&maxMessagesPerPoll=5")
+.to("mock:result");
+--------------------------------------------------------------------------------
+
+=== Minio Producer Operation examples
+
+- CopyObject: this operation copy an object from one bucket to a different one
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.DESTINATION_BUCKET_NAME, "camelDestinationBucket");
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+          exchange.getIn().setHeader(MinioConstants.DESTINATION_OBJECT_NAME, "camelDestinationKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=copyObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will copy the object with the name expressed in the header camelDestinationKey to the camelDestinationBucket bucket, from the bucket mycamelbucket.
+
+- DeleteObject: this operation deletes an object from a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will delete the object camelKey from the bucket mycamelbucket.
+
+- ListBuckets: this operation list the buckets for this account in this region
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=listBuckets")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will list the buckets for this account
+
+- DeleteBucket: this operation delete the bucket specified as URI parameter or header
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteBucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will delete the bucket mycamelbucket
+
+- ListObjects: this operation list object in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=listObjects")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will list the objects in the mycamelbucket bucket
+
+- GetObject: this operation get a single object in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will return an MinioObject instance related to the camelKey object in mycamelbucket bucket.
+
+- GetObjectRange: this operation get a single object range in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+          exchange.getIn().setHeader(MinioConstants.OFFSET, "0");
+          exchange.getIn().setHeader(MinioConstants.LENGTH, "9");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObjectRange")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will return an MinioObject instance related to the camelKey object in mycamelbucket bucket, containing bytes from 0 to 9.
+
+== Bucket Autocreation
+
+With the option `autoCreateBucket` users are able to avoid the autocreation of a Minio Bucket in case it doesn't exist. The default for this option is `true`.
+If set to false any operation on a not-existent bucket in Minio won't be successful, and an error will be returned.
+
+== Automatic detection of Minio client in registry
+
+The component is capable of detecting the presence of a Minio bean into the registry.
+If it's the only instance of that type it will be used as client, and you won't have to define it as uri parameter, like the example above.
+This may be really useful for smarter configuration of the endpoint.
+
+== Moving stuff between a bucket and another bucket
+
+Some users like to consume stuff from a bucket and move the content in a different one without using the copyObject feature of this component.
+If this is case for you, don't forget to remove the bucketName header from the incoming exchange of the consumer, otherwise the file will always be overwritten on the same
+original bucket.
+
+== MoveAfterRead consumer option
+
+In addition to deleteAfterRead it has been added another option, moveAfterRead. With this option enabled the consumed object will be moved to a target destinationBucket instead of being only deleted.
+This will require specifying the destinationBucket option. As example:
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("minio://mycamelbucket?minioClient=#minioClient&moveAfterRead=true&destinationBucketName=myothercamelbucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+In this case the objects consumed will be moved to myothercamelbucket bucket and deleted from the original one (because of deleteAfterRead set to true as default).
+
+== Using a POJO as body
+
+Sometimes build a Minio Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
+In Minio there are multiple operations you can submit, as an example for List brokers request, you can do something like:
+
+------------------------------------------------------------------------------------------------------
+from("direct:minio")
+     .setBody(ListObjectsArgs.builder()
+                    .bucket(bucketName)
+                    .recursive(getConfiguration().isRecursive())))
+     .to("minio://test?minioClient=#minioClient&operation=listObjects&pojoRequest=true")
+------------------------------------------------------------------------------------------------------
+
+In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.
+
+== Dependencies
+
+Maven users will need to add the following dependency to their pom.xml.
+
+*pom.xml*
+
+[source,xml]
+---------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-minio</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `$\{camel-version\}` must be replaced by the actual version of Camel.
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioChecks.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioChecks.java
new file mode 100644
index 0000000..6bd667b
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioChecks.java
@@ -0,0 +1,85 @@
+/*
+ * 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.minio;
+
+import java.time.ZonedDateTime;
+
+import io.minio.ServerSideEncryption;
+import io.minio.ServerSideEncryptionCustomerKey;
+
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+public final class MinioChecks {
+    private MinioChecks() {
+        // Prevent instantiation of this factory class.
+        throw new RuntimeException("Do not instantiate a Factory class! Refer to the class to learn how to properly use this factory implementation.");
+    }
+
+    static void checkServerSideEncryptionConfig(final MinioConfiguration configuration, final java.util.function.Consumer<ServerSideEncryption> fn) {
+        if (isNotEmpty(configuration.getServerSideEncryption())) {
+            fn.accept(configuration.getServerSideEncryption());
+        }
+    }
+
+    static void checkServerSideEncryptionCustomerKeyConfig(final MinioConfiguration configuration, final java.util.function.Consumer<ServerSideEncryptionCustomerKey> fn) {
+        if (isNotEmpty(configuration.getServerSideEncryptionCustomerKey())) {
+            fn.accept(configuration.getServerSideEncryptionCustomerKey());
+        }
+    }
+
+    static void checkOffsetConfig(final MinioConfiguration configuration, final java.util.function.Consumer<Long> fn) {
+        if (isNotEmpty(configuration.getOffset())) {
+            fn.accept(configuration.getOffset());
+        }
+    }
+
+    static void checkLengthConfig(final MinioConfiguration configuration, final java.util.function.Consumer<Long> fn) {
+        if (isNotEmpty(configuration.getLength())) {
+            fn.accept(configuration.getLength());
+        }
+    }
+
+    static void checkVersionIdConfig(final MinioConfiguration configuration, final java.util.function.Consumer<String> fn) {
+        if (isNotEmpty(configuration.getVersionId())) {
+            fn.accept(configuration.getVersionId());
+        }
+    }
+
+    static void checkMatchETagConfig(final MinioConfiguration configuration, final java.util.function.Consumer<String> fn) {
+        if (isNotEmpty(configuration.getMatchETag())) {
+            fn.accept(configuration.getMatchETag());
+        }
+    }
+
+    static void checkNotMatchETagConfig(final MinioConfiguration configuration, final java.util.function.Consumer<String> fn) {
+        if (isNotEmpty(configuration.getNotMatchETag())) {
+            fn.accept(configuration.getNotMatchETag());
+        }
+    }
+
+    static void checkModifiedSinceConfig(final MinioConfiguration configuration, final java.util.function.Consumer<ZonedDateTime> fn) {
+        if (isNotEmpty(configuration.getModifiedSince())) {
+            fn.accept(configuration.getModifiedSince());
+        }
+    }
+
+    static void checkUnModifiedSinceConfig(final MinioConfiguration configuration, final java.util.function.Consumer<ZonedDateTime> fn) {
+        if (isNotEmpty(configuration.getUnModifiedSince())) {
+            fn.accept(configuration.getUnModifiedSince());
+        }
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioComponent.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioComponent.java
new file mode 100644
index 0000000..2c7c096
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioComponent.java
@@ -0,0 +1,96 @@
+/*
+ * 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.minio;
+
+import java.util.Map;
+import java.util.Set;
+
+import io.minio.MinioClient;
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.util.ObjectHelper.isEmpty;
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+/**
+ * Represents the component that manages {@link MinioEndpoint}.
+ */
+@Component("minio")
+public class MinioComponent extends DefaultComponent {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MinioComponent.class);
+
+    @Metadata
+    private MinioConfiguration configuration = new MinioConfiguration();
+
+    public MinioComponent() {
+        this(null);
+    }
+
+    public MinioComponent(CamelContext context) {
+        super(context);
+        registerExtension(new MinioComponentVerifierExtension());
+
+    }
+
+    @Override
+    protected MinioEndpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        if (isEmpty(remaining) || remaining.trim().length() == 0) {
+            throw new IllegalArgumentException("Bucket name must be specified.");
+        }
+
+        final MinioConfiguration configuration = isNotEmpty(this.configuration) ? this.configuration.copy() : new MinioConfiguration();
+        configuration.setBucketName(remaining);
+        MinioEndpoint endpoint = new MinioEndpoint(uri, this, configuration);
+        setProperties(endpoint, parameters);
+        checkAndSetRegistryClient(configuration, endpoint);
+
+        return endpoint;
+    }
+
+    public MinioConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * The component configuration
+     */
+    public void setConfiguration(MinioConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    private void checkAndSetRegistryClient(MinioConfiguration configuration, MinioEndpoint endpoint) {
+        if (isEmpty(endpoint.getConfiguration().getMinioClient())) {
+            LOG.debug("Looking for an MinioClient instance in the registry");
+            Set<MinioClient> clients = getCamelContext().getRegistry().findByType(MinioClient.class);
+            if (clients.size() > 1) {
+                LOG.debug("Found more than one MinioClient instance in the registry");
+            } else if (clients.size() == 1) {
+                LOG.debug("Found exactly one MinioClient instance in the registry");
+                configuration.setMinioClient(clients.stream().findFirst().get());
+            } else {
+                LOG.debug("No MinioClient instance in the registry");
+            }
+        } else {
+            LOG.debug("MinioClient instance is already set at endpoint level: skipping the check in the registry");
+        }
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioComponentVerifierExtension.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioComponentVerifierExtension.java
new file mode 100644
index 0000000..cc97d5e
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioComponentVerifierExtension.java
@@ -0,0 +1,105 @@
+/*
+ * 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.minio;
+
+import java.util.Map;
+
+import io.minio.MinioClient;
+import io.minio.errors.MinioException;
+import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
+import org.apache.camel.component.extension.verifier.ResultBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorHelper;
+
+import static org.apache.camel.util.ObjectHelper.isEmpty;
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+public class MinioComponentVerifierExtension extends DefaultComponentVerifierExtension {
+
+    public MinioComponentVerifierExtension() {
+        this("minio");
+    }
+
+    public MinioComponentVerifierExtension(String scheme) {
+        super(scheme);
+    }
+
+    // *********************************
+    // Parameters validation
+    // *********************************
+
+    @Override
+    protected Result verifyParameters(Map<String, Object> parameters) {
+
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS)
+                .error(ResultErrorHelper.requiresOption("accessKey", parameters))
+                .error(ResultErrorHelper.requiresOption("secretKey", parameters))
+                .error(ResultErrorHelper.requiresOption("region", parameters));
+
+        // Validate using the catalog
+
+        super.verifyParametersAgainstCatalog(builder, parameters);
+
+        return builder.build();
+    }
+
+    // *********************************
+    // Connectivity validation
+    // *********************************
+
+    @Override
+    protected Result verifyConnectivity(Map<String, Object> parameters) {
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
+        try {
+            MinioConfiguration configuration = setProperties(new MinioConfiguration(), parameters);
+            MinioClient.Builder clientBuilderRequest = MinioClient.builder();
+
+            if (isEmpty(configuration.getEndpoint())) {
+                ResultErrorBuilder errorBuilder = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.ILLEGAL_PARAMETER, "The service endpoint has not defined");
+                return builder.error(errorBuilder.build()).build();
+            }
+
+            if (isNotEmpty(configuration.getProxyPort())) {
+                clientBuilderRequest.endpoint(
+                        configuration.getEndpoint(), configuration.getProxyPort(), configuration.isSecure());
+            } else {
+                clientBuilderRequest.endpoint(configuration.getEndpoint());
+            }
+
+            if (isNotEmpty(configuration.getRegion())) {
+                clientBuilderRequest.region(configuration.getRegion());
+            }
+
+            if (isNotEmpty(configuration.getAccessKey()) && isNotEmpty(configuration.getSecretKey())) {
+                clientBuilderRequest.credentials(configuration.getAccessKey(), configuration.getSecretKey());
+            }
+
+            MinioClient client = clientBuilderRequest.build();
+            client.listBuckets();
+        } catch (MinioException e) {
+            ResultErrorBuilder errorBuilder = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, e.getMessage())
+                    .detail("minio_exception_message", e.getMessage())
+                    .detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, e.getClass().getName())
+                    .detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, e);
+
+            builder.error(errorBuilder.build());
+        } catch (Exception e) {
+            builder.error(ResultErrorBuilder.withException(e).build());
+        }
+        return builder.build();
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConfiguration.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConfiguration.java
new file mode 100644
index 0000000..ee18fe1
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConfiguration.java
@@ -0,0 +1,623 @@
+/*
+ * 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.minio;
+
+import java.time.ZonedDateTime;
+
+import io.minio.MinioClient;
+import io.minio.ServerSideEncryption;
+import io.minio.ServerSideEncryptionCustomerKey;
+import okhttp3.OkHttpClient;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+@UriParams
+public class MinioConfiguration implements Cloneable {
+
+    @UriParam(label = "common")
+    private String endpoint;
+    @UriParam(label = "common")
+    private Integer proxyPort;
+    @UriParam(label = "common")
+    private boolean secure;
+    @UriParam(label = "common")
+    private String region;
+    @UriParam(label = "common")
+    private OkHttpClient customHttpClient;
+
+    @UriParam(label = "security", secret = true)
+    private String accessKey;
+    @UriParam(label = "security", secret = true)
+    private String secretKey;
+    @UriParam(label = "common", defaultValue = "false")
+
+    private String bucketName;
+    @UriParam(label = "common", defaultValue = "true")
+    private boolean autoCreateBucket = true;
+    @UriParam(label = "common", defaultValue = "false")
+    private boolean objectLock;
+    @UriParam(label = "common")
+    private String policy;
+    @UriParam(label = "common")
+    private ServerSideEncryptionCustomerKey serverSideEncryptionCustomerKey;
+    @UriParam(label = "common")
+    private ServerSideEncryption serverSideEncryption;
+    @UriParam(label = "common")
+    private MinioClient minioClient;
+
+    @UriParam(label = "consumer")
+    private String objectName;
+    @UriParam(label = "consumer")
+    private String delimiter;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean includeUserMetadata;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean includeVersions;
+    @UriParam(label = "consumer")
+    private String prefix;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean recursive;
+    @UriParam(label = "consumer")
+    private String startAfter;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean useVersion1;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean includeFolders;
+    @UriParam(label = "consumer")
+    private long offset;
+    @UriParam(label = "consumer")
+    private long length;
+    @UriParam(label = "consumer")
+    private String versionId;
+    @UriParam(label = "consumer")
+    private String matchETag;
+    @UriParam(label = "consumer")
+    private String notMatchETag;
+    @UriParam(label = "consumer")
+    private ZonedDateTime modifiedSince;
+    @UriParam(label = "consumer")
+    private ZonedDateTime unModifiedSince;
+    @UriParam(label = "consumer")
+    private String destinationBucketName;
+    @UriParam(label = "consumer")
+    private String destinationObjectName;
+    @UriParam(label = "consumer", defaultValue = "true")
+    private boolean deleteAfterRead = true;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean moveAfterRead;
+    @UriParam(label = "consumer", defaultValue = "false")
+    private boolean bypassGovernanceMode;
+    @UriParam(label = "consumer", defaultValue = "true")
+    private boolean includeBody = true;
+    @UriParam(label = "consumer", defaultValue = "true")
+    private boolean autoCloseBody = true;
+
+    @UriParam(label = "producer")
+    private String keyName;
+    @UriParam(label = "producer")
+    private boolean deleteAfterWrite;
+    @UriParam(label = "producer")
+    private String storageClass;
+    @UriParam(label = "producer", enums = "copyObject,listObjects,deleteObject,deleteObjects,deleteBucket,listBuckets,getObject,getObjectRange")
+    private MinioOperations operation;
+    @UriParam(label = "producer", defaultValue = "false")
+    private boolean pojoRequest;
+
+    public String getEndpoint() {
+        return endpoint;
+    }
+
+    /**
+     * Endpoint can be an URL, domain name, IPv4 address or IPv6 address.
+     */
+    public void setEndpoint(String endpoint) {
+        this.endpoint = endpoint;
+    }
+
+    public Integer getProxyPort() {
+        return proxyPort;
+    }
+
+    /**
+     * TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS.
+     */
+    public void setProxyPort(Integer proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+
+    public boolean isSecure() {
+        return secure;
+    }
+
+    /**
+     * Flag to indicate to use secure connection to minio service or not.
+     */
+    public void setSecure(boolean secure) {
+        this.secure = secure;
+    }
+
+    public String getRegion() {
+        return region;
+    }
+
+    /**
+     * The region in which Minio client needs to work. When using this parameter,
+     * the configuration will expect the lowercase name of the region (for
+     * example ap-east-1). You'll need to use the name Region.EU_WEST_1.id()
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+
+    public OkHttpClient getCustomHttpClient() {
+        return customHttpClient;
+    }
+
+    /**
+     * Set custom HTTP client for authenticated access.
+     */
+    public void setCustomHttpClient(OkHttpClient customHttpClient) {
+        this.customHttpClient = customHttpClient;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Secret Access Key or Minio Access Key.
+     * If not set camel will connect to service for anonymous access.
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Access Key Id or Minio Secret Key.
+     * If not set camel will connect to service for anonymous access.
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getBucketName() {
+        return bucketName;
+    }
+
+    /**
+     * Name of the bucket. The bucket will be created if it doesn't already
+     * exists.
+     */
+    public void setBucketName(String bucketName) {
+        this.bucketName = bucketName;
+    }
+
+    public boolean isAutoCreateBucket() {
+        return autoCreateBucket;
+    }
+
+    /**
+     * Setting the autocreation of the bucket if bucket name not exist.
+     */
+    public void setAutoCreateBucket(boolean autoCreateBucket) {
+        this.autoCreateBucket = autoCreateBucket;
+    }
+
+    public boolean isObjectLock() {
+        return objectLock;
+    }
+
+    /**
+     * Set when creating new bucket.
+     */
+    public void setObjectLock(boolean objectLock) {
+        this.objectLock = objectLock;
+    }
+
+    public String getPolicy() {
+        return policy;
+    }
+
+    /**
+     * The policy for this queue to set in the method.
+     */
+    public void setPolicy(String policy) {
+        this.policy = policy;
+    }
+
+    public ServerSideEncryptionCustomerKey getServerSideEncryptionCustomerKey() {
+        return serverSideEncryptionCustomerKey;
+    }
+
+    /**
+     * Server-side encryption for source object while copy/move objects.
+     */
+    public void setServerSideEncryptionCustomerKey(ServerSideEncryptionCustomerKey serverSideEncryptionCustomerKey) {
+        this.serverSideEncryptionCustomerKey = serverSideEncryptionCustomerKey;
+    }
+
+    public ServerSideEncryption getServerSideEncryption() {
+        return serverSideEncryption;
+    }
+
+    /**
+     * Server-side encryption.
+     */
+    public void setServerSideEncryption(ServerSideEncryption serverSideEncryption) {
+        this.serverSideEncryption = serverSideEncryption;
+    }
+
+    public MinioClient getMinioClient() {
+        return minioClient;
+    }
+
+    /**
+     * Reference to a Minio Client object in the registry.
+     */
+    public void setMinioClient(MinioClient minioClient) {
+        this.minioClient = minioClient;
+    }
+
+    public String getObjectName() {
+        return objectName;
+    }
+
+    /**
+     * To get the object from the bucket with the given object name.
+     */
+    public void setObjectName(String objectName) {
+        this.objectName = objectName;
+    }
+
+    public String getDelimiter() {
+        return delimiter;
+    }
+
+    /**
+     * The delimiter which is used in the
+     * ListObjectsRequest to only consume
+     * objects we are interested in.
+     */
+    public void setDelimiter(String delimiter) {
+        this.delimiter = delimiter;
+    }
+
+    public boolean isIncludeUserMetadata() {
+        return includeUserMetadata;
+    }
+
+    /**
+     * The flag which is used in the
+     * ListObjectsRequest to get objects with user meta data.
+     */
+    public void setIncludeUserMetadata(boolean includeUserMetadata) {
+        this.includeUserMetadata = includeUserMetadata;
+    }
+
+    public boolean isIncludeVersions() {
+        return includeVersions;
+    }
+
+    /**
+     * The flag which is used in the
+     * ListObjectsRequest to get objects with versioning.
+     */
+    public void setIncludeVersions(boolean includeVersions) {
+        this.includeVersions = includeVersions;
+    }
+
+    public boolean isIncludeFolders() {
+        return includeFolders;
+    }
+
+    /**
+     * The flag which is used in the
+     * ListObjectsRequest to set include folders.
+     */
+    public void setIncludeFolders(boolean includeFolders) {
+        this.includeFolders = includeFolders;
+    }
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * Object name starts with prefix.
+     */
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    public boolean isRecursive() {
+        return recursive;
+    }
+
+    /**
+     * List recursively than directory structure emulation.
+     */
+    public void setRecursive(boolean recursive) {
+        this.recursive = recursive;
+    }
+
+    public String getStartAfter() {
+        return startAfter;
+    }
+
+    /**
+     * list objects in bucket after this object name.
+     */
+    public void setStartAfter(String startAfter) {
+        this.startAfter = startAfter;
+    }
+
+    public boolean isUseVersion1() {
+        return useVersion1;
+    }
+
+    /**
+     * when true, version 1 of REST API is used.
+     */
+    public void setUseVersion1(boolean useVersion1) {
+        this.useVersion1 = useVersion1;
+    }
+
+    public long getOffset() {
+        return offset;
+    }
+
+    /**
+     * Start byte position of object data.
+     */
+    public void setOffset(long offset) {
+        this.offset = offset;
+    }
+
+    public long getLength() {
+        return length;
+    }
+
+    /**
+     * Number of bytes of object data from offset.
+     */
+    public void setLength(long length) {
+        this.length = length;
+    }
+
+    public String getVersionId() {
+        return versionId;
+    }
+
+    /**
+     * Set specific version_ID of a object when deleting the object.
+     */
+    public void setVersionId(String versionId) {
+        this.versionId = versionId;
+    }
+
+    public String getMatchETag() {
+        return matchETag;
+    }
+
+    /**
+     * Set match ETag parameter for get object(s).
+     */
+    public void setMatchETag(String matchETag) {
+        this.matchETag = matchETag;
+    }
+
+    public String getNotMatchETag() {
+        return notMatchETag;
+    }
+
+    /**
+     * Set not match ETag parameter for get object(s).
+     */
+    public void setNotMatchETag(String notMatchETag) {
+        this.notMatchETag = notMatchETag;
+    }
+
+    public ZonedDateTime getModifiedSince() {
+        return modifiedSince;
+    }
+
+    /**
+     * Set modified since parameter for get object(s).
+     */
+    public void setModifiedSince(ZonedDateTime modifiedSince) {
+        this.modifiedSince = modifiedSince;
+    }
+
+    public ZonedDateTime getUnModifiedSince() {
+        return unModifiedSince;
+    }
+
+    /**
+     * Set un modified since parameter for get object(s).
+     */
+    public void setUnModifiedSince(ZonedDateTime unModifiedSince) {
+        this.unModifiedSince = unModifiedSince;
+    }
+
+    public String getDestinationBucketName() {
+        return destinationBucketName;
+    }
+
+    /**
+     * Source bucket name.
+     */
+    public void setDestinationBucketName(String destinationBucketName) {
+        this.destinationBucketName = destinationBucketName;
+    }
+
+    public String getDestinationObjectName() {
+        return destinationObjectName;
+    }
+
+    /**
+     * Source object name.
+     */
+    public void setDestinationObjectName(String destinationObjectName) {
+        this.destinationObjectName = destinationObjectName;
+    }
+
+    public boolean isDeleteAfterRead() {
+        return deleteAfterRead;
+    }
+
+    /**
+     * Delete objects from Minio after they have been retrieved. The delete is only
+     * performed if the Exchange is committed. If a rollback occurs, the object
+     * is not deleted.
+     * <p/>
+     * If this option is false, then the same objects will be retrieve over and
+     * over again on the polls. Therefore you need to use the Idempotent
+     * Consumer EIP in the route to filter out duplicates. You can filter using
+     * the {@link MinioConstants#BUCKET_NAME} and {@link MinioConstants#OBJECT_NAME}
+     * headers, or only the {@link MinioConstants#OBJECT_NAME} header.
+     */
+    public void setDeleteAfterRead(boolean deleteAfterRead) {
+        this.deleteAfterRead = deleteAfterRead;
+    }
+
+    public boolean isMoveAfterRead() {
+        return moveAfterRead;
+    }
+
+    /**
+     * Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation
+     * the destinationBucket option must be set.
+     * The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object
+     * is not moved.
+     */
+    public void setMoveAfterRead(boolean moveAfterRead) {
+        this.moveAfterRead = moveAfterRead;
+    }
+
+    public boolean isBypassGovernanceMode() {
+        return bypassGovernanceMode;
+    }
+
+    /**
+     * Set this flag if you want to bypassGovernanceMode when deleting a particular object.
+     */
+    public void setBypassGovernanceMode(boolean bypassGovernanceMode) {
+        this.bypassGovernanceMode = bypassGovernanceMode;
+    }
+
+    public boolean isIncludeBody() {
+        return includeBody;
+    }
+
+    /**
+     * If it is true, the exchange body will be set to a stream to the contents
+     * of the file. If false, the headers will be set with the Minio object
+     * metadata, but the body will be null. This option is strongly related to
+     * autocloseBody option. In case of setting includeBody to true and
+     * autocloseBody to false, it will be up to the caller to close the MinioObject
+     * stream. Setting autocloseBody to true, will close the MinioObject stream
+     * automatically.
+     */
+    public void setIncludeBody(boolean includeBody) {
+        this.includeBody = includeBody;
+    }
+
+    public boolean isAutoCloseBody() {
+        return autoCloseBody;
+    }
+
+    /**
+     * If this option is true and includeBody is true, then the MinioObject.close()
+     * method will be called on exchange completion. This option is strongly
+     * related to includeBody option. In case of setting includeBody to true and
+     * autocloseBody to false, it will be up to the caller to close the MinioObject
+     * stream. Setting autocloseBody to true, will close the MinioObject stream
+     * automatically.
+     */
+    public void setAutoCloseBody(boolean autoCloseBody) {
+        this.autoCloseBody = autoCloseBody;
+    }
+
+    public String getKeyName() {
+        return keyName;
+    }
+
+    /**
+     * Setting the key name for an element in the bucket through endpoint
+     * parameter.
+     */
+    public void setKeyName(String keyName) {
+        this.keyName = keyName;
+    }
+
+    public boolean isDeleteAfterWrite() {
+        return deleteAfterWrite;
+    }
+
+    /**
+     * Delete file object after the Minio file has been uploaded.
+     */
+    public void setDeleteAfterWrite(boolean deleteAfterWrite) {
+        this.deleteAfterWrite = deleteAfterWrite;
+    }
+
+    public String getStorageClass() {
+        return storageClass;
+    }
+
+    /**
+     * The storage class to set in the request.
+     */
+    public void setStorageClass(String storageClass) {
+        this.storageClass = storageClass;
+    }
+
+    public MinioOperations getOperation() {
+        return operation;
+    }
+
+    /**
+     * The operation to do in case the user don't want to do only an upload.
+     */
+    public void setOperation(MinioOperations operation) {
+        this.operation = operation;
+    }
+
+    public boolean isPojoRequest() {
+        return pojoRequest;
+    }
+
+    /**
+     * If we want to use a POJO request as body or not.
+     */
+    public void setPojoRequest(boolean pojoRequest) {
+        this.pojoRequest = pojoRequest;
+    }
+
+    public MinioConfiguration copy() {
+        try {
+            return (MinioConfiguration) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConstants.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConstants.java
new file mode 100644
index 0000000..a9e1673
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConstants.java
@@ -0,0 +1,46 @@
+/*
+ * 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.minio;
+
+/**
+ * Constants used in Camel Minio module
+ */
+public interface MinioConstants {
+
+    int BYTE_ARRAY_LENGTH = 1024;
+    String BUCKET_NAME = "CamelMinioBucketName";
+    String DESTINATION_BUCKET_NAME = "CamelMinioDestinationBucketName";
+    String CACHE_CONTROL = "CamelMinioContentControl";
+    String CONTENT_DISPOSITION = "CamelMinioContentDisposition";
+    String CONTENT_ENCODING = "CamelMinioContentEncoding";
+    String CONTENT_LENGTH = "CamelMinioContentLength";
+    String CONTENT_MD5 = "CamelMinioContentMD5";
+    String CONTENT_TYPE = "CamelMinioContentType";
+    String E_TAG = "CamelMinioETag";
+    String OBJECT_NAME = "CamelMinioObjectName";
+    String DESTINATION_OBJECT_NAME = "CamelMinioDestinationObjectName";
+    String LAST_MODIFIED = "CamelMinioLastModified";
+    String STORAGE_CLASS = "CamelMinioStorageClass";
+    String VERSION_ID = "CamelMinioVersionId";
+    String CANNED_ACL = "CamelMinioCannedAcl";
+    String MINIO_OPERATION = "CamelMinioOperation";
+    String SERVER_SIDE_ENCRYPTION = "CamelMinioServerSideEncryption";
+    String EXPIRATION_TIME = "CamelMinioExpirationTime";
+    String REPLICATION_STATUS = "CamelMinioReplicationStatus";
+    String OFFSET = "CamelMinioOffset";
+    String LENGTH = "CamelMinioLength";
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java
new file mode 100644
index 0000000..37896ce
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java
@@ -0,0 +1,402 @@
+/*
+ * 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.minio;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import io.minio.BucketExistsArgs;
+import io.minio.CopyObjectArgs;
+import io.minio.CopySource;
+import io.minio.GetObjectArgs;
+import io.minio.ListObjectsArgs;
+import io.minio.MakeBucketArgs;
+import io.minio.MinioClient;
+import io.minio.RemoveObjectArgs;
+import io.minio.Result;
+import io.minio.errors.InvalidBucketNameException;
+import io.minio.errors.MinioException;
+import io.minio.messages.Item;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedExchange;
+import org.apache.camel.Processor;
+import org.apache.camel.spi.Synchronization;
+import org.apache.camel.support.ScheduledBatchPollingConsumer;
+import org.apache.camel.util.CastUtils;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.util.ObjectHelper.isEmpty;
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+import static org.apache.camel.util.ObjectHelper.cast;
+
+/**
+ * A Consumer of messages from the Minio Storage Service.
+ */
+public class MinioConsumer extends ScheduledBatchPollingConsumer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MinioConsumer.class);
+
+    int totalCounter;
+    private String continuationToken;
+    private transient String minioConsumerToString;
+
+    public MinioConsumer(MinioEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        if (getConfiguration().isMoveAfterRead()) {
+            String destinationBucketName = getConfiguration().getDestinationBucketName();
+
+            if (isNotEmpty(destinationBucketName)) {
+
+                if (bucketExists(destinationBucketName)) {
+                    LOG.trace("Bucket {} already exists", destinationBucketName);
+                } else {
+                    LOG.trace("Destination Bucket {} doesn't exist yet", destinationBucketName);
+
+                    if (getConfiguration().isAutoCreateBucket()) {
+                        // creates the new bucket because it doesn't exist yet
+                        LOG.trace("Creating Destination bucket {}...", destinationBucketName);
+                        makeBucket(destinationBucketName);
+                        LOG.trace("Destination Bucket created");
+                    } else {
+                        throw new InvalidBucketNameException("Bucket {} does not exists, set autoCreateBucket option for bucket auto creation", destinationBucketName);
+                    }
+                }
+            } else {
+                LOG.warn("invalid destinationBucketName found: {}", destinationBucketName);
+            }
+        }
+    }
+
+    private boolean bucketExists(String bucketName) throws Exception {
+        return getMinioClient().bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+    }
+
+    private void makeBucket(String bucketName) throws Exception {
+        MakeBucketArgs.Builder makeBucketRequest = MakeBucketArgs.builder().bucket(bucketName).objectLock(getConfiguration().isObjectLock());
+        if (isNotEmpty(getConfiguration().getRegion())) {
+            makeBucketRequest.region(getConfiguration().getRegion());
+        }
+        getMinioClient().makeBucket(makeBucketRequest.build());
+    }
+
+    @Override
+    protected int poll() throws Exception {
+        // must reset for each poll
+        shutdownRunningTask = null;
+        pendingExchanges = 0;
+
+        String bucketName = getConfiguration().getBucketName();
+        String objectName = getConfiguration().getObjectName();
+        MinioClient minioClient = getMinioClient();
+        Queue<Exchange> exchanges;
+
+        if (isNotEmpty(objectName)) {
+            LOG.trace("Getting object in bucket {} with object name {}...", bucketName, objectName);
+
+            InputStream minioObject = getObject(bucketName, minioClient, objectName);
+            exchanges = createExchanges(minioObject, objectName);
+            return processBatch(CastUtils.cast(exchanges));
+
+        } else {
+
+            LOG.trace("Queueing objects in bucket {}...", bucketName);
+
+            ListObjectsArgs.Builder listObjectRequest = ListObjectsArgs.builder()
+                    .bucket(bucketName)
+                    .includeUserMetadata(getConfiguration().isIncludeUserMetadata())
+                    .includeVersions(getConfiguration().isIncludeVersions())
+                    .recursive(getConfiguration().isRecursive())
+                    .useApiVersion1(getConfiguration().isUseVersion1());
+
+            if (isNotEmpty(getConfiguration().getDelimiter())) {
+                listObjectRequest.delimiter(getConfiguration().getDelimiter());
+            }
+
+            if (maxMessagesPerPoll > 0) {
+                listObjectRequest.maxKeys(maxMessagesPerPoll);
+            }
+
+            if (isNotEmpty(getConfiguration().getPrefix())) {
+                listObjectRequest.prefix(getConfiguration().getPrefix());
+            }
+
+            if (isNotEmpty(getConfiguration().getStartAfter())) {
+                listObjectRequest.startAfter(getConfiguration().getStartAfter());
+                continuationToken = null;
+            }
+
+            // if there was a marker from previous poll then use that to
+            // continue from where we left last time
+            if (isNotEmpty(continuationToken)) {
+                LOG.trace("Resuming from marker: {}", continuationToken);
+                listObjectRequest.startAfter(continuationToken);
+            }
+
+            Iterator<Result<Item>> listObjects = getMinioClient().listObjects(listObjectRequest.build()).iterator();
+
+            if (listObjects.hasNext()) {
+                exchanges = createExchanges(listObjects);
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Found {} objects in bucket {}...", totalCounter, bucketName);
+                }
+                return processBatch(CastUtils.cast(exchanges));
+
+            } else {
+                // no more data so clear marker
+                continuationToken = null;
+                return 0;
+            }
+        }
+    }
+
+    protected Queue<Exchange> createExchanges(InputStream objectStream, String objectName) throws Exception {
+        Queue<Exchange> answer = new LinkedList<>();
+        Exchange exchange = getEndpoint().createExchange(objectStream, objectName);
+        answer.add(exchange);
+        IOHelper.close(objectStream);
+        return answer;
+    }
+
+    protected Queue<Exchange> createExchanges(Iterator<Result<Item>> minioObjectSummaries) throws Exception {
+        int messageCounter = 0;
+        String bucketName = getConfiguration().getBucketName();
+        Collection<InputStream> minioObjects = new ArrayList<>();
+        Queue<Exchange> answer = new LinkedList<>();
+        try {
+            if (getConfiguration().isIncludeFolders()) {
+                do {
+                    messageCounter++;
+                    Item minioObjectSummary = minioObjectSummaries.next().get();
+                    InputStream minioObject = getObject(bucketName, getMinioClient(), minioObjectSummary.objectName());
+                    minioObjects.add(minioObject);
+                    Exchange exchange = getEndpoint().createExchange(minioObject, minioObjectSummary.objectName());
+                    answer.add(exchange);
+                    continuationToken = minioObjectSummary.objectName();
+                } while (minioObjectSummaries.hasNext());
+            } else {
+                do {
+                    messageCounter++;
+                    Item minioObjectSummary = minioObjectSummaries.next().get();
+                    // ignore if directory
+                    if (!minioObjectSummary.isDir()) {
+                        InputStream minioObject = getObject(bucketName, getMinioClient(), minioObjectSummary.objectName());
+                        minioObjects.add(minioObject);
+                        Exchange exchange = getEndpoint().createExchange(minioObject, minioObjectSummary.objectName());
+                        answer.add(exchange);
+                        continuationToken = minioObjectSummary.objectName();
+                    }
+                } while (minioObjectSummaries.hasNext());
+            }
+
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Received {} messages in this poll", messageCounter);
+                totalCounter += messageCounter;
+            }
+
+        } catch (Throwable e) {
+            LOG.warn("Error getting MinioObject due: {}", e.getMessage());
+            throw e;
+
+        } finally {
+            // ensure all previous gathered minio objects are closed
+            // if there was an exception creating the exchanges in this batch
+            minioObjects.forEach(IOHelper::close);
+        }
+
+        return answer;
+    }
+
+    private InputStream getObject(String bucketName, MinioClient minioClient, String objectName) throws Exception {
+        GetObjectArgs.Builder getObjectRequest = GetObjectArgs.builder().bucket(bucketName).object(objectName);
+
+        MinioChecks.checkServerSideEncryptionCustomerKeyConfig(getConfiguration(), getObjectRequest::ssec);
+        MinioChecks.checkOffsetConfig(getConfiguration(), getObjectRequest::offset);
+        MinioChecks.checkLengthConfig(getConfiguration(), getObjectRequest::length);
+        MinioChecks.checkVersionIdConfig(getConfiguration(), getObjectRequest::versionId);
+        MinioChecks.checkMatchETagConfig(getConfiguration(), getObjectRequest::matchETag);
+        MinioChecks.checkNotMatchETagConfig(getConfiguration(), getObjectRequest::notMatchETag);
+        MinioChecks.checkModifiedSinceConfig(getConfiguration(), getObjectRequest::modifiedSince);
+        MinioChecks.checkUnModifiedSinceConfig(getConfiguration(), getObjectRequest::unmodifiedSince);
+
+        return minioClient.getObject(getObjectRequest.build());
+    }
+
+    @Override
+    public int processBatch(Queue<Object> exchanges) {
+        int total = exchanges.size();
+
+        for (int index = 0; index < total && isBatchAllowed(); index++) {
+            // only loop if we are started (allowed to run)
+            final Exchange exchange = cast(Exchange.class, exchanges.poll());
+            // add current index and total as properties
+            exchange.setProperty(Exchange.BATCH_INDEX, index);
+            exchange.setProperty(Exchange.BATCH_SIZE, total);
+            exchange.setProperty(Exchange.BATCH_COMPLETE, index == total - 1);
+
+            // update pending number of exchanges
+            pendingExchanges = total - index - 1;
+
+            // add on completion to handle after work when the exchange is done
+            exchange.adapt(ExtendedExchange.class).addOnCompletion(new Synchronization() {
+                public void onComplete(Exchange exchange) {
+                    processCommit(exchange);
+                }
+
+                public void onFailure(Exchange exchange) {
+                    processRollback(exchange);
+                }
+
+                @Override
+                public String toString() {
+                    return "MinioConsumerOnCompletion";
+                }
+            });
+
+            LOG.trace("Processing exchange ...");
+            getAsyncProcessor().process(exchange, doneSync -> LOG.trace("Processing exchange done."));
+        }
+
+        return total;
+    }
+
+    /**
+     * Strategy to delete the message after being processed.
+     *
+     * @param exchange the exchange
+     */
+    protected void processCommit(Exchange exchange) {
+        try {
+            String srcBucketName = exchange.getIn().getHeader(MinioConstants.BUCKET_NAME, String.class);
+            String srcObjectName = exchange.getIn().getHeader(MinioConstants.OBJECT_NAME, String.class);
+
+            if (getConfiguration().isDeleteAfterRead() || getConfiguration().isMoveAfterRead()) {
+                if (getConfiguration().isMoveAfterRead()) {
+                    copyObject(srcBucketName, srcObjectName);
+                    LOG.trace("Copied object from bucket {} with objectName {} to bucket {}...",
+                            srcBucketName, srcObjectName, getConfiguration().getDestinationBucketName());
+                }
+
+                LOG.trace("Deleting object from bucket {} with objectName {}...", srcBucketName, srcObjectName);
+                removeObject(srcBucketName, srcObjectName);
+                LOG.trace("Deleted object from bucket {} with objectName {}...", srcBucketName, srcObjectName);
+            }
+        } catch (MinioException | NoSuchAlgorithmException | InvalidKeyException | IOException e) {
+            getExceptionHandler().handleException("Error occurred during moving or deleting object. This exception is ignored.",
+                    exchange, e);
+        }
+    }
+
+    private void removeObject(String srcBucketName, String srcObjectName) throws MinioException, IOException, InvalidKeyException, NoSuchAlgorithmException {
+        RemoveObjectArgs.Builder removeObjectRequest = RemoveObjectArgs.builder()
+                .bucket(srcBucketName)
+                .object(srcObjectName)
+                .bypassGovernanceMode(getConfiguration().isBypassGovernanceMode());
+
+        if (isNotEmpty(getConfiguration().getVersionId())) {
+            removeObjectRequest.versionId(getConfiguration().getVersionId());
+        }
+
+        getMinioClient().removeObject(removeObjectRequest.build());
+    }
+
+    private void copyObject(String srcBucketName, String srcObjectName) throws MinioException, IOException, InvalidKeyException, NoSuchAlgorithmException {
+        String destinationBucketName = getConfiguration().getDestinationBucketName();
+        if (isEmpty(destinationBucketName)) {
+            throw new IllegalArgumentException("Destination Bucket name must be specified to copy operation");
+        }
+
+        // set destination object name as source object name, if not specified
+        String destinationObjectName = (isNotEmpty(getConfiguration().getDestinationObjectName()))
+                ? getConfiguration().getDestinationObjectName()
+                : srcObjectName;
+
+
+        LOG.trace("Copying object from bucket {} with objectName {} to bucket {}...",
+                srcBucketName, srcObjectName, destinationBucketName);
+
+        CopySource.Builder copySourceBuilder = CopySource.builder().bucket(srcBucketName).object(srcObjectName);
+
+        MinioChecks.checkServerSideEncryptionCustomerKeyConfig(getConfiguration(), copySourceBuilder::ssec);
+        MinioChecks.checkOffsetConfig(getConfiguration(), copySourceBuilder::offset);
+        MinioChecks.checkLengthConfig(getConfiguration(), copySourceBuilder::length);
+        MinioChecks.checkVersionIdConfig(getConfiguration(), copySourceBuilder::versionId);
+        MinioChecks.checkMatchETagConfig(getConfiguration(), copySourceBuilder::matchETag);
+        MinioChecks.checkNotMatchETagConfig(getConfiguration(), copySourceBuilder::notMatchETag);
+        MinioChecks.checkModifiedSinceConfig(getConfiguration(), copySourceBuilder::modifiedSince);
+        MinioChecks.checkUnModifiedSinceConfig(getConfiguration(), copySourceBuilder::unmodifiedSince);
+
+        CopyObjectArgs.Builder copyObjectRequest = CopyObjectArgs.builder()
+                .source(copySourceBuilder.build())
+                .bucket(getConfiguration().getDestinationBucketName())
+                .object(destinationObjectName);
+
+        MinioChecks.checkServerSideEncryptionConfig(getConfiguration(), copyObjectRequest::sse);
+
+        getMinioClient().copyObject(copyObjectRequest.build());
+    }
+
+    /**
+     * Strategy when processing the exchange failed.
+     *
+     * @param exchange the exchange
+     */
+    protected void processRollback(Exchange exchange) {
+        Exception cause = exchange.getException();
+        if (isNotEmpty(cause)) {
+            LOG.warn("Exchange failed, so rolling back message status: {}", exchange, cause);
+        } else {
+            LOG.warn("Exchange failed, so rolling back message status: {}", exchange);
+        }
+    }
+
+    protected MinioConfiguration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    protected MinioClient getMinioClient() {
+        return getEndpoint().getMinioClient();
+    }
+
+    @Override
+    public MinioEndpoint getEndpoint() {
+        return (MinioEndpoint) super.getEndpoint();
+    }
+
+    @Override
+    public String toString() {
+        if (isEmpty(minioConsumerToString)) {
+            minioConsumerToString = "MinioConsumer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+        }
+        return minioConsumerToString;
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioEndpoint.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioEndpoint.java
new file mode 100644
index 0000000..e61a785
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioEndpoint.java
@@ -0,0 +1,280 @@
+/*
+ * 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.minio;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+
+import io.minio.BucketExistsArgs;
+import io.minio.MakeBucketArgs;
+import io.minio.MinioClient;
+import io.minio.ObjectStat;
+import io.minio.SetBucketPolicyArgs;
+import io.minio.StatObjectArgs;
+import io.minio.errors.InvalidBucketNameException;
+import org.apache.camel.Category;
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ExtendedExchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.minio.client.MinioClientFactory;
+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.ScheduledPollEndpoint;
+import org.apache.camel.support.SynchronizationAdapter;
+import org.apache.camel.util.IOHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+/**
+ * Store and retrieve objects from Minio Storage Service using Minio SDK.
+ */
+@UriEndpoint(firstVersion = "3.5.0", scheme = "minio", title = "Minio Storage Service", syntax = "minio://bucketName",
+        category = {Category.CLOUD, Category.FILE})
+
+public class MinioEndpoint extends ScheduledPollEndpoint {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MinioEndpoint.class);
+
+    private MinioClient minioClient;
+
+    @UriPath(description = "Bucket name")
+    @Metadata(required = true)
+    private String bucketName;
+    @UriParam
+    private MinioConfiguration configuration;
+    @UriParam(label = "consumer", defaultValue = "10")
+    private int maxMessagesPerPoll = 10;
+    @UriParam(label = "consumer", defaultValue = "60")
+    private int maxConnections = 50 + maxMessagesPerPoll;
+
+    public MinioEndpoint(String uri, Component component, MinioConfiguration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        MinioConsumer minioConsumer = new MinioConsumer(this, processor);
+        configureConsumer(minioConsumer);
+        minioConsumer.setMaxMessagesPerPoll(maxMessagesPerPoll);
+        return minioConsumer;
+    }
+
+    @Override
+    public Producer createProducer() {
+        return new MinioProducer(this);
+    }
+
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+
+        minioClient = isNotEmpty(getConfiguration().getMinioClient())
+                ? getConfiguration().getMinioClient()
+                : MinioClientFactory.getClient(getConfiguration()).getMinioClient();
+
+        String objectName = getConfiguration().getObjectName();
+
+        if (isNotEmpty(objectName)) {
+            LOG.trace("Object name {} requested, so skipping bucket check...", objectName);
+            return;
+        }
+
+        String bucketName = getConfiguration().getBucketName();
+        LOG.trace("Querying whether bucket {} already exists...", bucketName);
+
+        if (bucketExists(bucketName)) {
+            LOG.trace("Bucket {} already exists", bucketName);
+        } else {
+            if (getConfiguration().isAutoCreateBucket()) {
+                LOG.trace("AutoCreateBucket set to true, Creating bucket {}...", bucketName);
+                makeBucket(bucketName);
+                LOG.trace("Bucket created");
+            } else {
+                throw new InvalidBucketNameException("Bucket {} does not exists, set autoCreateBucket option for bucket auto creation", bucketName);
+
+            }
+        }
+
+        if (isNotEmpty(getConfiguration().getPolicy())) {
+            LOG.trace("Updating bucket {} with policy {}", bucketName, configuration.getPolicy());
+            setBucketPolicy(bucketName);
+            LOG.trace("Bucket policy updated");
+        }
+    }
+
+    @Override
+    public void doStop() throws Exception {
+        super.doStop();
+    }
+
+    public Exchange createExchange(InputStream minioObject, String objectName) throws Exception {
+        return createExchange(getExchangePattern(), minioObject, objectName);
+    }
+
+    public Exchange createExchange(ExchangePattern pattern,
+                                   InputStream minioObject, String objectName) throws Exception {
+        LOG.trace("Getting object with objectName {} from bucket {}...", objectName, getConfiguration().getBucketName());
+
+        Exchange exchange = super.createExchange(pattern);
+        Message message = exchange.getIn();
+        LOG.trace("Got object!");
+
+        getObjectStat(objectName, message);
+
+        if (getConfiguration().isIncludeBody()) {
+            try {
+                message.setBody(readInputStream(minioObject));
+                if (getConfiguration().isAutoCloseBody()) {
+                    exchange.adapt(ExtendedExchange.class).addOnCompletion(new SynchronizationAdapter() {
+                        @Override
+                        public void onDone(Exchange exchange) {
+                            IOHelper.close(minioObject);
+                        }
+                    });
+                }
+
+            } catch (IOException e) {
+                // TODO Auto-generated catch block
+                LOG.warn("Error setting message body");
+            }
+        } else {
+            message.setBody(null);
+            IOHelper.close(minioObject);
+        }
+
+        return exchange;
+    }
+
+    public MinioConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    public void setConfiguration(MinioConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public MinioClient getMinioClient() {
+        return minioClient;
+    }
+
+    public void setMinioClient(MinioClient minioClient) {
+        this.minioClient = minioClient;
+    }
+
+    public int getMaxMessagesPerPoll() {
+        return maxMessagesPerPoll;
+    }
+
+    /**
+     * Gets the maximum number of messages as a limit to poll at each polling.
+     * <p/>
+     * Gets the maximum number of messages as a limit to poll at each polling.
+     * The default value is 10. Use 0 or a negative number to set it as
+     * unlimited.
+     */
+    public void setMaxMessagesPerPoll(int maxMessagesPerPoll) {
+        this.maxMessagesPerPoll = maxMessagesPerPoll;
+    }
+
+    public int getMaxConnections() {
+        return maxConnections;
+    }
+
+    /**
+     * Set the maxConnections parameter in the minio client configuration
+     */
+    public void setMaxConnections(int maxConnections) {
+        this.maxConnections = maxConnections;
+    }
+
+    private String readInputStream(InputStream minioObject) throws IOException {
+        StringBuilder textBuilder = new StringBuilder();
+        try (Reader reader = new BufferedReader(new InputStreamReader(minioObject, StandardCharsets.UTF_8))) {
+            int c;
+            while ((c = reader.read()) != -1) {
+                textBuilder.append((char) c);
+            }
+        }
+        return textBuilder.toString();
+    }
+
+    private boolean bucketExists(String bucketName) throws Exception {
+        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+    }
+
+    private void makeBucket(String bucketName) throws Exception {
+        MakeBucketArgs.Builder makeBucketRequest = MakeBucketArgs.builder().bucket(bucketName).objectLock(getConfiguration().isObjectLock());
+        if (isNotEmpty(getConfiguration().getRegion())) {
+            makeBucketRequest.region(getConfiguration().getRegion());
+        }
+        minioClient.makeBucket(makeBucketRequest.build());
+    }
+
+    private void setBucketPolicy(String bucketName) throws Exception {
+        LOG.trace("Updating bucket {} with policy...", bucketName);
+        minioClient.setBucketPolicy(
+                SetBucketPolicyArgs.builder().bucket(bucketName).config(getConfiguration().getPolicy()).build());
+        LOG.trace("Bucket policy updated");
+    }
+
+    private void getObjectStat(String objectName, Message message) throws Exception {
+
+        String bucketName = getConfiguration().getBucketName();
+        StatObjectArgs.Builder statObjectRequest = StatObjectArgs.builder().bucket(bucketName).object(objectName);
+
+        MinioChecks.checkServerSideEncryptionCustomerKeyConfig(getConfiguration(), statObjectRequest::ssec);
+        MinioChecks.checkOffsetConfig(getConfiguration(), statObjectRequest::offset);
+        MinioChecks.checkLengthConfig(getConfiguration(), statObjectRequest::length);
+        MinioChecks.checkVersionIdConfig(getConfiguration(), statObjectRequest::versionId);
+        MinioChecks.checkMatchETagConfig(getConfiguration(), statObjectRequest::matchETag);
+        MinioChecks.checkNotMatchETagConfig(getConfiguration(), statObjectRequest::notMatchETag);
+        MinioChecks.checkModifiedSinceConfig(getConfiguration(), statObjectRequest::modifiedSince);
+        MinioChecks.checkUnModifiedSinceConfig(getConfiguration(), statObjectRequest::unmodifiedSince);
+
+        ObjectStat stat = minioClient.statObject(statObjectRequest.build());
+
+        // set all stat as message headers
+        message.setHeader(MinioConstants.OBJECT_NAME, stat.name());
+        message.setHeader(MinioConstants.BUCKET_NAME, stat.bucketName());
+        message.setHeader(MinioConstants.E_TAG, stat.etag());
+        message.setHeader(MinioConstants.LAST_MODIFIED, stat.httpHeaders().get("last-modified"));
+        message.setHeader(MinioConstants.VERSION_ID, stat.httpHeaders().get("x-amz-version-id"));
+        message.setHeader(MinioConstants.CONTENT_TYPE, stat.contentType());
+        message.setHeader(MinioConstants.CONTENT_LENGTH, stat.length());
+        message.setHeader(MinioConstants.CONTENT_ENCODING, stat.httpHeaders().get("content-encoding"));
+        message.setHeader(MinioConstants.CONTENT_DISPOSITION, stat.httpHeaders().get("content-disposition"));
+        message.setHeader(MinioConstants.CACHE_CONTROL, stat.httpHeaders().get("cache-control"));
+        message.setHeader(MinioConstants.SERVER_SIDE_ENCRYPTION, stat.httpHeaders().get("x-amz-server-side-encryption"));
+        message.setHeader(MinioConstants.EXPIRATION_TIME, stat.httpHeaders().get("x-amz-expiration"));
+        message.setHeader(MinioConstants.REPLICATION_STATUS, stat.httpHeaders().get("x-amz-replication-status"));
+        message.setHeader(MinioConstants.STORAGE_CLASS, stat.httpHeaders().get("x-amz-storage-class"));
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioOperations.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioOperations.java
new file mode 100644
index 0000000..17acaee
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioOperations.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.minio;
+
+public enum MinioOperations {
+    copyObject,
+    listObjects,
+    deleteObject,
+    deleteObjects,
+    deleteBucket,
+    listBuckets,
+    getObject,
+    getPartialObject
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java
new file mode 100644
index 0000000..1e19e06
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioProducer.java
@@ -0,0 +1,488 @@
+/*
+ * 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.minio;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import io.minio.CopyObjectArgs;
+import io.minio.CopySource;
+import io.minio.GetObjectArgs;
+import io.minio.ListObjectsArgs;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.PutObjectArgs;
+import io.minio.RemoveBucketArgs;
+import io.minio.RemoveObjectArgs;
+import io.minio.RemoveObjectsArgs;
+import io.minio.Result;
+import io.minio.messages.Bucket;
+import io.minio.messages.Item;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.Message;
+import org.apache.camel.WrappedFile;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.util.ObjectHelper.isEmpty;
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+/**
+ * A Producer which sends messages to the Minio Simple Storage
+ */
+public class MinioProducer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MinioProducer.class);
+
+    private transient String minioProducerToString;
+
+    public MinioProducer(final Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    public static Message getMessageForResponse(final Exchange exchange) {
+        return exchange.getMessage();
+    }
+
+    @Override
+    public void process(final Exchange exchange) throws Exception {
+        MinioOperations operation = determineOperation(exchange);
+        MinioClient minioClient = getEndpoint().getMinioClient();
+        if (isEmpty(operation)) {
+            putObject(minioClient, exchange);
+        } else {
+            switch (operation) {
+                case copyObject:
+                    copyObject(minioClient, exchange);
+                    break;
+                case deleteObject:
+                    deleteObject(minioClient, exchange);
+                    break;
+                case deleteObjects:
+                    deleteObjects(minioClient, exchange);
+                    break;
+                case listBuckets:
+                    listBuckets(minioClient, exchange);
+                    break;
+                case deleteBucket:
+                    deleteBucket(minioClient, exchange);
+                    break;
+                case listObjects:
+                    listObjects(minioClient, exchange);
+                    break;
+                case getObject:
+                    getObject(minioClient, exchange);
+                    break;
+                case getPartialObject:
+                    getPartialObject(minioClient, exchange);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unsupported operation");
+            }
+        }
+    }
+
+    public void putObject(MinioClient minioClient, final Exchange exchange) throws Exception {
+
+        if (getConfiguration().isPojoRequest()) {
+            PutObjectArgs.Builder payload = exchange.getIn().getMandatoryBody(PutObjectArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                ObjectWriteResponse putObjectResult = minioClient.putObject(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setHeader(MinioConstants.E_TAG, putObjectResult.etag());
+                if (isNotEmpty(putObjectResult.versionId())) {
+                    message.setHeader(MinioConstants.VERSION_ID, putObjectResult.versionId());
+                }
+            }
+        } else {
+            final String bucketName = determineBucketName(exchange);
+            final String objectName = determineObjectName(exchange);
+            Map<String, String> objectMetadata = determineMetadata(exchange);
+            Map<String, String> extraHeaders = determineExtraHeaders(exchange);
+
+            File filePayload = null;
+            InputStream inputStream;
+            ByteArrayOutputStream baos;
+            Object object = exchange.getIn().getMandatoryBody();
+
+            // Need to check if the message body is WrappedFile
+            if (object instanceof WrappedFile) {
+                object = ((WrappedFile<?>) object).getFile();
+            }
+            if (object instanceof File) {
+                filePayload = (File) object;
+                inputStream = new FileInputStream(filePayload);
+            } else {
+                inputStream = exchange.getIn().getMandatoryBody(InputStream.class);
+                if (objectMetadata.containsKey(Exchange.CONTENT_LENGTH)) {
+                    if (objectMetadata.get("Content-Length").equals("0") && isEmpty(exchange.getProperty(Exchange.CONTENT_LENGTH))) {
+                        LOG.debug("The content length is not defined. It needs to be determined by reading the data into memory");
+                        baos = determineLengthInputStream(inputStream);
+                        objectMetadata.put("Content-Length", String.valueOf(baos.size()));
+                        inputStream = new ByteArrayInputStream(baos.toByteArray());
+                    } else {
+                        if (isNotEmpty(exchange.getProperty(Exchange.CONTENT_LENGTH))) {
+                            objectMetadata.put("Content-Length", exchange.getProperty(Exchange.CONTENT_LENGTH, String.class));
+                        }
+                    }
+                }
+            }
+            PutObjectArgs.Builder putObjectRequest = PutObjectArgs.builder()
+                    .stream(inputStream, inputStream.available(), -1)
+                    .bucket(bucketName)
+                    .object(objectName)
+                    .userMetadata(objectMetadata);
+
+            if (!extraHeaders.isEmpty()) {
+                putObjectRequest.extraHeaders(extraHeaders);
+            }
+
+            LOG.trace("Put object from exchange...");
+
+            ObjectWriteResponse putObjectResult = getEndpoint().getMinioClient().putObject(putObjectRequest.build());
+
+            LOG.trace("Received result...");
+
+            Message message = getMessageForResponse(exchange);
+            message.setHeader(MinioConstants.E_TAG, putObjectResult.etag());
+            if (isNotEmpty(putObjectResult.versionId())) {
+                message.setHeader(MinioConstants.VERSION_ID, putObjectResult.versionId());
+            }
+
+            IOHelper.close(inputStream);
+
+            if (getConfiguration().isDeleteAfterWrite() && isNotEmpty(filePayload)) {
+                FileUtil.deleteFile(filePayload);
+            }
+        }
+    }
+
+    private Map<String, String> determineExtraHeaders(Exchange exchange) {
+        Map<String, String> extraHeaders = new HashMap<>();
+        String storageClass = determineStorageClass(exchange);
+        if (isNotEmpty(storageClass)) {
+            extraHeaders.put("X-Amz-Storage-Class", storageClass);
+        }
+
+        String cannedAcl = exchange.getIn().getHeader(MinioConstants.CANNED_ACL, String.class);
+        if (isNotEmpty(cannedAcl)) {
+            extraHeaders.put("x-amz-acl", cannedAcl);
+        }
+
+        return extraHeaders;
+    }
+
+    private void copyObject(MinioClient minioClient, Exchange exchange) throws Exception {
+
+        if (getConfiguration().isPojoRequest()) {
+            CopyObjectArgs.Builder payload = exchange.getIn().getMandatoryBody(CopyObjectArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                ObjectWriteResponse result = minioClient.copyObject(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+
+            final String bucketName = determineBucketName(exchange);
+            final String sourceKey = determineObjectName(exchange);
+            final String destinationKey = exchange.getIn().getHeader(MinioConstants.DESTINATION_OBJECT_NAME, String.class);
+            final String destinationBucketName = exchange.getIn().getHeader(MinioConstants.DESTINATION_BUCKET_NAME, String.class);
+
+            if (isEmpty(destinationBucketName)) {
+                throw new IllegalArgumentException("Bucket Name Destination must be specified for copyObject Operation");
+            }
+            if (isEmpty(destinationKey)) {
+                throw new IllegalArgumentException("Destination Key must be specified for copyObject Operation");
+            }
+
+            CopySource.Builder copySourceBuilder = CopySource.builder()
+                    .bucket(bucketName)
+                    .object(sourceKey);
+
+            CopyObjectArgs.Builder copyObjectRequest = CopyObjectArgs.builder()
+                    .bucket(destinationBucketName)
+                    .object(destinationKey)
+                    .source(copySourceBuilder.build());
+
+            ObjectWriteResponse copyObjectResult = minioClient.copyObject(copyObjectRequest.build());
+
+            Message message = getMessageForResponse(exchange);
+            if (isNotEmpty(copyObjectResult.versionId())) {
+                message.setHeader(MinioConstants.VERSION_ID, copyObjectResult.versionId());
+            }
+        }
+    }
+
+    private void deleteObject(MinioClient minioClient, Exchange exchange) throws Exception {
+        if (getConfiguration().isPojoRequest()) {
+            RemoveObjectArgs.Builder payload = exchange.getIn().getMandatoryBody(RemoveObjectArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                minioClient.removeObject(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody(true);
+            }
+        } else {
+            final String bucketName = determineBucketName(exchange);
+            final String sourceKey = determineObjectName(exchange);
+            minioClient.removeObject(RemoveObjectArgs.builder()
+                    .bucket(bucketName)
+                    .object(sourceKey).build());
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(true);
+        }
+    }
+
+    private void deleteObjects(MinioClient minioClient, Exchange exchange) throws Exception {
+        if (getConfiguration().isPojoRequest()) {
+            RemoveObjectsArgs.Builder payload = exchange.getIn().getMandatoryBody(RemoveObjectsArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                minioClient.removeObjects(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody(true);
+            }
+        } else {
+            throw new IllegalArgumentException("Cannot delete multiple objects without a POJO request");
+        }
+    }
+
+    private void listBuckets(MinioClient minioClient, Exchange exchange) throws Exception {
+        List<Bucket> bucketsList = minioClient.listBuckets();
+        Message message = getMessageForResponse(exchange);
+        //returns iterator of bucketList
+        message.setBody(bucketsList.iterator());
+    }
+
+    private void deleteBucket(MinioClient minioClient, Exchange exchange) throws Exception {
+        final String bucketName = determineBucketName(exchange);
+
+        if (getConfiguration().isPojoRequest()) {
+            RemoveBucketArgs.Builder payload = exchange.getIn().getMandatoryBody(RemoveBucketArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                minioClient.removeBucket(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody("ok");
+            }
+        } else {
+
+            minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
+            Message message = getMessageForResponse(exchange);
+            message.setBody("ok");
+        }
+    }
+
+    private void getObject(MinioClient minioClient, Exchange exchange) throws Exception {
+
+        if (getConfiguration().isPojoRequest()) {
+            GetObjectArgs.Builder payload = exchange.getIn().getMandatoryBody(GetObjectArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                InputStream respond = minioClient.getObject(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody(respond);
+            }
+        } else {
+            final String bucketName = determineBucketName(exchange);
+            final String sourceKey = determineObjectName(exchange);
+
+            InputStream respond = minioClient.getObject(GetObjectArgs.builder()
+                    .bucket(bucketName)
+                    .object(sourceKey)
+                    .build());
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(respond);
+        }
+    }
+
+    private void getPartialObject(MinioClient minioClient, Exchange exchange) throws Exception {
+
+        if (getConfiguration().isPojoRequest()) {
+            GetObjectArgs.Builder payload = exchange.getIn().getMandatoryBody(GetObjectArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                InputStream respond = minioClient.getObject(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody(respond);
+            }
+        } else {
+            final String bucketName = determineBucketName(exchange);
+            final String sourceKey = determineObjectName(exchange);
+            final String offset = exchange.getIn().getHeader(MinioConstants.OFFSET, String.class);
+            final String length = exchange.getIn().getHeader(MinioConstants.LENGTH, String.class);
+
+            if (isEmpty(offset) || isEmpty(length)) {
+                throw new IllegalArgumentException("A Offset and length header must be configured to perform a partial get operation.");
+            }
+
+            InputStream respond = minioClient.getObject(GetObjectArgs.builder()
+                    .bucket(bucketName)
+                    .object(sourceKey)
+                    .offset(Long.parseLong(offset))
+                    .length(Long.parseLong(length))
+                    .build());
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(respond);
+        }
+    }
+
+    private void listObjects(MinioClient minioClient, Exchange exchange) throws InvalidPayloadException {
+
+        if (getConfiguration().isPojoRequest()) {
+            ListObjectsArgs.Builder payload = exchange.getIn().getMandatoryBody(ListObjectsArgs.Builder.class);
+            if (isNotEmpty(payload)) {
+                Iterable<Result<Item>> objectList = minioClient.listObjects(payload.build());
+                Message message = getMessageForResponse(exchange);
+                message.setBody(objectList);
+            }
+        } else {
+            final String bucketName = determineBucketName(exchange);
+
+            Iterable<Result<Item>> objectList = minioClient.listObjects(ListObjectsArgs.builder()
+                    .bucket(bucketName)
+                    .build());
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(objectList);
+        }
+    }
+
+    private MinioOperations determineOperation(Exchange exchange) {
+        MinioOperations operation = exchange.getIn().getHeader(MinioConstants.MINIO_OPERATION, MinioOperations.class);
+        if (isEmpty(operation)) {
+            operation = getConfiguration().getOperation();
+        }
+        return operation;
+    }
+
+    private Map<String, String> determineMetadata(final Exchange exchange) {
+        Map<String, String> objectMetadata = new HashMap<>();
+
+        Long contentLength = exchange.getIn().getHeader(MinioConstants.CONTENT_LENGTH, Long.class);
+        if (isNotEmpty(contentLength)) {
+            objectMetadata.put("Content-Length", String.valueOf(contentLength));
+        }
+
+        String contentType = exchange.getIn().getHeader(MinioConstants.CONTENT_TYPE, String.class);
+        if (isNotEmpty(contentType)) {
+            objectMetadata.put("Content-Type", contentType);
+        }
+
+        String cacheControl = exchange.getIn().getHeader(MinioConstants.CACHE_CONTROL, String.class);
+        if (isNotEmpty(cacheControl)) {
+            objectMetadata.put("Cache-Control", cacheControl);
+        }
+
+        String contentDisposition = exchange.getIn().getHeader(MinioConstants.CONTENT_DISPOSITION, String.class);
+        if (isNotEmpty(contentDisposition)) {
+            objectMetadata.put("Content-Disposition", contentDisposition);
+        }
+
+        String contentEncoding = exchange.getIn().getHeader(MinioConstants.CONTENT_ENCODING, String.class);
+        if (isNotEmpty(contentEncoding)) {
+            objectMetadata.put("Content-Encoding", contentEncoding);
+        }
+
+        String contentMD5 = exchange.getIn().getHeader(MinioConstants.CONTENT_MD5, String.class);
+        if (isNotEmpty(contentMD5)) {
+            objectMetadata.put("Content-Md5", contentMD5);
+        }
+
+        return objectMetadata;
+    }
+
+    /**
+     * Reads the bucket name from the header of the given exchange. If not
+     * provided, it's read from the endpoint configuration.
+     *
+     * @param exchange The exchange to read the header from.
+     * @return The bucket name.
+     * @throws IllegalArgumentException if the header could not be determined.
+     */
+    private String determineBucketName(final Exchange exchange) {
+        String bucketName = exchange.getIn().getHeader(MinioConstants.BUCKET_NAME, String.class);
+
+        if (isEmpty(bucketName)) {
+            if (isNotEmpty(getConfiguration().getBucketName())) {
+                bucketName = getConfiguration().getBucketName();
+                LOG.trace("Minio Bucket name header is missing, using default one {}", bucketName);
+            } else {
+                throw new IllegalArgumentException("Minio Bucket name header is missing or not configured.");
+            }
+        }
+        return bucketName;
+    }
+
+    private String determineObjectName(final Exchange exchange) {
+        String objectName = exchange.getIn().getHeader(MinioConstants.OBJECT_NAME, String.class);
+        if (isEmpty(objectName)) {
+            objectName = getConfiguration().getKeyName();
+        }
+        if (isEmpty(objectName)) {
+            throw new IllegalArgumentException("Minio Key header is missing.");
+        }
+        return objectName;
+    }
+
+    private String determineStorageClass(final Exchange exchange) {
+        String storageClass = exchange.getIn().getHeader(MinioConstants.STORAGE_CLASS, String.class);
+        if (isEmpty(storageClass)) {
+            storageClass = getConfiguration().getStorageClass();
+        }
+
+        return storageClass;
+    }
+
+    private ByteArrayOutputStream determineLengthInputStream(InputStream inputStream) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        byte[] bytes = new byte[MinioConstants.BYTE_ARRAY_LENGTH];
+        int count;
+        while ((count = inputStream.read(bytes)) > 0) {
+            out.write(bytes, 0, count);
+        }
+        return out;
+    }
+
+    protected MinioConfiguration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public String toString() {
+        if (isEmpty(minioProducerToString)) {
+            minioProducerToString = "MinioProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+        }
+        return minioProducerToString;
+    }
+
+    @Override
+    public MinioEndpoint getEndpoint() {
+        return (MinioEndpoint) super.getEndpoint();
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioCamelInternalClient.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioCamelInternalClient.java
new file mode 100644
index 0000000..b74fe7a
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioCamelInternalClient.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.component.minio.client;
+
+import io.minio.MinioClient;
+
+/**
+ * Create MinioClient using either AWS IAM Credentials or Minio Credentials.
+ */
+public interface MinioCamelInternalClient {
+
+    /**
+     * Returns an minio client after a factory method determines which one to
+     * return.
+     *
+     * @return Minio Minio
+     */
+    MinioClient getMinioClient();
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioClientFactory.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioClientFactory.java
new file mode 100644
index 0000000..efa0c35
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioClientFactory.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.minio.client;
+
+import org.apache.camel.component.minio.MinioConfiguration;
+
+/**
+ * Factory class to return the correct type of MinioClient.
+ */
+public final class MinioClientFactory {
+
+    private MinioClientFactory() {
+        // Prevent instantiation of this factory class.
+        throw new RuntimeException("Do not instantiate a Factory class! Refer to the class " + "to learn how to properly use this factory implementation.");
+    }
+
+    /**
+     * Return the correct minio client (based on remote vs local).
+     *
+     * @param configuration configuration
+     * @return MinioClient
+     */
+    public static MinioCamelInternalClient getClient(MinioConfiguration configuration) {
+        return new MinioRemoteClientImpl(configuration);
+    }
+}
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioRemoteClientImpl.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioRemoteClientImpl.java
new file mode 100644
index 0000000..387b440
--- /dev/null
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/client/MinioRemoteClientImpl.java
@@ -0,0 +1,72 @@
+/*
+ * 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.minio.client;
+
+import io.minio.MinioClient;
+import org.apache.camel.component.minio.MinioConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.camel.util.ObjectHelper.isNotEmpty;
+
+/**
+ * Creates MinIO client object according to the
+ * given endpoint, port, access key, secret key, region and secure option.
+ */
+public class MinioRemoteClientImpl implements MinioCamelInternalClient {
+    private static final Logger LOG = LoggerFactory.getLogger(MinioRemoteClientImpl.class);
+    private final MinioConfiguration configuration;
+
+    /**
+     * Constructor that uses the config file.
+     */
+    public MinioRemoteClientImpl(MinioConfiguration configuration) {
+        LOG.trace("Creating an Minio client.");
+        this.configuration = configuration;
+    }
+
+    /**
+     * Getting the minio client.
+     *
+     * @return Minio Client.
+     */
+    @Override
+    public MinioClient getMinioClient() {
+        if (isNotEmpty(configuration.getEndpoint())) {
+            MinioClient.Builder minioClientRequest = MinioClient.builder();
+
+            if (isNotEmpty(configuration.getProxyPort())) {
+                minioClientRequest.endpoint(configuration.getEndpoint(), configuration.getProxyPort(), configuration.isSecure());
+            } else {
+                minioClientRequest.endpoint(configuration.getEndpoint());
+            }
+            if (isNotEmpty(configuration.getAccessKey()) && isNotEmpty(configuration.getSecretKey())) {
+                minioClientRequest.credentials(configuration.getAccessKey(), configuration.getSecretKey());
+            }
+            if (isNotEmpty(configuration.getRegion())) {
+                minioClientRequest.region(configuration.getRegion());
+            }
+            if (isNotEmpty(configuration.getCustomHttpClient())) {
+                minioClientRequest.httpClient(configuration.getCustomHttpClient());
+            }
+            return minioClientRequest.build();
+
+        } else {
+            throw new IllegalArgumentException("Endpoint must be specified");
+        }
+    }
+}
diff --git a/components/camel-minio/src/main/resources/META-INF/services/org/apache/camel/component/minio b/components/camel-minio/src/main/resources/META-INF/services/org/apache/camel/component/minio
new file mode 100644
index 0000000..6a731ab
--- /dev/null
+++ b/components/camel-minio/src/main/resources/META-INF/services/org/apache/camel/component/minio
@@ -0,0 +1 @@
+class=org.apache.camel.component.minio.MinioComponent
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioClientFactoryTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioClientFactoryTest.java
new file mode 100644
index 0000000..bf5ab50
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioClientFactoryTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.minio;
+
+import org.apache.camel.component.minio.client.MinioCamelInternalClient;
+import org.apache.camel.component.minio.client.MinioClientFactory;
+import org.apache.camel.component.minio.client.MinioRemoteClientImpl;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class MinioClientFactoryTest {
+
+    @Test
+    public void getStandardMinioClientDefault() {
+        MinioConfiguration minioConfiguration = new MinioConfiguration();
+        MinioCamelInternalClient minioClient = MinioClientFactory.getClient(minioConfiguration);
+        assertTrue(minioClient instanceof MinioRemoteClientImpl);
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioComponentConfigurationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioComponentConfigurationTest.java
new file mode 100644
index 0000000..18ddc54
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioComponentConfigurationTest.java
@@ -0,0 +1,57 @@
+/*
+ * 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.minio;
+
+import java.util.Properties;
+
+import io.minio.MinioClient;
+import org.apache.camel.component.minio.integration.MinioTestUtils;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+
+public class MinioComponentConfigurationTest extends CamelTestSupport {
+
+    @Test
+    public void createEndpointWithMinimalConfiguration() throws Exception {
+        MinioComponent component = context.getComponent("minio", MinioComponent.class);
+        MinioEndpoint endpoint = (MinioEndpoint) component
+                .createEndpoint("minio://TestDomain?accessKey=xxx&secretKey=yyy&region=us-west-1&endpoint=http://localhost:4572");
+        assertEquals(endpoint.getConfiguration().getBucketName(), "TestDomain");
+        assertEquals(endpoint.getConfiguration().getAccessKey(), "xxx");
+        assertEquals(endpoint.getConfiguration().getSecretKey(), "yyy");
+        assertEquals(endpoint.getConfiguration().getRegion(), "us-west-1");
+        assertEquals(endpoint.getConfiguration().getEndpoint(), "http://localhost:4572");
+    }
+
+    @Test
+    public void createEndpointWithCredentialsAndClientExistInRegistry() throws Exception {
+        final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+
+        MinioClient client = MinioClient.builder()
+                .endpoint(properties.getProperty("endpoint"))
+                .build();
+        context.getRegistry().bind("minioClient", client);
+        MinioComponent component = context.getComponent("minio", MinioComponent.class);
+        MinioEndpoint endpoint = (MinioEndpoint)component.createEndpoint("minio://MyBucket?accessKey=RAW(XXX)&secretKey=RAW(XXX)&region=eu-west-1");
+
+        assertEquals("MyBucket", endpoint.getConfiguration().getBucketName());
+        assertSame(client, endpoint.getConfiguration().getMinioClient());
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioComponentVerifierExtensionTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioComponentVerifierExtensionTest.java
new file mode 100644
index 0000000..56d32f7
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/MinioComponentVerifierExtensionTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.minio;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.extension.ComponentVerifierExtension;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class MinioComponentVerifierExtensionTest extends CamelTestSupport {
+
+    // *************************************************
+    // Tests (parameters)
+    // *************************************************
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testParameters() {
+        Component component = context().getComponent("minio");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "l");
+        parameters.put("bucketName", "bucket1");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+
+    @Test
+    public void testConnectivity() {
+        Component component = context().getComponent("minio");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "US_EAST_1");
+        parameters.put("bucketName", "test12");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+
+    @Test
+    public void testConnectivityAndRegion() {
+        Component component = context().getComponent("minio");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "l");
+        parameters.put("bucketName", "test12");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioComponentIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioComponentIntegrationTest.java
new file mode 100644
index 0000000..3191fd6
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioComponentIntegrationTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.minio.integration;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioComponentIntegrationTest extends CamelTestSupport {
+
+    @EndpointInject("direct:start")
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void sendInOnly() throws Exception {
+        result.expectedMessageCount(2);
+
+        Exchange exchange1 = template.send("direct:start", ExchangePattern.InOnly, exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "CamelUnitTest");
+            exchange.getIn().setBody("This is my bucket content.");
+        });
+
+        Exchange exchange2 = template.send("direct:start", ExchangePattern.InOnly, exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "CamelUnitTest");
+            exchange.getIn().setBody("This is my bucket content.");
+        });
+
+        assertMockEndpointsSatisfied();
+
+        assertResultExchange(result.getExchanges().get(0));
+        assertResultExchange(result.getExchanges().get(1));
+
+        assertResponseMessage(exchange1.getIn());
+        assertResponseMessage(exchange2.getIn());
+    }
+
+    @Test
+    public void sendInOut() throws Exception {
+        result.expectedMessageCount(1);
+
+        Exchange exchange = template.send("direct:start", ExchangePattern.InOut, exchange1 -> {
+            exchange1.getIn().setHeader(MinioConstants.OBJECT_NAME, "CamelUnitTest");
+            exchange1.getIn().setBody("This is my bucket content.");
+        });
+
+        assertMockEndpointsSatisfied();
+
+        assertResultExchange(result.getExchanges().get(0));
+
+        assertResponseMessage(exchange.getMessage());
+    }
+
+    private void assertResultExchange(Exchange resultExchange) {
+        assertEquals("This is my bucket content.", resultExchange.getIn().getBody(String.class));
+        assertTrue(resultExchange.getIn().getHeader(MinioConstants.OBJECT_NAME, String.class).startsWith("CamelUnitTest"));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.BUCKET_NAME));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.VERSION_ID)); // not enabled on this bucket
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.LAST_MODIFIED));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.CONTENT_TYPE));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.CONTENT_ENCODING));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.CONTENT_LENGTH));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.CONTENT_DISPOSITION));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.CONTENT_MD5));
+        assertNull(resultExchange.getIn().getHeader(MinioConstants.CACHE_CONTROL));
+    }
+
+    private void assertResponseMessage(Message message) {
+        assertNull(message.getHeader(MinioConstants.VERSION_ID));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpointUri =
+                        "minio://mycamelbucket?accessKey=Q3AM3UQ867SPQQA43P2F&secretKey=RAW(zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG)&region=us-west-1&autoCreateBucket=false&endpoint=https://play.min.io";
+
+                from("direct:start").to(minioEndpointUri).to("mock:result");
+
+            }
+        };
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioConsumerIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioConsumerIntegrationTest.java
new file mode 100644
index 0000000..4884ebd
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioConsumerIntegrationTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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.minio.integration;
+
+import java.util.Properties;
+
+import io.minio.MinioClient;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioConsumerIntegrationTest extends CamelTestSupport {
+    final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+
+    @BindToRegistry("minioClient")
+    MinioClient client = MinioClient.builder()
+            .endpoint(properties.getProperty("endpoint"))
+            .credentials(properties.getProperty("accessKey"), properties.getProperty("secretKey"))
+            .region(properties.getProperty("region"))
+            .build();
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    public MinioConsumerIntegrationTest() throws Exception {
+    }
+
+    @Test
+    public void sendIn() throws Exception {
+        result.expectedMessageCount(3);
+
+        template.send("direct:putObject", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "test1.txt");
+            exchange.getIn().setBody("Test1");
+        });
+
+        template.send("direct:putObject", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "test2.txt");
+            exchange.getIn().setBody("Test2");
+        });
+
+        template.send("direct:putObject", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "test3.txt");
+            exchange.getIn().setBody("Test3");
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpoint = "minio://mycamel?autoCreateBucket=false";
+
+                from("direct:putObject").startupOrder(1).to(minioEndpoint).to("mock:result");
+
+                // TODO: Check why this is not working
+                from("minio://mycamel?moveAfterRead=true&destinationBucketName=camel-kafka-connector&autoCreateBucket=false").startupOrder(2).log("${body}");
+
+            }
+        };
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioCopyObjectCustomerKeyOperationIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioCopyObjectCustomerKeyOperationIntegrationTest.java
new file mode 100644
index 0000000..7fec2fc9
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioCopyObjectCustomerKeyOperationIntegrationTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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.minio.integration;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
+import java.util.Properties;
+import java.util.UUID;
+
+import javax.crypto.KeyGenerator;
+
+import io.minio.CopyObjectArgs;
+import io.minio.CopySource;
+import io.minio.GetObjectArgs;
+import io.minio.MinioClient;
+import io.minio.PutObjectArgs;
+import io.minio.ServerSideEncryption;
+import io.minio.ServerSideEncryptionCustomerKey;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.minio.MinioOperations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioCopyObjectCustomerKeyOperationIntegrationTest extends CamelTestSupport {
+
+    final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+    final ServerSideEncryptionCustomerKey secretKey = generateSecretKey();
+    String key = UUID.randomUUID().toString();
+
+    @BindToRegistry("minioClient")
+    MinioClient minioClient =
+            MinioClient.builder()
+                    .endpoint(properties.getProperty("endpoint"))
+                    .credentials(properties.getProperty("accessKey"), properties.getProperty("secretKey"))
+                    .build();
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    public MinioCopyObjectCustomerKeyOperationIntegrationTest() throws IOException {
+    }
+
+    @Test
+    public void sendIn() throws Exception {
+
+        result.expectedMessageCount(1);
+
+        template.send("direct:putObject", exchange -> {
+            String string = "Test";
+
+            //use ByteArrayInputStream to get the bytes of the String and convert them to InputStream.
+            InputStream inputStream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
+
+            PutObjectArgs.Builder putObjectRequest = PutObjectArgs.builder()
+                    .stream(inputStream, inputStream.available(), -1)
+                    .bucket("mycamel")
+                    .object("test.txt")
+                    .sse(secretKey);
+
+            exchange.getIn().setBody(putObjectRequest);
+        });
+
+        template.send("direct:copyObject", exchange -> {
+
+            CopySource.Builder copySourceBuilder = CopySource.builder()
+                    .bucket("mycamel")
+                    .object("test.txt")
+                    .ssec(secretKey);
+
+            CopyObjectArgs.Builder copyObjectRequest = CopyObjectArgs.builder()
+                    .bucket("mycamel1")
+                    .object("test1.txt")
+                    .source(copySourceBuilder.build())
+                    .sse(secretKey);
+
+            exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.copyObject);
+            exchange.getIn().setBody(copyObjectRequest);
+        });
+
+        Exchange respond = template.request("direct:getObject", exchange -> {
+            GetObjectArgs.Builder getObjectRequest = GetObjectArgs.builder()
+                    .object("test1.txt")
+                    .bucket("mycamel1")
+                    .ssec(secretKey);
+
+            exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.getObject);
+            exchange.getIn().setBody(getObjectRequest);
+        });
+
+        InputStream minio = respond.getIn().getBody(InputStream.class);
+
+
+        assertEquals("Test", readInputStream(minio));
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpoint = "minio://mycamel?autoCreateBucket=false&pojoRequest=true";
+                String minioEndpoint1 = "minio://mycamel1?autoCreateBucket=false&pojoRequest=true";
+
+                from("direct:putObject").to(minioEndpoint);
+
+                from("direct:copyObject").to(minioEndpoint);
+
+                from("direct:getObject").to(minioEndpoint1).to("mock:result");
+
+            }
+        };
+    }
+
+    protected static ServerSideEncryptionCustomerKey generateSecretKey() {
+        KeyGenerator generator;
+        try {
+            generator = KeyGenerator.getInstance("AES");
+            generator.init(256, new SecureRandom());
+            return ServerSideEncryption.withCustomerKey(generator.generateKey());
+        } catch (Exception e) {
+            fail("Unable to generate symmetric key: " + e.getMessage());
+            return null;
+        }
+    }
+
+    private String readInputStream(InputStream minioObject) throws IOException {
+        StringBuilder textBuilder = new StringBuilder();
+        try (Reader reader = new BufferedReader(new InputStreamReader(minioObject, Charset.forName(StandardCharsets.UTF_8.name())))) {
+            int c;
+            while ((c = reader.read()) != -1) {
+                textBuilder.append((char) c);
+            }
+        }
+        return textBuilder.toString();
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioCopyObjectOperationIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioCopyObjectOperationIntegrationTest.java
new file mode 100644
index 0000000..2c5cb9a
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioCopyObjectOperationIntegrationTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.minio.integration;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import io.minio.MinioClient;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.minio.MinioOperations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioCopyObjectOperationIntegrationTest extends CamelTestSupport {
+    final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+
+    @BindToRegistry("minioClient")
+    MinioClient minioClient =
+            MinioClient.builder()
+                    .endpoint(properties.getProperty("endpoint"))
+                    .credentials(properties.getProperty("accessKey"), properties.getProperty("secretKey"))
+                    .build();
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    public MinioCopyObjectOperationIntegrationTest() throws IOException {
+    }
+
+    @Test
+    public void sendIn() throws Exception {
+        result.expectedMessageCount(1);
+
+        template.send("direct:putObject", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "test.txt");
+            exchange.getIn().setBody("Test");
+        });
+
+        template.send("direct:copyObject", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "test.txt");
+            exchange.getIn().setHeader(MinioConstants.DESTINATION_OBJECT_NAME, "test1.txt");
+            exchange.getIn().setHeader(MinioConstants.DESTINATION_BUCKET_NAME, "mycamel1");
+            exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.copyObject);
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpoint = "minio://mycamel?autoCreateBucket=false";
+
+                from("direct:putObject").to(minioEndpoint);
+
+                from("direct:copyObject").to(minioEndpoint).to("mock:result");
+
+            }
+        };
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioDeleteBucketOperationIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioDeleteBucketOperationIntegrationTest.java
new file mode 100644
index 0000000..e931f61
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioDeleteBucketOperationIntegrationTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.minio.integration;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import io.minio.MinioClient;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.minio.MinioOperations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioDeleteBucketOperationIntegrationTest extends CamelTestSupport {
+    final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+
+    @BindToRegistry("minioClient")
+    MinioClient minioClient =
+            MinioClient.builder()
+                    .endpoint(properties.getProperty("endpoint"))
+                    .credentials(properties.getProperty("accessKey"), properties.getProperty("secretKey"))
+                    .build();
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    public MinioDeleteBucketOperationIntegrationTest() throws IOException {
+    }
+
+    @Test
+    public void sendIn() throws Exception {
+        result.expectedMessageCount(1);
+
+        template.send("direct:listBuckets", exchange -> exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.listBuckets));
+
+        template.send("direct:deleteBucket", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.deleteBucket);
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpoint = "minio://mycamel2?autoCreateBucket=true";
+
+                from("direct:listBuckets").to(minioEndpoint);
+
+                from("direct:deleteBucket").to(minioEndpoint).to("mock:result");
+
+            }
+        };
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIntegrationTest.java
new file mode 100644
index 0000000..9d6a096
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioListObjectsOperationIntegrationTest.java
@@ -0,0 +1,121 @@
+/*
+ * 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.minio.integration;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Properties;
+
+import com.google.common.collect.Iterators;
+import io.minio.MinioClient;
+import io.minio.Result;
+import io.minio.messages.Item;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.minio.MinioOperations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioListObjectsOperationIntegrationTest extends CamelTestSupport {
+    final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+
+    @BindToRegistry("minioClient")
+    MinioClient minioClient =
+            MinioClient.builder()
+                    .endpoint(properties.getProperty("endpoint"))
+                    .credentials(properties.getProperty("accessKey"), properties.getProperty("secretKey"))
+                    .build();
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    public MinioListObjectsOperationIntegrationTest() throws IOException {
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void sendIn() throws Exception {
+        result.expectedMessageCount(1);
+
+        template.send("direct:listBuckets", exchange -> exchange.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.listBuckets));
+
+        template.send("direct:addObject", ExchangePattern.InOnly, exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "CamelUnitTest2");
+            exchange.getIn().setBody("This is my bucket content.");
+            exchange.getIn().removeHeader(MinioConstants.MINIO_OPERATION);
+        });
+
+        Exchange exchange = template.request("direct:listObjects", exchange13 -> {
+            exchange13.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange13.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.listObjects);
+        });
+
+        Iterable<Result<Item>> respond = (Iterable<Result<Item>>) exchange.getMessage().getBody();
+        Iterator<Result<Item>> respondSize = respond.iterator();
+        Iterator<Result<Item>> respondIterator = respond.iterator();
+
+        assertEquals(1, Iterators.size(respondSize));
+        assertEquals("CamelUnitTest2", respondIterator.next().get().objectName());
+
+        template.send("direct:deleteObject", ExchangePattern.InOnly, exchange12 -> {
+            exchange12.getIn().setHeader(MinioConstants.OBJECT_NAME, "CamelUnitTest2");
+            exchange12.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange12.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.deleteObject);
+        });
+
+        template.send("direct:deleteBucket", exchange1 -> {
+            exchange1.getIn().setHeader(MinioConstants.BUCKET_NAME, "mycamel2");
+            exchange1.getIn().setHeader(MinioConstants.MINIO_OPERATION, MinioOperations.deleteBucket);
+        });
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpoint = "minio://mycamel2?autoCreateBucket=true";
+
+                from("direct:listBucket").to(minioEndpoint);
+
+                from("direct:addObject").to(minioEndpoint);
+
+                from("direct:deleteObject").to(minioEndpoint);
+
+                from("direct:listObjects").to(minioEndpoint);
+
+                from("direct:deleteBucket").to(minioEndpoint).to("mock:result");
+
+            }
+        };
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioObjectRangeOperationIntegrationTest.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioObjectRangeOperationIntegrationTest.java
new file mode 100644
index 0000000..afeb31e
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioObjectRangeOperationIntegrationTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.minio.integration;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Properties;
+
+import io.minio.MinioClient;
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.EndpointInject;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.minio.MinioConstants;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Disabled("Must be manually tested. Provide your own accessKey and secretKey!")
+public class MinioObjectRangeOperationIntegrationTest extends CamelTestSupport {
+
+    private static final Logger LOG = LoggerFactory.getLogger(MinioObjectRangeOperationIntegrationTest.class);
+    final Properties properties = MinioTestUtils.loadMinioPropertiesFile();
+
+    @BindToRegistry("minioClient")
+    MinioClient minioClient =
+            MinioClient.builder()
+                    .endpoint(properties.getProperty("endpoint"))
+                    .credentials(properties.getProperty("accessKey"), properties.getProperty("secretKey"))
+                    .build();
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    public MinioObjectRangeOperationIntegrationTest() throws IOException {
+    }
+
+    @Test
+    public void sendIn() throws Exception {
+        result.expectedMessageCount(1);
+
+        template.send("direct:getPartialObject", exchange -> {
+            exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "element.txt");
+            exchange.getIn().setHeader(MinioConstants.OFFSET, 0);
+            exchange.getIn().setHeader(MinioConstants.LENGTH, 9);
+        });
+        assertMockEndpointsSatisfied();
+
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String minioEndpoint = "minio://mycamelbucket?operation=getPartialObject&autoCreateBucket=false";
+
+                from("direct:getPartialObject").to(minioEndpoint).process(exchange -> {
+                    InputStream minioPartialObject = exchange.getIn().getBody(InputStream.class);
+                    LOG.info(readInputStream(minioPartialObject));
+
+                }).to("mock:result");
+
+            }
+        };
+    }
+
+    private String readInputStream(InputStream minioObject) throws IOException {
+        StringBuilder textBuilder = new StringBuilder();
+        try (Reader reader = new BufferedReader(new InputStreamReader(minioObject, Charset.forName(StandardCharsets.UTF_8.name())))) {
+            int c;
+            while ((c = reader.read()) != -1) {
+                textBuilder.append((char) c);
+            }
+        }
+        return textBuilder.toString();
+    }
+}
diff --git a/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioTestUtils.java b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioTestUtils.java
new file mode 100644
index 0000000..f9fa048
--- /dev/null
+++ b/components/camel-minio/src/test/java/org/apache/camel/component/minio/integration/MinioTestUtils.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.minio.integration;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+import java.util.Properties;
+
+public final class MinioTestUtils {
+
+    private MinioTestUtils() {
+    }
+
+    public static Properties loadMinioPropertiesFile() throws IOException {
+        final Properties properties = new Properties();
+        final String fileName = "minio_key.properties";
+
+        final InputStream inputStream = Objects.requireNonNull(MinioTestUtils.class.getClassLoader().getResourceAsStream(fileName));
+
+        properties.load(inputStream);
+
+        return properties;
+    }
+
+    public static Properties loadMinioAccessFromJvmEnv() throws Exception {
+        final Properties properties = new Properties();
+        if (System.getProperty("endpoint") == null || System.getProperty("accessKey") == null || System.getProperty("secretKey") == null) {
+            throw new Exception("Make sure to supply minio endpoint and credentials");
+        }
+        properties.setProperty("endpoint", System.getProperty("endpoint"));
+        properties.setProperty("access_key", System.getProperty("accessKey"));
+        properties.setProperty("secret_key", System.getProperty("secretKey"));
+        properties.setProperty("region", System.getProperty("region"));
+        return properties;
+    }
+}
\ No newline at end of file
diff --git a/components/camel-minio/src/test/resources/empty.txt b/components/camel-minio/src/test/resources/empty.txt
new file mode 100644
index 0000000..3995316
--- /dev/null
+++ b/components/camel-minio/src/test/resources/empty.txt
Binary files differ
diff --git a/components/camel-minio/src/test/resources/log4j2.properties b/components/camel-minio/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..7674a89
--- /dev/null
+++ b/components/camel-minio/src/test/resources/log4j2.properties
@@ -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.
+## ---------------------------------------------------------------------------
+appender.file.type=File
+appender.file.name=file
+appender.file.fileName=target/camel-minio-test.log
+appender.file.layout.type=PatternLayout
+appender.file.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type=Console
+appender.out.name=out
+appender.out.layout.type=PatternLayout
+appender.out.layout.pattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level=INFO
+rootLogger.appenderRef.file.ref=file
diff --git a/components/camel-minio/src/test/resources/minio_key.properties b/components/camel-minio/src/test/resources/minio_key.properties
new file mode 100644
index 0000000..07be599
--- /dev/null
+++ b/components/camel-minio/src/test/resources/minio_key.properties
@@ -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.
+## ---------------------------------------------------------------------------
+endpoint=https://play.min.io
+accessKey=Q3AM3UQ867SPQQA43P2F
+secretKey=zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
+region=us-west-1
diff --git a/components/pom.xml b/components/pom.xml
index 10baedd..5302500 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -16,7 +16,8 @@
     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/xsd/maven-4.0.0.xsd">
+-->
+<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/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
@@ -391,6 +392,7 @@
         <module>camel-zipkin</module>
         <module>camel-zookeeper-master</module>
         <module>camel-zookeeper</module>
+        <module>camel-minio</module>
   </modules>
 
     <properties>
@@ -518,4 +520,4 @@
         </plugins>
     </build>
 
-</project>
+</project>
\ No newline at end of file
diff --git a/core/camel-allcomponents/pom.xml b/core/camel-allcomponents/pom.xml
index c9e82cc..53b47df 100644
--- a/core/camel-allcomponents/pom.xml
+++ b/core/camel-allcomponents/pom.xml
@@ -816,6 +816,10 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-minio</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-mllp</artifactId>
 		</dependency>
 		<dependency>
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 1d9b7b5..93f5088 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -2615,6 +2615,17 @@
         return org.apache.camel.builder.component.dsl.MinaComponentBuilderFactory.mina();
     }
     /**
+     * Minio Storage Service (camel-minio)
+     * Store and retrieve objects from Minio Storage Service using Minio SDK.
+     * 
+     * Category: cloud,file
+     * Since: 3.5
+     * Maven coordinates: org.apache.camel:camel-minio
+     */
+    static org.apache.camel.builder.component.dsl.MinioComponentBuilderFactory.MinioComponentBuilder minio() {
+        return org.apache.camel.builder.component.dsl.MinioComponentBuilderFactory.minio();
+    }
+    /**
      * MLLP (camel-mllp)
      * Communicate with external systems using the MLLP protocol.
      * 
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/MinioComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/MinioComponentBuilderFactory.java
new file mode 100644
index 0000000..37478c1
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/MinioComponentBuilderFactory.java
@@ -0,0 +1,716 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.minio.MinioComponent;
+
+/**
+ * Store and retrieve objects from Minio Storage Service using Minio SDK.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface MinioComponentBuilderFactory {
+
+    /**
+     * Minio Storage Service (camel-minio)
+     * Store and retrieve objects from Minio Storage Service using Minio SDK.
+     * 
+     * Category: cloud,file
+     * Since: 3.5
+     * Maven coordinates: org.apache.camel:camel-minio
+     */
+    static MinioComponentBuilder minio() {
+        return new MinioComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the Minio Storage Service component.
+     */
+    interface MinioComponentBuilder extends ComponentBuilder<MinioComponent> {
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioComponentBuilder autoCreateBucket(boolean autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Name of the bucket. The bucket will be created if it doesn't already
+         * exists.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioComponentBuilder bucketName(java.lang.String bucketName) {
+            doSetProperty("bucketName", bucketName);
+            return this;
+        }
+        /**
+         * The component configuration.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.minio.MinioConfiguration</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder configuration(
+                org.apache.camel.component.minio.MinioConfiguration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option is a: <code>okhttp3.OkHttpClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder customHttpClient(
+                okhttp3.OkHttpClient customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Endpoint can be an URL, domain name, IPv4 address or IPv6 address.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder endpoint(java.lang.String endpoint) {
+            doSetProperty("endpoint", endpoint);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option is a: <code>io.minio.MinioClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder minioClient(
+                io.minio.MinioClient minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioComponentBuilder objectLock(boolean objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * The policy for this queue to set in the method.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder policy(java.lang.String policy) {
+            doSetProperty("policy", policy);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option is a: <code>java.lang.Integer</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder proxyPort(java.lang.Integer proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * The region in which Minio client needs to work. When using this
+         * parameter, the configuration will expect the lowercase name of the
+         * region (for example ap-east-1). You'll need to use the name
+         * Region.EU_WEST_1.id().
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder region(java.lang.String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioComponentBuilder secure(boolean secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option is a: <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder serverSideEncryption(
+                io.minio.ServerSideEncryption serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option is a:
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioComponentBuilder serverSideEncryptionCustomerKey(
+                io.minio.ServerSideEncryptionCustomerKey serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * If this option is true and includeBody is true, then the
+         * MinioObject.close() method will be called on exchange completion.
+         * This option is strongly related to includeBody option. In case of
+         * setting includeBody to true and autocloseBody to false, it will be up
+         * to the caller to close the MinioObject stream. Setting autocloseBody
+         * to true, will close the MinioObject stream automatically.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioComponentBuilder autoCloseBody(boolean autoCloseBody) {
+            doSetProperty("autoCloseBody", autoCloseBody);
+            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.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder bridgeErrorHandler(
+                boolean bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Set this flag if you want to bypassGovernanceMode when deleting a
+         * particular object.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder bypassGovernanceMode(
+                boolean bypassGovernanceMode) {
+            doSetProperty("bypassGovernanceMode", bypassGovernanceMode);
+            return this;
+        }
+        /**
+         * Delete objects from Minio after they have been retrieved. The delete
+         * is only performed if the Exchange is committed. If a rollback occurs,
+         * the object is not deleted. If this option is false, then the same
+         * objects will be retrieve over and over again on the polls. Therefore
+         * you need to use the Idempotent Consumer EIP in the route to filter
+         * out duplicates. You can filter using the MinioConstants#BUCKET_NAME
+         * and MinioConstants#OBJECT_NAME headers, or only the
+         * MinioConstants#OBJECT_NAME header.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioComponentBuilder deleteAfterRead(boolean deleteAfterRead) {
+            doSetProperty("deleteAfterRead", deleteAfterRead);
+            return this;
+        }
+        /**
+         * The delimiter which is used in the ListObjectsRequest to only consume
+         * objects we are interested in.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder delimiter(java.lang.String delimiter) {
+            doSetProperty("delimiter", delimiter);
+            return this;
+        }
+        /**
+         * Source bucket name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder destinationBucketName(
+                java.lang.String destinationBucketName) {
+            doSetProperty("destinationBucketName", destinationBucketName);
+            return this;
+        }
+        /**
+         * Source object name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder destinationObjectName(
+                java.lang.String destinationObjectName) {
+            doSetProperty("destinationObjectName", destinationObjectName);
+            return this;
+        }
+        /**
+         * If it is true, the exchange body will be set to a stream to the
+         * contents of the file. If false, the headers will be set with the
+         * Minio object metadata, but the body will be null. This option is
+         * strongly related to autocloseBody option. In case of setting
+         * includeBody to true and autocloseBody to false, it will be up to the
+         * caller to close the MinioObject stream. Setting autocloseBody to
+         * true, will close the MinioObject stream automatically.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioComponentBuilder includeBody(boolean includeBody) {
+            doSetProperty("includeBody", includeBody);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to set include
+         * folders.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder includeFolders(boolean includeFolders) {
+            doSetProperty("includeFolders", includeFolders);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to get objects with
+         * user meta data.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder includeUserMetadata(
+                boolean includeUserMetadata) {
+            doSetProperty("includeUserMetadata", includeUserMetadata);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to get objects with
+         * versioning.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder includeVersions(boolean includeVersions) {
+            doSetProperty("includeVersions", includeVersions);
+            return this;
+        }
+        /**
+         * Number of bytes of object data from offset.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder length(long length) {
+            doSetProperty("length", length);
+            return this;
+        }
+        /**
+         * Set match ETag parameter for get object(s).
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder matchETag(java.lang.String matchETag) {
+            doSetProperty("matchETag", matchETag);
+            return this;
+        }
+        /**
+         * Set modified since parameter for get object(s).
+         * 
+         * The option is a: <code>java.time.ZonedDateTime</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder modifiedSince(
+                java.time.ZonedDateTime modifiedSince) {
+            doSetProperty("modifiedSince", modifiedSince);
+            return this;
+        }
+        /**
+         * Move objects from bucket to a different bucket after they have been
+         * retrieved. To accomplish the operation the destinationBucket option
+         * must be set. The copy bucket operation is only performed if the
+         * Exchange is committed. If a rollback occurs, the object is not moved.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder moveAfterRead(boolean moveAfterRead) {
+            doSetProperty("moveAfterRead", moveAfterRead);
+            return this;
+        }
+        /**
+         * Set not match ETag parameter for get object(s).
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder notMatchETag(java.lang.String notMatchETag) {
+            doSetProperty("notMatchETag", notMatchETag);
+            return this;
+        }
+        /**
+         * To get the object from the bucket with the given object name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder objectName(java.lang.String objectName) {
+            doSetProperty("objectName", objectName);
+            return this;
+        }
+        /**
+         * Start byte position of object data.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder offset(long offset) {
+            doSetProperty("offset", offset);
+            return this;
+        }
+        /**
+         * Object name starts with prefix.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder prefix(java.lang.String prefix) {
+            doSetProperty("prefix", prefix);
+            return this;
+        }
+        /**
+         * List recursively than directory structure emulation.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder recursive(boolean recursive) {
+            doSetProperty("recursive", recursive);
+            return this;
+        }
+        /**
+         * list objects in bucket after this object name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder startAfter(java.lang.String startAfter) {
+            doSetProperty("startAfter", startAfter);
+            return this;
+        }
+        /**
+         * Set un modified since parameter for get object(s).
+         * 
+         * The option is a: <code>java.time.ZonedDateTime</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder unModifiedSince(
+                java.time.ZonedDateTime unModifiedSince) {
+            doSetProperty("unModifiedSince", unModifiedSince);
+            return this;
+        }
+        /**
+         * when true, version 1 of REST API is used.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioComponentBuilder useVersion1(boolean useVersion1) {
+            doSetProperty("useVersion1", useVersion1);
+            return this;
+        }
+        /**
+         * Set specific version_ID of a object when deleting the object.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioComponentBuilder versionId(java.lang.String versionId) {
+            doSetProperty("versionId", versionId);
+            return this;
+        }
+        /**
+         * Delete file object after the Minio file has been uploaded.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioComponentBuilder deleteAfterWrite(boolean deleteAfterWrite) {
+            doSetProperty("deleteAfterWrite", deleteAfterWrite);
+            return this;
+        }
+        /**
+         * Setting the key name for an element in the bucket through endpoint
+         * parameter.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioComponentBuilder keyName(java.lang.String keyName) {
+            doSetProperty("keyName", keyName);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The operation to do in case the user don't want to do only an upload.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.minio.MinioOperations</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioComponentBuilder operation(
+                org.apache.camel.component.minio.MinioOperations operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * If we want to use a POJO request as body or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioComponentBuilder pojoRequest(boolean pojoRequest) {
+            doSetProperty("pojoRequest", pojoRequest);
+            return this;
+        }
+        /**
+         * The storage class to set in the request.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioComponentBuilder storageClass(java.lang.String storageClass) {
+            doSetProperty("storageClass", storageClass);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default MinioComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Access Key or Minio Access Key. If not set camel
+         * will connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioComponentBuilder accessKey(java.lang.String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key Id or Minio Secret Key. If not set camel will
+         * connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioComponentBuilder secretKey(java.lang.String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+    }
+
+    class MinioComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<MinioComponent>
+            implements
+                MinioComponentBuilder {
+        @Override
+        protected MinioComponent buildConcreteComponent() {
+            return new MinioComponent();
+        }
+        private org.apache.camel.component.minio.MinioConfiguration getOrCreateConfiguration(
+                org.apache.camel.component.minio.MinioComponent component) {
+            if (component.getConfiguration() == null) {
+                component.setConfiguration(new org.apache.camel.component.minio.MinioConfiguration());
+            }
+            return component.getConfiguration();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "autoCreateBucket": getOrCreateConfiguration((MinioComponent) component).setAutoCreateBucket((boolean) value); return true;
+            case "bucketName": getOrCreateConfiguration((MinioComponent) component).setBucketName((java.lang.String) value); return true;
+            case "configuration": ((MinioComponent) component).setConfiguration((org.apache.camel.component.minio.MinioConfiguration) value); return true;
+            case "customHttpClient": getOrCreateConfiguration((MinioComponent) component).setCustomHttpClient((okhttp3.OkHttpClient) value); return true;
+            case "endpoint": getOrCreateConfiguration((MinioComponent) component).setEndpoint((java.lang.String) value); return true;
+            case "minioClient": getOrCreateConfiguration((MinioComponent) component).setMinioClient((io.minio.MinioClient) value); return true;
+            case "objectLock": getOrCreateConfiguration((MinioComponent) component).setObjectLock((boolean) value); return true;
+            case "policy": getOrCreateConfiguration((MinioComponent) component).setPolicy((java.lang.String) value); return true;
+            case "proxyPort": getOrCreateConfiguration((MinioComponent) component).setProxyPort((java.lang.Integer) value); return true;
+            case "region": getOrCreateConfiguration((MinioComponent) component).setRegion((java.lang.String) value); return true;
+            case "secure": getOrCreateConfiguration((MinioComponent) component).setSecure((boolean) value); return true;
+            case "serverSideEncryption": getOrCreateConfiguration((MinioComponent) component).setServerSideEncryption((io.minio.ServerSideEncryption) value); return true;
+            case "serverSideEncryptionCustomerKey": getOrCreateConfiguration((MinioComponent) component).setServerSideEncryptionCustomerKey((io.minio.ServerSideEncryptionCustomerKey) value); return true;
+            case "autoCloseBody": getOrCreateConfiguration((MinioComponent) component).setAutoCloseBody((boolean) value); return true;
+            case "bridgeErrorHandler": ((MinioComponent) component).setBridgeErrorHandler((boolean) value); return true;
+            case "bypassGovernanceMode": getOrCreateConfiguration((MinioComponent) component).setBypassGovernanceMode((boolean) value); return true;
+            case "deleteAfterRead": getOrCreateConfiguration((MinioComponent) component).setDeleteAfterRead((boolean) value); return true;
+            case "delimiter": getOrCreateConfiguration((MinioComponent) component).setDelimiter((java.lang.String) value); return true;
+            case "destinationBucketName": getOrCreateConfiguration((MinioComponent) component).setDestinationBucketName((java.lang.String) value); return true;
+            case "destinationObjectName": getOrCreateConfiguration((MinioComponent) component).setDestinationObjectName((java.lang.String) value); return true;
+            case "includeBody": getOrCreateConfiguration((MinioComponent) component).setIncludeBody((boolean) value); return true;
+            case "includeFolders": getOrCreateConfiguration((MinioComponent) component).setIncludeFolders((boolean) value); return true;
+            case "includeUserMetadata": getOrCreateConfiguration((MinioComponent) component).setIncludeUserMetadata((boolean) value); return true;
+            case "includeVersions": getOrCreateConfiguration((MinioComponent) component).setIncludeVersions((boolean) value); return true;
+            case "length": getOrCreateConfiguration((MinioComponent) component).setLength((long) value); return true;
+            case "matchETag": getOrCreateConfiguration((MinioComponent) component).setMatchETag((java.lang.String) value); return true;
+            case "modifiedSince": getOrCreateConfiguration((MinioComponent) component).setModifiedSince((java.time.ZonedDateTime) value); return true;
+            case "moveAfterRead": getOrCreateConfiguration((MinioComponent) component).setMoveAfterRead((boolean) value); return true;
+            case "notMatchETag": getOrCreateConfiguration((MinioComponent) component).setNotMatchETag((java.lang.String) value); return true;
+            case "objectName": getOrCreateConfiguration((MinioComponent) component).setObjectName((java.lang.String) value); return true;
+            case "offset": getOrCreateConfiguration((MinioComponent) component).setOffset((long) value); return true;
+            case "prefix": getOrCreateConfiguration((MinioComponent) component).setPrefix((java.lang.String) value); return true;
+            case "recursive": getOrCreateConfiguration((MinioComponent) component).setRecursive((boolean) value); return true;
+            case "startAfter": getOrCreateConfiguration((MinioComponent) component).setStartAfter((java.lang.String) value); return true;
+            case "unModifiedSince": getOrCreateConfiguration((MinioComponent) component).setUnModifiedSince((java.time.ZonedDateTime) value); return true;
+            case "useVersion1": getOrCreateConfiguration((MinioComponent) component).setUseVersion1((boolean) value); return true;
+            case "versionId": getOrCreateConfiguration((MinioComponent) component).setVersionId((java.lang.String) value); return true;
+            case "deleteAfterWrite": getOrCreateConfiguration((MinioComponent) component).setDeleteAfterWrite((boolean) value); return true;
+            case "keyName": getOrCreateConfiguration((MinioComponent) component).setKeyName((java.lang.String) value); return true;
+            case "lazyStartProducer": ((MinioComponent) component).setLazyStartProducer((boolean) value); return true;
+            case "operation": getOrCreateConfiguration((MinioComponent) component).setOperation((org.apache.camel.component.minio.MinioOperations) value); return true;
+            case "pojoRequest": getOrCreateConfiguration((MinioComponent) component).setPojoRequest((boolean) value); return true;
+            case "storageClass": getOrCreateConfiguration((MinioComponent) component).setStorageClass((java.lang.String) value); return true;
+            case "basicPropertyBinding": ((MinioComponent) component).setBasicPropertyBinding((boolean) value); return true;
+            case "accessKey": getOrCreateConfiguration((MinioComponent) component).setAccessKey((java.lang.String) value); return true;
+            case "secretKey": getOrCreateConfiguration((MinioComponent) component).setSecretKey((java.lang.String) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index 86635a0..96a946f 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -4855,6 +4855,27 @@
     "producerOnly": false,
     "lenientProperties": false
   },
+  "MinioComponentBuilderFactory": {
+    "kind": "component",
+    "name": "minio",
+    "title": "Minio Storage Service",
+    "description": "Store and retrieve objects from Minio Storage Service using Minio SDK.",
+    "deprecated": false,
+    "firstVersion": "3.5.0",
+    "label": "cloud,file",
+    "javaType": "org.apache.camel.component.minio.MinioComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-minio",
+    "version": "3.5.0-SNAPSHOT",
+    "scheme": "minio",
+    "extendsScheme": "",
+    "syntax": "minio:\/\/bucketName",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": false,
+    "lenientProperties": false
+  },
   "MllpComponentBuilderFactory": {
     "kind": "component",
     "name": "mllp",
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index e65db7a..31e1427 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -240,6 +240,7 @@
             org.apache.camel.builder.endpoint.dsl.MiloClientEndpointBuilderFactory.MiloClientBuilders,
             org.apache.camel.builder.endpoint.dsl.MiloServerEndpointBuilderFactory.MiloServerBuilders,
             org.apache.camel.builder.endpoint.dsl.MinaEndpointBuilderFactory.MinaBuilders,
+            org.apache.camel.builder.endpoint.dsl.MinioEndpointBuilderFactory.MinioBuilders,
             org.apache.camel.builder.endpoint.dsl.MllpEndpointBuilderFactory.MllpBuilders,
             org.apache.camel.builder.endpoint.dsl.MockEndpointBuilderFactory.MockBuilders,
             org.apache.camel.builder.endpoint.dsl.MongoDbEndpointBuilderFactory.MongoDbBuilders,
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index 7a015e3..447fe96 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -237,6 +237,7 @@
             org.apache.camel.builder.endpoint.dsl.MiloClientEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.MiloServerEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.MinaEndpointBuilderFactory,
+            org.apache.camel.builder.endpoint.dsl.MinioEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.MllpEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.MockEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.MongoDbEndpointBuilderFactory,
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 9d56656..369fb96 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -10073,6 +10073,47 @@
         return org.apache.camel.builder.endpoint.dsl.MinaEndpointBuilderFactory.endpointBuilder(componentName, path);
     }
     /**
+     * Minio Storage Service (camel-minio)
+     * Store and retrieve objects from Minio Storage Service using Minio SDK.
+     * 
+     * Category: cloud,file
+     * Since: 3.5
+     * Maven coordinates: org.apache.camel:camel-minio
+     * 
+     * Syntax: <code>minio://bucketName</code>
+     * 
+     * Path parameter: bucketName (required)
+     * Bucket name
+     * 
+     * @param path //bucketName
+     */
+    public static org.apache.camel.builder.endpoint.dsl.MinioEndpointBuilderFactory.MinioEndpointBuilder minio(
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.MinioEndpointBuilderFactory.endpointBuilder("minio", path);
+    }
+    /**
+     * Minio Storage Service (camel-minio)
+     * Store and retrieve objects from Minio Storage Service using Minio SDK.
+     * 
+     * Category: cloud,file
+     * Since: 3.5
+     * Maven coordinates: org.apache.camel:camel-minio
+     * 
+     * Syntax: <code>minio://bucketName</code>
+     * 
+     * Path parameter: bucketName (required)
+     * Bucket name
+     * 
+     * @param componentName to use a custom component name for the endpoint
+     * instead of the default name
+     * @param path //bucketName
+     */
+    public static org.apache.camel.builder.endpoint.dsl.MinioEndpointBuilderFactory.MinioEndpointBuilder minio(
+            String componentName,
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.MinioEndpointBuilderFactory.endpointBuilder(componentName, path);
+    }
+    /**
      * MLLP (camel-mllp)
      * Communicate with external systems using the MLLP protocol.
      * 
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MinioEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MinioEndpointBuilderFactory.java
new file mode 100644
index 0000000..929aa39
--- /dev/null
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/MinioEndpointBuilderFactory.java
@@ -0,0 +1,2331 @@
+/*
+ * 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 java.time.ZonedDateTime;
+import java.util.Map;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Generated;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.LoggingLevel;
+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;
+import org.apache.camel.spi.PollingConsumerPollStrategy;
+
+/**
+ * Store and retrieve objects from Minio Storage Service using Minio SDK.
+ * 
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointDslMojo")
+public interface MinioEndpointBuilderFactory {
+
+
+    /**
+     * Builder for endpoint consumers for the Minio Storage Service component.
+     */
+    public interface MinioEndpointConsumerBuilder
+            extends
+                EndpointConsumerBuilder {
+        default AdvancedMinioEndpointConsumerBuilder advanced() {
+            return (AdvancedMinioEndpointConsumerBuilder) this;
+        }
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder autoCreateBucket(
+                boolean autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder autoCreateBucket(
+                String autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option is a: <code>okhttp3.OkHttpClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder customHttpClient(
+                Object customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option will be converted to a <code>okhttp3.OkHttpClient</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder customHttpClient(
+                String customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Endpoint can be an URL, domain name, IPv4 address or IPv6 address.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder endpoint(String endpoint) {
+            doSetProperty("endpoint", endpoint);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option is a: <code>io.minio.MinioClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder minioClient(Object minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option will be converted to a <code>io.minio.MinioClient</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder minioClient(String minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder objectLock(boolean objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder objectLock(String objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * The policy for this queue to set in the method.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder policy(String policy) {
+            doSetProperty("policy", policy);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option is a: <code>java.lang.Integer</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder proxyPort(Integer proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option will be converted to a <code>java.lang.Integer</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder proxyPort(String proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * The region in which Minio client needs to work. When using this
+         * parameter, the configuration will expect the lowercase name of the
+         * region (for example ap-east-1). You'll need to use the name
+         * Region.EU_WEST_1.id().
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder region(String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder secure(boolean secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder secure(String secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option is a: <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder serverSideEncryption(
+                Object serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option will be converted to a
+         * <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder serverSideEncryption(
+                String serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option is a:
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder serverSideEncryptionCustomerKey(
+                Object serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option will be converted to a
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointConsumerBuilder serverSideEncryptionCustomerKey(
+                String serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * If this option is true and includeBody is true, then the
+         * MinioObject.close() method will be called on exchange completion.
+         * This option is strongly related to includeBody option. In case of
+         * setting includeBody to true and autocloseBody to false, it will be up
+         * to the caller to close the MinioObject stream. Setting autocloseBody
+         * to true, will close the MinioObject stream automatically.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder autoCloseBody(boolean autoCloseBody) {
+            doSetProperty("autoCloseBody", autoCloseBody);
+            return this;
+        }
+        /**
+         * If this option is true and includeBody is true, then the
+         * MinioObject.close() method will be called on exchange completion.
+         * This option is strongly related to includeBody option. In case of
+         * setting includeBody to true and autocloseBody to false, it will be up
+         * to the caller to close the MinioObject stream. Setting autocloseBody
+         * to true, will close the MinioObject stream automatically.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder autoCloseBody(String autoCloseBody) {
+            doSetProperty("autoCloseBody", autoCloseBody);
+            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.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder 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.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder bridgeErrorHandler(
+                String bridgeErrorHandler) {
+            doSetProperty("bridgeErrorHandler", bridgeErrorHandler);
+            return this;
+        }
+        /**
+         * Set this flag if you want to bypassGovernanceMode when deleting a
+         * particular object.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder bypassGovernanceMode(
+                boolean bypassGovernanceMode) {
+            doSetProperty("bypassGovernanceMode", bypassGovernanceMode);
+            return this;
+        }
+        /**
+         * Set this flag if you want to bypassGovernanceMode when deleting a
+         * particular object.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder bypassGovernanceMode(
+                String bypassGovernanceMode) {
+            doSetProperty("bypassGovernanceMode", bypassGovernanceMode);
+            return this;
+        }
+        /**
+         * Delete objects from Minio after they have been retrieved. The delete
+         * is only performed if the Exchange is committed. If a rollback occurs,
+         * the object is not deleted. If this option is false, then the same
+         * objects will be retrieve over and over again on the polls. Therefore
+         * you need to use the Idempotent Consumer EIP in the route to filter
+         * out duplicates. You can filter using the MinioConstants#BUCKET_NAME
+         * and MinioConstants#OBJECT_NAME headers, or only the
+         * MinioConstants#OBJECT_NAME header.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder deleteAfterRead(
+                boolean deleteAfterRead) {
+            doSetProperty("deleteAfterRead", deleteAfterRead);
+            return this;
+        }
+        /**
+         * Delete objects from Minio after they have been retrieved. The delete
+         * is only performed if the Exchange is committed. If a rollback occurs,
+         * the object is not deleted. If this option is false, then the same
+         * objects will be retrieve over and over again on the polls. Therefore
+         * you need to use the Idempotent Consumer EIP in the route to filter
+         * out duplicates. You can filter using the MinioConstants#BUCKET_NAME
+         * and MinioConstants#OBJECT_NAME headers, or only the
+         * MinioConstants#OBJECT_NAME header.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder deleteAfterRead(
+                String deleteAfterRead) {
+            doSetProperty("deleteAfterRead", deleteAfterRead);
+            return this;
+        }
+        /**
+         * The delimiter which is used in the ListObjectsRequest to only consume
+         * objects we are interested in.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder delimiter(String delimiter) {
+            doSetProperty("delimiter", delimiter);
+            return this;
+        }
+        /**
+         * Source bucket name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder destinationBucketName(
+                String destinationBucketName) {
+            doSetProperty("destinationBucketName", destinationBucketName);
+            return this;
+        }
+        /**
+         * Source object name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder destinationObjectName(
+                String destinationObjectName) {
+            doSetProperty("destinationObjectName", destinationObjectName);
+            return this;
+        }
+        /**
+         * If it is true, the exchange body will be set to a stream to the
+         * contents of the file. If false, the headers will be set with the
+         * Minio object metadata, but the body will be null. This option is
+         * strongly related to autocloseBody option. In case of setting
+         * includeBody to true and autocloseBody to false, it will be up to the
+         * caller to close the MinioObject stream. Setting autocloseBody to
+         * true, will close the MinioObject stream automatically.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeBody(boolean includeBody) {
+            doSetProperty("includeBody", includeBody);
+            return this;
+        }
+        /**
+         * If it is true, the exchange body will be set to a stream to the
+         * contents of the file. If false, the headers will be set with the
+         * Minio object metadata, but the body will be null. This option is
+         * strongly related to autocloseBody option. In case of setting
+         * includeBody to true and autocloseBody to false, it will be up to the
+         * caller to close the MinioObject stream. Setting autocloseBody to
+         * true, will close the MinioObject stream automatically.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeBody(String includeBody) {
+            doSetProperty("includeBody", includeBody);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to set include
+         * folders.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeFolders(
+                boolean includeFolders) {
+            doSetProperty("includeFolders", includeFolders);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to set include
+         * folders.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeFolders(
+                String includeFolders) {
+            doSetProperty("includeFolders", includeFolders);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to get objects with
+         * user meta data.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeUserMetadata(
+                boolean includeUserMetadata) {
+            doSetProperty("includeUserMetadata", includeUserMetadata);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to get objects with
+         * user meta data.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeUserMetadata(
+                String includeUserMetadata) {
+            doSetProperty("includeUserMetadata", includeUserMetadata);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to get objects with
+         * versioning.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeVersions(
+                boolean includeVersions) {
+            doSetProperty("includeVersions", includeVersions);
+            return this;
+        }
+        /**
+         * The flag which is used in the ListObjectsRequest to get objects with
+         * versioning.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder includeVersions(
+                String includeVersions) {
+            doSetProperty("includeVersions", includeVersions);
+            return this;
+        }
+        /**
+         * Number of bytes of object data from offset.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder length(long length) {
+            doSetProperty("length", length);
+            return this;
+        }
+        /**
+         * Number of bytes of object data from offset.
+         * 
+         * The option will be converted to a <code>long</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder length(String length) {
+            doSetProperty("length", length);
+            return this;
+        }
+        /**
+         * Set match ETag parameter for get object(s).
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder matchETag(String matchETag) {
+            doSetProperty("matchETag", matchETag);
+            return this;
+        }
+        /**
+         * Set the maxConnections parameter in the minio client configuration.
+         * 
+         * The option is a: <code>int</code> type.
+         * 
+         * Default: 60
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder maxConnections(int maxConnections) {
+            doSetProperty("maxConnections", maxConnections);
+            return this;
+        }
+        /**
+         * Set the maxConnections parameter in the minio client configuration.
+         * 
+         * The option will be converted to a <code>int</code> type.
+         * 
+         * Default: 60
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder maxConnections(
+                String maxConnections) {
+            doSetProperty("maxConnections", maxConnections);
+            return this;
+        }
+        /**
+         * Gets the maximum number of messages as a limit to poll at each
+         * polling. Gets the maximum number of messages as a limit to poll at
+         * each polling. The default value is 10. Use 0 or a negative number to
+         * set it as unlimited.
+         * 
+         * The option is a: <code>int</code> type.
+         * 
+         * Default: 10
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder maxMessagesPerPoll(
+                int maxMessagesPerPoll) {
+            doSetProperty("maxMessagesPerPoll", maxMessagesPerPoll);
+            return this;
+        }
+        /**
+         * Gets the maximum number of messages as a limit to poll at each
+         * polling. Gets the maximum number of messages as a limit to poll at
+         * each polling. The default value is 10. Use 0 or a negative number to
+         * set it as unlimited.
+         * 
+         * The option will be converted to a <code>int</code> type.
+         * 
+         * Default: 10
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder maxMessagesPerPoll(
+                String maxMessagesPerPoll) {
+            doSetProperty("maxMessagesPerPoll", maxMessagesPerPoll);
+            return this;
+        }
+        /**
+         * Set modified since parameter for get object(s).
+         * 
+         * The option is a: <code>java.time.ZonedDateTime</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder modifiedSince(
+                ZonedDateTime modifiedSince) {
+            doSetProperty("modifiedSince", modifiedSince);
+            return this;
+        }
+        /**
+         * Set modified since parameter for get object(s).
+         * 
+         * The option will be converted to a
+         * <code>java.time.ZonedDateTime</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder modifiedSince(String modifiedSince) {
+            doSetProperty("modifiedSince", modifiedSince);
+            return this;
+        }
+        /**
+         * Move objects from bucket to a different bucket after they have been
+         * retrieved. To accomplish the operation the destinationBucket option
+         * must be set. The copy bucket operation is only performed if the
+         * Exchange is committed. If a rollback occurs, the object is not moved.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder moveAfterRead(boolean moveAfterRead) {
+            doSetProperty("moveAfterRead", moveAfterRead);
+            return this;
+        }
+        /**
+         * Move objects from bucket to a different bucket after they have been
+         * retrieved. To accomplish the operation the destinationBucket option
+         * must be set. The copy bucket operation is only performed if the
+         * Exchange is committed. If a rollback occurs, the object is not moved.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder moveAfterRead(String moveAfterRead) {
+            doSetProperty("moveAfterRead", moveAfterRead);
+            return this;
+        }
+        /**
+         * Set not match ETag parameter for get object(s).
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder notMatchETag(String notMatchETag) {
+            doSetProperty("notMatchETag", notMatchETag);
+            return this;
+        }
+        /**
+         * To get the object from the bucket with the given object name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder objectName(String objectName) {
+            doSetProperty("objectName", objectName);
+            return this;
+        }
+        /**
+         * Start byte position of object data.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder offset(long offset) {
+            doSetProperty("offset", offset);
+            return this;
+        }
+        /**
+         * Start byte position of object data.
+         * 
+         * The option will be converted to a <code>long</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder offset(String offset) {
+            doSetProperty("offset", offset);
+            return this;
+        }
+        /**
+         * Object name starts with prefix.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder prefix(String prefix) {
+            doSetProperty("prefix", prefix);
+            return this;
+        }
+        /**
+         * List recursively than directory structure emulation.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder recursive(boolean recursive) {
+            doSetProperty("recursive", recursive);
+            return this;
+        }
+        /**
+         * List recursively than directory structure emulation.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder recursive(String recursive) {
+            doSetProperty("recursive", recursive);
+            return this;
+        }
+        /**
+         * If the polling consumer did not poll any files, you can enable this
+         * option to send an empty message (no body) instead.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder sendEmptyMessageWhenIdle(
+                boolean sendEmptyMessageWhenIdle) {
+            doSetProperty("sendEmptyMessageWhenIdle", sendEmptyMessageWhenIdle);
+            return this;
+        }
+        /**
+         * If the polling consumer did not poll any files, you can enable this
+         * option to send an empty message (no body) instead.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder sendEmptyMessageWhenIdle(
+                String sendEmptyMessageWhenIdle) {
+            doSetProperty("sendEmptyMessageWhenIdle", sendEmptyMessageWhenIdle);
+            return this;
+        }
+        /**
+         * list objects in bucket after this object name.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder startAfter(String startAfter) {
+            doSetProperty("startAfter", startAfter);
+            return this;
+        }
+        /**
+         * Set un modified since parameter for get object(s).
+         * 
+         * The option is a: <code>java.time.ZonedDateTime</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder unModifiedSince(
+                ZonedDateTime unModifiedSince) {
+            doSetProperty("unModifiedSince", unModifiedSince);
+            return this;
+        }
+        /**
+         * Set un modified since parameter for get object(s).
+         * 
+         * The option will be converted to a
+         * <code>java.time.ZonedDateTime</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder unModifiedSince(
+                String unModifiedSince) {
+            doSetProperty("unModifiedSince", unModifiedSince);
+            return this;
+        }
+        /**
+         * when true, version 1 of REST API is used.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder useVersion1(boolean useVersion1) {
+            doSetProperty("useVersion1", useVersion1);
+            return this;
+        }
+        /**
+         * when true, version 1 of REST API is used.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder useVersion1(String useVersion1) {
+            doSetProperty("useVersion1", useVersion1);
+            return this;
+        }
+        /**
+         * Set specific version_ID of a object when deleting the object.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: consumer
+         */
+        default MinioEndpointConsumerBuilder versionId(String versionId) {
+            doSetProperty("versionId", versionId);
+            return this;
+        }
+        /**
+         * The number of subsequent error polls (failed due some error) that
+         * should happen before the backoffMultipler should kick-in.
+         * 
+         * The option is a: <code>int</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder backoffErrorThreshold(
+                int backoffErrorThreshold) {
+            doSetProperty("backoffErrorThreshold", backoffErrorThreshold);
+            return this;
+        }
+        /**
+         * The number of subsequent error polls (failed due some error) that
+         * should happen before the backoffMultipler should kick-in.
+         * 
+         * The option will be converted to a <code>int</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder backoffErrorThreshold(
+                String backoffErrorThreshold) {
+            doSetProperty("backoffErrorThreshold", backoffErrorThreshold);
+            return this;
+        }
+        /**
+         * The number of subsequent idle polls that should happen before the
+         * backoffMultipler should kick-in.
+         * 
+         * The option is a: <code>int</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder backoffIdleThreshold(
+                int backoffIdleThreshold) {
+            doSetProperty("backoffIdleThreshold", backoffIdleThreshold);
+            return this;
+        }
+        /**
+         * The number of subsequent idle polls that should happen before the
+         * backoffMultipler should kick-in.
+         * 
+         * The option will be converted to a <code>int</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder backoffIdleThreshold(
+                String backoffIdleThreshold) {
+            doSetProperty("backoffIdleThreshold", backoffIdleThreshold);
+            return this;
+        }
+        /**
+         * To let the scheduled polling consumer backoff if there has been a
+         * number of subsequent idles/errors in a row. The multiplier is then
+         * the number of polls that will be skipped before the next actual
+         * attempt is happening again. When this option is in use then
+         * backoffIdleThreshold and/or backoffErrorThreshold must also be
+         * configured.
+         * 
+         * The option is a: <code>int</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder backoffMultiplier(
+                int backoffMultiplier) {
+            doSetProperty("backoffMultiplier", backoffMultiplier);
+            return this;
+        }
+        /**
+         * To let the scheduled polling consumer backoff if there has been a
+         * number of subsequent idles/errors in a row. The multiplier is then
+         * the number of polls that will be skipped before the next actual
+         * attempt is happening again. When this option is in use then
+         * backoffIdleThreshold and/or backoffErrorThreshold must also be
+         * configured.
+         * 
+         * The option will be converted to a <code>int</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder backoffMultiplier(
+                String backoffMultiplier) {
+            doSetProperty("backoffMultiplier", backoffMultiplier);
+            return this;
+        }
+        /**
+         * Milliseconds before the next poll.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Default: 500
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder delay(long delay) {
+            doSetProperty("delay", delay);
+            return this;
+        }
+        /**
+         * Milliseconds before the next poll.
+         * 
+         * The option will be converted to a <code>long</code> type.
+         * 
+         * Default: 500
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder delay(String delay) {
+            doSetProperty("delay", delay);
+            return this;
+        }
+        /**
+         * If greedy is enabled, then the ScheduledPollConsumer will run
+         * immediately again, if the previous run polled 1 or more messages.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder greedy(boolean greedy) {
+            doSetProperty("greedy", greedy);
+            return this;
+        }
+        /**
+         * If greedy is enabled, then the ScheduledPollConsumer will run
+         * immediately again, if the previous run polled 1 or more messages.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder greedy(String greedy) {
+            doSetProperty("greedy", greedy);
+            return this;
+        }
+        /**
+         * Milliseconds before the first poll starts.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Default: 1000
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder initialDelay(long initialDelay) {
+            doSetProperty("initialDelay", initialDelay);
+            return this;
+        }
+        /**
+         * Milliseconds before the first poll starts.
+         * 
+         * The option will be converted to a <code>long</code> type.
+         * 
+         * Default: 1000
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder initialDelay(String initialDelay) {
+            doSetProperty("initialDelay", initialDelay);
+            return this;
+        }
+        /**
+         * Specifies a maximum limit of number of fires. So if you set it to 1,
+         * the scheduler will only fire once. If you set it to 5, it will only
+         * fire five times. A value of zero or negative means fire forever.
+         * 
+         * The option is a: <code>long</code> type.
+         * 
+         * Default: 0
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder repeatCount(long repeatCount) {
+            doSetProperty("repeatCount", repeatCount);
+            return this;
+        }
+        /**
+         * Specifies a maximum limit of number of fires. So if you set it to 1,
+         * the scheduler will only fire once. If you set it to 5, it will only
+         * fire five times. A value of zero or negative means fire forever.
+         * 
+         * The option will be converted to a <code>long</code> type.
+         * 
+         * Default: 0
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder repeatCount(String repeatCount) {
+            doSetProperty("repeatCount", repeatCount);
+            return this;
+        }
+        /**
+         * The consumer logs a start/complete log line when it polls. This
+         * option allows you to configure the logging level for that.
+         * 
+         * The option is a: <code>org.apache.camel.LoggingLevel</code> type.
+         * 
+         * Default: TRACE
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder runLoggingLevel(
+                LoggingLevel runLoggingLevel) {
+            doSetProperty("runLoggingLevel", runLoggingLevel);
+            return this;
+        }
+        /**
+         * The consumer logs a start/complete log line when it polls. This
+         * option allows you to configure the logging level for that.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.LoggingLevel</code> type.
+         * 
+         * Default: TRACE
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder runLoggingLevel(
+                String runLoggingLevel) {
+            doSetProperty("runLoggingLevel", runLoggingLevel);
+            return this;
+        }
+        /**
+         * Allows for configuring a custom/shared thread pool to use for the
+         * consumer. By default each consumer has its own single threaded thread
+         * pool.
+         * 
+         * The option is a:
+         * <code>java.util.concurrent.ScheduledExecutorService</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder scheduledExecutorService(
+                ScheduledExecutorService scheduledExecutorService) {
+            doSetProperty("scheduledExecutorService", scheduledExecutorService);
+            return this;
+        }
+        /**
+         * Allows for configuring a custom/shared thread pool to use for the
+         * consumer. By default each consumer has its own single threaded thread
+         * pool.
+         * 
+         * The option will be converted to a
+         * <code>java.util.concurrent.ScheduledExecutorService</code> type.
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder scheduledExecutorService(
+                String scheduledExecutorService) {
+            doSetProperty("scheduledExecutorService", scheduledExecutorService);
+            return this;
+        }
+        /**
+         * To use a cron scheduler from either camel-spring or camel-quartz
+         * component.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Default: none
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder scheduler(String scheduler) {
+            doSetProperty("scheduler", scheduler);
+            return this;
+        }
+        /**
+         * To configure additional properties when using a custom scheduler or
+         * any of the Quartz, Spring based scheduler.
+         * 
+         * The option is a: <code>java.util.Map&lt;java.lang.String,
+         * java.lang.Object&gt;</code> type.
+         * The option is multivalued, and you can use the
+         * schedulerProperties(String, Object) method to add a value (call the
+         * method multiple times to set more values).
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder schedulerProperties(
+                String key,
+                Object value) {
+            doSetMultiValueProperty("schedulerProperties", "scheduler." + key, value);
+            return this;
+        }
+        /**
+         * To configure additional properties when using a custom scheduler or
+         * any of the Quartz, Spring based scheduler.
+         * 
+         * The option is a: <code>java.util.Map&lt;java.lang.String,
+         * java.lang.Object&gt;</code> type.
+         * The option is multivalued, and you can use the
+         * schedulerProperties(String, Object) method to add a value (call the
+         * method multiple times to set more values).
+         * 
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder schedulerProperties(Map values) {
+            doSetMultiValueProperties("schedulerProperties", "scheduler.", values);
+            return this;
+        }
+        /**
+         * Whether the scheduler should be auto started.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder startScheduler(
+                boolean startScheduler) {
+            doSetProperty("startScheduler", startScheduler);
+            return this;
+        }
+        /**
+         * Whether the scheduler should be auto started.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder startScheduler(
+                String startScheduler) {
+            doSetProperty("startScheduler", startScheduler);
+            return this;
+        }
+        /**
+         * Time unit for initialDelay and delay options.
+         * 
+         * The option is a: <code>java.util.concurrent.TimeUnit</code> type.
+         * 
+         * Default: MILLISECONDS
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder timeUnit(TimeUnit timeUnit) {
+            doSetProperty("timeUnit", timeUnit);
+            return this;
+        }
+        /**
+         * Time unit for initialDelay and delay options.
+         * 
+         * The option will be converted to a
+         * <code>java.util.concurrent.TimeUnit</code> type.
+         * 
+         * Default: MILLISECONDS
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder timeUnit(String timeUnit) {
+            doSetProperty("timeUnit", timeUnit);
+            return this;
+        }
+        /**
+         * Controls if fixed delay or fixed rate is used. See
+         * ScheduledExecutorService in JDK for details.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder useFixedDelay(boolean useFixedDelay) {
+            doSetProperty("useFixedDelay", useFixedDelay);
+            return this;
+        }
+        /**
+         * Controls if fixed delay or fixed rate is used. See
+         * ScheduledExecutorService in JDK for details.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: scheduler
+         */
+        default MinioEndpointConsumerBuilder useFixedDelay(String useFixedDelay) {
+            doSetProperty("useFixedDelay", useFixedDelay);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Access Key or Minio Access Key. If not set camel
+         * will connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioEndpointConsumerBuilder accessKey(String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key Id or Minio Secret Key. If not set camel will
+         * connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioEndpointConsumerBuilder secretKey(String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint consumers for the Minio Storage Service
+     * component.
+     */
+    public interface AdvancedMinioEndpointConsumerBuilder
+            extends
+                EndpointConsumerBuilder {
+        default MinioEndpointConsumerBuilder basic() {
+            return (MinioEndpointConsumerBuilder) 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 AdvancedMinioEndpointConsumerBuilder 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 AdvancedMinioEndpointConsumerBuilder 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 AdvancedMinioEndpointConsumerBuilder 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 AdvancedMinioEndpointConsumerBuilder exchangePattern(
+                String exchangePattern) {
+            doSetProperty("exchangePattern", exchangePattern);
+            return this;
+        }
+        /**
+         * A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing
+         * you to provide your custom implementation to control error handling
+         * usually occurred during the poll operation before an Exchange have
+         * been created and being routed in Camel.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.spi.PollingConsumerPollStrategy</code> type.
+         * 
+         * Group: consumer (advanced)
+         */
+        default AdvancedMinioEndpointConsumerBuilder pollStrategy(
+                PollingConsumerPollStrategy pollStrategy) {
+            doSetProperty("pollStrategy", pollStrategy);
+            return this;
+        }
+        /**
+         * A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing
+         * you to provide your custom implementation to control error handling
+         * usually occurred during the poll operation before an Exchange have
+         * been created and being routed in Camel.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.spi.PollingConsumerPollStrategy</code> type.
+         * 
+         * Group: consumer (advanced)
+         */
+        default AdvancedMinioEndpointConsumerBuilder pollStrategy(
+                String pollStrategy) {
+            doSetProperty("pollStrategy", pollStrategy);
+            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.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointConsumerBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointConsumerBuilder 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.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointConsumerBuilder synchronous(
+                boolean synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+        /**
+         * Sets whether synchronous processing should be strictly used, or Camel
+         * is allowed to use asynchronous processing (if supported).
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointConsumerBuilder synchronous(
+                String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+
+    /**
+     * Builder for endpoint producers for the Minio Storage Service component.
+     */
+    public interface MinioEndpointProducerBuilder
+            extends
+                EndpointProducerBuilder {
+        default AdvancedMinioEndpointProducerBuilder advanced() {
+            return (AdvancedMinioEndpointProducerBuilder) this;
+        }
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder autoCreateBucket(
+                boolean autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder autoCreateBucket(
+                String autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option is a: <code>okhttp3.OkHttpClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder customHttpClient(
+                Object customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option will be converted to a <code>okhttp3.OkHttpClient</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder customHttpClient(
+                String customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Endpoint can be an URL, domain name, IPv4 address or IPv6 address.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder endpoint(String endpoint) {
+            doSetProperty("endpoint", endpoint);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option is a: <code>io.minio.MinioClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder minioClient(Object minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option will be converted to a <code>io.minio.MinioClient</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder minioClient(String minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder objectLock(boolean objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder objectLock(String objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * The policy for this queue to set in the method.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder policy(String policy) {
+            doSetProperty("policy", policy);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option is a: <code>java.lang.Integer</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder proxyPort(Integer proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option will be converted to a <code>java.lang.Integer</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder proxyPort(String proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * The region in which Minio client needs to work. When using this
+         * parameter, the configuration will expect the lowercase name of the
+         * region (for example ap-east-1). You'll need to use the name
+         * Region.EU_WEST_1.id().
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder region(String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder secure(boolean secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder secure(String secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option is a: <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder serverSideEncryption(
+                Object serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option will be converted to a
+         * <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder serverSideEncryption(
+                String serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option is a:
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder serverSideEncryptionCustomerKey(
+                Object serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option will be converted to a
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointProducerBuilder serverSideEncryptionCustomerKey(
+                String serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * Delete file object after the Minio file has been uploaded.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder deleteAfterWrite(
+                boolean deleteAfterWrite) {
+            doSetProperty("deleteAfterWrite", deleteAfterWrite);
+            return this;
+        }
+        /**
+         * Delete file object after the Minio file has been uploaded.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder deleteAfterWrite(
+                String deleteAfterWrite) {
+            doSetProperty("deleteAfterWrite", deleteAfterWrite);
+            return this;
+        }
+        /**
+         * Setting the key name for an element in the bucket through endpoint
+         * parameter.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder keyName(String keyName) {
+            doSetProperty("keyName", keyName);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder lazyStartProducer(
+                String lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The operation to do in case the user don't want to do only an upload.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.minio.MinioOperations</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder operation(MinioOperations operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * The operation to do in case the user don't want to do only an upload.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.component.minio.MinioOperations</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder operation(String operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * If we want to use a POJO request as body or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder pojoRequest(boolean pojoRequest) {
+            doSetProperty("pojoRequest", pojoRequest);
+            return this;
+        }
+        /**
+         * If we want to use a POJO request as body or not.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder pojoRequest(String pojoRequest) {
+            doSetProperty("pojoRequest", pojoRequest);
+            return this;
+        }
+        /**
+         * The storage class to set in the request.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default MinioEndpointProducerBuilder storageClass(String storageClass) {
+            doSetProperty("storageClass", storageClass);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Access Key or Minio Access Key. If not set camel
+         * will connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioEndpointProducerBuilder accessKey(String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key Id or Minio Secret Key. If not set camel will
+         * connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioEndpointProducerBuilder secretKey(String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint producers for the Minio Storage Service
+     * component.
+     */
+    public interface AdvancedMinioEndpointProducerBuilder
+            extends
+                EndpointProducerBuilder {
+        default MinioEndpointProducerBuilder basic() {
+            return (MinioEndpointProducerBuilder) this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointProducerBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointProducerBuilder 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.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointProducerBuilder synchronous(
+                boolean synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+        /**
+         * Sets whether synchronous processing should be strictly used, or Camel
+         * is allowed to use asynchronous processing (if supported).
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointProducerBuilder synchronous(
+                String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+
+    /**
+     * Builder for endpoint for the Minio Storage Service component.
+     */
+    public interface MinioEndpointBuilder
+            extends
+                MinioEndpointConsumerBuilder,
+                MinioEndpointProducerBuilder {
+        default AdvancedMinioEndpointBuilder advanced() {
+            return (AdvancedMinioEndpointBuilder) this;
+        }
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioEndpointBuilder autoCreateBucket(boolean autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Setting the autocreation of the bucket if bucket name not exist.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: common
+         */
+        default MinioEndpointBuilder autoCreateBucket(String autoCreateBucket) {
+            doSetProperty("autoCreateBucket", autoCreateBucket);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option is a: <code>okhttp3.OkHttpClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder customHttpClient(Object customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Set custom HTTP client for authenticated access.
+         * 
+         * The option will be converted to a <code>okhttp3.OkHttpClient</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder customHttpClient(String customHttpClient) {
+            doSetProperty("customHttpClient", customHttpClient);
+            return this;
+        }
+        /**
+         * Endpoint can be an URL, domain name, IPv4 address or IPv6 address.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder endpoint(String endpoint) {
+            doSetProperty("endpoint", endpoint);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option is a: <code>io.minio.MinioClient</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder minioClient(Object minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Reference to a Minio Client object in the registry.
+         * 
+         * The option will be converted to a <code>io.minio.MinioClient</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder minioClient(String minioClient) {
+            doSetProperty("minioClient", minioClient);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointBuilder objectLock(boolean objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * Set when creating new bucket.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointBuilder objectLock(String objectLock) {
+            doSetProperty("objectLock", objectLock);
+            return this;
+        }
+        /**
+         * The policy for this queue to set in the method.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder policy(String policy) {
+            doSetProperty("policy", policy);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option is a: <code>java.lang.Integer</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder proxyPort(Integer proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * TCP/IP port number. 80 and 443 are used as defaults for HTTP and
+         * HTTPS.
+         * 
+         * The option will be converted to a <code>java.lang.Integer</code>
+         * type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder proxyPort(String proxyPort) {
+            doSetProperty("proxyPort", proxyPort);
+            return this;
+        }
+        /**
+         * The region in which Minio client needs to work. When using this
+         * parameter, the configuration will expect the lowercase name of the
+         * region (for example ap-east-1). You'll need to use the name
+         * Region.EU_WEST_1.id().
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder region(String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointBuilder secure(boolean secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Flag to indicate to use secure connection to minio service or not.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: common
+         */
+        default MinioEndpointBuilder secure(String secure) {
+            doSetProperty("secure", secure);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option is a: <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder serverSideEncryption(
+                Object serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption.
+         * 
+         * The option will be converted to a
+         * <code>io.minio.ServerSideEncryption</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder serverSideEncryption(
+                String serverSideEncryption) {
+            doSetProperty("serverSideEncryption", serverSideEncryption);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option is a:
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder serverSideEncryptionCustomerKey(
+                Object serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * Server-side encryption for source object while copy/move objects.
+         * 
+         * The option will be converted to a
+         * <code>io.minio.ServerSideEncryptionCustomerKey</code> type.
+         * 
+         * Group: common
+         */
+        default MinioEndpointBuilder serverSideEncryptionCustomerKey(
+                String serverSideEncryptionCustomerKey) {
+            doSetProperty("serverSideEncryptionCustomerKey", serverSideEncryptionCustomerKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Access Key or Minio Access Key. If not set camel
+         * will connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioEndpointBuilder accessKey(String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * Amazon AWS Access Key Id or Minio Secret Key. If not set camel will
+         * connect to service for anonymous access.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         */
+        default MinioEndpointBuilder secretKey(String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint for the Minio Storage Service component.
+     */
+    public interface AdvancedMinioEndpointBuilder
+            extends
+                AdvancedMinioEndpointConsumerBuilder,
+                AdvancedMinioEndpointProducerBuilder {
+        default MinioEndpointBuilder basic() {
+            return (MinioEndpointBuilder) this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointBuilder 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.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointBuilder synchronous(boolean synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+        /**
+         * Sets whether synchronous processing should be strictly used, or Camel
+         * is allowed to use asynchronous processing (if supported).
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedMinioEndpointBuilder synchronous(String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+
+    /**
+     * Proxy enum for
+     * <code>org.apache.camel.component.minio.MinioOperations</code> enum.
+     */
+    enum MinioOperations {
+        copyObject,
+        listObjects,
+        deleteObject,
+        deleteObjects,
+        deleteBucket,
+        listBuckets,
+        getObject,
+        getPartialObject;
+    }
+
+    public interface MinioBuilders {
+        /**
+         * Minio Storage Service (camel-minio)
+         * Store and retrieve objects from Minio Storage Service using Minio
+         * SDK.
+         * 
+         * Category: cloud,file
+         * Since: 3.5
+         * Maven coordinates: org.apache.camel:camel-minio
+         * 
+         * Syntax: <code>minio://bucketName</code>
+         * 
+         * Path parameter: bucketName (required)
+         * Bucket name
+         * 
+         * @param path //bucketName
+         */
+        default MinioEndpointBuilder minio(String path) {
+            return MinioEndpointBuilderFactory.endpointBuilder("minio", path);
+        }
+        /**
+         * Minio Storage Service (camel-minio)
+         * Store and retrieve objects from Minio Storage Service using Minio
+         * SDK.
+         * 
+         * Category: cloud,file
+         * Since: 3.5
+         * Maven coordinates: org.apache.camel:camel-minio
+         * 
+         * Syntax: <code>minio://bucketName</code>
+         * 
+         * Path parameter: bucketName (required)
+         * Bucket name
+         * 
+         * @param componentName to use a custom component name for the endpoint
+         * instead of the default name
+         * @param path //bucketName
+         */
+        default MinioEndpointBuilder minio(String componentName, String path) {
+            return MinioEndpointBuilderFactory.endpointBuilder(componentName, path);
+        }
+    }
+    static MinioEndpointBuilder endpointBuilder(
+            String componentName,
+            String path) {
+        class MinioEndpointBuilderImpl extends AbstractEndpointBuilder implements MinioEndpointBuilder, AdvancedMinioEndpointBuilder {
+            public MinioEndpointBuilderImpl(String path) {
+                super(componentName, path);
+            }
+        }
+        return new MinioEndpointBuilderImpl(path);
+    }
+}
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index b037390..774a827 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -232,6 +232,7 @@
 ** xref:micrometer-component.adoc[Micrometer]
 ** xref:microprofile-metrics-component.adoc[MicroProfile Metrics]
 ** xref:mina-component.adoc[Mina]
+** xref:minio-component.adoc[Minio Storage Service]
 ** xref:mllp-component.adoc[MLLP]
 ** xref:mock-component.adoc[Mock]
 ** xref:mongodb-component.adoc[MongoDB]
diff --git a/docs/components/modules/ROOT/pages/minio-component.adoc b/docs/components/modules/ROOT/pages/minio-component.adoc
new file mode 100644
index 0000000..7c02bb3
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/minio-component.adoc
@@ -0,0 +1,508 @@
+[[minio-component]]
+= Minio Storage Service Component
+//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
+:page-source: components/camel-minio/src/main/docs/minio-component.adoc
+:docTitle: Minio Storage Service
+:artifactId: camel-minio
+:description: Store and retrieve objects from Minio Storage Service using Minio SDK.
+:since: 3.5
+:supportLevel: Preview
+:component-header: Both producer and consumer are supported
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The Minio component supports storing and retrieving objects from/to
+https://min.io/[Minio] service.
+
+Prerequisites
+
+You must have valid credentials for authorized access to the buckets/folders. More information is available at
+https://min.io/[Minio].
+
+== URI Format
+
+[source,java]
+------------------------------
+minio://bucketName[?options]
+------------------------------
+
+The bucket will be created if it doesn't already exist. +
+You can append query options to the URI in the following format,
+?options=value&option2=value&...
+
+For example in order to read file `hello.txt` from the bucket `helloBucket`, use the following snippet:
+
+[source,java]
+--------------------------------------------------------------------------------
+from("minio://helloBucket?accessKey=yourAccessKey&secretKey=yourSecretKey&prefix=hello.txt")
+  .to("file:/var/downloaded");
+--------------------------------------------------------------------------------
+
+== URI Options
+
+// component options: START
+The Minio Storage Service component supports 46 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *autoCreateBucket* (common) | Setting the autocreation of the bucket if bucket name not exist. | true | boolean
+| *bucketName* (common) | Name of the bucket. The bucket will be created if it doesn't already exists. | false | String
+| *configuration* (common) | The component configuration |  | MinioConfiguration
+| *customHttpClient* (common) | Set custom HTTP client for authenticated access. |  | OkHttpClient
+| *endpoint* (common) | Endpoint can be an URL, domain name, IPv4 address or IPv6 address. |  | String
+| *minioClient* (common) | Reference to a Minio Client object in the registry. |  | MinioClient
+| *objectLock* (common) | Set when creating new bucket. | false | boolean
+| *policy* (common) | The policy for this queue to set in the method. |  | String
+| *proxyPort* (common) | TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS. |  | Integer
+| *region* (common) | The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id() |  | String
+| *secure* (common) | Flag to indicate to use secure connection to minio service or not. | false | boolean
+| *serverSideEncryption* (common) | Server-side encryption. |  | ServerSideEncryption
+| *serverSideEncryptionCustomer Key* (common) | Server-side encryption for source object while copy/move objects. |  | ServerSideEncryptionCustomerKey
+| *autoCloseBody* (consumer) | If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *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
+| *bypassGovernanceMode* (consumer) | Set this flag if you want to bypassGovernanceMode when deleting a particular object. | false | boolean
+| *deleteAfterRead* (consumer) | Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header. | true | boolean
+| *delimiter* (consumer) | The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in. |  | String
+| *destinationBucketName* (consumer) | Source bucket name. |  | String
+| *destinationObjectName* (consumer) | Source object name. |  | String
+| *includeBody* (consumer) | If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *includeFolders* (consumer) | The flag which is used in the ListObjectsRequest to set include folders. | false | boolean
+| *includeUserMetadata* (consumer) | The flag which is used in the ListObjectsRequest to get objects with user meta data. | false | boolean
+| *includeVersions* (consumer) | The flag which is used in the ListObjectsRequest to get objects with versioning. | false | boolean
+| *length* (consumer) | Number of bytes of object data from offset. |  | long
+| *matchETag* (consumer) | Set match ETag parameter for get object(s). |  | String
+| *modifiedSince* (consumer) | Set modified since parameter for get object(s). |  | ZonedDateTime
+| *moveAfterRead* (consumer) | Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved. | false | boolean
+| *notMatchETag* (consumer) | Set not match ETag parameter for get object(s). |  | String
+| *objectName* (consumer) | To get the object from the bucket with the given object name. |  | String
+| *offset* (consumer) | Start byte position of object data. |  | long
+| *prefix* (consumer) | Object name starts with prefix. |  | String
+| *recursive* (consumer) | List recursively than directory structure emulation. | false | boolean
+| *startAfter* (consumer) | list objects in bucket after this object name. |  | String
+| *unModifiedSince* (consumer) | Set un modified since parameter for get object(s). |  | ZonedDateTime
+| *useVersion1* (consumer) | when true, version 1 of REST API is used. | false | boolean
+| *versionId* (consumer) | Set specific version_ID of a object when deleting the object. |  | String
+| *deleteAfterWrite* (producer) | Delete file object after the Minio file has been uploaded. | false | boolean
+| *keyName* (producer) | Setting the key name for an element in the bucket through endpoint parameter. |  | String
+| *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 starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
+| *operation* (producer) | The operation to do in case the user don't want to do only an upload. The value can be one of: copyObject, listObjects, deleteObject, deleteObjects, deleteBucket, listBuckets, getObject, getObjectRange |  | MinioOperations
+| *pojoRequest* (producer) | If we want to use a POJO request as body or not. | false | boolean
+| *storageClass* (producer) | The storage class to set in the request. |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *accessKey* (security) | Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access. |  | String
+| *secretKey* (security) | Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access. |  | String
+|===
+// component options: END
+
+// endpoint options: START
+The Minio Storage Service endpoint is configured using URI syntax:
+
+----
+minio://bucketName
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bucketName* | *Required* Bucket name |  | String
+|===
+
+
+=== Query Parameters (65 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *autoCreateBucket* (common) | Setting the autocreation of the bucket if bucket name not exist. | true | boolean
+| *customHttpClient* (common) | Set custom HTTP client for authenticated access. |  | OkHttpClient
+| *endpoint* (common) | Endpoint can be an URL, domain name, IPv4 address or IPv6 address. |  | String
+| *minioClient* (common) | Reference to a Minio Client object in the registry. |  | MinioClient
+| *objectLock* (common) | Set when creating new bucket. | false | boolean
+| *policy* (common) | The policy for this queue to set in the method. |  | String
+| *proxyPort* (common) | TCP/IP port number. 80 and 443 are used as defaults for HTTP and HTTPS. |  | Integer
+| *region* (common) | The region in which Minio client needs to work. When using this parameter, the configuration will expect the lowercase name of the region (for example ap-east-1). You'll need to use the name Region.EU_WEST_1.id() |  | String
+| *secure* (common) | Flag to indicate to use secure connection to minio service or not. | false | boolean
+| *serverSideEncryption* (common) | Server-side encryption. |  | ServerSideEncryption
+| *serverSideEncryptionCustomer Key* (common) | Server-side encryption for source object while copy/move objects. |  | ServerSideEncryptionCustomerKey
+| *autoCloseBody* (consumer) | If this option is true and includeBody is true, then the MinioObject.close() method will be called on exchange completion. This option is strongly related to includeBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *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
+| *bypassGovernanceMode* (consumer) | Set this flag if you want to bypassGovernanceMode when deleting a particular object. | false | boolean
+| *deleteAfterRead* (consumer) | Delete objects from Minio after they have been retrieved. The delete is only performed if the Exchange is committed. If a rollback occurs, the object is not deleted. If this option is false, then the same objects will be retrieve over and over again on the polls. Therefore you need to use the Idempotent Consumer EIP in the route to filter out duplicates. You can filter using the MinioConstants#BUCKET_NAME and MinioConstants#OBJECT_NAME headers, or only the MinioConstants#OBJECT_NAME header. | true | boolean
+| *delimiter* (consumer) | The delimiter which is used in the ListObjectsRequest to only consume objects we are interested in. |  | String
+| *destinationBucketName* (consumer) | Source bucket name. |  | String
+| *destinationObjectName* (consumer) | Source object name. |  | String
+| *includeBody* (consumer) | If it is true, the exchange body will be set to a stream to the contents of the file. If false, the headers will be set with the Minio object metadata, but the body will be null. This option is strongly related to autocloseBody option. In case of setting includeBody to true and autocloseBody to false, it will be up to the caller to close the MinioObject stream. Setting autocloseBody to true, will close the MinioObject stream automatically. | true | boolean
+| *includeFolders* (consumer) | The flag which is used in the ListObjectsRequest to set include folders. | false | boolean
+| *includeUserMetadata* (consumer) | The flag which is used in the ListObjectsRequest to get objects with user meta data. | false | boolean
+| *includeVersions* (consumer) | The flag which is used in the ListObjectsRequest to get objects with versioning. | false | boolean
+| *length* (consumer) | Number of bytes of object data from offset. |  | long
+| *matchETag* (consumer) | Set match ETag parameter for get object(s). |  | String
+| *maxConnections* (consumer) | Set the maxConnections parameter in the minio client configuration | 60 | int
+| *maxMessagesPerPoll* (consumer) | Gets the maximum number of messages as a limit to poll at each polling. Gets the maximum number of messages as a limit to poll at each polling. The default value is 10. Use 0 or a negative number to set it as unlimited. | 10 | int
+| *modifiedSince* (consumer) | Set modified since parameter for get object(s). |  | ZonedDateTime
+| *moveAfterRead* (consumer) | Move objects from bucket to a different bucket after they have been retrieved. To accomplish the operation the destinationBucket option must be set. The copy bucket operation is only performed if the Exchange is committed. If a rollback occurs, the object is not moved. | false | boolean
+| *notMatchETag* (consumer) | Set not match ETag parameter for get object(s). |  | String
+| *objectName* (consumer) | To get the object from the bucket with the given object name. |  | String
+| *offset* (consumer) | Start byte position of object data. |  | long
+| *prefix* (consumer) | Object name starts with prefix. |  | String
+| *recursive* (consumer) | List recursively than directory structure emulation. | false | boolean
+| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
+| *startAfter* (consumer) | list objects in bucket after this object name. |  | String
+| *unModifiedSince* (consumer) | Set un modified since parameter for get object(s). |  | ZonedDateTime
+| *useVersion1* (consumer) | when true, version 1 of REST API is used. | false | boolean
+| *versionId* (consumer) | Set specific version_ID of a object when deleting the object. |  | String
+| *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. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
+| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
+| *deleteAfterWrite* (producer) | Delete file object after the Minio file has been uploaded. | false | boolean
+| *keyName* (producer) | Setting the key name for an element in the bucket through endpoint parameter. |  | String
+| *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 starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
+| *operation* (producer) | The operation to do in case the user don't want to do only an upload. The value can be one of: copyObject, listObjects, deleteObject, deleteObjects, deleteBucket, listBuckets, getObject, getObjectRange |  | MinioOperations
+| *pojoRequest* (producer) | If we want to use a POJO request as body or not. | false | boolean
+| *storageClass* (producer) | The storage class to set in the request. |  | String
+| *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
+| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
+| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
+| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
+| *delay* (scheduler) | Milliseconds before the next poll. | 500 | long
+| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
+| *initialDelay* (scheduler) | Milliseconds before the first poll starts. | 1000 | long
+| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
+| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | TRACE | LoggingLevel
+| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
+| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component. The value can be one of: none, spring, quartz | none | String
+| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
+| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
+| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. The value can be one of: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS | MILLISECONDS | TimeUnit
+| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
+| *accessKey* (security) | Amazon AWS Secret Access Key or Minio Access Key. If not set camel will connect to service for anonymous access. |  | String
+| *secretKey* (security) | Amazon AWS Access Key Id or Minio Secret Key. If not set camel will connect to service for anonymous access. |  | String
+|===
+// endpoint options: END
+
+Required Minio component options
+
+You have to provide the minioClient in the
+Registry or your accessKey and secretKey to access
+the https://min.io/[Minio].
+
+== Batch Consumer
+
+This component implements the Batch Consumer.
+
+This allows you for instance to know how many messages exists in this
+batch and for instance let the Aggregator
+aggregate this number of messages.
+
+== Usage
+
+=== Message headers evaluated by the Minio producer
+
+[width="100%",cols="10%,10%,80%",options="header"]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelMinioBucketName` |`String` |The bucket Name which this object will be stored or which will be used for the current operation
+
+|`CamelMinioDestinationBucketName` |`String` |The bucket Destination Name which will be used for the current operation
+
+|`CamelMinioContentLength` |`Long` |The content length of this object.
+
+|`CamelMinioContentType` |`String` |The content type of this object.
+
+|`CamelMinioContentControl` |`String` |The content control of this object.
+
+|`CamelMinioContentDisposition` |`String` |The content disposition of this object.
+
+|`CamelMinioContentEncoding` |`String` |The content encoding of this object.
+
+|`CamelMinioContentMD5` |`String` |The md5 checksum of this object.
+
+|`CamelMinioDestinationObjectName` |`String` |The Destination key which will be used for the current operation
+
+|`CamelMinioObjectName` |`String` |The key under which this object will be stored or which will be used for the current operation
+
+|`CamelMinioLastModified` |`java.util.Date` |The last modified timestamp of this object.
+
+|`CamelMinioOperation` |`String` |The operation to perform. Permitted values are copyObject, deleteObject, deleteObjects, listBuckets, deleteBucket, downloadLink, listObjects
+
+|`CamelMinioStorageClass` |`String` |The storage class of this object.
+
+|`CamelMinioCannedAcl` |`String` |The canned acl that will be applied to the object. see
+`com.amazonaws.services.s3.model.CannedAccessControlList` for allowed
+values.
+
+//|`CamelMinioHeaders` |`Map<String,String>` |Support to get or set custom objectMetadata headers.
+
+|`CamelMinioServerSideEncryption` |String |Sets the server-side encryption algorithm when encrypting
+the object using Minio-managed keys. For example use AES256.
+
+|`CamelMinioVersionId` |`String` |The version Id of the object to be stored or returned from the current operation
+|=======================================================================
+
+=== Message headers set by the Minio producer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+|`CamelMinioETag` |`String` |The ETag value for the newly uploaded object.
+
+|`CamelMinioVersionId` |`String` |The *optional* version ID of the newly uploaded object.
+
+//|`CamelMinioDownloadLinkExpiration` | `String` | The expiration (millis) of URL download link. The link will be stored into *CamelMinioDownloadLink* response header.
+
+|=======================================================================
+
+=== Message headers set by the Minio consumer
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|=======================================================================
+|Header |Type |Description
+
+|`CamelMinioObjectName` |`String` |The key under which this object is stored.
+
+|`CamelMinioBucketName` |`String` |The name of the bucket in which this object is contained.
+
+|`CamelMinioETag` |`String` |The hex encoded 128-bit MD5 digest of the associated object according to
+RFC 1864. This data is used as an integrity check to verify that the
+data received by the caller is the same data that was sent by Minio
+
+|`CamelMinioLastModified` |`Date` |The value of the Last-Modified header, indicating the date and time at
+which Minio last recorded a modification to the associated object.
+
+|`CamelMinioVersionId` |`String` |The version ID of the associated Minio object if available. Version
+IDs are only assigned to objects when an object is uploaded to an Minio bucket that has object versioning enabled.
+
+|`CamelMinioContentType` |`String` |The Content-Type HTTP header, which indicates the type of content stored
+in the associated object. The value of this header is a standard MIME
+type.
+
+|`CamelMinioContentMD5` |`String` |The base64 encoded 128-bit MD5 digest of the associated object (content
+- not including headers) according to RFC 1864. This data is used as a
+message integrity check to verify that the data received by Minio is
+the same data that the caller sent.
+
+|`CamelMinioContentLength` |`Long` |The Content-Length HTTP header indicating the size of the associated
+object in bytes.
+
+|`CamelMinioContentEncoding` |`String` |The *optional* Content-Encoding HTTP header specifying what content
+encodings have been applied to the object and what decoding mechanisms
+must be applied in order to obtain the media-type referenced by the
+Content-Type field.
+
+|`CamelMinioContentDisposition` |`String` |The *optional* Content-Disposition HTTP header, which specifies
+presentational information such as the recommended filename for the
+object to be saved as.
+
+|`CamelMinioContentControl` |`String` |The *optional* Cache-Control HTTP header which allows the user to
+specify caching behavior along the HTTP request/reply chain.
+
+|`CamelMinioServerSideEncryption` |String |The server-side encryption algorithm when encrypting the
+object using Minio-managed keys.
+|=======================================================================
+
+=== Minio Producer operations
+
+Camel-Minio component provides the following operation on the producer side:
+
+- copyObject
+- deleteObject
+- deleteObjects
+- listBuckets
+- deleteBucket
+- listObjects
+- getObject (this will return a MinioObject instance)
+- getObjectRange (this will return a MinioObject instance)
+
+=== Advanced Minio configuration
+
+If your Camel Application is running behind a firewall or if you need to
+have more control over the `MinioClient` instance configuration, you can
+create your own instance and refer to it in your Camel minio component configuration:
+
+[source,java]
+--------------------------------------------------------------------------------
+from("minio://MyBucket?minioClient=#client&delay=5000&maxMessagesPerPoll=5")
+.to("mock:result");
+--------------------------------------------------------------------------------
+
+=== Minio Producer Operation examples
+
+- CopyObject: this operation copy an object from one bucket to a different one
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.DESTINATION_BUCKET_NAME, "camelDestinationBucket");
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+          exchange.getIn().setHeader(MinioConstants.DESTINATION_OBJECT_NAME, "camelDestinationKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=copyObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will copy the object with the name expressed in the header camelDestinationKey to the camelDestinationBucket bucket, from the bucket mycamelbucket.
+
+- DeleteObject: this operation deletes an object from a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will delete the object camelKey from the bucket mycamelbucket.
+
+- ListBuckets: this operation list the buckets for this account in this region
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=listBuckets")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will list the buckets for this account
+
+- DeleteBucket: this operation delete the bucket specified as URI parameter or header
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=deleteBucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will delete the bucket mycamelbucket
+
+- ListObjects: this operation list object in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=listObjects")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will list the objects in the mycamelbucket bucket
+
+- GetObject: this operation get a single object in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will return an MinioObject instance related to the camelKey object in mycamelbucket bucket.
+
+- GetObjectRange: this operation get a single object range in a specific bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(MinioConstants.OBJECT_NAME, "camelKey");
+          exchange.getIn().setHeader(MinioConstants.OFFSET, "0");
+          exchange.getIn().setHeader(MinioConstants.LENGTH, "9");
+      }
+  })
+  .to("minio://mycamelbucket?minioClient=#minioClient&operation=getObjectRange")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+This operation will return an MinioObject instance related to the camelKey object in mycamelbucket bucket, containing bytes from 0 to 9.
+
+== Bucket Autocreation
+
+With the option `autoCreateBucket` users are able to avoid the autocreation of a Minio Bucket in case it doesn't exist. The default for this option is `true`.
+If set to false any operation on a not-existent bucket in Minio won't be successful, and an error will be returned.
+
+== Automatic detection of Minio client in registry
+
+The component is capable of detecting the presence of a Minio bean into the registry.
+If it's the only instance of that type it will be used as client, and you won't have to define it as uri parameter, like the example above.
+This may be really useful for smarter configuration of the endpoint.
+
+== Moving stuff between a bucket and another bucket
+
+Some users like to consume stuff from a bucket and move the content in a different one without using the copyObject feature of this component.
+If this is case for you, don't forget to remove the bucketName header from the incoming exchange of the consumer, otherwise the file will always be overwritten on the same
+original bucket.
+
+== MoveAfterRead consumer option
+
+In addition to deleteAfterRead it has been added another option, moveAfterRead. With this option enabled the consumed object will be moved to a target destinationBucket instead of being only deleted.
+This will require specifying the destinationBucket option. As example:
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("minio://mycamelbucket?minioClient=#minioClient&moveAfterRead=true&destinationBucketName=myothercamelbucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+In this case the objects consumed will be moved to myothercamelbucket bucket and deleted from the original one (because of deleteAfterRead set to true as default).
+
+== Using a POJO as body
+
+Sometimes build a Minio Request can be complex, because of multiple options. We introduce the possibility to use a POJO as body.
+In Minio there are multiple operations you can submit, as an example for List brokers request, you can do something like:
+
+------------------------------------------------------------------------------------------------------
+from("direct:minio")
+     .setBody(ListObjectsArgs.builder()
+                    .bucket(bucketName)
+                    .recursive(getConfiguration().isRecursive())))
+     .to("minio://test?minioClient=#minioClient&operation=listObjects&pojoRequest=true")
+------------------------------------------------------------------------------------------------------
+
+In this way you'll pass the request directly without the need of passing headers and options specifically related to this operation.
+
+== Dependencies
+
+Maven users will need to add the following dependency to their pom.xml.
+
+*pom.xml*
+
+[source,xml]
+---------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-minio</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `$\{camel-version\}` must be replaced by the actual version of Camel.
diff --git a/parent/pom.xml b/parent/pom.xml
index 68c46f6..2de4e5c 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -415,6 +415,7 @@
         <mina-version>2.1.3</mina-version>
         <minidns-version>0.3.4</minidns-version>
         <minimal-json-version>0.9.5</minimal-json-version>
+        <minio-version>7.1.0</minio-version>
         <mock-javamail-version>1.9</mock-javamail-version>
         <mockwebserver-version>0.1.8</mockwebserver-version>
         <mockito-version>3.3.3</mockito-version>
@@ -1836,6 +1837,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-minio</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-mllp</artifactId>
         <version>${project.version}</version>
       </dependency>