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

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

commit c4ce1736da87770be2e618ae4620a7886014f581
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Oct 6 12:07:13 2025 +0200

    CAMEL-22495 - Camel-aws2-s3: Add more bucket and object operations on the 
producer side
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../apache/camel/catalog/components/aws2-s3.json   |  18 +-
 .../jbang/camel-jbang-configuration-metadata.json  |   3 -
 .../java/org/apache/camel/maven/GenerateMojo.java  |   5 +
 .../apache/camel/component/aws2/s3/aws2-s3.json    |  18 +-
 .../src/main/docs/aws2-s3-component.adoc           | 535 +++++++++++++++++++
 .../camel/component/aws2/s3/AWS2S3Constants.java   |  39 ++
 .../camel/component/aws2/s3/AWS2S3Operations.java  |  19 +-
 .../camel/component/aws2/s3/AWS2S3Producer.java    | 586 +++++++++++++++++++++
 .../s3/integration/S3BucketTaggingOperationIT.java | 118 +++++
 .../integration/S3BucketVersioningOperationIT.java |  88 ++++
 .../s3/integration/S3CreateBucketOperationIT.java  |  86 +++
 .../integration/S3CreateUploadLinkOperationIT.java |  79 +++
 .../s3/integration/S3DeleteObjectsOperationIT.java |  96 ++++
 .../s3/integration/S3ObjectTaggingOperationIT.java | 137 +++++
 .../endpoint/dsl/AWS2S3EndpointBuilderFactory.java | 153 ++++++
 15 files changed, 1970 insertions(+), 10 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
index e7860a736838..8e6cffbdadce 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
@@ -58,7 +58,7 @@
     "lazyStartProducer": { "index": 31, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": 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 fai [...]
     "multiPartUpload": { "index": 32, "kind": "property", "displayName": 
"Multi Part Upload", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If it is true, camel 
will upload the file with multipart format. The part size  [...]
     "namingStrategy": { "index": 33, "kind": "property", "displayName": 
"Naming Strategy", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3NamingStrategyEnum", "enum": [ 
"progressive", "random", "timestamp" ], "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "progressive", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"c [...]
-    "operation": { "index": 34, "kind": "property", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteBucket", "listBuckets", "getObject", 
"getObjectRange", "createDownloadLink", "headBucket", "headObject" ], 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.c [...]
+    "operation": { "index": 34, "kind": "property", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", 
"getObject", "getObjectRange", "createDownloadLink", "createUploadLink", 
"headBucket", "headObject", "restoreObject", "getObjectTagging", 
"putObjectTagging", "delete [...]
     "partSize": { "index": 35, "kind": "property", "displayName": "Part Size", 
"group": "producer", "label": "producer", "required": false, "type": "integer", 
"javaType": "long", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": 26214400, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set up the partSize which is used in multipart 
upload, the default size is 25 MB. The minimum  [...]
     "restartingPolicy": { "index": 36, "kind": "property", "displayName": 
"Restarting Policy", "group": "producer", "label": "producer", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum", "enum": 
[ "override", "lastPart" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "override", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuratio [...]
     "storageClass": { "index": 37, "kind": "property", "displayName": "Storage 
Class", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "The storage class to set in the 
com.amazonaws.services.s3.model.PutObjectRequest request." },
@@ -127,7 +127,19 @@
     "CamelAwsS3IfModifiedSinceCondition": { "index": 34, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
been modified since the specified time; otherwise, return a 304 Not Modified 
error.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION"
 },
     "CamelAwsS3IfNoneMatchCondition": { "index": 35, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is different from the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" },
     "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 36, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
not been modified since the specified time.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION"
 },
-    "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
+    "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
+    "CamelAwsS3KeysToDelete": { "index": 38, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A list of keys to delete when using 
deleteObjects operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" },
+    "CamelAwsS3RestoreDays": { "index": 39, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Integer", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The number of days for which the restore 
request will remain active when using restoreObject operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" },
+    "CamelAwsS3RestoreTier": { "index": 40, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The tier at which the restore will be 
processed when using restoreObject operation (e.g., Standard, Bulk, 
Expedited)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" },
+    "CamelAwsS3ObjectTags": { "index": 41, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The object tags to set when using 
putObjectTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" },
+    "CamelAwsS3BucketTags": { "index": 42, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket tags to set when using 
putBucketTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" },
+    "CamelAwsS3BucketPolicy": { "index": 43, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The bucket policy as JSON string when using 
putBucketPolicy operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" },
+    "CamelAwsS3VersioningStatus": { "index": 44, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The versioning status (Enabled or 
Suspended) when using putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" },
+    "CamelAwsS3MfaDelete": { "index": 45, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Whether to enable MFA delete when using 
putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" },
+    "CamelAwsS3UploadLinkExpirationTime": { "index": 46, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the upload link 
in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME"
 },
+    "CamelAwsS3UploadLinkBrowserCompatible": { "index": 47, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the upload link is browser 
compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE"
 },
+    "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 48, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, List<String>>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
headers that are needed by the service for upload (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HE 
[...]
+    "CamelAwsS3UploadLinkSignedPayload": { "index": 49, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service for upload (not needed when BrowserCompatible is true)", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" 
}
   },
   "properties": {
     "bucketNameOrArn": { "index": 0, "kind": "path", "displayName": "Bucket 
Name Or Arn", "group": "common", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Bucket name or ARN" },
@@ -170,7 +182,7 @@
     "keyName": { "index": 37, "kind": "parameter", "displayName": "Key Name", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Setting the key name for an element in the 
bucket through endpoint parameter" },
     "multiPartUpload": { "index": 38, "kind": "parameter", "displayName": 
"Multi Part Upload", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If it is true, camel 
will upload the file with multipart format. The part size [...]
     "namingStrategy": { "index": 39, "kind": "parameter", "displayName": 
"Naming Strategy", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3NamingStrategyEnum", "enum": [ 
"progressive", "random", "timestamp" ], "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "progressive", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
" [...]
-    "operation": { "index": 40, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteBucket", "listBuckets", "getObject", 
"getObjectRange", "createDownloadLink", "headBucket", "headObject" ], 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel. [...]
+    "operation": { "index": 40, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", 
"getObject", "getObjectRange", "createDownloadLink", "createUploadLink", 
"headBucket", "headObject", "restoreObject", "getObjectTagging", 
"putObjectTagging", "delet [...]
     "partSize": { "index": 41, "kind": "parameter", "displayName": "Part 
Size", "group": "producer", "label": "producer", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 26214400, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set up the partSize which is used in multipart 
upload, the default size is 25 MB. The minimum [...]
     "restartingPolicy": { "index": 42, "kind": "parameter", "displayName": 
"Restarting Policy", "group": "producer", "label": "producer", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum", "enum": 
[ "override", "lastPart" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "override", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configurati [...]
     "storageClass": { "index": 43, "kind": "parameter", "displayName": 
"Storage Class", "group": "producer", "label": "producer", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "The storage class to set in the 
com.amazonaws.services.s3.model.PutObjectRequest request." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
index c230d7b16bb5..5ddbf4d38107 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json
@@ -10,9 +10,6 @@
     { "name": "camel.jbang.compileWorkDir", "required": false, "description": 
"Work directory for compiler. Can be used to write compiled classes or other 
resources.", "label": "advanced", "type": "string", "javaType": "String", 
"defaultValue": ".camel-jbang\/compile", "secret": false },
     { "name": "camel.jbang.console", "required": false, "description": 
"Developer console at \/q\/dev on local HTTP server (port 8080 by default)", 
"type": "boolean", "javaType": "boolean", "defaultValue": false, "secret": 
false },
     { "name": "camel.jbang.dependencies", "required": false, "description": 
"Additional dependencies (Use commas to separate multiple dependencies).", 
"type": "string", "javaType": "String", "secret": false },
-    { "name": "camel.jbang.dependencies.main", "required": false, 
"description": "Additional dependencies for Camel Main runtime only", "type": 
"string", "javaType": "String", "secret": false },
-    { "name": "camel.jbang.dependencies.quarkus", "required": false, 
"description": "Additional dependencies for Quarkus runtime only", "type": 
"string", "javaType": "String", "secret": false },
-    { "name": "camel.jbang.dependencies.spring-boot", "required": false, 
"description": "Additional dependencies for Spring Boot runtime only", "type": 
"string", "javaType": "String", "secret": false },
     { "name": "camel.jbang.download", "required": false, "description": 
"Whether to allow automatic downloading JAR dependencies (over the internet)", 
"type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false 
},
     { "name": "camel.jbang.excludes", "required": false, "description": 
"Exclude files by name or pattern (Use commas to separate multiple files)", 
"type": "string", "javaType": "String", "secret": false },
     { "name": "camel.jbang.exportDir", "required": false, "description": 
"Directory where the project will be exported", "type": "string", "javaType": 
"String", "defaultValue": ".", "secret": false },
diff --git 
a/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
 
b/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
index 3c28b05b1a8f..2db7b9c60d6e 100644
--- 
a/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
+++ 
b/catalog/camel-csimple-maven-plugin/src/main/java/org/apache/camel/maven/GenerateMojo.java
@@ -67,6 +67,11 @@ public class GenerateMojo extends AbstractExecMojo {
     public static final String GENERATED_MSG = "Generated by camel build tools 
- do NOT edit this file!";
     public static final String RESOURCE_FILE = 
"META-INF/services/org/apache/camel/csimple.properties";
 
+    @Inject
+    public GenerateMojo(RepositorySystem repositorySystem) {
+        super(repositorySystem);
+    }
+
     // Output directory
 
     /**
diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
index e7860a736838..8e6cffbdadce 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
@@ -58,7 +58,7 @@
     "lazyStartProducer": { "index": 31, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": 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 fai [...]
     "multiPartUpload": { "index": 32, "kind": "property", "displayName": 
"Multi Part Upload", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If it is true, camel 
will upload the file with multipart format. The part size  [...]
     "namingStrategy": { "index": 33, "kind": "property", "displayName": 
"Naming Strategy", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3NamingStrategyEnum", "enum": [ 
"progressive", "random", "timestamp" ], "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "progressive", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"c [...]
-    "operation": { "index": 34, "kind": "property", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteBucket", "listBuckets", "getObject", 
"getObjectRange", "createDownloadLink", "headBucket", "headObject" ], 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.c [...]
+    "operation": { "index": 34, "kind": "property", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", 
"getObject", "getObjectRange", "createDownloadLink", "createUploadLink", 
"headBucket", "headObject", "restoreObject", "getObjectTagging", 
"putObjectTagging", "delete [...]
     "partSize": { "index": 35, "kind": "property", "displayName": "Part Size", 
"group": "producer", "label": "producer", "required": false, "type": "integer", 
"javaType": "long", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": 26214400, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set up the partSize which is used in multipart 
upload, the default size is 25 MB. The minimum  [...]
     "restartingPolicy": { "index": 36, "kind": "property", "displayName": 
"Restarting Policy", "group": "producer", "label": "producer", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum", "enum": 
[ "override", "lastPart" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "override", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuratio [...]
     "storageClass": { "index": 37, "kind": "property", "displayName": "Storage 
Class", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "The storage class to set in the 
com.amazonaws.services.s3.model.PutObjectRequest request." },
@@ -127,7 +127,19 @@
     "CamelAwsS3IfModifiedSinceCondition": { "index": 34, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
been modified since the specified time; otherwise, return a 304 Not Modified 
error.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION"
 },
     "CamelAwsS3IfNoneMatchCondition": { "index": 35, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is different from the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" },
     "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 36, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
not been modified since the specified time.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION"
 },
-    "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
+    "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
+    "CamelAwsS3KeysToDelete": { "index": 38, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A list of keys to delete when using 
deleteObjects operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" },
+    "CamelAwsS3RestoreDays": { "index": 39, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Integer", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The number of days for which the restore 
request will remain active when using restoreObject operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" },
+    "CamelAwsS3RestoreTier": { "index": 40, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The tier at which the restore will be 
processed when using restoreObject operation (e.g., Standard, Bulk, 
Expedited)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" },
+    "CamelAwsS3ObjectTags": { "index": 41, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The object tags to set when using 
putObjectTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" },
+    "CamelAwsS3BucketTags": { "index": 42, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket tags to set when using 
putBucketTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" },
+    "CamelAwsS3BucketPolicy": { "index": 43, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The bucket policy as JSON string when using 
putBucketPolicy operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" },
+    "CamelAwsS3VersioningStatus": { "index": 44, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The versioning status (Enabled or 
Suspended) when using putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" },
+    "CamelAwsS3MfaDelete": { "index": 45, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Whether to enable MFA delete when using 
putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" },
+    "CamelAwsS3UploadLinkExpirationTime": { "index": 46, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the upload link 
in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME"
 },
+    "CamelAwsS3UploadLinkBrowserCompatible": { "index": 47, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the upload link is browser 
compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE"
 },
+    "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 48, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, List<String>>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
headers that are needed by the service for upload (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HE 
[...]
+    "CamelAwsS3UploadLinkSignedPayload": { "index": 49, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service for upload (not needed when BrowserCompatible is true)", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" 
}
   },
   "properties": {
     "bucketNameOrArn": { "index": 0, "kind": "path", "displayName": "Bucket 
Name Or Arn", "group": "common", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Bucket name or ARN" },
@@ -170,7 +182,7 @@
     "keyName": { "index": 37, "kind": "parameter", "displayName": "Key Name", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Setting the key name for an element in the 
bucket through endpoint parameter" },
     "multiPartUpload": { "index": 38, "kind": "parameter", "displayName": 
"Multi Part Upload", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If it is true, camel 
will upload the file with multipart format. The part size [...]
     "namingStrategy": { "index": 39, "kind": "parameter", "displayName": 
"Naming Strategy", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3NamingStrategyEnum", "enum": [ 
"progressive", "random", "timestamp" ], "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "progressive", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
" [...]
-    "operation": { "index": 40, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteBucket", "listBuckets", "getObject", 
"getObjectRange", "createDownloadLink", "headBucket", "headObject" ], 
"deprecated": false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel. [...]
+    "operation": { "index": 40, "kind": "parameter", "displayName": 
"Operation", "group": "producer", "label": "producer", "required": false, 
"type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.AWS2S3Operations", "enum": [ "copyObject", 
"listObjects", "deleteObject", "deleteObjects", "deleteBucket", "listBuckets", 
"getObject", "getObjectRange", "createDownloadLink", "createUploadLink", 
"headBucket", "headObject", "restoreObject", "getObjectTagging", 
"putObjectTagging", "delet [...]
     "partSize": { "index": 41, "kind": "parameter", "displayName": "Part 
Size", "group": "producer", "label": "producer", "required": false, "type": 
"integer", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": 26214400, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set up the partSize which is used in multipart 
upload, the default size is 25 MB. The minimum [...]
     "restartingPolicy": { "index": 42, "kind": "parameter", "displayName": 
"Restarting Policy", "group": "producer", "label": "producer", "required": 
false, "type": "enum", "javaType": 
"org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum", "enum": 
[ "override", "lastPart" ], "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": "override", "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configurati [...]
     "storageClass": { "index": 43, "kind": "parameter", "displayName": 
"Storage Class", "group": "producer", "label": "producer", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "The storage class to set in the 
com.amazonaws.services.s3.model.PutObjectRequest request." },
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc 
b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc
index 722032b7b46f..0fda7b5edad3 100644
--- a/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc
+++ b/components/camel-aws/camel-aws2-s3/src/main/docs/aws2-s3-component.adoc
@@ -77,12 +77,31 @@ Camel-AWS2-S3 component provides the following operation on 
the producer side:
 
 - copyObject
 - deleteObject
+- deleteObjects
 - listBuckets
 - deleteBucket
 - listObjects
 - getObject (this will return an S3Object instance)
 - getObjectRange (this will return an S3Object instance)
 - createDownloadLink
+- createUploadLink
+- headBucket
+- headObject
+- restoreObject
+- getObjectTagging
+- putObjectTagging
+- deleteObjectTagging
+- getObjectAcl
+- putObjectAcl
+- createBucket
+- getBucketTagging
+- putBucketTagging
+- deleteBucketTagging
+- getBucketVersioning
+- putBucketVersioning
+- getBucketPolicy
+- putBucketPolicy
+- deleteBucketPolicy
 
 If you don't specify an operation, explicitly the producer will do:
 
@@ -335,6 +354,522 @@ This operation will check if the bucket _mycamelbucket_ 
exists and is accessible
 
 This operation will return metadata about the object camelKey in the bucket 
_mycamelbucket_.
 
+- DeleteObjects: this operation deletes multiple objects from a bucket in a 
single request
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          List<String> keys = Arrays.asList("key1", "key2", "key3");
+          exchange.getIn().setHeader(AWS2S3Constants.KEYS_TO_DELETE, keys);
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObjects")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - process:
+          ref: myProcessor
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: deleteObjects
+--------------------------------------------------------------------------------
+
+This operation will delete the objects with keys key1, key2, and key3 from the 
bucket _mycamelbucket_.
+
+- CreateUploadLink: this operation will return an upload link through S3 
Presigner
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?accessKey=xxx&secretKey=yyy&region=region&operation=createUploadLink")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3Key
+          constant: camelKey
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            accessKey: xxx
+            secretKey: yyy
+            region: region
+            operation: createUploadLink
+--------------------------------------------------------------------------------
+
+This operation will return an upload link url for uploading to the bucket 
_mycamelbucket_.
+
+- RestoreObject: this operation restores an archived object from Glacier 
storage
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+          exchange.getIn().setHeader(AWS2S3Constants.RESTORE_DAYS, 1);
+          exchange.getIn().setHeader(AWS2S3Constants.RESTORE_TIER, 
"Expedited");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=restoreObject")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3Key
+          constant: camelKey
+      - setHeader:
+          name: CamelAwsS3RestoreDays
+          constant: 1
+      - setHeader:
+          name: CamelAwsS3RestoreTier
+          constant: Expedited
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: restoreObject
+--------------------------------------------------------------------------------
+
+This operation will restore the archived object camelKey from Glacier for 1 
day using expedited retrieval.
+
+- GetObjectTagging: this operation retrieves the tags associated with an object
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectTagging")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3Key
+          constant: camelKey
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: getObjectTagging
+--------------------------------------------------------------------------------
+
+This operation will return the tags for object camelKey in the bucket 
_mycamelbucket_.
+
+- PutObjectTagging: this operation sets tags on an object
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          Map<String, String> tags = new HashMap<>();
+          tags.put("Environment", "Production");
+          tags.put("Owner", "TeamA");
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+          exchange.getIn().setHeader(AWS2S3Constants.OBJECT_TAGS, tags);
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putObjectTagging")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - process:
+          ref: myProcessor
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: putObjectTagging
+--------------------------------------------------------------------------------
+
+This operation will set tags on the object camelKey in the bucket 
_mycamelbucket_.
+
+- DeleteObjectTagging: this operation deletes all tags from an object
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteObjectTagging")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3Key
+          constant: camelKey
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: deleteObjectTagging
+--------------------------------------------------------------------------------
+
+This operation will delete all tags from the object camelKey in the bucket 
_mycamelbucket_.
+
+- GetObjectAcl: this operation retrieves the access control list (ACL) for an 
object
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getObjectAcl")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3Key
+          constant: camelKey
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: getObjectAcl
+--------------------------------------------------------------------------------
+
+This operation will return the ACL for object camelKey in the bucket 
_mycamelbucket_.
+
+- PutObjectAcl: this operation sets the access control list (ACL) for an object
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.KEY, "camelKey");
+          exchange.getIn().setHeader(AWS2S3Constants.CANNED_ACL, "PublicRead");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putObjectAcl")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3Key
+          constant: camelKey
+      - setHeader:
+          name: CamelAwsS3CannedAcl
+          constant: PublicRead
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: putObjectAcl
+--------------------------------------------------------------------------------
+
+This operation will set the ACL to public-read for object camelKey in the 
bucket _mycamelbucket_.
+
+- CreateBucket: this operation creates a new S3 bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  
.to("aws2-s3://mynewbucket?amazonS3Client=#amazonS3Client&operation=createBucket")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - to:
+          uri: aws2-s3://mynewbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: createBucket
+--------------------------------------------------------------------------------
+
+This operation will create a new bucket named _mynewbucket_ in the configured 
region.
+
+- GetBucketTagging: this operation retrieves the tags associated with a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getBucketTagging")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: getBucketTagging
+--------------------------------------------------------------------------------
+
+This operation will return the tags for the bucket _mycamelbucket_.
+
+- PutBucketTagging: this operation sets tags on a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          Map<String, String> tags = new HashMap<>();
+          tags.put("Project", "CamelIntegration");
+          tags.put("CostCenter", "Engineering");
+          exchange.getIn().setHeader(AWS2S3Constants.BUCKET_TAGS, tags);
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketTagging")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - process:
+          ref: myProcessor
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: putBucketTagging
+--------------------------------------------------------------------------------
+
+This operation will set tags on the bucket _mycamelbucket_.
+
+- DeleteBucketTagging: this operation deletes all tags from a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucketTagging")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: deleteBucketTagging
+--------------------------------------------------------------------------------
+
+This operation will delete all tags from the bucket _mycamelbucket_.
+
+- GetBucketVersioning: this operation retrieves the versioning configuration 
of a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getBucketVersioning")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: getBucketVersioning
+--------------------------------------------------------------------------------
+
+This operation will return the versioning configuration for the bucket 
_mycamelbucket_.
+
+- PutBucketVersioning: this operation sets the versioning configuration of a 
bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          exchange.getIn().setHeader(AWS2S3Constants.VERSIONING_STATUS, 
"Enabled");
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketVersioning")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - setHeader:
+          name: CamelAwsS3VersioningStatus
+          constant: Enabled
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: putBucketVersioning
+--------------------------------------------------------------------------------
+
+This operation will enable versioning on the bucket _mycamelbucket_.
+
+- GetBucketPolicy: this operation retrieves the policy of a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=getBucketPolicy")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: getBucketPolicy
+--------------------------------------------------------------------------------
+
+This operation will return the bucket policy for _mycamelbucket_ as a JSON 
string.
+
+- PutBucketPolicy: this operation sets the policy on a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start").process(new Processor() {
+
+      @Override
+      public void process(Exchange exchange) throws Exception {
+          String policy = "{"
+              + "\"Version\": \"2012-10-17\","
+              + "\"Statement\": [{"
+              + "\"Effect\": \"Allow\","
+              + "\"Principal\": \"*\","
+              + "\"Action\": \"s3:GetObject\","
+              + "\"Resource\": \"arn:aws:s3:::mycamelbucket/*\""
+              + "}]}";
+          exchange.getIn().setHeader(AWS2S3Constants.BUCKET_POLICY, policy);
+      }
+  })
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=putBucketPolicy")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - process:
+          ref: myProcessor
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: putBucketPolicy
+--------------------------------------------------------------------------------
+
+This operation will set a bucket policy on _mycamelbucket_.
+
+- DeleteBucketPolicy: this operation deletes the policy from a bucket
+
+[source,java]
+--------------------------------------------------------------------------------
+  from("direct:start")
+  
.to("aws2-s3://mycamelbucket?amazonS3Client=#amazonS3Client&operation=deleteBucketPolicy")
+  .to("mock:result");
+--------------------------------------------------------------------------------
+
+[source,yaml]
+--------------------------------------------------------------------------------
+- from:
+    uri: direct:start
+    steps:
+      - to:
+          uri: aws2-s3://mycamelbucket
+          parameters:
+            amazonS3Client: "#amazonS3Client"
+            operation: deleteBucketPolicy
+--------------------------------------------------------------------------------
+
+This operation will delete the bucket policy from _mycamelbucket_.
+
 === AWS S3 Producer minimum permissions
 
 For making the producer work, you'll need at least PutObject and ListBuckets 
permissions. The following policy will be enough:
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
index 31e0168634ab..30e6d6776e5b 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
@@ -160,5 +160,44 @@ public interface AWS2S3Constants {
     @Metadata(description = "The bucket Name to override (can be dynamic using 
the simple language in the producer) which this object will be stored or which 
will be used for the current operation or in which this object is contained.",
               javaType = "String")
     String OVERRIDE_BUCKET_NAME = "CamelAwsS3OverrideBucketName";
+    @Metadata(label = "producer", description = "A list of keys to delete when 
using deleteObjects operation",
+              javaType = "List<String>")
+    String KEYS_TO_DELETE = "CamelAwsS3KeysToDelete";
+    @Metadata(label = "producer",
+              description = "The number of days for which the restore request 
will remain active when using restoreObject operation",
+              javaType = "Integer")
+    String RESTORE_DAYS = "CamelAwsS3RestoreDays";
+    @Metadata(label = "producer",
+              description = "The tier at which the restore will be processed 
when using restoreObject operation (e.g., Standard, Bulk, Expedited)",
+              javaType = "String")
+    String RESTORE_TIER = "CamelAwsS3RestoreTier";
+    @Metadata(label = "producer", description = "The object tags to set when 
using putObjectTagging operation",
+              javaType = "Map<String, String>")
+    String OBJECT_TAGS = "CamelAwsS3ObjectTags";
+    @Metadata(label = "producer", description = "The bucket tags to set when 
using putBucketTagging operation",
+              javaType = "Map<String, String>")
+    String BUCKET_TAGS = "CamelAwsS3BucketTags";
+    @Metadata(label = "producer", description = "The bucket policy as JSON 
string when using putBucketPolicy operation",
+              javaType = "String")
+    String BUCKET_POLICY = "CamelAwsS3BucketPolicy";
+    @Metadata(label = "producer",
+              description = "The versioning status (Enabled or Suspended) when 
using putBucketVersioning operation",
+              javaType = "String")
+    String VERSIONING_STATUS = "CamelAwsS3VersioningStatus";
+    @Metadata(label = "producer", description = "Whether to enable MFA delete 
when using putBucketVersioning operation",
+              javaType = "String")
+    String MFA_DELETE = "CamelAwsS3MfaDelete";
+    @Metadata(label = "producer", description = "The expiration time of the 
upload link in milliseconds", javaType = "Long")
+    String UPLOAD_LINK_EXPIRATION_TIME = "CamelAwsS3UploadLinkExpirationTime";
+    @Metadata(label = "producer", description = "Whether the upload link is 
browser compatible", javaType = "boolean")
+    String UPLOAD_LINK_BROWSER_COMPATIBLE = 
"CamelAwsS3UploadLinkBrowserCompatible";
+    @Metadata(label = "producer",
+              description = "The headers that are needed by the service for 
upload (not needed when BrowserCompatible is true)",
+              javaType = "Map<String, List<String>>")
+    String UPLOAD_LINK_HTTP_REQUEST_HEADERS = 
"CamelAwsS3UploadLinkHttpRequestHeaders";
+    @Metadata(label = "producer",
+              description = "The request payload that is needed by the service 
for upload (not needed when BrowserCompatible is true)",
+              javaType = "String")
+    String UPLOAD_LINK_SIGNED_PAYLOAD = "CamelAwsS3UploadLinkSignedPayload";
 
 }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java
index b4e12b1ef85f..7c017eff93ee 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Operations.java
@@ -21,11 +21,28 @@ public enum AWS2S3Operations {
     copyObject,
     listObjects,
     deleteObject,
+    deleteObjects,
     deleteBucket,
     listBuckets,
     getObject,
     getObjectRange,
     createDownloadLink,
+    createUploadLink,
     headBucket,
-    headObject
+    headObject,
+    restoreObject,
+    getObjectTagging,
+    putObjectTagging,
+    deleteObjectTagging,
+    getObjectAcl,
+    putObjectAcl,
+    createBucket,
+    getBucketTagging,
+    putBucketTagging,
+    deleteBucketTagging,
+    getBucketVersioning,
+    putBucketVersioning,
+    getBucketPolicy,
+    putBucketPolicy,
+    deleteBucketPolicy
 }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
index 7e6180d577b9..fe1f7ebf7129 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
@@ -83,6 +83,9 @@ public class AWS2S3Producer extends DefaultProducer {
                 case deleteObject:
                     deleteObject(getEndpoint().getS3Client(), exchange);
                     break;
+                case deleteObjects:
+                    deleteObjects(getEndpoint().getS3Client(), exchange);
+                    break;
                 case listBuckets:
                     listBuckets(getEndpoint().getS3Client(), exchange);
                     break;
@@ -101,12 +104,60 @@ public class AWS2S3Producer extends DefaultProducer {
                 case createDownloadLink:
                     createDownloadLink(exchange);
                     break;
+                case createUploadLink:
+                    createUploadLink(exchange);
+                    break;
                 case headBucket:
                     headBucket(getEndpoint().getS3Client(), exchange);
                     break;
                 case headObject:
                     headObject(getEndpoint().getS3Client(), exchange);
                     break;
+                case restoreObject:
+                    restoreObject(getEndpoint().getS3Client(), exchange);
+                    break;
+                case getObjectTagging:
+                    getObjectTagging(getEndpoint().getS3Client(), exchange);
+                    break;
+                case putObjectTagging:
+                    putObjectTagging(getEndpoint().getS3Client(), exchange);
+                    break;
+                case deleteObjectTagging:
+                    deleteObjectTagging(getEndpoint().getS3Client(), exchange);
+                    break;
+                case getObjectAcl:
+                    getObjectAcl(getEndpoint().getS3Client(), exchange);
+                    break;
+                case putObjectAcl:
+                    putObjectAcl(getEndpoint().getS3Client(), exchange);
+                    break;
+                case createBucket:
+                    createBucket(getEndpoint().getS3Client(), exchange);
+                    break;
+                case getBucketTagging:
+                    getBucketTagging(getEndpoint().getS3Client(), exchange);
+                    break;
+                case putBucketTagging:
+                    putBucketTagging(getEndpoint().getS3Client(), exchange);
+                    break;
+                case deleteBucketTagging:
+                    deleteBucketTagging(getEndpoint().getS3Client(), exchange);
+                    break;
+                case getBucketVersioning:
+                    getBucketVersioning(getEndpoint().getS3Client(), exchange);
+                    break;
+                case putBucketVersioning:
+                    putBucketVersioning(getEndpoint().getS3Client(), exchange);
+                    break;
+                case getBucketPolicy:
+                    getBucketPolicy(getEndpoint().getS3Client(), exchange);
+                    break;
+                case putBucketPolicy:
+                    putBucketPolicy(getEndpoint().getS3Client(), exchange);
+                    break;
+                case deleteBucketPolicy:
+                    deleteBucketPolicy(getEndpoint().getS3Client(), exchange);
+                    break;
                 default:
                     throw new IllegalArgumentException("Unsupported 
operation");
             }
@@ -744,6 +795,541 @@ public class AWS2S3Producer extends DefaultProducer {
         message.setBody(headObjectResponse);
     }
 
+    private void deleteObjects(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DeleteObjectsRequest) {
+                DeleteObjectsResponse result = 
s3Client.deleteObjects((DeleteObjectsRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            List<String> keysToDelete = 
exchange.getIn().getHeader(AWS2S3Constants.KEYS_TO_DELETE, List.class);
+            if (ObjectHelper.isEmpty(keysToDelete)) {
+                throw new IllegalArgumentException("Keys to delete must be 
specified for deleteObjects Operation");
+            }
+
+            List<ObjectIdentifier> objectIdentifiers = new ArrayList<>();
+            for (String key : keysToDelete) {
+                
objectIdentifiers.add(ObjectIdentifier.builder().key(key).build());
+            }
+
+            Delete delete = 
Delete.builder().objects(objectIdentifiers).build();
+            DeleteObjectsRequest deleteObjectsRequest = 
DeleteObjectsRequest.builder()
+                    .bucket(bucketName)
+                    .delete(delete)
+                    .build();
+
+            DeleteObjectsResponse result = 
s3Client.deleteObjects(deleteObjectsRequest);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+        }
+    }
+
+    private void restoreObject(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof RestoreObjectRequest) {
+                RestoreObjectResponse result = 
s3Client.restoreObject((RestoreObjectRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            Integer days = 
exchange.getIn().getHeader(AWS2S3Constants.RESTORE_DAYS, 1, Integer.class);
+            String tier = 
exchange.getIn().getHeader(AWS2S3Constants.RESTORE_TIER, "Standard", 
String.class);
+
+            GlacierJobParameters glacierJobParameters = 
GlacierJobParameters.builder()
+                    .tier(Tier.fromValue(tier))
+                    .build();
+
+            RestoreRequest restoreRequest = RestoreRequest.builder()
+                    .days(days)
+                    .glacierJobParameters(glacierJobParameters)
+                    .build();
+
+            RestoreObjectRequest.Builder requestBuilder = 
RestoreObjectRequest.builder()
+                    .bucket(bucketName)
+                    .key(keyName)
+                    .restoreRequest(restoreRequest);
+
+            RestoreObjectResponse result = 
s3Client.restoreObject(requestBuilder.build());
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void getObjectTagging(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetObjectTaggingRequest) {
+                GetObjectTaggingResponse result = 
s3Client.getObjectTagging((GetObjectTaggingRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result.tagSet());
+            }
+        } else {
+            GetObjectTaggingRequest request = GetObjectTaggingRequest.builder()
+                    .bucket(bucketName)
+                    .key(keyName)
+                    .build();
+
+            GetObjectTaggingResponse result = 
s3Client.getObjectTagging(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result.tagSet());
+            message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void putObjectTagging(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof PutObjectTaggingRequest) {
+                PutObjectTaggingResponse result = 
s3Client.putObjectTagging((PutObjectTaggingRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            Map<String, String> tags = 
exchange.getIn().getHeader(AWS2S3Constants.OBJECT_TAGS, Map.class);
+            if (ObjectHelper.isEmpty(tags)) {
+                throw new IllegalArgumentException("Object tags must be 
specified for putObjectTagging Operation");
+            }
+
+            List<Tag> tagSet = new ArrayList<>();
+            for (Map.Entry<String, String> entry : tags.entrySet()) {
+                
tagSet.add(Tag.builder().key(entry.getKey()).value(entry.getValue()).build());
+            }
+
+            Tagging tagging = Tagging.builder().tagSet(tagSet).build();
+            PutObjectTaggingRequest request = PutObjectTaggingRequest.builder()
+                    .bucket(bucketName)
+                    .key(keyName)
+                    .tagging(tagging)
+                    .build();
+
+            PutObjectTaggingResponse result = 
s3Client.putObjectTagging(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void deleteObjectTagging(S3Client s3Client, Exchange exchange) 
throws InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DeleteObjectTaggingRequest) {
+                DeleteObjectTaggingResponse result = 
s3Client.deleteObjectTagging((DeleteObjectTaggingRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DeleteObjectTaggingRequest request = 
DeleteObjectTaggingRequest.builder()
+                    .bucket(bucketName)
+                    .key(keyName)
+                    .build();
+
+            DeleteObjectTaggingResponse result = 
s3Client.deleteObjectTagging(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void getObjectAcl(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetObjectAclRequest) {
+                GetObjectAclResponse result = 
s3Client.getObjectAcl((GetObjectAclRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            GetObjectAclRequest request = GetObjectAclRequest.builder()
+                    .bucket(bucketName)
+                    .key(keyName)
+                    .build();
+
+            GetObjectAclResponse result = s3Client.getObjectAcl(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void putObjectAcl(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof PutObjectAclRequest) {
+                PutObjectAclResponse result = 
s3Client.putObjectAcl((PutObjectAclRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            String cannedAcl = 
exchange.getIn().getHeader(AWS2S3Constants.CANNED_ACL, String.class);
+            if (ObjectHelper.isEmpty(cannedAcl)) {
+                throw new IllegalArgumentException("Canned ACL must be 
specified for putObjectAcl Operation");
+            }
+
+            ObjectCannedACL objectCannedACL = 
ObjectCannedACL.valueOf(cannedAcl);
+            PutObjectAclRequest request = PutObjectAclRequest.builder()
+                    .bucket(bucketName)
+                    .key(keyName)
+                    .acl(objectCannedACL)
+                    .build();
+
+            PutObjectAclResponse result = s3Client.putObjectAcl(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void createUploadLink(Exchange exchange) {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+        final String keyName = AWS2S3Utils.determineKey(exchange, 
getConfiguration());
+
+        long milliSeconds = 0;
+
+        Long expirationMillis = 
exchange.getIn().getHeader(AWS2S3Constants.UPLOAD_LINK_EXPIRATION_TIME, 
Long.class);
+        if (expirationMillis != null) {
+            milliSeconds += expirationMillis;
+        } else {
+            milliSeconds += 1000 * 60 * 60;
+        }
+        S3Presigner presigner;
+
+        if 
(ObjectHelper.isNotEmpty(getConfiguration().getAmazonS3Presigner())) {
+            presigner = getConfiguration().getAmazonS3Presigner();
+        } else {
+            S3Presigner.Builder builder = S3Presigner.builder();
+            builder.credentialsProvider(
+                    getConfiguration().isUseDefaultCredentialsProvider()
+                            ? DefaultCredentialsProvider.create() : 
StaticCredentialsProvider.create(
+                                    
AwsBasicCredentials.create(getConfiguration().getAccessKey(),
+                                            
getConfiguration().getSecretKey())))
+                    .region(Region.of(getConfiguration().getRegion()));
+
+            String uriEndpointOverride = 
getConfiguration().getUriEndpointOverride();
+            if (ObjectHelper.isNotEmpty(uriEndpointOverride)) {
+                builder.endpointOverride(URI.create(uriEndpointOverride));
+            }
+
+            presigner = builder.build();
+        }
+
+        PutObjectRequest putObjectRequest = PutObjectRequest.builder()
+                .bucket(bucketName)
+                .key(keyName)
+                .build();
+
+        
software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest 
putObjectPresignRequest
+                = 
software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest.builder()
+                        .signatureDuration(Duration.ofMillis(milliSeconds))
+                        .putObjectRequest(putObjectRequest)
+                        .build();
+
+        
software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest 
presignedPutObjectRequest
+                = presigner.presignPutObject(putObjectPresignRequest);
+
+        Message message = getMessageForResponse(exchange);
+        message.setBody(presignedPutObjectRequest.url().toString());
+        message.setHeader(AWS2S3Constants.UPLOAD_LINK_BROWSER_COMPATIBLE, 
presignedPutObjectRequest.isBrowserExecutable());
+        message.setHeader(AWS2S3Constants.PRODUCED_KEY, keyName);
+        message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, bucketName);
+
+        if (!presignedPutObjectRequest.isBrowserExecutable()) {
+            LOG.debug(
+                    "The upload link url is not browser compatible and please 
check the option of checksum validations in Amazon S3 client");
+            message.setHeader(AWS2S3Constants.UPLOAD_LINK_HTTP_REQUEST_HEADERS,
+                    presignedPutObjectRequest.httpRequest().headers());
+            presignedPutObjectRequest.signedPayload().ifPresent(payload -> {
+                message.setHeader(AWS2S3Constants.UPLOAD_LINK_SIGNED_PAYLOAD, 
payload.asUtf8String());
+            });
+        }
+
+        if (ObjectHelper.isEmpty(getConfiguration().getAmazonS3Presigner())) {
+            presigner.close();
+        }
+    }
+
+    private void createBucket(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof CreateBucketRequest) {
+                CreateBucketResponse result = 
s3Client.createBucket((CreateBucketRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            CreateBucketRequest.Builder requestBuilder = 
CreateBucketRequest.builder().bucket(bucketName);
+
+            // Add location constraint if region is not us-east-1
+            String region = getConfiguration().getRegion();
+            if (region != null && !region.equals("us-east-1")) {
+                CreateBucketConfiguration bucketConfiguration = 
CreateBucketConfiguration.builder()
+                        
.locationConstraint(BucketLocationConstraint.fromValue(region))
+                        .build();
+                requestBuilder.createBucketConfiguration(bucketConfiguration);
+            }
+
+            CreateBucketResponse result = 
s3Client.createBucket(requestBuilder.build());
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void getBucketTagging(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetBucketTaggingRequest) {
+                GetBucketTaggingResponse result = 
s3Client.getBucketTagging((GetBucketTaggingRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result.tagSet());
+            }
+        } else {
+            GetBucketTaggingRequest request = GetBucketTaggingRequest.builder()
+                    .bucket(bucketName)
+                    .build();
+
+            GetBucketTaggingResponse result = 
s3Client.getBucketTagging(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result.tagSet());
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void putBucketTagging(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof PutBucketTaggingRequest) {
+                PutBucketTaggingResponse result = 
s3Client.putBucketTagging((PutBucketTaggingRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            Map<String, String> tags = 
exchange.getIn().getHeader(AWS2S3Constants.BUCKET_TAGS, Map.class);
+            if (ObjectHelper.isEmpty(tags)) {
+                throw new IllegalArgumentException("Bucket tags must be 
specified for putBucketTagging Operation");
+            }
+
+            List<Tag> tagSet = new ArrayList<>();
+            for (Map.Entry<String, String> entry : tags.entrySet()) {
+                
tagSet.add(Tag.builder().key(entry.getKey()).value(entry.getValue()).build());
+            }
+
+            Tagging tagging = Tagging.builder().tagSet(tagSet).build();
+            PutBucketTaggingRequest request = PutBucketTaggingRequest.builder()
+                    .bucket(bucketName)
+                    .tagging(tagging)
+                    .build();
+
+            PutBucketTaggingResponse result = 
s3Client.putBucketTagging(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void deleteBucketTagging(S3Client s3Client, Exchange exchange) 
throws InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DeleteBucketTaggingRequest) {
+                DeleteBucketTaggingResponse result = 
s3Client.deleteBucketTagging((DeleteBucketTaggingRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DeleteBucketTaggingRequest request = 
DeleteBucketTaggingRequest.builder()
+                    .bucket(bucketName)
+                    .build();
+
+            DeleteBucketTaggingResponse result = 
s3Client.deleteBucketTagging(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void getBucketVersioning(S3Client s3Client, Exchange exchange) 
throws InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetBucketVersioningRequest) {
+                GetBucketVersioningResponse result = 
s3Client.getBucketVersioning((GetBucketVersioningRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            GetBucketVersioningRequest request = 
GetBucketVersioningRequest.builder()
+                    .bucket(bucketName)
+                    .build();
+
+            GetBucketVersioningResponse result = 
s3Client.getBucketVersioning(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void putBucketVersioning(S3Client s3Client, Exchange exchange) 
throws InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof PutBucketVersioningRequest) {
+                PutBucketVersioningResponse result = 
s3Client.putBucketVersioning((PutBucketVersioningRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            String versioningStatus = 
exchange.getIn().getHeader(AWS2S3Constants.VERSIONING_STATUS, String.class);
+            if (ObjectHelper.isEmpty(versioningStatus)) {
+                throw new IllegalArgumentException("Versioning status must be 
specified for putBucketVersioning Operation");
+            }
+
+            VersioningConfiguration.Builder versioningConfigBuilder = 
VersioningConfiguration.builder()
+                    
.status(BucketVersioningStatus.fromValue(versioningStatus));
+
+            String mfaDelete = 
exchange.getIn().getHeader(AWS2S3Constants.MFA_DELETE, String.class);
+            if (ObjectHelper.isNotEmpty(mfaDelete)) {
+                
versioningConfigBuilder.mfaDelete(MFADelete.fromValue(mfaDelete));
+            }
+
+            PutBucketVersioningRequest request = 
PutBucketVersioningRequest.builder()
+                    .bucket(bucketName)
+                    .versioningConfiguration(versioningConfigBuilder.build())
+                    .build();
+
+            PutBucketVersioningResponse result = 
s3Client.putBucketVersioning(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void getBucketPolicy(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof GetBucketPolicyRequest) {
+                GetBucketPolicyResponse result = 
s3Client.getBucketPolicy((GetBucketPolicyRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result.policy());
+            }
+        } else {
+            GetBucketPolicyRequest request = GetBucketPolicyRequest.builder()
+                    .bucket(bucketName)
+                    .build();
+
+            GetBucketPolicyResponse result = s3Client.getBucketPolicy(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result.policy());
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void putBucketPolicy(S3Client s3Client, Exchange exchange) throws 
InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof PutBucketPolicyRequest) {
+                PutBucketPolicyResponse result = 
s3Client.putBucketPolicy((PutBucketPolicyRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            String policy = 
exchange.getIn().getHeader(AWS2S3Constants.BUCKET_POLICY, String.class);
+            if (ObjectHelper.isEmpty(policy)) {
+                throw new IllegalArgumentException("Bucket policy must be 
specified for putBucketPolicy Operation");
+            }
+
+            PutBucketPolicyRequest request = PutBucketPolicyRequest.builder()
+                    .bucket(bucketName)
+                    .policy(policy)
+                    .build();
+
+            PutBucketPolicyResponse result = s3Client.putBucketPolicy(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
+    private void deleteBucketPolicy(S3Client s3Client, Exchange exchange) 
throws InvalidPayloadException {
+        final String bucketName = AWS2S3Utils.determineBucketName(exchange, 
getConfiguration());
+
+        if (getConfiguration().isPojoRequest()) {
+            Object payload = exchange.getIn().getMandatoryBody();
+            if (payload instanceof DeleteBucketPolicyRequest) {
+                DeleteBucketPolicyResponse result = 
s3Client.deleteBucketPolicy((DeleteBucketPolicyRequest) payload);
+                Message message = getMessageForResponse(exchange);
+                message.setBody(result);
+            }
+        } else {
+            DeleteBucketPolicyRequest request = 
DeleteBucketPolicyRequest.builder()
+                    .bucket(bucketName)
+                    .build();
+
+            DeleteBucketPolicyResponse result = 
s3Client.deleteBucketPolicy(request);
+
+            Message message = getMessageForResponse(exchange);
+            message.setBody(result);
+            message.setHeader(AWS2S3Constants.PRODUCED_BUCKET_NAME, 
bucketName);
+        }
+    }
+
     private AWS2S3Operations determineOperation(Exchange exchange) {
         AWS2S3Operations operation = 
exchange.getIn().getHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.class);
         if (operation == null) {
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3BucketTaggingOperationIT.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3BucketTaggingOperationIT.java
new file mode 100644
index 000000000000..7fee77c644e2
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3BucketTaggingOperationIT.java
@@ -0,0 +1,118 @@
+/*
+ * 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.aws2.s3.integration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.s3.AWS2S3Constants;
+import org.apache.camel.component.aws2.s3.AWS2S3Operations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.s3.model.Tag;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class S3BucketTaggingOperationIT extends Aws2S3Base {
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void putAndGetBucketTagging() throws Exception {
+        // Put tags on the bucket
+        Exchange putResult = template.request("direct:putBucketTagging", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                Map<String, String> tags = new HashMap<>();
+                tags.put("Team", "Integration");
+                tags.put("Cost-Center", "Engineering");
+                exchange.getIn().setHeader(AWS2S3Constants.BUCKET_TAGS, tags);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.putBucketTagging);
+            }
+        });
+        assertNotNull(putResult);
+
+        // Get tags from the bucket
+        Exchange getResult = template.request("direct:getBucketTagging", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.getBucketTagging);
+            }
+        });
+
+        List<Tag> tags = getResult.getMessage().getBody(List.class);
+        assertNotNull(tags);
+        assertEquals(2, tags.size());
+    }
+
+    @Test
+    public void deleteBucketTagging() throws Exception {
+        // Put tags on the bucket
+        template.send("direct:putBucketTagging2", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                Map<String, String> tags = new HashMap<>();
+                tags.put("Temp", "Value");
+                exchange.getIn().setHeader(AWS2S3Constants.BUCKET_TAGS, tags);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.putBucketTagging);
+            }
+        });
+
+        // Delete tags
+        Exchange deleteResult = template.request("direct:deleteBucketTagging", 
new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.deleteBucketTagging);
+            }
+        });
+
+        assertNotNull(deleteResult);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String awsEndpoint = "aws2-s3://" + name.get() + 
"?autoCreateBucket=true";
+
+                from("direct:putBucketTagging")
+                        .to(awsEndpoint);
+
+                from("direct:putBucketTagging2")
+                        .to(awsEndpoint);
+
+                from("direct:getBucketTagging")
+                        .to(awsEndpoint);
+
+                from("direct:deleteBucketTagging")
+                        .to(awsEndpoint);
+            }
+        };
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3BucketVersioningOperationIT.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3BucketVersioningOperationIT.java
new file mode 100644
index 000000000000..c8e4c6226fad
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3BucketVersioningOperationIT.java
@@ -0,0 +1,88 @@
+/*
+ * 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.aws2.s3.integration;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.s3.AWS2S3Constants;
+import org.apache.camel.component.aws2.s3.AWS2S3Operations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.s3.model.BucketVersioningStatus;
+import software.amazon.awssdk.services.s3.model.GetBucketVersioningResponse;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class S3BucketVersioningOperationIT extends Aws2S3Base {
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void putAndGetBucketVersioning() throws Exception {
+        result.expectedMessageCount(2);
+
+        // Enable versioning on the bucket
+        template.send("direct:putBucketVersioning", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.VERSIONING_STATUS, 
"Enabled");
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.putBucketVersioning);
+            }
+        });
+
+        // Get versioning status from the bucket
+        template.send("direct:getBucketVersioning", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.getBucketVersioning);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        Exchange getVersioningExchange = result.getExchanges().get(1);
+        GetBucketVersioningResponse response = 
getVersioningExchange.getMessage().getBody(GetBucketVersioningResponse.class);
+        assertNotNull(response);
+        assertEquals(BucketVersioningStatus.ENABLED, response.status());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String awsEndpoint = "aws2-s3://" + name.get() + 
"?autoCreateBucket=true";
+
+                from("direct:putBucketVersioning")
+                        .to(awsEndpoint)
+                        .to("mock:result");
+
+                from("direct:getBucketVersioning")
+                        .to(awsEndpoint)
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3CreateBucketOperationIT.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3CreateBucketOperationIT.java
new file mode 100644
index 000000000000..8955ced9c74e
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3CreateBucketOperationIT.java
@@ -0,0 +1,86 @@
+/*
+ * 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.aws2.s3.integration;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.s3.AWS2S3Constants;
+import org.apache.camel.component.aws2.s3.AWS2S3Operations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.s3.model.CreateBucketResponse;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class S3CreateBucketOperationIT extends Aws2S3Base {
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void createBucket() throws Exception {
+        result.expectedMessageCount(1);
+
+        String testBucketName = name.get() + "-create-test";
+
+        template.send("direct:createBucket", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.BUCKET_NAME, 
testBucketName);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.createBucket);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        Exchange resultExchange = result.getExchanges().get(0);
+        CreateBucketResponse response = 
resultExchange.getMessage().getBody(CreateBucketResponse.class);
+        assertNotNull(response);
+
+        // Clean up - delete the bucket
+        template.send("direct:deleteBucket", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.BUCKET_NAME, 
testBucketName);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.deleteBucket);
+            }
+        });
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String awsEndpoint = "aws2-s3://" + name.get();
+
+                from("direct:createBucket")
+                        .to(awsEndpoint)
+                        .to("mock:result");
+
+                from("direct:deleteBucket")
+                        .to(awsEndpoint);
+            }
+        };
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3CreateUploadLinkOperationIT.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3CreateUploadLinkOperationIT.java
new file mode 100644
index 000000000000..0a7fadc1e21d
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3CreateUploadLinkOperationIT.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.s3.integration;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.s3.AWS2S3Constants;
+import org.apache.camel.component.aws2.s3.AWS2S3Operations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class S3CreateUploadLinkOperationIT extends Aws2S3Base {
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void createUploadLink() throws Exception {
+        // First upload an object
+        template.send("direct:addObject", exchange -> {
+            exchange.getIn().setHeader(AWS2S3Constants.KEY, "test-upload-key");
+            exchange.getIn().setBody("Test content for upload link");
+        });
+
+        Exchange response = template.request("direct:createUploadLink", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-upload-key");
+                exchange.getIn().setHeader(AWS2S3Constants.BUCKET_NAME, 
name.get());
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.createUploadLink);
+                
exchange.getIn().setHeader(AWS2S3Constants.UPLOAD_LINK_EXPIRATION_TIME, 
3600000L); // 1 hour
+            }
+        });
+
+        String uploadUrl = response.getMessage().getBody(String.class);
+        assertNotNull(uploadUrl);
+        assertTrue(uploadUrl.startsWith("http"));
+        assertTrue(uploadUrl.contains(name.get()));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String awsEndpoint = "aws2-s3://" + name.get() + 
"?autoCreateBucket=true";
+
+                from("direct:addObject")
+                        .to(awsEndpoint + 
"&accessKey=xxx&secretKey=yyy&region=eu-west-1");
+
+                from("direct:createUploadLink")
+                        .to(awsEndpoint + 
"&accessKey=xxx&secretKey=yyy&region=eu-west-1");
+            }
+        };
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3DeleteObjectsOperationIT.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3DeleteObjectsOperationIT.java
new file mode 100644
index 000000000000..927e225fade8
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3DeleteObjectsOperationIT.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.aws2.s3.integration;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.s3.AWS2S3Constants;
+import org.apache.camel.component.aws2.s3.AWS2S3Operations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.s3.model.DeleteObjectsResponse;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class S3DeleteObjectsOperationIT extends Aws2S3Base {
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void deleteMultipleObjects() throws Exception {
+        result.expectedMessageCount(1);
+
+        // First upload some objects
+        template.send("direct:putObject1", exchange -> 
exchange.getIn().setBody("Test Content 1"));
+        template.send("direct:putObject2", exchange -> 
exchange.getIn().setBody("Test Content 2"));
+        template.send("direct:putObject3", exchange -> 
exchange.getIn().setBody("Test Content 3"));
+
+        // Now delete multiple objects
+        template.send("direct:deleteObjects", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                List<String> keys = Arrays.asList("test-key-1", "test-key-2", 
"test-key-3");
+                exchange.getIn().setHeader(AWS2S3Constants.KEYS_TO_DELETE, 
keys);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.deleteObjects);
+            }
+        });
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        Exchange resultExchange = result.getExchanges().get(0);
+        DeleteObjectsResponse response = 
resultExchange.getMessage().getBody(DeleteObjectsResponse.class);
+        assertNotNull(response);
+        assertTrue(response.deleted().size() >= 1);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String awsEndpoint = "aws2-s3://" + name.get() + 
"?autoCreateBucket=true";
+
+                from("direct:putObject1")
+                        .setHeader(AWS2S3Constants.KEY, constant("test-key-1"))
+                        .to(awsEndpoint);
+
+                from("direct:putObject2")
+                        .setHeader(AWS2S3Constants.KEY, constant("test-key-2"))
+                        .to(awsEndpoint);
+
+                from("direct:putObject3")
+                        .setHeader(AWS2S3Constants.KEY, constant("test-key-3"))
+                        .to(awsEndpoint);
+
+                from("direct:deleteObjects")
+                        .to(awsEndpoint)
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3ObjectTaggingOperationIT.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3ObjectTaggingOperationIT.java
new file mode 100644
index 000000000000..3ea95f0e0055
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/integration/S3ObjectTaggingOperationIT.java
@@ -0,0 +1,137 @@
+/*
+ * 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.aws2.s3.integration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.s3.AWS2S3Constants;
+import org.apache.camel.component.aws2.s3.AWS2S3Operations;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.services.s3.model.Tag;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class S3ObjectTaggingOperationIT extends Aws2S3Base {
+
+    @EndpointInject
+    private ProducerTemplate template;
+
+    @EndpointInject("mock:result")
+    private MockEndpoint result;
+
+    @Test
+    public void putAndGetObjectTagging() throws Exception {
+        // First upload an object
+        template.send("direct:putObject", exchange -> {
+            exchange.getIn().setBody("Test Content");
+            exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-tagging-key");
+        });
+
+        // Put tags on the object
+        Exchange putResult = template.request("direct:putObjectTagging", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                Map<String, String> tags = new HashMap<>();
+                tags.put("Environment", "Development");
+                tags.put("Project", "Camel");
+                exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-tagging-key");
+                exchange.getIn().setHeader(AWS2S3Constants.OBJECT_TAGS, tags);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.putObjectTagging);
+            }
+        });
+        assertNotNull(putResult);
+
+        // Get tags from the object
+        Exchange getResult = template.request("direct:getObjectTagging", new 
Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-tagging-key");
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.getObjectTagging);
+            }
+        });
+
+        List<Tag> tags = getResult.getMessage().getBody(List.class);
+        assertNotNull(tags);
+        assertEquals(2, tags.size());
+    }
+
+    @Test
+    public void deleteObjectTagging() throws Exception {
+        // First upload an object
+        template.send("direct:putObject", exchange -> {
+            exchange.getIn().setBody("Test Content");
+            exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-delete-tagging-key");
+        });
+
+        // Put tags on the object
+        template.send("direct:putObjectTagging2", new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                Map<String, String> tags = new HashMap<>();
+                tags.put("Temp", "Value");
+                exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-delete-tagging-key");
+                exchange.getIn().setHeader(AWS2S3Constants.OBJECT_TAGS, tags);
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.putObjectTagging);
+            }
+        });
+
+        // Delete tags
+        Exchange deleteResult = template.request("direct:deleteObjectTagging", 
new Processor() {
+            @Override
+            public void process(Exchange exchange) {
+                exchange.getIn().setHeader(AWS2S3Constants.KEY, 
"test-delete-tagging-key");
+                exchange.getIn().setHeader(AWS2S3Constants.S3_OPERATION, 
AWS2S3Operations.deleteObjectTagging);
+            }
+        });
+
+        assertNotNull(deleteResult);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                String awsEndpoint = "aws2-s3://" + name.get() + 
"?autoCreateBucket=true";
+
+                from("direct:putObject")
+                        .to(awsEndpoint);
+
+                from("direct:putObjectTagging")
+                        .to(awsEndpoint);
+
+                from("direct:putObjectTagging2")
+                        .to(awsEndpoint);
+
+                from("direct:getObjectTagging")
+                        .to(awsEndpoint);
+
+                from("direct:deleteObjectTagging")
+                        .to(awsEndpoint);
+            }
+        };
+    }
+}
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
index 63d794fb6c5e..33de5662b775 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
@@ -4226,6 +4226,159 @@ public interface AWS2S3EndpointBuilderFactory {
         public String awsS3OverrideBucketName() {
             return "CamelAwsS3OverrideBucketName";
         }
+        /**
+         * A list of keys to delete when using deleteObjects operation.
+         * 
+         * The option is a: {@code List<String>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3KeysToDelete}.
+         */
+        public String awsS3KeysToDelete() {
+            return "CamelAwsS3KeysToDelete";
+        }
+        /**
+         * The number of days for which the restore request will remain active
+         * when using restoreObject operation.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3RestoreDays}.
+         */
+        public String awsS3RestoreDays() {
+            return "CamelAwsS3RestoreDays";
+        }
+        /**
+         * The tier at which the restore will be processed when using
+         * restoreObject operation (e.g., Standard, Bulk, Expedited).
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3RestoreTier}.
+         */
+        public String awsS3RestoreTier() {
+            return "CamelAwsS3RestoreTier";
+        }
+        /**
+         * The object tags to set when using putObjectTagging operation.
+         * 
+         * The option is a: {@code Map<String, String>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3ObjectTags}.
+         */
+        public String awsS3ObjectTags() {
+            return "CamelAwsS3ObjectTags";
+        }
+        /**
+         * The bucket tags to set when using putBucketTagging operation.
+         * 
+         * The option is a: {@code Map<String, String>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3BucketTags}.
+         */
+        public String awsS3BucketTags() {
+            return "CamelAwsS3BucketTags";
+        }
+        /**
+         * The bucket policy as JSON string when using putBucketPolicy
+         * operation.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3BucketPolicy}.
+         */
+        public String awsS3BucketPolicy() {
+            return "CamelAwsS3BucketPolicy";
+        }
+        /**
+         * The versioning status (Enabled or Suspended) when using
+         * putBucketVersioning operation.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3VersioningStatus}.
+         */
+        public String awsS3VersioningStatus() {
+            return "CamelAwsS3VersioningStatus";
+        }
+        /**
+         * Whether to enable MFA delete when using putBucketVersioning
+         * operation.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3MfaDelete}.
+         */
+        public String awsS3MfaDelete() {
+            return "CamelAwsS3MfaDelete";
+        }
+        /**
+         * The expiration time of the upload link in milliseconds.
+         * 
+         * The option is a: {@code Long} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code 
AwsS3UploadLinkExpirationTime}.
+         */
+        public String awsS3UploadLinkExpirationTime() {
+            return "CamelAwsS3UploadLinkExpirationTime";
+        }
+        /**
+         * Whether the upload link is browser compatible.
+         * 
+         * The option is a: {@code boolean} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsS3UploadLinkBrowserCompatible}.
+         */
+        public String awsS3UploadLinkBrowserCompatible() {
+            return "CamelAwsS3UploadLinkBrowserCompatible";
+        }
+        /**
+         * The headers that are needed by the service for upload (not needed
+         * when BrowserCompatible is true).
+         * 
+         * The option is a: {@code Map<String, List<String>>} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code
+         * AwsS3UploadLinkHttpRequestHeaders}.
+         */
+        public String awsS3UploadLinkHttpRequestHeaders() {
+            return "CamelAwsS3UploadLinkHttpRequestHeaders";
+        }
+        /**
+         * The request payload that is needed by the service for upload (not
+         * needed when BrowserCompatible is true).
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3UploadLinkSignedPayload}.
+         */
+        public String awsS3UploadLinkSignedPayload() {
+            return "CamelAwsS3UploadLinkSignedPayload";
+        }
     }
     static AWS2S3EndpointBuilder endpointBuilder(String componentName, String 
path) {
         class AWS2S3EndpointBuilderImpl extends AbstractEndpointBuilder 
implements AWS2S3EndpointBuilder, AdvancedAWS2S3EndpointBuilder {

Reply via email to