You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/01/24 10:38:03 UTC

[camel] branch main updated: Service account authorization (Google OAuth2 2LO) added for Google-components calendar, sheets, drive, gmail (#6808)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 2bdac9e  Service account authorization (Google OAuth2 2LO) added for Google-components calendar, sheets, drive, gmail (#6808)
2bdac9e is described below

commit 2bdac9e1aafbaf90d13ef736973059667da1c859
Author: Vladimir V. Bychkov <gi...@bychkov.name>
AuthorDate: Mon Jan 24 11:37:17 2022 +0100

    Service account authorization (Google OAuth2 2LO) added for Google-components calendar, sheets, drive, gmail (#6808)
    
    Signed-off-by: Vladimir V. Bychkov <gi...@bychkov.name>
---
 .../camel/catalog/components/google-mail.json      |  12 +-
 ...CalendarAclEndpointConfigurationConfigurer.java |  29 +-
 ...alendarListEndpointConfigurationConfigurer.java |  29 +-
 ...arCalendarsEndpointConfigurationConfigurer.java |  29 +-
 ...darChannelsEndpointConfigurationConfigurer.java |  29 +-
 ...endarColorsEndpointConfigurationConfigurer.java |  29 +-
 ...endarEventsEndpointConfigurationConfigurer.java |  29 +-
 ...darFreebusyEndpointConfigurationConfigurer.java |  29 +-
 ...darSettingsEndpointConfigurationConfigurer.java |  29 +-
 .../GoogleCalendarComponentConfigurer.java         |  25 +-
 .../GoogleCalendarConfigurationConfigurer.java     |  29 +-
 .../calendar/GoogleCalendarEndpointConfigurer.java |  18 +-
 .../calendar/GoogleCalendarEndpointUriFactory.java |   4 +-
 .../GoogleCalendarStreamComponentConfigurer.java   |   9 +
 .../GoogleCalendarStreamEndpointConfigurer.java    |   9 +
 .../GoogleCalendarStreamEndpointUriFactory.java    |   4 +-
 .../component/google/calendar/google-calendar.json |   8 +-
 .../calendar/stream/google-calendar-stream.json    |   4 +
 .../src/main/docs/google-calendar-component.adoc   |   6 +
 .../docs/google-calendar-stream-component.adoc     |   6 +
 .../calendar/BatchGoogleCalendarClientFactory.java |  43 +-
 .../calendar/GoogleCalendarClientFactory.java      |   9 +-
 .../google/calendar/GoogleCalendarComponent.java   |  25 +-
 .../calendar/GoogleCalendarConfiguration.java      |  36 +-
 .../stream/GoogleCalendarStreamComponent.java      |  18 +-
 .../stream/GoogleCalendarStreamConfiguration.java  |  29 ++
 .../AbstractGoogleCalendarTestSupport.java         |   3 +-
 .../src/test/resources/test-options.properties     |   4 +
 components/camel-google/camel-google-drive/pom.xml |  10 +
 .../DriveAboutEndpointConfigurationConfigurer.java |  14 +
 .../DriveAppsEndpointConfigurationConfigurer.java  |  14 +
 ...riveChangesEndpointConfigurationConfigurer.java |  14 +
 ...iveChannelsEndpointConfigurationConfigurer.java |  14 +
 ...iveChildrenEndpointConfigurationConfigurer.java |  14 +
 ...iveCommentsEndpointConfigurationConfigurer.java |  14 +
 .../drive/DriveDrivesEndpointConfiguration.java    |  56 +++
 ...riveDrivesEndpointConfigurationConfigurer.java} |  50 +--
 .../DriveFilesEndpointConfigurationConfigurer.java |  14 +
 ...riveParentsEndpointConfigurationConfigurer.java |  14 +
 ...PermissionsEndpointConfigurationConfigurer.java |  14 +
 ...ePropertiesEndpointConfigurationConfigurer.java |  14 +
 ...riveRepliesEndpointConfigurationConfigurer.java |  14 +
 ...veRevisionsEndpointConfigurationConfigurer.java |  14 +
 .../DriveTeamdrivesEndpointConfiguration.java      |  56 +++
 ...TeamdrivesEndpointConfigurationConfigurer.java} |  50 +--
 .../drive/GoogleDriveComponentConfigurer.java      |  11 +
 .../drive/GoogleDriveConfigurationConfigurer.java  |  14 +
 .../drive/GoogleDriveEndpointConfigurer.java       |  11 +
 .../drive/GoogleDriveEndpointUriFactory.java       |  45 +-
 .../drive/internal/DriveDrivesApiMethod.java       |  79 ++++
 .../drive/internal/DriveTeamdrivesApiMethod.java   |  69 +++
 .../drive/internal/GoogleDriveApiCollection.java   |  18 +
 .../google/drive/internal/GoogleDriveApiName.java  |   4 +
 ...t.google.drive.DriveDrivesEndpointConfiguration |   2 +
 ...ogle.drive.DriveTeamdrivesEndpointConfiguration |   2 +
 .../camel/component/google/drive/google-drive.json |  14 +-
 .../src/main/docs/google-drive-component.adoc      |   6 +
 .../drive/BatchGoogleDriveClientFactory.java       | 208 +++++----
 .../google/drive/GoogleDriveClientFactory.java     |  62 +--
 .../google/drive/GoogleDriveComponent.java         |  18 +-
 .../google/drive/GoogleDriveConfiguration.java     |  37 +-
 .../google/drive/GoogleDriveEndpoint.java          |   6 +
 .../drive/InteractiveGoogleDriveClientFactory.java | 153 +++----
 .../drive/AbstractGoogleDriveTestSupport.java      |   3 +-
 .../google/drive/CustomClientFactoryTest.java      |   3 +
 .../google/drive/DriveConfigurationTest.java       |   3 +
 .../component/google/drive/MyClientFactory.java    |  79 ++--
 .../src/test/resources/test-options.properties     |   4 +
 components/camel-google/camel-google-mail/pom.xml  |   7 -
 ...UsersDraftsEndpointConfigurationConfigurer.java |   6 +-
 .../GmailUsersEndpointConfigurationConfigurer.java |   6 +-
 ...sersHistoryEndpointConfigurationConfigurer.java |   6 +-
 ...UsersLabelsEndpointConfigurationConfigurer.java |   6 +-
 ...AttachmentsEndpointConfigurationConfigurer.java |   6 +-
 ...ersMessagesEndpointConfigurationConfigurer.java |   6 +-
 ...sersThreadsEndpointConfigurationConfigurer.java |   6 +-
 .../google/mail/GoogleMailComponentConfigurer.java |   6 +-
 .../mail/GoogleMailConfigurationConfigurer.java    |   6 +-
 .../google/mail/GoogleMailEndpointConfigurer.java  |   6 +-
 .../GoogleMailStreamComponentConfigurer.java       |  20 +
 .../stream/GoogleMailStreamEndpointConfigurer.java |  13 +
 .../stream/GoogleMailStreamEndpointUriFactory.java |   5 +-
 .../camel/component/google/mail/google-mail.json   |   4 +-
 .../google/mail/stream/google-mail-stream.json     |   6 +
 .../src/main/docs/google-mail-component.adoc       |   6 +
 .../main/docs/google-mail-stream-component.adoc    |   6 +
 .../google/mail/BatchGoogleMailClientFactory.java  |  16 +-
 .../google/mail/GoogleMailClientFactory.java       |   8 +-
 .../component/google/mail/GoogleMailComponent.java |  22 +-
 .../mail/GoogleMailComponentVerifierExtension.java |   5 +-
 .../google/mail/GoogleMailConfiguration.java       | 344 +++++++--------
 .../mail/stream/GoogleMailStreamComponent.java     |  14 +-
 ...GoogleMailStreamComponentVerifierExtension.java |   2 +-
 .../mail/stream/GoogleMailStreamConfiguration.java |  46 ++
 .../google/mail/AbstractGoogleMailTestSupport.java |   3 +-
 .../src/test/resources/test-options.properties     |   4 +
 .../sheets/GoogleSheetsComponentConfigurer.java    |  23 +
 .../GoogleSheetsConfigurationConfigurer.java       |  30 ++
 .../sheets/GoogleSheetsEndpointConfigurer.java     |  16 +
 .../sheets/GoogleSheetsEndpointUriFactory.java     |   5 +-
 ...preadsheetsEndpointConfigurationConfigurer.java |  30 ++
 ...heetsValuesEndpointConfigurationConfigurer.java |  30 ++
 .../GoogleSheetsStreamComponentConfigurer.java     |   9 +
 .../GoogleSheetsStreamEndpointConfigurer.java      |   9 +
 .../GoogleSheetsStreamEndpointUriFactory.java      |   4 +-
 .../component/google/sheets/google-sheets.json     |   6 +
 .../google/sheets/stream/google-sheets-stream.json |   4 +
 .../src/main/docs/google-sheets-component.adoc     |   6 +
 .../main/docs/google-sheets-stream-component.adoc  |   6 +
 .../sheets/BatchGoogleSheetsClientFactory.java     | 232 +++++-----
 .../google/sheets/GoogleSheetsClientFactory.java   |  70 +--
 .../google/sheets/GoogleSheetsComponent.java       |  17 +-
 .../google/sheets/GoogleSheetsConfiguration.java   |  46 ++
 .../sheets/GoogleSheetsVerifierExtension.java      |   2 +-
 .../sheets/stream/GoogleSheetsStreamComponent.java |  18 +-
 .../stream/GoogleSheetsStreamConfiguration.java    | 479 +++++++++++----------
 .../sheets/AbstractGoogleSheetsTestSupport.java    |  48 ++-
 .../google/sheets/SheetsSpreadsheetsIT.java        |   3 +
 .../google/sheets/SheetsSpreadsheetsValuesIT.java  |   3 +
 .../SheetsStreamConsumerIntegrationTest.java       |   3 +
 .../src/test/resources/test-options.properties     |  12 +-
 parent/pom.xml                                     |   2 +-
 122 files changed, 2465 insertions(+), 1013 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail.json
index 7c666e5..6f2d42a 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/google-mail.json
@@ -25,16 +25,16 @@
   "componentProperties": {
     "applicationName": { "kind": "property", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Google mail application name. Example would be camel-google-mail\/1.0" },
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client ID of the mail application" },
+    "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client secret of the mail application" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use the shared configuration" },
-    "delegate": { "kind": "property", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account. Example would be classpath:credentials.json or file:\/ [...]
     "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "lazyStartProducer": { "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 fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "clientFactory": { "kind": "property", "displayName": "Client Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.mail.GoogleMailClientFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use the GoogleCalendarClientFactory as factory for creating the client. Will by default use BatchGoogleMailClientFactory" },
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage." },
-    "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client secret of the mail application" },
-    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever the  [...]
   },
   "properties": {
@@ -42,9 +42,11 @@
     "methodName": { "kind": "path", "displayName": "Method Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "enum": [ "attachments", "create", "delete", "get", "getProfile", "gmailImport", "insert", "list", "modify", "patch", "send", "stop", "trash", "untrash", "update", "watch" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMa [...]
     "applicationName": { "kind": "parameter", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Google mail application name. Example would be camel-google-mail\/1.0" },
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client ID of the mail application" },
-    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
+    "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client secret of the mail application" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of a parameter to be passed in the exchange In Body" },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
     "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
@@ -66,8 +68,6 @@
     "timeUnit": { "kind": "parameter", "displayName": "Time Unit", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "object", "javaType": "java.util.concurrent.TimeUnit", "enum": [ "NANOSECONDS", "MICROSECONDS", "MILLISECONDS", "SECONDS", "MINUTES", "HOURS", "DAYS" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "MILLISECONDS", "description": "Time unit for initialDelay and delay options." },
     "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage." },
-    "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client secret of the mail application" },
-    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever the [...]
   },
   "apis": {
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarAclEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarAclEndpointConfigurationConfigurer.java
index dd4e552..5163ecc 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarAclEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarAclEndpointConfigurationConfigurer.java
@@ -28,12 +28,14 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.calendar.model.AclRule.class);
         map.put("ContentChannel", com.google.api.services.calendar.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("RuleId", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -58,8 +60,12 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         case "Content": target.setContent(property(camelContext, com.google.api.services.calendar.model.AclRule.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.calendar.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -69,7 +75,7 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         case "ruleid":
         case "RuleId": target.setRuleId(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -100,8 +106,12 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         case "Content": return com.google.api.services.calendar.model.AclRule.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.calendar.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -111,7 +121,7 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         case "ruleid":
         case "RuleId": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -138,8 +148,12 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         case "Content": return target.getContent();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -155,5 +169,14 @@ public class CalendarAclEndpointConfigurationConfigurer extends org.apache.camel
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarListEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarListEndpointConfigurationConfigurer.java
index 5739f72..a15dde5 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarListEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarListEndpointConfigurationConfigurer.java
@@ -28,11 +28,13 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.calendar.model.CalendarListEntry.class);
         map.put("ContentChannel", com.google.api.services.calendar.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -57,8 +59,12 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         case "Content": target.setContent(property(camelContext, com.google.api.services.calendar.model.CalendarListEntry.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.calendar.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -66,7 +72,7 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -97,8 +103,12 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         case "Content": return com.google.api.services.calendar.model.CalendarListEntry.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.calendar.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -106,7 +116,7 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -133,8 +143,12 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         case "Content": return target.getContent();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -148,5 +162,14 @@ public class CalendarCalendarListEndpointConfigurationConfigurer extends org.apa
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarsEndpointConfigurationConfigurer.java
index edd7d26..a2f687c 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarCalendarsEndpointConfigurationConfigurer.java
@@ -27,11 +27,13 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.calendar.model.Calendar.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -54,8 +56,12 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.calendar.model.Calendar.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -63,7 +69,7 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -92,8 +98,12 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.calendar.model.Calendar.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -101,7 +111,7 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -126,8 +136,12 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -141,5 +155,14 @@ public class CalendarCalendarsEndpointConfigurationConfigurer extends org.apache
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarChannelsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarChannelsEndpointConfigurationConfigurer.java
index c94f0f8..36e51cb 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarChannelsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarChannelsEndpointConfigurationConfigurer.java
@@ -26,11 +26,13 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("ContentChannel", com.google.api.services.calendar.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -51,8 +53,12 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.calendar.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -60,7 +66,7 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -87,8 +93,12 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return java.lang.String.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.calendar.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -96,7 +106,7 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -119,8 +129,12 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return target.getClientSecret();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -134,5 +148,14 @@ public class CalendarChannelsEndpointConfigurationConfigurer extends org.apache.
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarColorsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarColorsEndpointConfigurationConfigurer.java
index 814c4cf..2bdd352 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarColorsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarColorsEndpointConfigurationConfigurer.java
@@ -25,11 +25,13 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -48,8 +50,12 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         case "ClientId": target.setClientId(property(camelContext, java.lang.String.class, value)); return true;
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -57,7 +63,7 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -82,8 +88,12 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         case "ClientId": return java.lang.String.class;
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -91,7 +101,7 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -112,8 +122,12 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         case "ClientId": return target.getClientId();
         case "clientsecret":
         case "ClientSecret": return target.getClientSecret();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -127,5 +141,14 @@ public class CalendarColorsEndpointConfigurationConfigurer extends org.apache.ca
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarEventsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarEventsEndpointConfigurationConfigurer.java
index 149ff8b..ce4bec1 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarEventsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarEventsEndpointConfigurationConfigurer.java
@@ -28,13 +28,15 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.calendar.model.Event.class);
         map.put("ContentChannel", com.google.api.services.calendar.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("Destination", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
         map.put("EventId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("Text", java.lang.String.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
@@ -60,12 +62,16 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         case "Content": target.setContent(property(camelContext, com.google.api.services.calendar.model.Event.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.calendar.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "destination":
         case "Destination": target.setDestination(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
         case "eventid":
         case "EventId": target.setEventId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -73,7 +79,7 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "text":
         case "Text": target.setText(property(camelContext, java.lang.String.class, value)); return true;
         case "user":
@@ -106,12 +112,16 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         case "Content": return com.google.api.services.calendar.model.Event.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.calendar.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "destination":
         case "Destination": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
         case "eventid":
         case "EventId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -119,7 +129,7 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "text":
         case "Text": return java.lang.String.class;
         case "user":
@@ -148,12 +158,16 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         case "Content": return target.getContent();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "destination":
         case "Destination": return target.getDestination();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
         case "eventid":
         case "EventId": return target.getEventId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -169,5 +183,14 @@ public class CalendarEventsEndpointConfigurationConfigurer extends org.apache.ca
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarFreebusyEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarFreebusyEndpointConfigurationConfigurer.java
index 098a65c..3197152 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarFreebusyEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarFreebusyEndpointConfigurationConfigurer.java
@@ -26,11 +26,13 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.calendar.model.FreeBusyRequest.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -51,8 +53,12 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.calendar.model.FreeBusyRequest.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -60,7 +66,7 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -87,8 +93,12 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.calendar.model.FreeBusyRequest.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -96,7 +106,7 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -119,8 +129,12 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -134,5 +148,14 @@ public class CalendarFreebusyEndpointConfigurationConfigurer extends org.apache.
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarSettingsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarSettingsEndpointConfigurationConfigurer.java
index 02cba0d..a3b2784 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarSettingsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/CalendarSettingsEndpointConfigurationConfigurer.java
@@ -26,11 +26,13 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("ContentChannel", com.google.api.services.calendar.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("Setting", java.lang.String.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
@@ -52,8 +54,12 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.calendar.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -61,7 +67,7 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "setting":
         case "Setting": target.setSetting(property(camelContext, java.lang.String.class, value)); return true;
         case "user":
@@ -90,8 +96,12 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return java.lang.String.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.calendar.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -99,7 +109,7 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "setting":
         case "Setting": return java.lang.String.class;
         case "user":
@@ -124,8 +134,12 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return target.getClientSecret();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -141,5 +155,14 @@ public class CalendarSettingsEndpointConfigurationConfigurer extends org.apache.
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarComponentConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarComponentConfigurer.java
index 465a53f..3308285 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarComponentConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarComponentConfigurer.java
@@ -23,7 +23,8 @@ public class GoogleCalendarComponentConfigurer extends PropertyConfigurerSupport
         map.put("applicationName", java.lang.String.class);
         map.put("clientId", java.lang.String.class);
         map.put("configuration", org.apache.camel.component.google.calendar.GoogleCalendarConfiguration.class);
-        map.put("scopes", java.lang.String.class);
+        map.put("delegate", java.lang.String.class);
+        map.put("scopes", java.util.List.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("lazyStartProducer", boolean.class);
         map.put("autowiredEnabled", boolean.class);
@@ -31,6 +32,7 @@ public class GoogleCalendarComponentConfigurer extends PropertyConfigurerSupport
         map.put("accessToken", java.lang.String.class);
         map.put("clientSecret", java.lang.String.class);
         map.put("emailAddress", java.lang.String.class);
+        map.put("keyResource", java.lang.String.class);
         map.put("p12FileName", java.lang.String.class);
         map.put("refreshToken", java.lang.String.class);
         map.put("user", java.lang.String.class);
@@ -63,15 +65,18 @@ public class GoogleCalendarComponentConfigurer extends PropertyConfigurerSupport
         case "clientsecret":
         case "clientSecret": getOrCreateConfiguration(target).setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.google.calendar.GoogleCalendarConfiguration.class, value)); return true;
+        case "delegate": getOrCreateConfiguration(target).setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "emailAddress": getOrCreateConfiguration(target).setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "keyResource": getOrCreateConfiguration(target).setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "p12filename":
         case "p12FileName": getOrCreateConfiguration(target).setP12FileName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "refreshToken": getOrCreateConfiguration(target).setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
-        case "scopes": getOrCreateConfiguration(target).setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes": getOrCreateConfiguration(target).setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user": getOrCreateConfiguration(target).setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
         }
@@ -100,15 +105,18 @@ public class GoogleCalendarComponentConfigurer extends PropertyConfigurerSupport
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "configuration": return org.apache.camel.component.google.calendar.GoogleCalendarConfiguration.class;
+        case "delegate": return java.lang.String.class;
         case "emailaddress":
         case "emailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "p12filename":
         case "p12FileName": return java.lang.String.class;
         case "refreshtoken":
         case "refreshToken": return java.lang.String.class;
-        case "scopes": return java.lang.String.class;
+        case "scopes": return java.util.List.class;
         case "user": return java.lang.String.class;
         default: return null;
         }
@@ -133,8 +141,11 @@ public class GoogleCalendarComponentConfigurer extends PropertyConfigurerSupport
         case "clientsecret":
         case "clientSecret": return getOrCreateConfiguration(target).getClientSecret();
         case "configuration": return target.getConfiguration();
+        case "delegate": return getOrCreateConfiguration(target).getDelegate();
         case "emailaddress":
         case "emailAddress": return getOrCreateConfiguration(target).getEmailAddress();
+        case "keyresource":
+        case "keyResource": return getOrCreateConfiguration(target).getKeyResource();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "p12filename":
@@ -146,5 +157,13 @@ public class GoogleCalendarComponentConfigurer extends PropertyConfigurerSupport
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarConfigurationConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarConfigurationConfigurer.java
index 52ff68e..00a788d 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarConfigurationConfigurer.java
@@ -25,11 +25,13 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("EmailAddress", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("P12FileName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.lang.String.class);
+        map.put("Scopes", java.util.List.class);
         map.put("User", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -48,8 +50,12 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         case "ClientId": target.setClientId(property(camelContext, java.lang.String.class, value)); return true;
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "EmailAddress": target.setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "p12filename":
@@ -57,7 +63,7 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "user":
         case "User": target.setUser(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -82,8 +88,12 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         case "ClientId": return java.lang.String.class;
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "emailaddress":
         case "EmailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "p12filename":
@@ -91,7 +101,7 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.lang.String.class;
+        case "Scopes": return java.util.List.class;
         case "user":
         case "User": return java.lang.String.class;
         default: return null;
@@ -112,8 +122,12 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         case "ClientId": return target.getClientId();
         case "clientsecret":
         case "ClientSecret": return target.getClientSecret();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "emailaddress":
         case "EmailAddress": return target.getEmailAddress();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "p12filename":
@@ -127,5 +141,14 @@ public class GoogleCalendarConfigurationConfigurer extends org.apache.camel.supp
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointConfigurer.java
index a60d053..5e18cca 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointConfigurer.java
@@ -24,8 +24,9 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         map.put("methodName", java.lang.String.class);
         map.put("applicationName", java.lang.String.class);
         map.put("clientId", java.lang.String.class);
+        map.put("delegate", java.lang.String.class);
         map.put("inBody", java.lang.String.class);
-        map.put("scopes", java.lang.String.class);
+        map.put("scopes", java.util.List.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("sendEmptyMessageWhenIdle", boolean.class);
         map.put("exceptionHandler", org.apache.camel.spi.ExceptionHandler.class);
@@ -49,6 +50,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         map.put("accessToken", java.lang.String.class);
         map.put("clientSecret", java.lang.String.class);
         map.put("emailAddress", java.lang.String.class);
+        map.put("keyResource", java.lang.String.class);
         map.put("p12FileName", java.lang.String.class);
         map.put("refreshToken", java.lang.String.class);
         map.put("user", java.lang.String.class);
@@ -76,6 +78,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "clientsecret":
         case "clientSecret": target.getConfiguration().setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "delegate": target.getConfiguration().setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "emailAddress": target.getConfiguration().setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
@@ -87,6 +90,8 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "inBody": target.setInBody(property(camelContext, java.lang.String.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyresource":
+        case "keyResource": target.getConfiguration().setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "p12filename":
@@ -104,7 +109,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "scheduler": target.setScheduler(property(camelContext, java.lang.Object.class, value)); return true;
         case "schedulerproperties":
         case "schedulerProperties": target.setSchedulerProperties(property(camelContext, java.util.Map.class, value)); return true;
-        case "scopes": target.getConfiguration().setScopes(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes": target.getConfiguration().setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": target.setSendEmptyMessageWhenIdle(property(camelContext, boolean.class, value)); return true;
         case "startscheduler":
@@ -143,6 +148,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "delay": return long.class;
+        case "delegate": return java.lang.String.class;
         case "emailaddress":
         case "emailAddress": return java.lang.String.class;
         case "exceptionhandler":
@@ -154,6 +160,8 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "inBody": return java.lang.String.class;
         case "initialdelay":
         case "initialDelay": return long.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "p12filename":
@@ -171,7 +179,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "scheduler": return java.lang.Object.class;
         case "schedulerproperties":
         case "schedulerProperties": return java.util.Map.class;
-        case "scopes": return java.lang.String.class;
+        case "scopes": return java.util.List.class;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return boolean.class;
         case "startscheduler":
@@ -206,6 +214,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "clientsecret":
         case "clientSecret": return target.getConfiguration().getClientSecret();
         case "delay": return target.getDelay();
+        case "delegate": return target.getConfiguration().getDelegate();
         case "emailaddress":
         case "emailAddress": return target.getConfiguration().getEmailAddress();
         case "exceptionhandler":
@@ -217,6 +226,8 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         case "inBody": return target.getInBody();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
+        case "keyresource":
+        case "keyResource": return target.getConfiguration().getKeyResource();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "p12filename":
@@ -253,6 +264,7 @@ public class GoogleCalendarEndpointConfigurer extends PropertyConfigurerSupport
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "schedulerproperties":
         case "schedulerProperties": return java.lang.Object.class;
+        case "scopes": return java.lang.String.class;
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointUriFactory.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointUriFactory.java
index d13731a..ab76490 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointUriFactory.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/GoogleCalendarEndpointUriFactory.java
@@ -21,13 +21,14 @@ public class GoogleCalendarEndpointUriFactory extends org.apache.camel.support.c
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(40);
+        Set<String> props = new HashSet<>(42);
         props.add("backoffMultiplier");
         props.add("apiName");
         props.add("destination");
         props.add("initialDelay");
         props.add("content");
         props.add("setting");
+        props.add("delegate");
         props.add("scheduler");
         props.add("emailAddress");
         props.add("bridgeErrorHandler");
@@ -45,6 +46,7 @@ public class GoogleCalendarEndpointUriFactory extends org.apache.camel.support.c
         props.add("eventId");
         props.add("p12FileName");
         props.add("clientId");
+        props.add("keyResource");
         props.add("sendEmptyMessageWhenIdle");
         props.add("schedulerProperties");
         props.add("exchangePattern");
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponentConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponentConfigurer.java
index c40d3d5..7898b13 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponentConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponentConfigurer.java
@@ -49,8 +49,11 @@ public class GoogleCalendarStreamComponentConfigurer extends PropertyConfigurerS
         case "considerLastUpdate": getOrCreateConfiguration(target).setConsiderLastUpdate(property(camelContext, boolean.class, value)); return true;
         case "consumefromnow":
         case "consumeFromNow": getOrCreateConfiguration(target).setConsumeFromNow(property(camelContext, boolean.class, value)); return true;
+        case "delegate": getOrCreateConfiguration(target).setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "emailAddress": getOrCreateConfiguration(target).setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "keyResource": getOrCreateConfiguration(target).setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "maxresults":
         case "maxResults": getOrCreateConfiguration(target).setMaxResults(property(camelContext, int.class, value)); return true;
         case "p12filename":
@@ -90,8 +93,11 @@ public class GoogleCalendarStreamComponentConfigurer extends PropertyConfigurerS
         case "considerLastUpdate": return boolean.class;
         case "consumefromnow":
         case "consumeFromNow": return boolean.class;
+        case "delegate": return java.lang.String.class;
         case "emailaddress":
         case "emailAddress": return java.lang.String.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "maxresults":
         case "maxResults": return int.class;
         case "p12filename":
@@ -132,8 +138,11 @@ public class GoogleCalendarStreamComponentConfigurer extends PropertyConfigurerS
         case "considerLastUpdate": return getOrCreateConfiguration(target).isConsiderLastUpdate();
         case "consumefromnow":
         case "consumeFromNow": return getOrCreateConfiguration(target).isConsumeFromNow();
+        case "delegate": return getOrCreateConfiguration(target).getDelegate();
         case "emailaddress":
         case "emailAddress": return getOrCreateConfiguration(target).getEmailAddress();
+        case "keyresource":
+        case "keyResource": return getOrCreateConfiguration(target).getKeyResource();
         case "maxresults":
         case "maxResults": return getOrCreateConfiguration(target).getMaxResults();
         case "p12filename":
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointConfigurer.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointConfigurer.java
index 102d2f0..61a49d3 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointConfigurer.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointConfigurer.java
@@ -44,6 +44,7 @@ public class GoogleCalendarStreamEndpointConfigurer extends PropertyConfigurerSu
         case "consumefromnow":
         case "consumeFromNow": target.getConfiguration().setConsumeFromNow(property(camelContext, boolean.class, value)); return true;
         case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "delegate": target.getConfiguration().setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "emailaddress":
         case "emailAddress": target.getConfiguration().setEmailAddress(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
@@ -53,6 +54,8 @@ public class GoogleCalendarStreamEndpointConfigurer extends PropertyConfigurerSu
         case "greedy": target.setGreedy(property(camelContext, boolean.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyresource":
+        case "keyResource": target.getConfiguration().setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "maxresults":
         case "maxResults": target.getConfiguration().setMaxResults(property(camelContext, int.class, value)); return true;
         case "p12filename":
@@ -113,6 +116,7 @@ public class GoogleCalendarStreamEndpointConfigurer extends PropertyConfigurerSu
         case "consumefromnow":
         case "consumeFromNow": return boolean.class;
         case "delay": return long.class;
+        case "delegate": return java.lang.String.class;
         case "emailaddress":
         case "emailAddress": return java.lang.String.class;
         case "exceptionhandler":
@@ -122,6 +126,8 @@ public class GoogleCalendarStreamEndpointConfigurer extends PropertyConfigurerSu
         case "greedy": return boolean.class;
         case "initialdelay":
         case "initialDelay": return long.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "maxresults":
         case "maxResults": return int.class;
         case "p12filename":
@@ -183,6 +189,7 @@ public class GoogleCalendarStreamEndpointConfigurer extends PropertyConfigurerSu
         case "consumefromnow":
         case "consumeFromNow": return target.getConfiguration().isConsumeFromNow();
         case "delay": return target.getDelay();
+        case "delegate": return target.getConfiguration().getDelegate();
         case "emailaddress":
         case "emailAddress": return target.getConfiguration().getEmailAddress();
         case "exceptionhandler":
@@ -192,6 +199,8 @@ public class GoogleCalendarStreamEndpointConfigurer extends PropertyConfigurerSu
         case "greedy": return target.isGreedy();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
+        case "keyresource":
+        case "keyResource": return target.getConfiguration().getKeyResource();
         case "maxresults":
         case "maxResults": return target.getConfiguration().getMaxResults();
         case "p12filename":
diff --git a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointUriFactory.java b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointUriFactory.java
index d116b67..6f6e92c 100644
--- a/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointUriFactory.java
+++ b/components/camel-google/camel-google-calendar/src/generated/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamEndpointUriFactory.java
@@ -21,10 +21,11 @@ public class GoogleCalendarStreamEndpointUriFactory extends org.apache.camel.sup
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(35);
+        Set<String> props = new HashSet<>(37);
         props.add("backoffMultiplier");
         props.add("initialDelay");
         props.add("consumeFromNow");
+        props.add("delegate");
         props.add("scheduler");
         props.add("emailAddress");
         props.add("bridgeErrorHandler");
@@ -40,6 +41,7 @@ public class GoogleCalendarStreamEndpointUriFactory extends org.apache.camel.sup
         props.add("timeUnit");
         props.add("p12FileName");
         props.add("clientId");
+        props.add("keyResource");
         props.add("considerLastUpdate");
         props.add("query");
         props.add("sendEmptyMessageWhenIdle");
diff --git a/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/google-calendar.json b/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/google-calendar.json
index af3b52d..94aaa50 100644
--- a/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/google-calendar.json
+++ b/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/google-calendar.json
@@ -26,7 +26,8 @@
     "applicationName": { "kind": "property", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Google calendar application name. Example would be camel-google-calendar\/1.0" },
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Client ID of the calendar application" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use the shared configuration" },
-    "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "https:\/\/www.googleapis.com\/auth\/calendar", "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you want a calendar ap [...]
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
+    "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "https:\/\/www.googleapis.com\/auth\/calendar", "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you wan [...]
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "lazyStartProducer": { "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 fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
@@ -34,6 +35,7 @@
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long te [...]
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Client secret of the calendar application" },
     "emailAddress": { "kind": "property", "displayName": "Email Address", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "The emailAddress of the Google Service Account." },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "p12FileName": { "kind": "property", "displayName": "P12 File Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "The name of the p12 file which has the private key to use with the Google Service Account." },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whene [...]
     "user": { "kind": "property", "displayName": "User", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "The email address of the user the application is trying to impersonate in the service account flow" }
@@ -43,8 +45,9 @@
     "methodName": { "kind": "path", "displayName": "Method Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "enum": [ "calendarImport", "clear", "delete", "get", "insert", "instances", "list", "move", "patch", "query", "quickAdd", "stop", "update", "watch" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration [...]
     "applicationName": { "kind": "parameter", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Google calendar application name. Example would be camel-google-calendar\/1.0" },
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Client ID of the calendar application" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of a parameter to be passed in the exchange In Body" },
-    "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "https:\/\/www.googleapis.com\/auth\/calendar", "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you want a calendar a [...]
+    "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "https:\/\/www.googleapis.com\/auth\/calendar", "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you wa [...]
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
     "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
@@ -68,6 +71,7 @@
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long t [...]
     "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Client secret of the calendar application" },
     "emailAddress": { "kind": "parameter", "displayName": "Email Address", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "The emailAddress of the Google Service Account." },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "p12FileName": { "kind": "parameter", "displayName": "P12 File Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "The name of the p12 file which has the private key to use with the Google Service Account." },
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken when [...]
     "user": { "kind": "parameter", "displayName": "User", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.GoogleCalendarConfiguration", "configurationField": "configuration", "description": "The email address of the user the application is trying to impersonate in the service account flow" }
diff --git a/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/stream/google-calendar-stream.json b/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/stream/google-calendar-stream.json
index 59e20bf..2441d81 100644
--- a/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/stream/google-calendar-stream.json
+++ b/components/camel-google/camel-google-calendar/src/generated/resources/org/apache/camel/component/google/calendar/stream/google-calendar-stream.json
@@ -29,6 +29,7 @@
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "consumer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "The configuration" },
     "considerLastUpdate": { "kind": "property", "displayName": "Consider Last Update", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Take into account the lastUpdate of the last event polled as star [...]
     "consumeFromNow": { "kind": "property", "displayName": "Consume From Now", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Consume events in the selected calendar from now on" },
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "maxResults": { "kind": "property", "displayName": "Max Results", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Max results to be returned" },
     "query": { "kind": "property", "displayName": "Query", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The query to execute on calendar" },
     "scopes": { "kind": "property", "displayName": "Scopes", "group": "consumer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you want a calendar application to have to a user accoun [...]
@@ -38,6 +39,7 @@
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommende [...]
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Client secret of the calendar application" },
     "emailAddress": { "kind": "property", "displayName": "Email Address", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The emailAddress of the Google Service Account." },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "p12FileName": { "kind": "property", "displayName": "P12 File Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The name of the p12 file which has the private key to use with the Google Service Account." },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new acce [...]
     "user": { "kind": "property", "displayName": "User", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The email address of the user the application is trying to impersonate in the service account flow." }
@@ -50,6 +52,7 @@
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Client ID of the calendar application" },
     "considerLastUpdate": { "kind": "parameter", "displayName": "Consider Last Update", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Take into account the lastUpdate of the last event polled as sta [...]
     "consumeFromNow": { "kind": "parameter", "displayName": "Consume From Now", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Consume events in the selected calendar from now on" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "maxResults": { "kind": "parameter", "displayName": "Max Results", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Max results to be returned" },
     "query": { "kind": "parameter", "displayName": "Query", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The query to execute on calendar" },
     "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "consumer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you want a calendar application to have to a user accou [...]
@@ -75,6 +78,7 @@
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommend [...]
     "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Client secret of the calendar application" },
     "emailAddress": { "kind": "parameter", "displayName": "Email Address", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The emailAddress of the Google Service Account." },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "p12FileName": { "kind": "parameter", "displayName": "P12 File Name", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The name of the p12 file which has the private key to use with the Google Service Acco [...]
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new acc [...]
     "user": { "kind": "parameter", "displayName": "User", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.calendar.stream.GoogleCalendarStreamConfiguration", "configurationField": "configuration", "description": "The email address of the user the application is trying to impersonate in the service account flow." }
diff --git a/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-component.adoc b/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-component.adoc
index 436bbd4..6cadb57 100644
--- a/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-component.adoc
+++ b/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-component.adoc
@@ -29,6 +29,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is
 the https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/calendar/api/guides/auth[Calendar API Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-stream-component.adoc b/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-stream-component.adoc
index b4856d7..1cfa550 100644
--- a/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-stream-component.adoc
+++ b/components/camel-google/camel-google-calendar/src/main/docs/google-calendar-stream-component.adoc
@@ -29,6 +29,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is
 the https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/calendar/api/guides/auth[Calendar API Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/BatchGoogleCalendarClientFactory.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/BatchGoogleCalendarClientFactory.java
index 41c83df..866c64d 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/BatchGoogleCalendarClientFactory.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/BatchGoogleCalendarClientFactory.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.google.calendar;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 
 import com.google.api.client.auth.oauth2.Credential;
@@ -26,7 +27,9 @@ import com.google.api.client.http.HttpTransport;
 import com.google.api.client.http.javanet.NetHttpTransport;
 import com.google.api.client.json.jackson2.JacksonFactory;
 import com.google.api.services.calendar.Calendar;
+import org.apache.camel.CamelContext;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.support.ResourceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,11 +46,12 @@ public class BatchGoogleCalendarClientFactory implements GoogleCalendarClientFac
 
     @Override
     public Calendar makeClient(
-            String clientId, String clientSecret,
-            Collection<String> scopes, String applicationName, String refreshToken,
-            String accessToken, String emailAddress, String p12FileName, String user) {
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken,
+            String emailAddress, String p12FileName, String user) {
         boolean serviceAccount = false;
-        // if emailAddress and p12FileName values are present, assume Google Service Account
+        // if emailAddress and p12FileName values are present, assume Google
+        // Service Account
         if (null != emailAddress && !"".equals(emailAddress) && null != p12FileName && !"".equals(p12FileName)) {
             serviceAccount = true;
         }
@@ -84,6 +88,7 @@ public class BatchGoogleCalendarClientFactory implements GoogleCalendarClientFac
                 .build();
     }
 
+    // authorize with P12-Certificate file
     private Credential authorizeServiceAccount(String emailAddress, String p12FileName, Collection<String> scopes, String user)
             throws Exception {
         HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
@@ -98,4 +103,34 @@ public class BatchGoogleCalendarClientFactory implements GoogleCalendarClientFac
                 .build();
         return credential;
     }
+
+    @Override
+    public Calendar makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate) {
+        if (keyResource == null) {
+            throw new IllegalArgumentException("keyResource is required to create Google Calendar client.");
+        }
+        try {
+            Credential credential = authorizeServiceAccount(camelContext, keyResource, delegate, scopes);
+            return new Calendar.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
+        } catch (Exception e) {
+            throw new RuntimeCamelException("Could not create Google Calendar client.", e);
+        }
+    }
+
+    // authorize with JSON-Credentials
+    private Credential authorizeServiceAccount(
+            CamelContext camelContext, String keyResource, String delegate, Collection<String> scopes) {
+        // authorize
+        try {
+            GoogleCredential cred = GoogleCredential
+                    .fromStream(ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, keyResource), transport,
+                            jsonFactory)
+                    .createScoped(scopes != null && scopes.size() != 0 ? scopes : null).createDelegated(delegate);
+            cred.refreshToken();
+            return cred;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarClientFactory.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarClientFactory.java
index a81a3a6..a1dc9db 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarClientFactory.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarClientFactory.java
@@ -19,12 +19,15 @@ package org.apache.camel.component.google.calendar;
 import java.util.Collection;
 
 import com.google.api.services.calendar.Calendar;
+import org.apache.camel.CamelContext;
 
 public interface GoogleCalendarClientFactory {
 
     Calendar makeClient(
-            String clientId, String clientSecret, Collection<String> scopes,
-            String applicationName, String refreshToken, String accessToken,
-            String emailAddress, String p12FileName, String user);
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken, String emailAddress,
+            String p12FileName, String user);
 
+    Calendar makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate);
 }
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarComponent.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarComponent.java
index 6a0641b..5e66ba3 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarComponent.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarComponent.java
@@ -16,9 +16,6 @@
  */
 package org.apache.camel.component.google.calendar;
 
-import java.util.Arrays;
-import java.util.List;
-
 import com.google.api.services.calendar.Calendar;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
@@ -54,18 +51,18 @@ public class GoogleCalendarComponent
 
     public Calendar getClient(GoogleCalendarConfiguration config) {
         if (client == null) {
-
-            List<String> list = null;
-            if (config.getScopes() != null) {
-                String[] arr = config.getScopes().split(",");
-                list = Arrays.asList(arr);
+            if (config.getClientId() != null && !config.getClientId().isBlank()
+                    && config.getClientSecret() != null && !config.getClientSecret().isBlank()) {
+                client = getClientFactory().makeClient(config.getClientId(), config.getClientSecret(), config.getScopes(),
+                        config.getApplicationName(), config.getRefreshToken(),
+                        config.getAccessToken(), config.getEmailAddress(), config.getP12FileName(), config.getUser());
+            } else if (config.getKeyResource() != null && !config.getKeyResource().isBlank()) {
+                client = getClientFactory().makeClient(getCamelContext(), config.getKeyResource(), config.getScopes(),
+                        config.getApplicationName(), config.getDelegate());
+            } else {
+                throw new IllegalArgumentException(
+                        "(clientId and clientSecret) or keyResource are required to create Google Calendar client");
             }
-
-            client = getClientFactory().makeClient(config.getClientId(),
-                    config.getClientSecret(), list,
-                    config.getApplicationName(), config.getRefreshToken(),
-                    config.getAccessToken(), config.getEmailAddress(),
-                    config.getP12FileName(), config.getUser());
         }
         return client;
     }
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarConfiguration.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarConfiguration.java
index b0631437..00df53a 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarConfiguration.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/GoogleCalendarConfiguration.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.google.calendar;
 
+import java.util.List;
+
 import com.google.api.services.calendar.CalendarScopes;
 import org.apache.camel.component.google.calendar.internal.GoogleCalendarApiName;
 import org.apache.camel.spi.Configurer;
@@ -38,7 +40,7 @@ public class GoogleCalendarConfiguration {
     @Metadata(required = true)
     private String methodName;
     @UriParam(defaultValue = CalendarScopes.CALENDAR)
-    private String scopes = CalendarScopes.CALENDAR;
+    private List<String> scopes;
     @UriParam
     private String clientId;
     @UriParam
@@ -55,6 +57,11 @@ public class GoogleCalendarConfiguration {
     private String p12FileName;
     @UriParam(label = "security", secret = true)
     private String user;
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
 
     public GoogleCalendarApiName getApiName() {
         return apiName;
@@ -145,7 +152,7 @@ public class GoogleCalendarConfiguration {
         this.applicationName = applicationName;
     }
 
-    public String getScopes() {
+    public List<String> getScopes() {
         return scopes;
     }
 
@@ -153,7 +160,7 @@ public class GoogleCalendarConfiguration {
      * Specifies the level of permissions you want a calendar application to have to a user account. You can separate
      * multiple scopes by comma. See https://developers.google.com/google-apps/calendar/auth for more info.
      */
-    public void setScopes(String scopes) {
+    public void setScopes(List<String> scopes) {
         this.scopes = scopes;
     }
 
@@ -179,4 +186,27 @@ public class GoogleCalendarConfiguration {
         this.user = user;
     }
 
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
 }
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java
index e0696ea..2ee5314 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamComponent.java
@@ -47,13 +47,19 @@ public class GoogleCalendarStreamComponent extends DefaultComponent {
         this.configuration = new GoogleCalendarStreamConfiguration();
     }
 
-    public Calendar getClient(GoogleCalendarStreamConfiguration endpointConfiguration) {
+    public Calendar getClient(GoogleCalendarStreamConfiguration config) {
         if (client == null) {
-            client = getClientFactory().makeClient(endpointConfiguration.getClientId(),
-                    endpointConfiguration.getClientSecret(), endpointConfiguration.getScopes(),
-                    endpointConfiguration.getApplicationName(), endpointConfiguration.getRefreshToken(),
-                    endpointConfiguration.getAccessToken(), endpointConfiguration.getEmailAddress(),
-                    endpointConfiguration.getP12FileName(), endpointConfiguration.getUser());
+            if (config.getClientId() != null && config.getClientSecret() != null) {
+                client = getClientFactory().makeClient(config.getClientId(), config.getClientSecret(), config.getScopes(),
+                        config.getApplicationName(), config.getRefreshToken(),
+                        config.getAccessToken(), config.getEmailAddress(), config.getP12FileName(), config.getUser());
+            } else if (config.getKeyResource() != null) {
+                client = getClientFactory().makeClient(getCamelContext(), config.getKeyResource(), config.getScopes(),
+                        config.getApplicationName(), config.getDelegate());
+            } else {
+                throw new IllegalArgumentException(
+                        "(clientId and clientSecret) or keyResource are required to create Gmail client");
+            }
         }
         return client;
     }
diff --git a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java
index 84a1aa6..e063533 100644
--- a/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java
+++ b/components/camel-google/camel-google-calendar/src/main/java/org/apache/camel/component/google/calendar/stream/GoogleCalendarStreamConfiguration.java
@@ -66,6 +66,11 @@ public class GoogleCalendarStreamConfiguration implements Cloneable {
     private boolean considerLastUpdate;
     @UriParam
     private boolean syncFlow;
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
 
     public String getClientId() {
         return clientId;
@@ -247,6 +252,30 @@ public class GoogleCalendarStreamConfiguration implements Cloneable {
         this.considerLastUpdate = considerLastUpdate;
     }
 
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
+
     // *************************************************
     //
     // *************************************************
diff --git a/components/camel-google/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/AbstractGoogleCalendarTestSupport.java b/components/camel-google/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/AbstractGoogleCalendarTestSupport.java
index 3c54d62f..5ec8984 100644
--- a/components/camel-google/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/AbstractGoogleCalendarTestSupport.java
+++ b/components/camel-google/camel-google-calendar/src/test/java/org/apache/camel/component/google/calendar/AbstractGoogleCalendarTestSupport.java
@@ -67,7 +67,8 @@ public class AbstractGoogleCalendarTestSupport extends CamelTestSupport {
 
         return !properties.getProperty("clientId", "").isEmpty()
                 && !properties.getProperty("clientSecret", "").isEmpty()
-                && !properties.getProperty("accessToken", "").isEmpty();
+                && !properties.getProperty("accessToken", "").isEmpty()
+                || !properties.getProperty("keyResource", "").isEmpty();
     }
 
     @BeforeEach
diff --git a/components/camel-google/camel-google-calendar/src/test/resources/test-options.properties b/components/camel-google/camel-google-calendar/src/test/resources/test-options.properties
index eb80178..b71858c 100644
--- a/components/camel-google/camel-google-calendar/src/test/resources/test-options.properties
+++ b/components/camel-google/camel-google-calendar/src/test/resources/test-options.properties
@@ -26,3 +26,7 @@ accessToken=
 refreshToken=
 emailAddress=
 p12FileName=
+
+keyResource=
+scopes[]=
+delegate=
\ No newline at end of file
diff --git a/components/camel-google/camel-google-drive/pom.xml b/components/camel-google/camel-google-drive/pom.xml
index 5d2b6e2..e961ff0 100644
--- a/components/camel-google/camel-google-drive/pom.xml
+++ b/components/camel-google/camel-google-drive/pom.xml
@@ -181,6 +181,16 @@
                                     <fromJavasource />
                                 </api>
                                 <api>
+                                    <apiName>drive-drives</apiName>
+                                    <proxyClass>com.google.api.services.drive.Drive$Drives</proxyClass>
+                                    <fromJavasource />
+                                </api>
+                                <api>
+                                    <apiName>drive-teamdrives</apiName>
+                                    <proxyClass>com.google.api.services.drive.Drive$Teamdrives</proxyClass>
+                                    <fromJavasource />
+                                </api>
+                                <api>
                                     <apiName>drive-replies</apiName>
                                     <proxyClass>com.google.api.services.drive.Drive$Replies</proxyClass>
                                     <fromJavasource />
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAboutEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAboutEndpointConfigurationConfigurer.java
index 51d3473..1187d0e 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAboutEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAboutEndpointConfigurationConfigurer.java
@@ -25,6 +25,8 @@ public class DriveAboutEndpointConfigurationConfigurer extends org.apache.camel.
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -45,6 +47,10 @@ public class DriveAboutEndpointConfigurationConfigurer extends org.apache.camel.
         case "ClientId": target.setClientId(property(camelContext, java.lang.String.class, value)); return true;
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -73,6 +79,10 @@ public class DriveAboutEndpointConfigurationConfigurer extends org.apache.camel.
         case "ClientId": return java.lang.String.class;
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -97,6 +107,10 @@ public class DriveAboutEndpointConfigurationConfigurer extends org.apache.camel.
         case "ClientId": return target.getClientId();
         case "clientsecret":
         case "ClientSecret": return target.getClientSecret();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAppsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAppsEndpointConfigurationConfigurer.java
index d42fb36..d4d11c1 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAppsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveAppsEndpointConfigurationConfigurer.java
@@ -26,6 +26,8 @@ public class DriveAppsEndpointConfigurationConfigurer extends org.apache.camel.s
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -48,6 +50,10 @@ public class DriveAppsEndpointConfigurationConfigurer extends org.apache.camel.s
         case "ClientId": target.setClientId(property(camelContext, java.lang.String.class, value)); return true;
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -78,6 +84,10 @@ public class DriveAppsEndpointConfigurationConfigurer extends org.apache.camel.s
         case "ClientId": return java.lang.String.class;
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -104,6 +114,10 @@ public class DriveAppsEndpointConfigurationConfigurer extends org.apache.camel.s
         case "ClientId": return target.getClientId();
         case "clientsecret":
         case "ClientSecret": return target.getClientSecret();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChangesEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChangesEndpointConfigurationConfigurer.java
index 9fb7d60..ac83ceb 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChangesEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChangesEndpointConfigurationConfigurer.java
@@ -27,6 +27,8 @@ public class DriveChangesEndpointConfigurationConfigurer extends org.apache.came
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("ContentChannel", com.google.api.services.drive.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -51,6 +53,10 @@ public class DriveChangesEndpointConfigurationConfigurer extends org.apache.came
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.drive.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -83,6 +89,10 @@ public class DriveChangesEndpointConfigurationConfigurer extends org.apache.came
         case "ClientSecret": return java.lang.String.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.drive.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -111,6 +121,10 @@ public class DriveChangesEndpointConfigurationConfigurer extends org.apache.came
         case "ClientSecret": return target.getClientSecret();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChannelsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChannelsEndpointConfigurationConfigurer.java
index a9955d9..f7f1866 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChannelsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChannelsEndpointConfigurationConfigurer.java
@@ -26,6 +26,8 @@ public class DriveChannelsEndpointConfigurationConfigurer extends org.apache.cam
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("ContentChannel", com.google.api.services.drive.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -48,6 +50,10 @@ public class DriveChannelsEndpointConfigurationConfigurer extends org.apache.cam
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.drive.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -78,6 +84,10 @@ public class DriveChannelsEndpointConfigurationConfigurer extends org.apache.cam
         case "ClientSecret": return java.lang.String.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.drive.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -104,6 +114,10 @@ public class DriveChannelsEndpointConfigurationConfigurer extends org.apache.cam
         case "ClientSecret": return target.getClientSecret();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChildrenEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChildrenEndpointConfigurationConfigurer.java
index c05dad8..3d1c511 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChildrenEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveChildrenEndpointConfigurationConfigurer.java
@@ -27,7 +27,9 @@ public class DriveChildrenEndpointConfigurationConfigurer extends org.apache.cam
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.ChildReference.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FolderId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -52,8 +54,12 @@ public class DriveChildrenEndpointConfigurationConfigurer extends org.apache.cam
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.ChildReference.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "folderid":
         case "FolderId": target.setFolderId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -86,8 +92,12 @@ public class DriveChildrenEndpointConfigurationConfigurer extends org.apache.cam
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.ChildReference.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "folderid":
         case "FolderId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -116,8 +126,12 @@ public class DriveChildrenEndpointConfigurationConfigurer extends org.apache.cam
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "folderid":
         case "FolderId": return target.getFolderId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveCommentsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveCommentsEndpointConfigurationConfigurer.java
index cfaa5f4..922a73d 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveCommentsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveCommentsEndpointConfigurationConfigurer.java
@@ -27,7 +27,9 @@ public class DriveCommentsEndpointConfigurationConfigurer extends org.apache.cam
         map.put("ClientSecret", java.lang.String.class);
         map.put("CommentId", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.Comment.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -52,8 +54,12 @@ public class DriveCommentsEndpointConfigurationConfigurer extends org.apache.cam
         case "CommentId": target.setCommentId(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.Comment.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -86,8 +92,12 @@ public class DriveCommentsEndpointConfigurationConfigurer extends org.apache.cam
         case "CommentId": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.Comment.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -116,8 +126,12 @@ public class DriveCommentsEndpointConfigurationConfigurer extends org.apache.cam
         case "CommentId": return target.getCommentId();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveDrivesEndpointConfiguration.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveDrivesEndpointConfiguration.java
new file mode 100644
index 0000000..96e811c
--- /dev/null
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveDrivesEndpointConfiguration.java
@@ -0,0 +1,56 @@
+
+/*
+ * Camel EndpointConfiguration generated by camel-api-component-maven-plugin
+ */
+package org.apache.camel.component.google.drive;
+
+import org.apache.camel.spi.ApiMethod;
+import org.apache.camel.spi.ApiParam;
+import org.apache.camel.spi.ApiParams;
+import org.apache.camel.spi.Configurer;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+/**
+ * Camel endpoint configuration for {@link com.google.api.services.drive.Drive.Drives}.
+ */
+@ApiParams(apiName = "drive-drives", 
+           description = "The drives collection of methods",
+           apiMethods = {@ApiMethod(methodName = "delete", description="Permanently deletes a shared drive for which the user is an organizer", signatures={"com.google.api.services.drive.Drive$Drives$Delete delete(String driveId)"}), @ApiMethod(methodName = "get", description="Gets a shared drive's metadata by ID", signatures={"com.google.api.services.drive.Drive$Drives$Get get(String driveId)"}), @ApiMethod(methodName = "hide", description="Hides a shared drive from the default view", s [...]
+@UriParams
+@Configurer(extended = true)
+public final class DriveDrivesEndpointConfiguration extends GoogleDriveConfiguration {
+    @UriParam
+    @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "insert", description="The com.google.api.services.drive.model.Drive"), @ApiMethod(methodName = "update", description="The com.google.api.services.drive.model.Drive")})
+    private com.google.api.services.drive.model.Drive content;
+    @UriParam
+    @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "delete", description="The ID of the shared drive"), @ApiMethod(methodName = "get", description="The ID of the shared drive"), @ApiMethod(methodName = "hide", description="The ID of the shared drive"), @ApiMethod(methodName = "unhide", description="The ID of the shared drive"), @ApiMethod(methodName = "update", description="The ID of the shared drive")})
+    private String driveId;
+    @UriParam
+    @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "insert", description="An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a shared drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same shared drive. If the shared drive already exists a 409 error will be returned.")})
+    private String requestId;
+
+    public com.google.api.services.drive.model.Drive getContent() {
+        return content;
+    }
+
+    public void setContent(com.google.api.services.drive.model.Drive content) {
+        this.content = content;
+    }
+
+    public String getDriveId() {
+        return driveId;
+    }
+
+    public void setDriveId(String driveId) {
+        this.driveId = driveId;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+}
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveDrivesEndpointConfigurationConfigurer.java
similarity index 74%
copy from components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
copy to components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveDrivesEndpointConfigurationConfigurer.java
index 676ba83..3661f7f 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveDrivesEndpointConfigurationConfigurer.java
@@ -1,5 +1,5 @@
 /* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.component.google.mail;
+package org.apache.camel.component.google.drive;
 
 import java.util.Map;
 
@@ -9,41 +9,41 @@ import org.apache.camel.spi.PropertyConfigurerGetter;
 import org.apache.camel.spi.ConfigurerStrategy;
 import org.apache.camel.spi.GeneratedPropertyConfigurer;
 import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration;
+import org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration;
 
 /**
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, ExtendedPropertyConfigurerGetter {
+public class DriveDrivesEndpointConfigurationConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, ExtendedPropertyConfigurerGetter {
 
     private static final Map<String, Object> ALL_OPTIONS;
     static {
         Map<String, Object> map = new CaseInsensitiveMap();
         map.put("AccessToken", java.lang.String.class);
-        map.put("ApiName", org.apache.camel.component.google.mail.internal.GoogleMailApiName.class);
+        map.put("ApiName", org.apache.camel.component.google.drive.internal.GoogleDriveApiName.class);
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
-        map.put("Content", com.google.api.services.gmail.model.Label.class);
+        map.put("Content", com.google.api.services.drive.model.Drive.class);
         map.put("Delegate", java.lang.String.class);
-        map.put("Id", java.lang.String.class);
+        map.put("DriveId", java.lang.String.class);
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
+        map.put("RequestId", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
-        map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration target = (org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration) obj;
+        org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration target = (org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "accesstoken":
         case "AccessToken": target.setAccessToken(property(camelContext, java.lang.String.class, value)); return true;
         case "apiname":
-        case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.google.mail.internal.GoogleMailApiName.class, value)); return true;
+        case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.google.drive.internal.GoogleDriveApiName.class, value)); return true;
         case "applicationname":
         case "ApplicationName": target.setApplicationName(property(camelContext, java.lang.String.class, value)); return true;
         case "clientid":
@@ -51,21 +51,21 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
-        case "Content": target.setContent(property(camelContext, com.google.api.services.gmail.model.Label.class, value)); return true;
+        case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.Drive.class, value)); return true;
         case "delegate":
         case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
-        case "id":
-        case "Id": target.setId(property(camelContext, java.lang.String.class, value)); return true;
+        case "driveid":
+        case "DriveId": target.setDriveId(property(camelContext, java.lang.String.class, value)); return true;
         case "keyresource":
         case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "requestid":
+        case "RequestId": target.setRequestId(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
         case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
-        case "userid":
-        case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
         }
     }
@@ -81,7 +81,7 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "accesstoken":
         case "AccessToken": return java.lang.String.class;
         case "apiname":
-        case "ApiName": return org.apache.camel.component.google.mail.internal.GoogleMailApiName.class;
+        case "ApiName": return org.apache.camel.component.google.drive.internal.GoogleDriveApiName.class;
         case "applicationname":
         case "ApplicationName": return java.lang.String.class;
         case "clientid":
@@ -89,28 +89,28 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
         case "content":
-        case "Content": return com.google.api.services.gmail.model.Label.class;
+        case "Content": return com.google.api.services.drive.model.Drive.class;
         case "delegate":
         case "Delegate": return java.lang.String.class;
-        case "id":
-        case "Id": return java.lang.String.class;
+        case "driveid":
+        case "DriveId": return java.lang.String.class;
         case "keyresource":
         case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
+        case "requestid":
+        case "RequestId": return java.lang.String.class;
         case "scopes":
         case "Scopes": return java.util.List.class;
-        case "userid":
-        case "UserId": return java.lang.String.class;
         default: return null;
         }
     }
 
     @Override
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration target = (org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration) obj;
+        org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration target = (org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "accesstoken":
         case "AccessToken": return target.getAccessToken();
@@ -126,18 +126,18 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "Content": return target.getContent();
         case "delegate":
         case "Delegate": return target.getDelegate();
-        case "id":
-        case "Id": return target.getId();
+        case "driveid":
+        case "DriveId": return target.getDriveId();
         case "keyresource":
         case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
         case "RefreshToken": return target.getRefreshToken();
+        case "requestid":
+        case "RequestId": return target.getRequestId();
         case "scopes":
         case "Scopes": return target.getScopes();
-        case "userid":
-        case "UserId": return target.getUserId();
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveFilesEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveFilesEndpointConfigurationConfigurer.java
index d0c0a67..6cd73be 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveFilesEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveFilesEndpointConfigurationConfigurer.java
@@ -27,7 +27,9 @@ public class DriveFilesEndpointConfigurationConfigurer extends org.apache.camel.
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.File.class);
         map.put("ContentChannel", com.google.api.services.drive.model.Channel.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MediaContent", com.google.api.client.http.AbstractInputStreamContent.class);
         map.put("MethodName", java.lang.String.class);
         map.put("MimeType", java.lang.String.class);
@@ -54,8 +56,12 @@ public class DriveFilesEndpointConfigurationConfigurer extends org.apache.camel.
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.File.class, value)); return true;
         case "contentchannel":
         case "ContentChannel": target.setContentChannel(property(camelContext, com.google.api.services.drive.model.Channel.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "mediacontent":
         case "MediaContent": target.setMediaContent(property(camelContext, com.google.api.client.http.AbstractInputStreamContent.class, value)); return true;
         case "methodname":
@@ -92,8 +98,12 @@ public class DriveFilesEndpointConfigurationConfigurer extends org.apache.camel.
         case "Content": return com.google.api.services.drive.model.File.class;
         case "contentchannel":
         case "ContentChannel": return com.google.api.services.drive.model.Channel.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "mediacontent":
         case "MediaContent": return com.google.api.client.http.AbstractInputStreamContent.class;
         case "methodname":
@@ -126,8 +136,12 @@ public class DriveFilesEndpointConfigurationConfigurer extends org.apache.camel.
         case "Content": return target.getContent();
         case "contentchannel":
         case "ContentChannel": return target.getContentChannel();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "mediacontent":
         case "MediaContent": return target.getMediaContent();
         case "methodname":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveParentsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveParentsEndpointConfigurationConfigurer.java
index c788f7a..21b7e72 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveParentsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveParentsEndpointConfigurationConfigurer.java
@@ -26,7 +26,9 @@ public class DriveParentsEndpointConfigurationConfigurer extends org.apache.came
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.ParentReference.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("ParentId", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
@@ -50,8 +52,12 @@ public class DriveParentsEndpointConfigurationConfigurer extends org.apache.came
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.ParentReference.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "parentid":
@@ -84,8 +90,12 @@ public class DriveParentsEndpointConfigurationConfigurer extends org.apache.came
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.ParentReference.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "parentid":
@@ -114,8 +124,12 @@ public class DriveParentsEndpointConfigurationConfigurer extends org.apache.came
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "parentid":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePermissionsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePermissionsEndpointConfigurationConfigurer.java
index 8153640..f86c6b3 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePermissionsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePermissionsEndpointConfigurationConfigurer.java
@@ -26,8 +26,10 @@ public class DrivePermissionsEndpointConfigurationConfigurer extends org.apache.
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.Permission.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("Email", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("PermissionId", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
@@ -51,10 +53,14 @@ public class DrivePermissionsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.Permission.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "email":
         case "Email": target.setEmail(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "permissionid":
@@ -87,10 +93,14 @@ public class DrivePermissionsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.Permission.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "email":
         case "Email": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "permissionid":
@@ -119,10 +129,14 @@ public class DrivePermissionsEndpointConfigurationConfigurer extends org.apache.
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "email":
         case "Email": return target.getEmail();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "permissionid":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePropertiesEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePropertiesEndpointConfigurationConfigurer.java
index f1c7c37..e53691b 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePropertiesEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DrivePropertiesEndpointConfigurationConfigurer.java
@@ -26,7 +26,9 @@ public class DrivePropertiesEndpointConfigurationConfigurer extends org.apache.c
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.Property.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("PropertyKey", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
@@ -50,8 +52,12 @@ public class DrivePropertiesEndpointConfigurationConfigurer extends org.apache.c
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.Property.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "propertykey":
@@ -84,8 +90,12 @@ public class DrivePropertiesEndpointConfigurationConfigurer extends org.apache.c
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.Property.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "propertykey":
@@ -114,8 +124,12 @@ public class DrivePropertiesEndpointConfigurationConfigurer extends org.apache.c
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "propertykey":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRepliesEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRepliesEndpointConfigurationConfigurer.java
index ff17d05..89def01 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRepliesEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRepliesEndpointConfigurationConfigurer.java
@@ -27,7 +27,9 @@ public class DriveRepliesEndpointConfigurationConfigurer extends org.apache.came
         map.put("ClientSecret", java.lang.String.class);
         map.put("CommentId", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.CommentReply.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("ReplyId", java.lang.String.class);
@@ -53,8 +55,12 @@ public class DriveRepliesEndpointConfigurationConfigurer extends org.apache.came
         case "CommentId": target.setCommentId(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.CommentReply.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -89,8 +95,12 @@ public class DriveRepliesEndpointConfigurationConfigurer extends org.apache.came
         case "CommentId": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.CommentReply.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -121,8 +131,12 @@ public class DriveRepliesEndpointConfigurationConfigurer extends org.apache.came
         case "CommentId": return target.getCommentId();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRevisionsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRevisionsEndpointConfigurationConfigurer.java
index 535ea21..db37bd3 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRevisionsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveRevisionsEndpointConfigurationConfigurer.java
@@ -26,7 +26,9 @@ public class DriveRevisionsEndpointConfigurationConfigurer extends org.apache.ca
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.drive.model.Revision.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("FileId", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("RevisionId", java.lang.String.class);
@@ -50,8 +52,12 @@ public class DriveRevisionsEndpointConfigurationConfigurer extends org.apache.ca
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.Revision.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "fileid":
         case "FileId": target.setFileId(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -84,8 +90,12 @@ public class DriveRevisionsEndpointConfigurationConfigurer extends org.apache.ca
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.drive.model.Revision.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "fileid":
         case "FileId": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -114,8 +124,12 @@ public class DriveRevisionsEndpointConfigurationConfigurer extends org.apache.ca
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "fileid":
         case "FileId": return target.getFileId();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveTeamdrivesEndpointConfiguration.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveTeamdrivesEndpointConfiguration.java
new file mode 100644
index 0000000..dd10202
--- /dev/null
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveTeamdrivesEndpointConfiguration.java
@@ -0,0 +1,56 @@
+
+/*
+ * Camel EndpointConfiguration generated by camel-api-component-maven-plugin
+ */
+package org.apache.camel.component.google.drive;
+
+import org.apache.camel.spi.ApiMethod;
+import org.apache.camel.spi.ApiParam;
+import org.apache.camel.spi.ApiParams;
+import org.apache.camel.spi.Configurer;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+/**
+ * Camel endpoint configuration for {@link com.google.api.services.drive.Drive.Teamdrives}.
+ */
+@ApiParams(apiName = "drive-teamdrives", 
+           description = "The teamdrives collection of methods",
+           apiMethods = {@ApiMethod(methodName = "delete", description="Deprecated use drives", signatures={"com.google.api.services.drive.Drive$Teamdrives$Delete delete(String teamDriveId)"}), @ApiMethod(methodName = "get", description="Deprecated use drives", signatures={"com.google.api.services.drive.Drive$Teamdrives$Get get(String teamDriveId)"}), @ApiMethod(methodName = "insert", description="Deprecated use drives", signatures={"com.google.api.services.drive.Drive$Teamdrives$Insert  [...]
+@UriParams
+@Configurer(extended = true)
+public final class DriveTeamdrivesEndpointConfiguration extends GoogleDriveConfiguration {
+    @UriParam
+    @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "insert", description="The com.google.api.services.drive.model.TeamDrive"), @ApiMethod(methodName = "update", description="The com.google.api.services.drive.model.TeamDrive")})
+    private com.google.api.services.drive.model.TeamDrive content;
+    @UriParam
+    @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "insert", description="An ID, such as a random UUID, which uniquely identifies this user's request for idempotent creation of a Team Drive. A repeated request by the same user and with the same request ID will avoid creating duplicates by attempting to create the same Team Drive. If the Team Drive already exists a 409 error will be returned.")})
+    private String requestId;
+    @UriParam
+    @ApiParam(optional = false, apiMethods = {@ApiMethod(methodName = "delete", description="The ID of the Team Drive"), @ApiMethod(methodName = "get", description="The ID of the Team Drive"), @ApiMethod(methodName = "update", description="The ID of the Team Drive")})
+    private String teamDriveId;
+
+    public com.google.api.services.drive.model.TeamDrive getContent() {
+        return content;
+    }
+
+    public void setContent(com.google.api.services.drive.model.TeamDrive content) {
+        this.content = content;
+    }
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+
+    public String getTeamDriveId() {
+        return teamDriveId;
+    }
+
+    public void setTeamDriveId(String teamDriveId) {
+        this.teamDriveId = teamDriveId;
+    }
+}
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveTeamdrivesEndpointConfigurationConfigurer.java
similarity index 76%
copy from components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
copy to components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveTeamdrivesEndpointConfigurationConfigurer.java
index 676ba83..5d05f2b6 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/DriveTeamdrivesEndpointConfigurationConfigurer.java
@@ -1,5 +1,5 @@
 /* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.component.google.mail;
+package org.apache.camel.component.google.drive;
 
 import java.util.Map;
 
@@ -9,41 +9,41 @@ import org.apache.camel.spi.PropertyConfigurerGetter;
 import org.apache.camel.spi.ConfigurerStrategy;
 import org.apache.camel.spi.GeneratedPropertyConfigurer;
 import org.apache.camel.util.CaseInsensitiveMap;
-import org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration;
+import org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration;
 
 /**
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, ExtendedPropertyConfigurerGetter {
+public class DriveTeamdrivesEndpointConfigurationConfigurer extends org.apache.camel.support.component.PropertyConfigurerSupport implements GeneratedPropertyConfigurer, ExtendedPropertyConfigurerGetter {
 
     private static final Map<String, Object> ALL_OPTIONS;
     static {
         Map<String, Object> map = new CaseInsensitiveMap();
         map.put("AccessToken", java.lang.String.class);
-        map.put("ApiName", org.apache.camel.component.google.mail.internal.GoogleMailApiName.class);
+        map.put("ApiName", org.apache.camel.component.google.drive.internal.GoogleDriveApiName.class);
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
-        map.put("Content", com.google.api.services.gmail.model.Label.class);
+        map.put("Content", com.google.api.services.drive.model.TeamDrive.class);
         map.put("Delegate", java.lang.String.class);
-        map.put("Id", java.lang.String.class);
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
+        map.put("RequestId", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
-        map.put("UserId", java.lang.String.class);
+        map.put("TeamDriveId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
 
     @Override
     public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
-        org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration target = (org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration) obj;
+        org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration target = (org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "accesstoken":
         case "AccessToken": target.setAccessToken(property(camelContext, java.lang.String.class, value)); return true;
         case "apiname":
-        case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.google.mail.internal.GoogleMailApiName.class, value)); return true;
+        case "ApiName": target.setApiName(property(camelContext, org.apache.camel.component.google.drive.internal.GoogleDriveApiName.class, value)); return true;
         case "applicationname":
         case "ApplicationName": target.setApplicationName(property(camelContext, java.lang.String.class, value)); return true;
         case "clientid":
@@ -51,21 +51,21 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
-        case "Content": target.setContent(property(camelContext, com.google.api.services.gmail.model.Label.class, value)); return true;
+        case "Content": target.setContent(property(camelContext, com.google.api.services.drive.model.TeamDrive.class, value)); return true;
         case "delegate":
         case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
-        case "id":
-        case "Id": target.setId(property(camelContext, java.lang.String.class, value)); return true;
         case "keyresource":
         case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "requestid":
+        case "RequestId": target.setRequestId(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
         case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
-        case "userid":
-        case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
+        case "teamdriveid":
+        case "TeamDriveId": target.setTeamDriveId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
         }
     }
@@ -81,7 +81,7 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "accesstoken":
         case "AccessToken": return java.lang.String.class;
         case "apiname":
-        case "ApiName": return org.apache.camel.component.google.mail.internal.GoogleMailApiName.class;
+        case "ApiName": return org.apache.camel.component.google.drive.internal.GoogleDriveApiName.class;
         case "applicationname":
         case "ApplicationName": return java.lang.String.class;
         case "clientid":
@@ -89,28 +89,28 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
         case "content":
-        case "Content": return com.google.api.services.gmail.model.Label.class;
+        case "Content": return com.google.api.services.drive.model.TeamDrive.class;
         case "delegate":
         case "Delegate": return java.lang.String.class;
-        case "id":
-        case "Id": return java.lang.String.class;
         case "keyresource":
         case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
+        case "requestid":
+        case "RequestId": return java.lang.String.class;
         case "scopes":
         case "Scopes": return java.util.List.class;
-        case "userid":
-        case "UserId": return java.lang.String.class;
+        case "teamdriveid":
+        case "TeamDriveId": return java.lang.String.class;
         default: return null;
         }
     }
 
     @Override
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
-        org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration target = (org.apache.camel.component.google.mail.GmailUsersLabelsEndpointConfiguration) obj;
+        org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration target = (org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "accesstoken":
         case "AccessToken": return target.getAccessToken();
@@ -126,18 +126,18 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "Content": return target.getContent();
         case "delegate":
         case "Delegate": return target.getDelegate();
-        case "id":
-        case "Id": return target.getId();
         case "keyresource":
         case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
         case "RefreshToken": return target.getRefreshToken();
+        case "requestid":
+        case "RequestId": return target.getRequestId();
         case "scopes":
         case "Scopes": return target.getScopes();
-        case "userid":
-        case "UserId": return target.getUserId();
+        case "teamdriveid":
+        case "TeamDriveId": return target.getTeamDriveId();
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveComponentConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveComponentConfigurer.java
index adbcb9d..3921b35 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveComponentConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveComponentConfigurer.java
@@ -23,6 +23,7 @@ public class GoogleDriveComponentConfigurer extends PropertyConfigurerSupport im
         map.put("applicationName", java.lang.String.class);
         map.put("clientId", java.lang.String.class);
         map.put("configuration", org.apache.camel.component.google.drive.GoogleDriveConfiguration.class);
+        map.put("delegate", java.lang.String.class);
         map.put("scopes", java.util.List.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("lazyStartProducer", boolean.class);
@@ -30,6 +31,7 @@ public class GoogleDriveComponentConfigurer extends PropertyConfigurerSupport im
         map.put("clientFactory", org.apache.camel.component.google.drive.GoogleDriveClientFactory.class);
         map.put("accessToken", java.lang.String.class);
         map.put("clientSecret", java.lang.String.class);
+        map.put("keyResource", java.lang.String.class);
         map.put("refreshToken", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -60,6 +62,9 @@ public class GoogleDriveComponentConfigurer extends PropertyConfigurerSupport im
         case "clientsecret":
         case "clientSecret": getOrCreateConfiguration(target).setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.google.drive.GoogleDriveConfiguration.class, value)); return true;
+        case "delegate": getOrCreateConfiguration(target).setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "keyResource": getOrCreateConfiguration(target).setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "refreshtoken":
@@ -92,6 +97,9 @@ public class GoogleDriveComponentConfigurer extends PropertyConfigurerSupport im
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "configuration": return org.apache.camel.component.google.drive.GoogleDriveConfiguration.class;
+        case "delegate": return java.lang.String.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "refreshtoken":
@@ -120,6 +128,9 @@ public class GoogleDriveComponentConfigurer extends PropertyConfigurerSupport im
         case "clientsecret":
         case "clientSecret": return getOrCreateConfiguration(target).getClientSecret();
         case "configuration": return target.getConfiguration();
+        case "delegate": return getOrCreateConfiguration(target).getDelegate();
+        case "keyresource":
+        case "keyResource": return getOrCreateConfiguration(target).getKeyResource();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveConfigurationConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveConfigurationConfigurer.java
index 392bb4d..73f1ff3 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveConfigurationConfigurer.java
@@ -25,6 +25,8 @@ public class GoogleDriveConfigurationConfigurer extends org.apache.camel.support
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
         map.put("Scopes", java.util.List.class);
@@ -45,6 +47,10 @@ public class GoogleDriveConfigurationConfigurer extends org.apache.camel.support
         case "ClientId": target.setClientId(property(camelContext, java.lang.String.class, value)); return true;
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
@@ -73,6 +79,10 @@ public class GoogleDriveConfigurationConfigurer extends org.apache.camel.support
         case "ClientId": return java.lang.String.class;
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
@@ -97,6 +107,10 @@ public class GoogleDriveConfigurationConfigurer extends org.apache.camel.support
         case "ClientId": return target.getClientId();
         case "clientsecret":
         case "ClientSecret": return target.getClientSecret();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointConfigurer.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointConfigurer.java
index 00b8a59..f160f92 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointConfigurer.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointConfigurer.java
@@ -25,6 +25,7 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         map.put("applicationName", java.lang.String.class);
         map.put("clientFactory", org.apache.camel.component.google.drive.GoogleDriveClientFactory.class);
         map.put("clientId", java.lang.String.class);
+        map.put("delegate", java.lang.String.class);
         map.put("inBody", java.lang.String.class);
         map.put("scopes", java.util.List.class);
         map.put("bridgeErrorHandler", boolean.class);
@@ -49,6 +50,7 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         map.put("useFixedDelay", boolean.class);
         map.put("accessToken", java.lang.String.class);
         map.put("clientSecret", java.lang.String.class);
+        map.put("keyResource", java.lang.String.class);
         map.put("refreshToken", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -76,6 +78,7 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         case "clientsecret":
         case "clientSecret": target.getConfiguration().setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "delegate": target.getConfiguration().setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
@@ -85,6 +88,8 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         case "inBody": target.setInBody(property(camelContext, java.lang.String.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyresource":
+        case "keyResource": target.getConfiguration().setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "pollstrategy":
@@ -140,6 +145,7 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "delay": return long.class;
+        case "delegate": return java.lang.String.class;
         case "exceptionhandler":
         case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
         case "exchangepattern":
@@ -149,6 +155,8 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         case "inBody": return java.lang.String.class;
         case "initialdelay":
         case "initialDelay": return long.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "pollstrategy":
@@ -200,6 +208,7 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         case "clientsecret":
         case "clientSecret": return target.getConfiguration().getClientSecret();
         case "delay": return target.getDelay();
+        case "delegate": return target.getConfiguration().getDelegate();
         case "exceptionhandler":
         case "exceptionHandler": return target.getExceptionHandler();
         case "exchangepattern":
@@ -209,6 +218,8 @@ public class GoogleDriveEndpointConfigurer extends PropertyConfigurerSupport imp
         case "inBody": return target.getInBody();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
+        case "keyresource":
+        case "keyResource": return target.getConfiguration().getKeyResource();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "pollstrategy":
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointUriFactory.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointUriFactory.java
index fe305b0..2dbf589 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointUriFactory.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/GoogleDriveEndpointUriFactory.java
@@ -21,53 +21,58 @@ public class GoogleDriveEndpointUriFactory extends org.apache.camel.support.comp
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(46);
-        props.add("backoffMultiplier");
+        Set<String> props = new HashSet<>(51);
         props.add("permissionId");
         props.add("apiName");
-        props.add("clientFactory");
         props.add("initialDelay");
         props.add("changeId");
         props.add("mimeType");
-        props.add("content");
-        props.add("scheduler");
         props.add("bridgeErrorHandler");
-        props.add("useFixedDelay");
         props.add("mediaContent");
-        props.add("runLoggingLevel");
-        props.add("backoffErrorThreshold");
         props.add("appId");
         props.add("replyId");
         props.add("greedy");
         props.add("clientSecret");
         props.add("scheduledExecutorService");
-        props.add("applicationName");
-        props.add("email");
         props.add("repeatCount");
-        props.add("timeUnit");
         props.add("propertyKey");
-        props.add("clientId");
         props.add("sendEmptyMessageWhenIdle");
         props.add("schedulerProperties");
-        props.add("exchangePattern");
-        props.add("methodName");
         props.add("accessToken");
         props.add("childId");
         props.add("backoffIdleThreshold");
         props.add("folderId");
-        props.add("parentId");
-        props.add("revisionId");
         props.add("lazyStartProducer");
-        props.add("contentChannel");
         props.add("delay");
-        props.add("pollStrategy");
+        props.add("driveId");
         props.add("startScheduler");
         props.add("commentId");
-        props.add("scopes");
         props.add("inBody");
         props.add("exceptionHandler");
-        props.add("refreshToken");
         props.add("fileId");
+        props.add("teamDriveId");
+        props.add("backoffMultiplier");
+        props.add("clientFactory");
+        props.add("content");
+        props.add("delegate");
+        props.add("scheduler");
+        props.add("useFixedDelay");
+        props.add("runLoggingLevel");
+        props.add("backoffErrorThreshold");
+        props.add("requestId");
+        props.add("applicationName");
+        props.add("email");
+        props.add("timeUnit");
+        props.add("clientId");
+        props.add("keyResource");
+        props.add("exchangePattern");
+        props.add("methodName");
+        props.add("parentId");
+        props.add("revisionId");
+        props.add("contentChannel");
+        props.add("pollStrategy");
+        props.add("scopes");
+        props.add("refreshToken");
         PROPERTY_NAMES = Collections.unmodifiableSet(props);
         Set<String> secretProps = new HashSet<>(3);
         secretProps.add("clientSecret");
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/DriveDrivesApiMethod.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/DriveDrivesApiMethod.java
new file mode 100644
index 0000000..8a69f6a
--- /dev/null
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/DriveDrivesApiMethod.java
@@ -0,0 +1,79 @@
+
+/*
+ * Camel ApiMethod Enumeration generated by camel-api-component-maven-plugin
+ */
+package org.apache.camel.component.google.drive.internal;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import com.google.api.services.drive.Drive.Drives;
+
+import org.apache.camel.support.component.ApiMethod;
+import org.apache.camel.support.component.ApiMethodArg;
+import org.apache.camel.support.component.ApiMethodImpl;
+
+import static org.apache.camel.support.component.ApiMethodArg.arg;
+
+/**
+ * Camel {@link ApiMethod} Enumeration for com.google.api.services.drive.Drive$Drives
+ */
+public enum DriveDrivesApiMethod implements ApiMethod {
+
+    DELETE(
+        com.google.api.services.drive.Drive.Drives.Delete.class,
+        "delete",
+        arg("driveId", String.class)),
+
+    GET(
+        com.google.api.services.drive.Drive.Drives.Get.class,
+        "get",
+        arg("driveId", String.class)),
+
+    HIDE(
+        com.google.api.services.drive.Drive.Drives.Hide.class,
+        "hide",
+        arg("driveId", String.class)),
+
+    INSERT(
+        com.google.api.services.drive.Drive.Drives.Insert.class,
+        "insert",
+        arg("requestId", String.class),
+        arg("content", com.google.api.services.drive.model.Drive.class)),
+
+    LIST(
+        com.google.api.services.drive.Drive.Drives.List.class,
+        "list"),
+
+    UNHIDE(
+        com.google.api.services.drive.Drive.Drives.Unhide.class,
+        "unhide",
+        arg("driveId", String.class)),
+
+    UPDATE(
+        com.google.api.services.drive.Drive.Drives.Update.class,
+        "update",
+        arg("driveId", String.class),
+        arg("content", com.google.api.services.drive.model.Drive.class));
+
+    private final ApiMethod apiMethod;
+
+    private DriveDrivesApiMethod(Class<?> resultType, String name, ApiMethodArg... args) {
+        this.apiMethod = new ApiMethodImpl(Drives.class, resultType, name, args);
+    }
+
+    @Override
+    public String getName() { return apiMethod.getName(); }
+
+    @Override
+    public Class<?> getResultType() { return apiMethod.getResultType(); }
+
+    @Override
+    public List<String> getArgNames() { return apiMethod.getArgNames(); }
+
+    @Override
+    public List<Class<?>> getArgTypes() { return apiMethod.getArgTypes(); }
+
+    @Override
+    public Method getMethod() { return apiMethod.getMethod(); }
+}
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/DriveTeamdrivesApiMethod.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/DriveTeamdrivesApiMethod.java
new file mode 100644
index 0000000..b0386e5
--- /dev/null
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/DriveTeamdrivesApiMethod.java
@@ -0,0 +1,69 @@
+
+/*
+ * Camel ApiMethod Enumeration generated by camel-api-component-maven-plugin
+ */
+package org.apache.camel.component.google.drive.internal;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import com.google.api.services.drive.Drive.Teamdrives;
+
+import org.apache.camel.support.component.ApiMethod;
+import org.apache.camel.support.component.ApiMethodArg;
+import org.apache.camel.support.component.ApiMethodImpl;
+
+import static org.apache.camel.support.component.ApiMethodArg.arg;
+
+/**
+ * Camel {@link ApiMethod} Enumeration for com.google.api.services.drive.Drive$Teamdrives
+ */
+public enum DriveTeamdrivesApiMethod implements ApiMethod {
+
+    DELETE(
+        com.google.api.services.drive.Drive.Teamdrives.Delete.class,
+        "delete",
+        arg("teamDriveId", String.class)),
+
+    GET(
+        com.google.api.services.drive.Drive.Teamdrives.Get.class,
+        "get",
+        arg("teamDriveId", String.class)),
+
+    INSERT(
+        com.google.api.services.drive.Drive.Teamdrives.Insert.class,
+        "insert",
+        arg("requestId", String.class),
+        arg("content", com.google.api.services.drive.model.TeamDrive.class)),
+
+    LIST(
+        com.google.api.services.drive.Drive.Teamdrives.List.class,
+        "list"),
+
+    UPDATE(
+        com.google.api.services.drive.Drive.Teamdrives.Update.class,
+        "update",
+        arg("teamDriveId", String.class),
+        arg("content", com.google.api.services.drive.model.TeamDrive.class));
+
+    private final ApiMethod apiMethod;
+
+    private DriveTeamdrivesApiMethod(Class<?> resultType, String name, ApiMethodArg... args) {
+        this.apiMethod = new ApiMethodImpl(Teamdrives.class, resultType, name, args);
+    }
+
+    @Override
+    public String getName() { return apiMethod.getName(); }
+
+    @Override
+    public Class<?> getResultType() { return apiMethod.getResultType(); }
+
+    @Override
+    public List<String> getArgNames() { return apiMethod.getArgNames(); }
+
+    @Override
+    public List<Class<?>> getArgTypes() { return apiMethod.getArgTypes(); }
+
+    @Override
+    public Method getMethod() { return apiMethod.getMethod(); }
+}
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiCollection.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiCollection.java
index 06afc51..d043fe8 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiCollection.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiCollection.java
@@ -21,6 +21,8 @@ import org.apache.camel.component.google.drive.DriveFilesEndpointConfiguration;
 import org.apache.camel.component.google.drive.DriveParentsEndpointConfiguration;
 import org.apache.camel.component.google.drive.DrivePermissionsEndpointConfiguration;
 import org.apache.camel.component.google.drive.DrivePropertiesEndpointConfiguration;
+import org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration;
+import org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration;
 import org.apache.camel.component.google.drive.DriveRepliesEndpointConfiguration;
 import org.apache.camel.component.google.drive.DriveRevisionsEndpointConfiguration;
 
@@ -94,6 +96,16 @@ public final class GoogleDriveApiCollection extends ApiCollection<GoogleDriveApi
 
         aliases.clear();
         nullableArgs = Arrays.asList();
+        apiHelpers.put(GoogleDriveApiName.DRIVE_DRIVES, new ApiMethodHelper<DriveDrivesApiMethod>(DriveDrivesApiMethod.class, aliases, nullableArgs));
+        apiMethods.put(DriveDrivesApiMethod.class, GoogleDriveApiName.DRIVE_DRIVES);
+
+        aliases.clear();
+        nullableArgs = Arrays.asList();
+        apiHelpers.put(GoogleDriveApiName.DRIVE_TEAMDRIVES, new ApiMethodHelper<DriveTeamdrivesApiMethod>(DriveTeamdrivesApiMethod.class, aliases, nullableArgs));
+        apiMethods.put(DriveTeamdrivesApiMethod.class, GoogleDriveApiName.DRIVE_TEAMDRIVES);
+
+        aliases.clear();
+        nullableArgs = Arrays.asList();
         apiHelpers.put(GoogleDriveApiName.DRIVE_REPLIES, new ApiMethodHelper<DriveRepliesApiMethod>(DriveRepliesApiMethod.class, aliases, nullableArgs));
         apiMethods.put(DriveRepliesApiMethod.class, GoogleDriveApiName.DRIVE_REPLIES);
 
@@ -139,6 +151,12 @@ public final class GoogleDriveApiCollection extends ApiCollection<GoogleDriveApi
             case DRIVE_PROPERTIES:
                 result = new DrivePropertiesEndpointConfiguration();
                 break;
+            case DRIVE_DRIVES:
+                result = new DriveDrivesEndpointConfiguration();
+                break;
+            case DRIVE_TEAMDRIVES:
+                result = new DriveTeamdrivesEndpointConfiguration();
+                break;
             case DRIVE_REPLIES:
                 result = new DriveRepliesEndpointConfiguration();
                 break;
diff --git a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiName.java b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiName.java
index 7307861..3c0ab34 100644
--- a/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiName.java
+++ b/components/camel-google/camel-google-drive/src/generated/java/org/apache/camel/component/google/drive/internal/GoogleDriveApiName.java
@@ -31,6 +31,10 @@ public enum GoogleDriveApiName implements ApiName {
 
     DRIVE_PROPERTIES("drive-properties"),
 
+    DRIVE_DRIVES("drive-drives"),
+
+    DRIVE_TEAMDRIVES("drive-teamdrives"),
+
     DRIVE_REPLIES("drive-replies"),
 
     DRIVE_REVISIONS("drive-revisions");
diff --git a/components/camel-google/camel-google-drive/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration b/components/camel-google/camel-google-drive/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration
new file mode 100644
index 0000000..164122e
--- /dev/null
+++ b/components/camel-google/camel-google-drive/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.google.drive.DriveDrivesEndpointConfiguration
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.drive.DriveDrivesEndpointConfigurationConfigurer
diff --git a/components/camel-google/camel-google-drive/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration b/components/camel-google/camel-google-drive/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration
new file mode 100644
index 0000000..d1c1186
--- /dev/null
+++ b/components/camel-google/camel-google-drive/src/generated/resources/META-INF/services/org/apache/camel/configurer/org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfiguration
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.google.drive.DriveTeamdrivesEndpointConfigurationConfigurer
diff --git a/components/camel-google/camel-google-drive/src/generated/resources/org/apache/camel/component/google/drive/google-drive.json b/components/camel-google/camel-google-drive/src/generated/resources/org/apache/camel/component/google/drive/google-drive.json
index 53de387..c1d2cd0 100644
--- a/components/camel-google/camel-google-drive/src/generated/resources/org/apache/camel/component/google/drive/google-drive.json
+++ b/components/camel-google/camel-google-drive/src/generated/resources/org/apache/camel/component/google/drive/google-drive.json
@@ -26,6 +26,7 @@
     "applicationName": { "kind": "property", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Google drive application name. Example would be camel-google-drive\/1.0" },
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Client ID of the drive application" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use the shared configuration" },
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you want a drive application to have to a user account. See https:\/\/develop [...]
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "lazyStartProducer": { "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 fail during star [...]
@@ -33,14 +34,16 @@
     "clientFactory": { "kind": "property", "displayName": "Client Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.drive.GoogleDriveClientFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use the GoogleCalendarClientFactory as factory for creating the client. Will by default use BatchGoogleDriveClientFactory" },
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage." },
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Client secret of the drive application" },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever th [...]
   },
   "properties": {
-    "apiName": { "kind": "path", "displayName": "Api Name", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.google.drive.internal.GoogleDriveApiName", "enum": [ "DRIVE_ABOUT", "DRIVE_APPS", "DRIVE_CHANGES", "DRIVE_CHANNELS", "DRIVE_CHILDREN", "DRIVE_COMMENTS", "DRIVE_FILES", "DRIVE_PARENTS", "DRIVE_PERMISSIONS", "DRIVE_PROPERTIES", "DRIVE_REPLIES", "DRIVE_REVISIONS" ], "deprecated": false, "deprecationNote": "", "autowired": fal [...]
+    "apiName": { "kind": "path", "displayName": "Api Name", "group": "common", "label": "", "required": true, "type": "object", "javaType": "org.apache.camel.component.google.drive.internal.GoogleDriveApiName", "enum": [ "DRIVE_ABOUT", "DRIVE_APPS", "DRIVE_CHANGES", "DRIVE_CHANNELS", "DRIVE_CHILDREN", "DRIVE_COMMENTS", "DRIVE_FILES", "DRIVE_PARENTS", "DRIVE_PERMISSIONS", "DRIVE_PROPERTIES", "DRIVE_DRIVES", "DRIVE_TEAMDRIVES", "DRIVE_REPLIES", "DRIVE_REVISIONS" ], "deprecated": false, "de [...]
     "methodName": { "kind": "path", "displayName": "Method Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "enum": [ "copy", "delete", "get", "getIdForEmail", "insert", "list", "patch", "stop", "touch", "trash", "untrash", "update", "watch" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationFiel [...]
     "applicationName": { "kind": "parameter", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Google drive application name. Example would be camel-google-drive\/1.0" },
     "clientFactory": { "kind": "parameter", "displayName": "Client Factory", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.drive.GoogleDriveClientFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use the GoogleCalendarClientFactory as factory for creating the client. Will by default use BatchGoogleDriveClientFactory" },
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Client ID of the drive application" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of a parameter to be passed in the exchange In Body" },
     "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Specifies the level of permissions you want a drive application to have to a user account. See https:\/\/develo [...]
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
@@ -65,6 +68,7 @@
     "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term us [...]
     "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Client secret of the drive application" },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.drive.GoogleDriveConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever t [...]
   },
   "apis": {
@@ -73,12 +77,14 @@
     "drive-channels": { "consumerOnly": false, "producerOnly": false, "description": "The channels collection of methods", "methods": { "stop": { "description": "Stop watching resources through this channel", "signatures": [ "com.google.api.services.drive.Drive$Channels$Stop stop(com.google.api.services.drive.model.Channel content)" ] } } },
     "drive-children": { "consumerOnly": false, "producerOnly": false, "description": "The children collection of methods", "methods": { "delete": { "description": "Removes a child from a folder", "signatures": [ "com.google.api.services.drive.Drive$Children$Delete delete(String folderId, String childId)" ] }, "get": { "description": "Gets a specific child reference", "signatures": [ "com.google.api.services.drive.Drive$Children$Get get(String folderId, String childId)" ] }, "insert": { " [...]
     "drive-comments": { "consumerOnly": false, "producerOnly": false, "description": "The comments collection of methods", "methods": { "delete": { "description": "Deletes a comment", "signatures": [ "com.google.api.services.drive.Drive$Comments$Delete delete(String fileId, String commentId)" ] }, "get": { "description": "Gets a comment by ID", "signatures": [ "com.google.api.services.drive.Drive$Comments$Get get(String fileId, String commentId)" ] }, "insert": { "description": "Creates  [...]
+    "drive-drives": { "consumerOnly": false, "producerOnly": false, "description": "The drives collection of methods", "methods": { "delete": { "description": "Permanently deletes a shared drive for which the user is an organizer", "signatures": [ "com.google.api.services.drive.Drive$Drives$Delete delete(String driveId)" ] }, "get": { "description": "Gets a shared drive's metadata by ID", "signatures": [ "com.google.api.services.drive.Drive$Drives$Get get(String driveId)" ] }, "hide": {  [...]
     "drive-files": { "consumerOnly": false, "producerOnly": false, "description": "The files collection of methods", "methods": { "copy": { "description": "Creates a copy of the specified file", "signatures": [ "com.google.api.services.drive.Drive$Files$Copy copy(String fileId, com.google.api.services.drive.model.File content)" ] }, "delete": { "description": "Permanently deletes a file by ID", "signatures": [ "com.google.api.services.drive.Drive$Files$Delete delete(String fileId)" ] },  [...]
     "drive-parents": { "consumerOnly": false, "producerOnly": false, "description": "The parents collection of methods", "methods": { "delete": { "description": "Removes a parent from a file", "signatures": [ "com.google.api.services.drive.Drive$Parents$Delete delete(String fileId, String parentId)" ] }, "get": { "description": "Gets a specific parent reference", "signatures": [ "com.google.api.services.drive.Drive$Parents$Get get(String fileId, String parentId)" ] }, "insert": { "descri [...]
     "drive-permissions": { "consumerOnly": false, "producerOnly": false, "description": "The permissions collection of methods", "methods": { "delete": { "description": "Deletes a permission from a file or shared drive", "signatures": [ "com.google.api.services.drive.Drive$Permissions$Delete delete(String fileId, String permissionId)" ] }, "get": { "description": "Gets a permission by ID", "signatures": [ "com.google.api.services.drive.Drive$Permissions$Get get(String fileId, String perm [...]
     "drive-properties": { "consumerOnly": false, "producerOnly": false, "description": "The properties collection of methods", "methods": { "delete": { "description": "Deletes a property", "signatures": [ "com.google.api.services.drive.Drive$Properties$Delete delete(String fileId, String propertyKey)" ] }, "get": { "description": "Gets a property by its key", "signatures": [ "com.google.api.services.drive.Drive$Properties$Get get(String fileId, String propertyKey)" ] }, "insert": { "desc [...]
     "drive-replies": { "consumerOnly": false, "producerOnly": false, "description": "The replies collection of methods", "methods": { "delete": { "description": "Deletes a reply", "signatures": [ "com.google.api.services.drive.Drive$Replies$Delete delete(String fileId, String commentId, String replyId)" ] }, "get": { "description": "Gets a reply", "signatures": [ "com.google.api.services.drive.Drive$Replies$Get get(String fileId, String commentId, String replyId)" ] }, "insert": { "descr [...]
-    "drive-revisions": { "consumerOnly": false, "producerOnly": false, "description": "The revisions collection of methods", "methods": { "delete": { "description": "Permanently deletes a file version", "signatures": [ "com.google.api.services.drive.Drive$Revisions$Delete delete(String fileId, String revisionId)" ] }, "get": { "description": "Gets a specific revision", "signatures": [ "com.google.api.services.drive.Drive$Revisions$Get get(String fileId, String revisionId)" ] }, "list": { [...]
+    "drive-revisions": { "consumerOnly": false, "producerOnly": false, "description": "The revisions collection of methods", "methods": { "delete": { "description": "Permanently deletes a file version", "signatures": [ "com.google.api.services.drive.Drive$Revisions$Delete delete(String fileId, String revisionId)" ] }, "get": { "description": "Gets a specific revision", "signatures": [ "com.google.api.services.drive.Drive$Revisions$Get get(String fileId, String revisionId)" ] }, "list": { [...]
+    "drive-teamdrives": { "consumerOnly": false, "producerOnly": false, "description": "The teamdrives collection of methods", "methods": { "delete": { "description": "Deprecated use drives", "signatures": [ "com.google.api.services.drive.Drive$Teamdrives$Delete delete(String teamDriveId)" ] }, "get": { "description": "Deprecated use drives", "signatures": [ "com.google.api.services.drive.Drive$Teamdrives$Get get(String teamDriveId)" ] }, "insert": { "description": "Deprecated use drives [...]
   },
   "apiProperties": {
     "drive-apps": { "methods": { "get": { "properties": { "appId": { "kind": "parameter", "displayName": "App Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the app", "optional": false } } } } },
@@ -86,11 +92,13 @@
     "drive-channels": { "methods": { "stop": { "properties": { "contentChannel": { "kind": "parameter", "displayName": "Content Channel", "group": "common", "label": "", "required": false, "type": "object", "javaType": "com.google.api.services.drive.model.Channel", "deprecated": false, "autowired": false, "secret": false, "description": "The com.google.api.services.drive.model.Channel", "optional": false } } } } },
     "drive-children": { "methods": { "delete": { "properties": { "childId": { "kind": "parameter", "displayName": "Child Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the child", "optional": false }, "folderId": { "kind": "parameter", "displayName": "Folder Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "jav [...]
     "drive-comments": { "methods": { "delete": { "properties": { "commentId": { "kind": "parameter", "displayName": "Comment Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the comment", "optional": false }, "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "j [...]
+    "drive-drives": { "methods": { "delete": { "properties": { "driveId": { "kind": "parameter", "displayName": "Drive Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the shared drive", "optional": false } } }, "get": { "properties": { "driveId": { "kind": "parameter", "displayName": "Drive Id", "group": "common", "label": "", "required": false, "t [...]
     "drive-files": { "methods": { "copy": { "properties": { "content": { "kind": "parameter", "displayName": "Content", "group": "common", "label": "", "required": false, "type": "object", "javaType": "com.google.api.services.drive.model.File", "deprecated": false, "autowired": false, "secret": false, "description": "The com.google.api.services.drive.model.File", "optional": false }, "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": fa [...]
     "drive-parents": { "methods": { "delete": { "properties": { "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the file", "optional": false }, "parentId": { "kind": "parameter", "displayName": "Parent Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.la [...]
     "drive-permissions": { "methods": { "delete": { "properties": { "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID for the file or shared drive", "optional": false }, "permissionId": { "kind": "parameter", "displayName": "Permission Id", "group": "common", "label": "", "required": false, "type": " [...]
     "drive-properties": { "methods": { "delete": { "properties": { "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the file", "optional": false }, "propertyKey": { "kind": "parameter", "displayName": "Property Key", "group": "common", "label": "", "required": false, "type": "string", "javaType": [...]
     "drive-replies": { "methods": { "delete": { "properties": { "commentId": { "kind": "parameter", "displayName": "Comment Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the comment", "optional": false }, "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "ja [...]
-    "drive-revisions": { "methods": { "delete": { "properties": { "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the file", "optional": false }, "revisionId": { "kind": "parameter", "displayName": "Revision Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "j [...]
+    "drive-revisions": { "methods": { "delete": { "properties": { "fileId": { "kind": "parameter", "displayName": "File Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the file", "optional": false }, "revisionId": { "kind": "parameter", "displayName": "Revision Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "j [...]
+    "drive-teamdrives": { "methods": { "delete": { "properties": { "teamDriveId": { "kind": "parameter", "displayName": "Team Drive Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The ID of the Team Drive", "optional": false } } }, "get": { "properties": { "teamDriveId": { "kind": "parameter", "displayName": "Team Drive Id", "group": "common", "label": "", " [...]
   }
 }
diff --git a/components/camel-google/camel-google-drive/src/main/docs/google-drive-component.adoc b/components/camel-google/camel-google-drive/src/main/docs/google-drive-component.adoc
index 3737cb1..260cef0 100644
--- a/components/camel-google/camel-google-drive/src/main/docs/google-drive-component.adoc
+++ b/components/camel-google/camel-google-drive/src/main/docs/google-drive-component.adoc
@@ -28,6 +28,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is the
 https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/drive/api/v2/about-auth[Drive API (V2) Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/BatchGoogleDriveClientFactory.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/BatchGoogleDriveClientFactory.java
index 376086a..3881531 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/BatchGoogleDriveClientFactory.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/BatchGoogleDriveClientFactory.java
@@ -1,87 +1,121 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.google.drive;
-
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Proxy;
-import java.net.UnknownHostException;
-import java.util.Collection;
-
-import com.google.api.client.auth.oauth2.Credential;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.drive.Drive;
-import org.apache.camel.RuntimeCamelException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class BatchGoogleDriveClientFactory implements GoogleDriveClientFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(BatchGoogleDriveClientFactory.class);
-    private NetHttpTransport transport;
-    private JacksonFactory jsonFactory;
-
-    public BatchGoogleDriveClientFactory() {
-        this.transport = new NetHttpTransport();
-        this.jsonFactory = new JacksonFactory();
-    }
-
-    public BatchGoogleDriveClientFactory(String proxyHost, int proxyPort) {
-        try {
-            Proxy proxy = new Proxy(
-                    Proxy.Type.HTTP,
-                    new InetSocketAddress(InetAddress.getByName(proxyHost), proxyPort));
-            this.transport = new NetHttpTransport.Builder().setProxy(proxy).build();
-            this.jsonFactory = new JacksonFactory();
-        } catch (UnknownHostException e) {
-            LOG.error("Unknow proxy host", e);
-        }
-    }
-
-    @Override
-    public Drive makeClient(
-            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
-            String accessToken) {
-        if (clientId == null || clientSecret == null) {
-            throw new IllegalArgumentException("clientId and clientSecret are required to create Google Drive client.");
-        }
-        try {
-            Credential credential = authorize(clientId, clientSecret, scopes);
-
-            if (refreshToken != null && !"".equals(refreshToken)) {
-                credential.setRefreshToken(refreshToken);
-            }
-            if (accessToken != null && !"".equals(accessToken)) {
-                credential.setAccessToken(accessToken);
-            }
-            return new Drive.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
-        } catch (Exception e) {
-            throw new RuntimeCamelException("Could not create Google Drive client.", e);
-        }
-    }
-
-    // Authorizes the installed application to access user's protected data.
-    private Credential authorize(String clientId, String clientSecret, Collection<String> scopes) {
-        // authorize
-        return new GoogleCredential.Builder()
-                .setJsonFactory(jsonFactory)
-                .setTransport(transport)
-                .setClientSecrets(clientId, clientSecret)
-                .build();
-    }
-}
+/*
+ * 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.google.drive;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.UnknownHostException;
+import java.util.Collection;
+
+import com.google.api.client.auth.oauth2.Credential;
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.drive.Drive;
+import org.apache.camel.CamelContext;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.support.ResourceHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BatchGoogleDriveClientFactory implements GoogleDriveClientFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(BatchGoogleDriveClientFactory.class);
+    private NetHttpTransport transport;
+    private JacksonFactory jsonFactory;
+
+    public BatchGoogleDriveClientFactory() {
+        this.transport = new NetHttpTransport();
+        this.jsonFactory = new JacksonFactory();
+    }
+
+    public BatchGoogleDriveClientFactory(String proxyHost, int proxyPort) {
+        try {
+            Proxy proxy = new Proxy(
+                    Proxy.Type.HTTP,
+                    new InetSocketAddress(InetAddress.getByName(proxyHost), proxyPort));
+            this.transport = new NetHttpTransport.Builder().setProxy(proxy).build();
+            this.jsonFactory = new JacksonFactory();
+        } catch (UnknownHostException e) {
+            LOG.error("Unknow proxy host", e);
+        }
+    }
+
+    @Override
+    public Drive makeClient(
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken) {
+        if (clientId == null || clientSecret == null) {
+            throw new IllegalArgumentException("clientId and clientSecret are required to create Google Drive client.");
+        }
+        try {
+            Credential credential = authorize(clientId, clientSecret, scopes);
+
+            if (refreshToken != null && !"".equals(refreshToken)) {
+                credential.setRefreshToken(refreshToken);
+            }
+            if (accessToken != null && !"".equals(accessToken)) {
+                credential.setAccessToken(accessToken);
+            }
+            return new Drive.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
+        } catch (Exception e) {
+            throw new RuntimeCamelException("Could not create Google Drive client.", e);
+        }
+    }
+
+    // Authorizes the installed application to access user's protected data.
+    private Credential authorize(String clientId, String clientSecret, Collection<String> scopes) {
+        // authorize
+        return new GoogleCredential.Builder()
+                .setJsonFactory(jsonFactory)
+                .setTransport(transport)
+                .setClientSecrets(clientId, clientSecret)
+                .setServiceAccountScopes(scopes)
+                .build();
+    }
+
+    @Override
+    public Drive makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate) {
+        if (keyResource == null) {
+            throw new IllegalArgumentException("keyResource is required to create Gmail client.");
+        }
+        try {
+            Credential credential = authorizeServiceAccount(camelContext, keyResource, delegate, scopes);
+            return new Drive.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
+        } catch (Exception e) {
+            throw new RuntimeCamelException("Could not create Gmail client.", e);
+        }
+    }
+
+    private Credential authorizeServiceAccount(
+            CamelContext camelContext, String keyResource, String delegate, Collection<String> scopes) {
+        // authorize
+        try {
+            GoogleCredential cred = GoogleCredential
+                    .fromStream(ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, keyResource), transport,
+                            jsonFactory)
+                    .createScoped(scopes != null && scopes.size() != 0 ? scopes : null)
+                    .createDelegated(delegate);
+            cred.refreshToken();
+            return cred;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveClientFactory.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveClientFactory.java
index f514d74..a645fdc 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveClientFactory.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveClientFactory.java
@@ -1,29 +1,33 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.google.drive;
-
-import java.util.Collection;
-
-import com.google.api.services.drive.Drive;
-
-public interface GoogleDriveClientFactory {
-
-    Drive makeClient(
-            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
-            String accessToken);
-
-}
+/*
+ * 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.google.drive;
+
+import java.util.Collection;
+
+import com.google.api.services.drive.Drive;
+import org.apache.camel.CamelContext;
+
+public interface GoogleDriveClientFactory {
+
+    Drive makeClient(
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken);
+
+    Drive makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate);
+
+}
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveComponent.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveComponent.java
index 82d0f86..0d75c1f 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveComponent.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveComponent.java
@@ -50,12 +50,20 @@ public class GoogleDriveComponent
         return getCamelContext().getTypeConverter().convertTo(GoogleDriveApiName.class, apiNameStr);
     }
 
-    public Drive getClient(GoogleDriveConfiguration googleDriveConfiguration) {
+    public Drive getClient(GoogleDriveConfiguration config) {
         if (client == null) {
-            client = getClientFactory().makeClient(googleDriveConfiguration.getClientId(),
-                    googleDriveConfiguration.getClientSecret(),
-                    googleDriveConfiguration.getScopes(), googleDriveConfiguration.getApplicationName(),
-                    googleDriveConfiguration.getRefreshToken(), googleDriveConfiguration.getAccessToken());
+            if (config.getClientId() != null && !config.getClientId().isBlank()
+                    && config.getClientSecret() != null && !config.getClientSecret().isBlank()) {
+                client = getClientFactory().makeClient(config.getClientId(),
+                        config.getClientSecret(), config.getScopes(),
+                        config.getApplicationName(), config.getRefreshToken(), config.getAccessToken());
+            } else if (config.getKeyResource() != null && !config.getKeyResource().isBlank()) {
+                client = getClientFactory().makeClient(getCamelContext(), config.getKeyResource(),
+                        config.getScopes(), config.getApplicationName(), config.getDelegate());
+            } else {
+                throw new IllegalArgumentException(
+                        "(clientId and clientSecret) or keyResource are required to create Google Drive client");
+            }
         }
         return client;
     }
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveConfiguration.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveConfiguration.java
index 67b9f4d..40d420c 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveConfiguration.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveConfiguration.java
@@ -16,10 +16,8 @@
  */
 package org.apache.camel.component.google.drive;
 
-import java.util.Arrays;
 import java.util.List;
 
-import com.google.api.services.drive.DriveScopes;
 import org.apache.camel.component.google.drive.internal.GoogleDriveApiName;
 import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.Metadata;
@@ -33,10 +31,6 @@ import org.apache.camel.spi.UriPath;
 @UriParams
 @Configurer(extended = true)
 public class GoogleDriveConfiguration {
-    private static final List<String> DEFAULT_SCOPES
-            = Arrays.asList(DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_APPS_READONLY, DriveScopes.DRIVE_METADATA_READONLY,
-                    DriveScopes.DRIVE);
-
     @UriPath
     @Metadata(required = true)
     private GoogleDriveApiName apiName;
@@ -44,7 +38,7 @@ public class GoogleDriveConfiguration {
     @Metadata(required = true)
     private String methodName;
     @UriParam
-    private List<String> scopes = DEFAULT_SCOPES;
+    private List<String> scopes;
     @UriParam
     private String clientId;
     @UriParam(label = "security", secret = true)
@@ -55,6 +49,11 @@ public class GoogleDriveConfiguration {
     private String refreshToken;
     @UriParam
     private String applicationName;
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
 
     public GoogleDriveApiName getApiName() {
         return apiName;
@@ -145,4 +144,28 @@ public class GoogleDriveConfiguration {
     public void setScopes(List<String> scopes) {
         this.scopes = scopes;
     }
+
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
 }
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveEndpoint.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveEndpoint.java
index 404ad6b..d075f7c 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveEndpoint.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/GoogleDriveEndpoint.java
@@ -109,6 +109,9 @@ public class GoogleDriveEndpoint extends AbstractApiEndpoint<GoogleDriveApiName,
             case DRIVE_PROPERTIES:
                 apiProxy = getClient().properties();
                 break;
+            case DRIVE_DRIVES:
+                apiProxy = getClient().drives();
+                break;
             case DRIVE_REPLIES:
                 apiProxy = getClient().replies();
                 break;
@@ -121,6 +124,9 @@ public class GoogleDriveEndpoint extends AbstractApiEndpoint<GoogleDriveApiName,
             case DRIVE_PARENTS:
                 apiProxy = getClient().parents();
                 break;
+            case DRIVE_TEAMDRIVES:
+                apiProxy = getClient().teamdrives();
+                break;
             default:
                 throw new IllegalArgumentException("Invalid API name " + apiName);
         }
diff --git a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/InteractiveGoogleDriveClientFactory.java b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/InteractiveGoogleDriveClientFactory.java
index 2a35128..b3a8011 100644
--- a/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/InteractiveGoogleDriveClientFactory.java
+++ b/components/camel-google/camel-google-drive/src/main/java/org/apache/camel/component/google/drive/InteractiveGoogleDriveClientFactory.java
@@ -1,73 +1,80 @@
-/*
- * 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.google.drive;
-
-import java.util.Collection;
-
-import com.google.api.client.auth.oauth2.Credential;
-import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
-import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
-import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.client.util.store.FileDataStoreFactory;
-import com.google.api.services.drive.Drive;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class InteractiveGoogleDriveClientFactory implements GoogleDriveClientFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(InteractiveGoogleDriveClientFactory.class);
-    private static final java.io.File DATA_STORE_DIR = new java.io.File(".google_drive");
-    private NetHttpTransport transport;
-    private JacksonFactory jsonFactory;
-    private FileDataStoreFactory dataStoreFactory;
-
-    public InteractiveGoogleDriveClientFactory() {
-        this.transport = new NetHttpTransport();
-        this.jsonFactory = new JacksonFactory();
-    }
-
-    @Override
-    public Drive makeClient(
-            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
-            String accessToken) {
-        Credential credential;
-        try {
-            credential = authorize(clientId, clientSecret, scopes);
-            return new Drive.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
-        } catch (Exception e) {
-            LOG.error("Could not create Google Drive client.", e);
-        }
-        return null;
-    }
-
-    /**
-     * This method interactively creates the necessary authorization tokens on first run, and stores the tokens in the
-     * data store. Subsequent runs will no longer require interactivity as long as the credentials file is not removed.
-     */
-    private Credential authorize(String clientId, String clientSecret, Collection<String> scopes) throws Exception {
-        dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
-        // set up authorization code flow
-        GoogleAuthorizationCodeFlow flow
-                = new GoogleAuthorizationCodeFlow.Builder(transport, jsonFactory, clientId, clientSecret, scopes)
-                        .setDataStoreFactory(dataStoreFactory)
-                        .setAccessType("offline")
-                        .build();
-        // authorize
-        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
-    }
-}
+/*
+ * 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.google.drive;
+
+import java.util.Collection;
+
+import com.google.api.client.auth.oauth2.Credential;
+import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
+import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
+import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.client.util.store.FileDataStoreFactory;
+import com.google.api.services.drive.Drive;
+import org.apache.camel.CamelContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InteractiveGoogleDriveClientFactory implements GoogleDriveClientFactory {
+    private static final Logger LOG = LoggerFactory.getLogger(InteractiveGoogleDriveClientFactory.class);
+    private static final java.io.File DATA_STORE_DIR = new java.io.File(".google_drive");
+    private NetHttpTransport transport;
+    private JacksonFactory jsonFactory;
+    private FileDataStoreFactory dataStoreFactory;
+
+    public InteractiveGoogleDriveClientFactory() {
+        this.transport = new NetHttpTransport();
+        this.jsonFactory = new JacksonFactory();
+    }
+
+    @Override
+    public Drive makeClient(
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken) {
+        Credential credential;
+        try {
+            credential = authorize(clientId, clientSecret, scopes);
+            return new Drive.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
+        } catch (Exception e) {
+            LOG.error("Could not create Google Drive client.", e);
+        }
+        return null;
+    }
+
+    /**
+     * This method interactively creates the necessary authorization tokens on first run, and stores the tokens in the
+     * data store. Subsequent runs will no longer require interactivity as long as the credentials file is not removed.
+     */
+    private Credential authorize(String clientId, String clientSecret, Collection<String> scopes) throws Exception {
+        dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
+        // set up authorization code flow
+        GoogleAuthorizationCodeFlow flow
+                = new GoogleAuthorizationCodeFlow.Builder(transport, jsonFactory, clientId, clientSecret, scopes)
+                        .setDataStoreFactory(dataStoreFactory)
+                        .setAccessType("offline")
+                        .build();
+        // authorize
+        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
+    }
+
+    @Override
+    public Drive makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate) {
+        throw new IllegalArgumentException("Not implemented");
+    }
+}
diff --git a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/AbstractGoogleDriveTestSupport.java b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/AbstractGoogleDriveTestSupport.java
index a129415..8bdd0f0 100644
--- a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/AbstractGoogleDriveTestSupport.java
+++ b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/AbstractGoogleDriveTestSupport.java
@@ -59,7 +59,8 @@ public abstract class AbstractGoogleDriveTestSupport extends CamelTestSupport {
         Properties properties = loadProperties();
 
         return !properties.getProperty("clientId", "").isEmpty()
-                && !properties.getProperty("clientSecret").isEmpty();
+                && !properties.getProperty("clientSecret").isEmpty()
+                || !properties.getProperty("keyResource", "").isEmpty();
     }
 
     private static Properties loadProperties() {
diff --git a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/CustomClientFactoryTest.java b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/CustomClientFactoryTest.java
index 983512c..ed6fe06 100644
--- a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/CustomClientFactoryTest.java
+++ b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/CustomClientFactoryTest.java
@@ -20,12 +20,15 @@ import org.apache.camel.BindToRegistry;
 import org.apache.camel.Endpoint;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test class for com.google.api.services.drive.Drive$Files APIs.
  */
+@EnabledIf(value = "org.apache.camel.component.google.drive.AbstractGoogleDriveTestSupport#hasCredentials",
+           disabledReason = "Google Drive credentials were not provided")
 public class CustomClientFactoryTest extends AbstractGoogleDriveTestSupport {
 
     @BindToRegistry("myAuth")
diff --git a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/DriveConfigurationTest.java b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/DriveConfigurationTest.java
index 973d3f2..8ca00e5 100644
--- a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/DriveConfigurationTest.java
+++ b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/DriveConfigurationTest.java
@@ -22,12 +22,15 @@ import org.apache.camel.component.google.drive.internal.DriveFilesApiMethod;
 import org.apache.camel.component.google.drive.internal.GoogleDriveApiCollection;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
+@EnabledIf(value = "org.apache.camel.component.google.drive.AbstractGoogleDriveTestSupport#hasCredentials",
+           disabledReason = "Google Drive credentials were not provided")
 public class DriveConfigurationTest extends AbstractGoogleDriveTestSupport {
 
     private static final Logger LOG = LoggerFactory.getLogger(DriveConfigurationTest.class);
diff --git a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/MyClientFactory.java b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/MyClientFactory.java
index 9d90c8e..7af782d 100644
--- a/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/MyClientFactory.java
+++ b/components/camel-google/camel-google-drive/src/test/java/org/apache/camel/component/google/drive/MyClientFactory.java
@@ -1,36 +1,43 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.google.drive;
-
-import java.util.Collection;
-
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.drive.Drive;
-
-public class MyClientFactory implements GoogleDriveClientFactory {
-
-    public MyClientFactory() {
-    }
-
-    @Override
-    public Drive makeClient(
-            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
-            String accessToken) {
-        return new Drive(new NetHttpTransport(), new JacksonFactory(), null);
-    }
-}
+/*
+ * 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.google.drive;
+
+import java.util.Collection;
+
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.drive.Drive;
+import org.apache.camel.CamelContext;
+
+public class MyClientFactory implements GoogleDriveClientFactory {
+
+    public MyClientFactory() {
+    }
+
+    @Override
+    public Drive makeClient(
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken) {
+        return new Drive(new NetHttpTransport(), new JacksonFactory(), null);
+    }
+
+    @Override
+    public Drive makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate) {
+        throw new IllegalArgumentException("Not implemented");
+    }
+}
diff --git a/components/camel-google/camel-google-drive/src/test/resources/test-options.properties b/components/camel-google/camel-google-drive/src/test/resources/test-options.properties
index 3ffedba..b6d6934 100644
--- a/components/camel-google/camel-google-drive/src/test/resources/test-options.properties
+++ b/components/camel-google/camel-google-drive/src/test/resources/test-options.properties
@@ -24,3 +24,7 @@ clientSecret=
 applicationName=camel-google-drive/1.0
 #accessToken=
 refreshToken=
+
+keyResource=
+scopes[]=
+delegate=
\ No newline at end of file
diff --git a/components/camel-google/camel-google-mail/pom.xml b/components/camel-google/camel-google-mail/pom.xml
index 184c72d..0bc6a6d 100644
--- a/components/camel-google/camel-google-mail/pom.xml
+++ b/components/camel-google/camel-google-mail/pom.xml
@@ -102,13 +102,6 @@
             <groupId>com.sun.mail</groupId>
             <artifactId>jakarta.mail</artifactId>
             <version>${jakarta-mail-version}</version>
-            <exclusions>
-                <!-- javax activation is part of the JDK now -->
-                <exclusion>
-                    <groupId>com.sun.activation</groupId>
-                    <artifactId>jakarta.activation</artifactId>
-                </exclusion>
-            </exclusions>
         </dependency>
 
         <!-- logging -->
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersDraftsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersDraftsEndpointConfigurationConfigurer.java
index 33a8281..d7c7dde 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersDraftsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersDraftsEndpointConfigurationConfigurer.java
@@ -32,7 +32,7 @@ public class GmailUsersDraftsEndpointConfigurationConfigurer extends org.apache.
         map.put("MediaContent", com.google.api.client.http.AbstractInputStreamContent.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -66,7 +66,7 @@ public class GmailUsersDraftsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -106,7 +106,7 @@ public class GmailUsersDraftsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersEndpointConfigurationConfigurer.java
index deaf323..41497dd 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersEndpointConfigurationConfigurer.java
@@ -30,7 +30,7 @@ public class GmailUsersEndpointConfigurationConfigurer extends org.apache.camel.
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -60,7 +60,7 @@ public class GmailUsersEndpointConfigurationConfigurer extends org.apache.camel.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -96,7 +96,7 @@ public class GmailUsersEndpointConfigurationConfigurer extends org.apache.camel.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersHistoryEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersHistoryEndpointConfigurationConfigurer.java
index d72de2f..4ce237d 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersHistoryEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersHistoryEndpointConfigurationConfigurer.java
@@ -29,7 +29,7 @@ public class GmailUsersHistoryEndpointConfigurationConfigurer extends org.apache
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -57,7 +57,7 @@ public class GmailUsersHistoryEndpointConfigurationConfigurer extends org.apache
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -91,7 +91,7 @@ public class GmailUsersHistoryEndpointConfigurationConfigurer extends org.apache
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
index 676ba83..bdd2535 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersLabelsEndpointConfigurationConfigurer.java
@@ -31,7 +31,7 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -63,7 +63,7 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -101,7 +101,7 @@ public class GmailUsersLabelsEndpointConfigurationConfigurer extends org.apache.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer.java
index b800cc2..3cde3e5 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer.java
@@ -31,7 +31,7 @@ public class GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer extend
         map.put("MessageId", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -63,7 +63,7 @@ public class GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer extend
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -101,7 +101,7 @@ public class GmailUsersMessagesAttachmentsEndpointConfigurationConfigurer extend
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesEndpointConfigurationConfigurer.java
index bdcd6b7..efe8c75 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersMessagesEndpointConfigurationConfigurer.java
@@ -35,7 +35,7 @@ public class GmailUsersMessagesEndpointConfigurationConfigurer extends org.apach
         map.put("MethodName", java.lang.String.class);
         map.put("ModifyMessageRequest", com.google.api.services.gmail.model.ModifyMessageRequest.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -75,7 +75,7 @@ public class GmailUsersMessagesEndpointConfigurationConfigurer extends org.apach
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -121,7 +121,7 @@ public class GmailUsersMessagesEndpointConfigurationConfigurer extends org.apach
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersThreadsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersThreadsEndpointConfigurationConfigurer.java
index a91a9af..2fd36d9 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersThreadsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GmailUsersThreadsEndpointConfigurationConfigurer.java
@@ -31,7 +31,7 @@ public class GmailUsersThreadsEndpointConfigurationConfigurer extends org.apache
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("UserId", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -63,7 +63,7 @@ public class GmailUsersThreadsEndpointConfigurationConfigurer extends org.apache
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "userid":
         case "UserId": target.setUserId(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -101,7 +101,7 @@ public class GmailUsersThreadsEndpointConfigurationConfigurer extends org.apache
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         case "userid":
         case "UserId": return java.lang.String.class;
         default: return null;
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailComponentConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailComponentConfigurer.java
index 4177bbf..0332b34 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailComponentConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailComponentConfigurer.java
@@ -24,7 +24,7 @@ public class GoogleMailComponentConfigurer extends PropertyConfigurerSupport imp
         map.put("clientId", java.lang.String.class);
         map.put("configuration", org.apache.camel.component.google.mail.GoogleMailConfiguration.class);
         map.put("delegate", java.lang.String.class);
-        map.put("scopes", java.util.List.class);
+        map.put("scopes", java.util.Collection.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("lazyStartProducer", boolean.class);
         map.put("autowiredEnabled", boolean.class);
@@ -69,7 +69,7 @@ public class GoogleMailComponentConfigurer extends PropertyConfigurerSupport imp
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "refreshtoken":
         case "refreshToken": getOrCreateConfiguration(target).setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
-        case "scopes": getOrCreateConfiguration(target).setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "scopes": getOrCreateConfiguration(target).setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         default: return false;
         }
     }
@@ -104,7 +104,7 @@ public class GoogleMailComponentConfigurer extends PropertyConfigurerSupport imp
         case "lazyStartProducer": return boolean.class;
         case "refreshtoken":
         case "refreshToken": return java.lang.String.class;
-        case "scopes": return java.util.List.class;
+        case "scopes": return java.util.Collection.class;
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailConfigurationConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailConfigurationConfigurer.java
index e1157f7..fa4432b 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailConfigurationConfigurer.java
@@ -29,7 +29,7 @@ public class GoogleMailConfigurationConfigurer extends org.apache.camel.support.
         map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
-        map.put("Scopes", java.util.List.class);
+        map.put("Scopes", java.util.Collection.class);
         ALL_OPTIONS = map;
     }
 
@@ -56,7 +56,7 @@ public class GoogleMailConfigurationConfigurer extends org.apache.camel.support.
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
         case "scopes":
-        case "Scopes": target.setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         default: return false;
         }
     }
@@ -88,7 +88,7 @@ public class GoogleMailConfigurationConfigurer extends org.apache.camel.support.
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
         case "scopes":
-        case "Scopes": return java.util.List.class;
+        case "Scopes": return java.util.Collection.class;
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailEndpointConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailEndpointConfigurer.java
index bf18167..7b320f9 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailEndpointConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/GoogleMailEndpointConfigurer.java
@@ -26,7 +26,7 @@ public class GoogleMailEndpointConfigurer extends PropertyConfigurerSupport impl
         map.put("clientId", java.lang.String.class);
         map.put("delegate", java.lang.String.class);
         map.put("inBody", java.lang.String.class);
-        map.put("scopes", java.util.List.class);
+        map.put("scopes", java.util.Collection.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("sendEmptyMessageWhenIdle", boolean.class);
         map.put("exceptionHandler", org.apache.camel.spi.ExceptionHandler.class);
@@ -102,7 +102,7 @@ public class GoogleMailEndpointConfigurer extends PropertyConfigurerSupport impl
         case "scheduler": target.setScheduler(property(camelContext, java.lang.Object.class, value)); return true;
         case "schedulerproperties":
         case "schedulerProperties": target.setSchedulerProperties(property(camelContext, java.util.Map.class, value)); return true;
-        case "scopes": target.getConfiguration().setScopes(property(camelContext, java.util.List.class, value)); return true;
+        case "scopes": target.getConfiguration().setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": target.setSendEmptyMessageWhenIdle(property(camelContext, boolean.class, value)); return true;
         case "startscheduler":
@@ -167,7 +167,7 @@ public class GoogleMailEndpointConfigurer extends PropertyConfigurerSupport impl
         case "scheduler": return java.lang.Object.class;
         case "schedulerproperties":
         case "schedulerProperties": return java.util.Map.class;
-        case "scopes": return java.util.List.class;
+        case "scopes": return java.util.Collection.class;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return boolean.class;
         case "startscheduler":
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentConfigurer.java
index 8a95ef5..b07a0ae 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentConfigurer.java
@@ -43,6 +43,9 @@ public class GoogleMailStreamComponentConfigurer extends PropertyConfigurerSuppo
         case "clientsecret":
         case "clientSecret": getOrCreateConfiguration(target).setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration.class, value)); return true;
+        case "delegate": getOrCreateConfiguration(target).setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "keyResource": getOrCreateConfiguration(target).setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "labels": getOrCreateConfiguration(target).setLabels(property(camelContext, java.lang.String.class, value)); return true;
         case "markasread":
         case "markAsRead": getOrCreateConfiguration(target).setMarkAsRead(property(camelContext, boolean.class, value)); return true;
@@ -51,6 +54,7 @@ public class GoogleMailStreamComponentConfigurer extends PropertyConfigurerSuppo
         case "query": getOrCreateConfiguration(target).setQuery(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "refreshToken": getOrCreateConfiguration(target).setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes": getOrCreateConfiguration(target).setScopes(property(camelContext, java.util.List.class, value)); return true;
         default: return false;
         }
     }
@@ -73,6 +77,9 @@ public class GoogleMailStreamComponentConfigurer extends PropertyConfigurerSuppo
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "configuration": return org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration.class;
+        case "delegate": return java.lang.String.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "labels": return java.lang.String.class;
         case "markasread":
         case "markAsRead": return boolean.class;
@@ -81,6 +88,7 @@ public class GoogleMailStreamComponentConfigurer extends PropertyConfigurerSuppo
         case "query": return java.lang.String.class;
         case "refreshtoken":
         case "refreshToken": return java.lang.String.class;
+        case "scopes": return java.util.List.class;
         default: return null;
         }
     }
@@ -104,6 +112,9 @@ public class GoogleMailStreamComponentConfigurer extends PropertyConfigurerSuppo
         case "clientsecret":
         case "clientSecret": return getOrCreateConfiguration(target).getClientSecret();
         case "configuration": return target.getConfiguration();
+        case "delegate": return getOrCreateConfiguration(target).getDelegate();
+        case "keyresource":
+        case "keyResource": return getOrCreateConfiguration(target).getKeyResource();
         case "labels": return getOrCreateConfiguration(target).getLabels();
         case "markasread":
         case "markAsRead": return getOrCreateConfiguration(target).isMarkAsRead();
@@ -112,6 +123,15 @@ public class GoogleMailStreamComponentConfigurer extends PropertyConfigurerSuppo
         case "query": return getOrCreateConfiguration(target).getQuery();
         case "refreshtoken":
         case "refreshToken": return getOrCreateConfiguration(target).getRefreshToken();
+        case "scopes": return getOrCreateConfiguration(target).getScopes();
+        default: return null;
+        }
+    }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes": return java.lang.String.class;
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointConfigurer.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointConfigurer.java
index 7dc685d..f455728 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointConfigurer.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointConfigurer.java
@@ -38,6 +38,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "clientsecret":
         case "clientSecret": target.getConfiguration().setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "delegate": target.getConfiguration().setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
@@ -45,6 +46,8 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "greedy": target.setGreedy(property(camelContext, boolean.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyresource":
+        case "keyResource": target.getConfiguration().setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "labels": target.getConfiguration().setLabels(property(camelContext, java.lang.String.class, value)); return true;
         case "markasread":
         case "markAsRead": target.getConfiguration().setMarkAsRead(property(camelContext, boolean.class, value)); return true;
@@ -64,6 +67,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "scheduler": target.setScheduler(property(camelContext, java.lang.Object.class, value)); return true;
         case "schedulerproperties":
         case "schedulerProperties": target.setSchedulerProperties(property(camelContext, java.util.Map.class, value)); return true;
+        case "scopes": target.getConfiguration().setScopes(property(camelContext, java.util.List.class, value)); return true;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": target.setSendEmptyMessageWhenIdle(property(camelContext, boolean.class, value)); return true;
         case "startscheduler":
@@ -96,6 +100,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "delay": return long.class;
+        case "delegate": return java.lang.String.class;
         case "exceptionhandler":
         case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
         case "exchangepattern":
@@ -103,6 +108,8 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "greedy": return boolean.class;
         case "initialdelay":
         case "initialDelay": return long.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "labels": return java.lang.String.class;
         case "markasread":
         case "markAsRead": return boolean.class;
@@ -122,6 +129,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "scheduler": return java.lang.Object.class;
         case "schedulerproperties":
         case "schedulerProperties": return java.util.Map.class;
+        case "scopes": return java.util.List.class;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return boolean.class;
         case "startscheduler":
@@ -155,6 +163,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "clientsecret":
         case "clientSecret": return target.getConfiguration().getClientSecret();
         case "delay": return target.getDelay();
+        case "delegate": return target.getConfiguration().getDelegate();
         case "exceptionhandler":
         case "exceptionHandler": return target.getExceptionHandler();
         case "exchangepattern":
@@ -162,6 +171,8 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "greedy": return target.isGreedy();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
+        case "keyresource":
+        case "keyResource": return target.getConfiguration().getKeyResource();
         case "labels": return target.getConfiguration().getLabels();
         case "markasread":
         case "markAsRead": return target.getConfiguration().isMarkAsRead();
@@ -181,6 +192,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         case "scheduler": return target.getScheduler();
         case "schedulerproperties":
         case "schedulerProperties": return target.getSchedulerProperties();
+        case "scopes": return target.getConfiguration().getScopes();
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return target.isSendEmptyMessageWhenIdle();
         case "startscheduler":
@@ -198,6 +210,7 @@ public class GoogleMailStreamEndpointConfigurer extends PropertyConfigurerSuppor
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "schedulerproperties":
         case "schedulerProperties": return java.lang.Object.class;
+        case "scopes": return java.lang.String.class;
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointUriFactory.java b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointUriFactory.java
index 92291a1..bced1ea 100644
--- a/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointUriFactory.java
+++ b/components/camel-google/camel-google-mail/src/generated/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamEndpointUriFactory.java
@@ -21,10 +21,11 @@ public class GoogleMailStreamEndpointUriFactory extends org.apache.camel.support
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(29);
+        Set<String> props = new HashSet<>(32);
         props.add("backoffMultiplier");
         props.add("initialDelay");
         props.add("markAsRead");
+        props.add("delegate");
         props.add("scheduler");
         props.add("bridgeErrorHandler");
         props.add("useFixedDelay");
@@ -38,6 +39,7 @@ public class GoogleMailStreamEndpointUriFactory extends org.apache.camel.support
         props.add("repeatCount");
         props.add("timeUnit");
         props.add("clientId");
+        props.add("keyResource");
         props.add("query");
         props.add("sendEmptyMessageWhenIdle");
         props.add("schedulerProperties");
@@ -49,6 +51,7 @@ public class GoogleMailStreamEndpointUriFactory extends org.apache.camel.support
         props.add("delay");
         props.add("pollStrategy");
         props.add("startScheduler");
+        props.add("scopes");
         props.add("exceptionHandler");
         props.add("refreshToken");
         PROPERTY_NAMES = Collections.unmodifiableSet(props);
diff --git a/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/google-mail.json b/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/google-mail.json
index 7c666e5..a5ce728 100644
--- a/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/google-mail.json
+++ b/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/google-mail.json
@@ -27,7 +27,7 @@
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client ID of the mail application" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use the shared configuration" },
     "delegate": { "kind": "property", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
-    "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
+    "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.Collection<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "lazyStartProducer": { "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 fail during star [...]
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
@@ -44,7 +44,7 @@
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Client ID of the mail application" },
     "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of a parameter to be passed in the exchange In Body" },
-    "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
+    "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.Collection<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.GoogleMailConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
     "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
diff --git a/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/stream/google-mail-stream.json b/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/stream/google-mail-stream.json
index b204105..ebef81f 100644
--- a/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/stream/google-mail-stream.json
+++ b/components/camel-google/camel-google-mail/src/generated/resources/org/apache/camel/component/google/mail/stream/google-mail-stream.json
@@ -25,15 +25,18 @@
     "applicationName": { "kind": "property", "displayName": "Application Name", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Google mail application name. Example would be camel-google-mail\/1.0" },
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Client ID of the mail application" },
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "labels": { "kind": "property", "displayName": "Labels", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Comma separated list of labels to take into account" },
     "markAsRead": { "kind": "property", "displayName": "Mark As Read", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Mark the message as read once it has been consumed" },
     "maxResults": { "kind": "property", "displayName": "Max Results", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Max results to be returned" },
     "query": { "kind": "property", "displayName": "Query", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "is:unread", "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "The query to execute on gmail box" },
+    "scopes": { "kind": "property", "displayName": "Scopes", "group": "consumer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
     "autowiredEnabled": { "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which t [...]
     "clientFactory": { "kind": "property", "displayName": "Client Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.mail.GoogleMailClientFactory", "deprecated": false, "autowired": false, "secret": false, "description": "The client Factory" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "The configuration" },
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for lo [...]
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Client secret of the mail application" },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken  [...]
   },
   "properties": {
@@ -41,10 +44,12 @@
     "applicationName": { "kind": "parameter", "displayName": "Application Name", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Google mail application name. Example would be camel-google-mail\/1.0" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Client ID of the mail application" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "labels": { "kind": "parameter", "displayName": "Labels", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Comma separated list of labels to take into account" },
     "markAsRead": { "kind": "parameter", "displayName": "Mark As Read", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Mark the message as read once it has been consumed" },
     "maxResults": { "kind": "parameter", "displayName": "Max Results", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Max results to be returned" },
     "query": { "kind": "parameter", "displayName": "Query", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "is:unread", "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "The query to execute on gmail box" },
+    "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "consumer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "GMail scopes" },
     "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
     "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the con [...]
     "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
@@ -65,6 +70,7 @@
     "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for l [...]
     "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Client secret of the mail application" },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.mail.stream.GoogleMailStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken [...]
   }
 }
diff --git a/components/camel-google/camel-google-mail/src/main/docs/google-mail-component.adoc b/components/camel-google/camel-google-mail/src/main/docs/google-mail-component.adoc
index aced1e6..2468f83 100644
--- a/components/camel-google/camel-google-mail/src/main/docs/google-mail-component.adoc
+++ b/components/camel-google/camel-google-mail/src/main/docs/google-mail-component.adoc
@@ -29,6 +29,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is
 the https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/gmail/api/auth/scopes[GMail API Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-mail/src/main/docs/google-mail-stream-component.adoc b/components/camel-google/camel-google-mail/src/main/docs/google-mail-stream-component.adoc
index 1eb6914..fd0217a 100644
--- a/components/camel-google/camel-google-mail/src/main/docs/google-mail-stream-component.adoc
+++ b/components/camel-google/camel-google-mail/src/main/docs/google-mail-stream-component.adoc
@@ -29,6 +29,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is
 the https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/gmail/api/auth/scopes[GMail API Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/BatchGoogleMailClientFactory.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/BatchGoogleMailClientFactory.java
index 5fe1f1b..b3fa0ef 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/BatchGoogleMailClientFactory.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/BatchGoogleMailClientFactory.java
@@ -17,7 +17,7 @@
 package org.apache.camel.component.google.mail;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.Collection;
 
 import com.google.api.client.auth.oauth2.Credential;
 import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
@@ -42,7 +42,8 @@ public class BatchGoogleMailClientFactory implements GoogleMailClientFactory {
 
     @Override
     public Gmail makeClient(
-            String clientId, String clientSecret, String applicationName, String refreshToken, String accessToken) {
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken) {
         if (clientId == null || clientSecret == null) {
             throw new IllegalArgumentException("clientId and clientSecret are required to create Gmail client.");
         }
@@ -70,12 +71,12 @@ public class BatchGoogleMailClientFactory implements GoogleMailClientFactory {
 
     @Override
     public Gmail makeClient(
-            CamelContext camelContext, String keyResource, String applicationName, String delegate, List<String> gmailScopes) {
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate) {
         if (keyResource == null) {
             throw new IllegalArgumentException("keyResource is required to create Gmail client.");
         }
         try {
-            Credential credential = authorizeServiceAccount(camelContext, keyResource, delegate, gmailScopes);
+            Credential credential = authorizeServiceAccount(camelContext, keyResource, delegate, scopes);
             return new Gmail.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
         } catch (Exception e) {
             throw new RuntimeCamelException("Could not create Gmail client.", e);
@@ -83,12 +84,13 @@ public class BatchGoogleMailClientFactory implements GoogleMailClientFactory {
     }
 
     private Credential authorizeServiceAccount(
-            CamelContext camelContext, String keyResource, String delegate, List<String> gmailScopes) {
+            CamelContext camelContext, String keyResource, String delegate, Collection<String> scopes) {
         // authorize
         try {
             GoogleCredential cred = GoogleCredential
-                    .fromStream(ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, keyResource))
-                    .createScoped(gmailScopes != null && gmailScopes.size() != 0 ? gmailScopes : null)
+                    .fromStream(ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, keyResource), transport,
+                            jsonFactory)
+                    .createScoped(scopes != null && scopes.size() != 0 ? scopes : null)
                     .createDelegated(delegate);
             cred.refreshToken();
             return cred;
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailClientFactory.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailClientFactory.java
index ecee7ed..e4cd9ad 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailClientFactory.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailClientFactory.java
@@ -16,15 +16,17 @@
  */
 package org.apache.camel.component.google.mail;
 
-import java.util.List;
+import java.util.Collection;
 
 import com.google.api.services.gmail.Gmail;
 import org.apache.camel.CamelContext;
 
 public interface GoogleMailClientFactory {
 
-    Gmail makeClient(String clientId, String clientSecret, String applicationName, String refreshToken, String accessToken);
+    Gmail makeClient(
+            String clientId, String clientSecret, Collection<String> scopes, String applicationName, String refreshToken,
+            String accessToken);
 
     Gmail makeClient(
-            CamelContext camelContext, String keyResource, String applicationName, String delegate, List<String> gmailScopes);
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate);
 }
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponent.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponent.java
index d1efa7f..e05a8e1 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponent.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponent.java
@@ -51,17 +51,19 @@ public class GoogleMailComponent
         return getCamelContext().getTypeConverter().convertTo(GoogleMailApiName.class, apiNameStr);
     }
 
-    public Gmail getClient(GoogleMailConfiguration googleMailConfiguration) {
+    public Gmail getClient(GoogleMailConfiguration config) {
         if (client == null) {
-            if (googleMailConfiguration.getClientSecret() != null) {
-                client = getClientFactory().makeClient(googleMailConfiguration.getClientId(),
-                        googleMailConfiguration.getClientSecret(),
-                        googleMailConfiguration.getApplicationName(),
-                        googleMailConfiguration.getRefreshToken(), googleMailConfiguration.getAccessToken());
-            } else if (googleMailConfiguration.getKeyResource() != null) {
-                client = getClientFactory().makeClient(getCamelContext(), googleMailConfiguration.getKeyResource(),
-                        googleMailConfiguration.getApplicationName(), googleMailConfiguration.getDelegate(),
-                        googleMailConfiguration.getScopes());
+            if (config.getClientId() != null && !config.getClientId().isBlank()
+                    && config.getClientSecret() != null && !config.getClientSecret().isBlank()) {
+                client = getClientFactory().makeClient(config.getClientId(),
+                        config.getClientSecret(), config.getScopes(),
+                        config.getApplicationName(), config.getRefreshToken(), config.getAccessToken());
+            } else if (config.getKeyResource() != null && !config.getKeyResource().isBlank()) {
+                client = getClientFactory().makeClient(getCamelContext(), config.getKeyResource(),
+                        config.getScopes(), config.getApplicationName(), config.getDelegate());
+            } else {
+                throw new IllegalArgumentException(
+                        "(clientId and clientSecret) or keyResource are required to create Gmail client");
             }
         }
         return client;
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponentVerifierExtension.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponentVerifierExtension.java
index 9672a97..4f76c9c 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponentVerifierExtension.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailComponentVerifierExtension.java
@@ -64,12 +64,11 @@ public class GoogleMailComponentVerifierExtension extends DefaultComponentVerifi
             Gmail client = null;
             if (configuration.getClientSecret() != null) {
                 client = clientFactory.makeClient(configuration.getClientId(), configuration.getClientSecret(),
-                        configuration.getApplicationName(),
+                        configuration.getScopes(), configuration.getApplicationName(),
                         configuration.getRefreshToken(), configuration.getAccessToken());
             } else if (configuration.getKeyResource() != null) {
                 client = clientFactory.makeClient(getCamelContext(), configuration.getKeyResource(),
-                        configuration.getApplicationName(), configuration.getDelegate(),
-                        configuration.getScopes());
+                        configuration.getScopes(), configuration.getApplicationName(), configuration.getDelegate());
             }
             client.users().getProfile((String) parameters.get("userId")).execute();
         } catch (Exception e) {
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailConfiguration.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailConfiguration.java
index 5632934..7b99a49 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailConfiguration.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/GoogleMailConfiguration.java
@@ -1,172 +1,172 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.google.mail;
-
-import java.util.List;
-
-import org.apache.camel.component.google.mail.internal.GoogleMailApiName;
-import org.apache.camel.spi.Configurer;
-import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.UriParam;
-import org.apache.camel.spi.UriParams;
-import org.apache.camel.spi.UriPath;
-
-/**
- * Component configuration for GoogleMail component.
- */
-@UriParams
-@Configurer(extended = true)
-public class GoogleMailConfiguration {
-    @UriPath
-    @Metadata(required = true)
-    private GoogleMailApiName apiName;
-    @UriPath(enums = "attachments,create,delete,get,getProfile,gmailImport,insert,list,modify,patch,send,stop,trash,untrash,update,watch")
-    @Metadata(required = true)
-    private String methodName;
-    @UriParam
-    private String clientId;
-    @UriParam(label = "security", secret = true)
-    private String clientSecret;
-    @UriParam(label = "security", secret = true)
-    private String accessToken;
-    @UriParam(label = "security", secret = true)
-    private String refreshToken;
-    @UriParam
-    private String applicationName;
-    /* Service account */
-    @UriParam(label = "security")
-    private String keyResource;
-    @UriParam
-    private String delegate;
-    @UriParam
-    private List<String> scopes;
-
-    public GoogleMailApiName getApiName() {
-        return apiName;
-    }
-
-    /**
-     * What kind of operation to perform
-     */
-    public void setApiName(GoogleMailApiName apiName) {
-        this.apiName = apiName;
-    }
-
-    public String getMethodName() {
-        return methodName;
-    }
-
-    /**
-     * What sub operation to use for the selected operation
-     */
-    public void setMethodName(String methodName) {
-        this.methodName = methodName;
-    }
-
-    public String getClientId() {
-        return clientId;
-    }
-
-    /**
-     * Client ID of the mail application
-     */
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
-
-    public String getClientSecret() {
-        return clientSecret;
-    }
-
-    /**
-     * Client secret of the mail application
-     */
-    public void setClientSecret(String clientSecret) {
-        this.clientSecret = clientSecret;
-    }
-
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    /**
-     * OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage.
-     */
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public String getRefreshToken() {
-        return refreshToken;
-    }
-
-    /**
-     * OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever the
-     * current one expires - a necessity if the application is long-lived.
-     */
-    public void setRefreshToken(String refreshToken) {
-        this.refreshToken = refreshToken;
-    }
-
-    public String getApplicationName() {
-        return applicationName;
-    }
-
-    /**
-     * Google mail application name. Example would be "camel-google-mail/1.0"
-     */
-    public void setApplicationName(String applicationName) {
-        this.applicationName = applicationName;
-    }
-
-    public String getKeyResource() {
-        return keyResource;
-    }
-
-    /**
-     * Sets "*.json" file with credentials for Service account
-     * 
-     * @param keyResource String file, classpath, or http url
-     */
-    public void setKeyResource(String keyResource) {
-        this.keyResource = keyResource;
-    }
-
-    public String getDelegate() {
-        return delegate;
-    }
-
-    /**
-     * Delegate for wide-domain service account
-     */
-    public void setDelegate(String delegate) {
-        this.delegate = delegate;
-    }
-
-    public List<String> getScopes() {
-        return scopes;
-    }
-
-    /**
-     * GMail scopes
-     * 
-     * @see com.google.api.services.gmail.GmailScopes
-     */
-    public void setScopes(List<String> scopes) {
-        this.scopes = scopes;
-    }
-}
+/*
+ * 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.google.mail;
+
+import java.util.Collection;
+
+import org.apache.camel.component.google.mail.internal.GoogleMailApiName;
+import org.apache.camel.spi.Configurer;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+/**
+ * Component configuration for GoogleMail component.
+ */
+@UriParams
+@Configurer(extended = true)
+public class GoogleMailConfiguration {
+    @UriPath
+    @Metadata(required = true)
+    private GoogleMailApiName apiName;
+    @UriPath(enums = "attachments,create,delete,get,getProfile,gmailImport,insert,list,modify,patch,send,stop,trash,untrash,update,watch")
+    @Metadata(required = true)
+    private String methodName;
+    @UriParam
+    private String clientId;
+    @UriParam(label = "security", secret = true)
+    private String clientSecret;
+    @UriParam(label = "security", secret = true)
+    private String accessToken;
+    @UriParam(label = "security", secret = true)
+    private String refreshToken;
+    @UriParam
+    private String applicationName;
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
+    @UriParam
+    private Collection<String> scopes;
+
+    public GoogleMailApiName getApiName() {
+        return apiName;
+    }
+
+    /**
+     * What kind of operation to perform
+     */
+    public void setApiName(GoogleMailApiName apiName) {
+        this.apiName = apiName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    /**
+     * What sub operation to use for the selected operation
+     */
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    /**
+     * Client ID of the mail application
+     */
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public String getClientSecret() {
+        return clientSecret;
+    }
+
+    /**
+     * Client secret of the mail application
+     */
+    public void setClientSecret(String clientSecret) {
+        this.clientSecret = clientSecret;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    /**
+     * OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage.
+     */
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public String getRefreshToken() {
+        return refreshToken;
+    }
+
+    /**
+     * OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever the
+     * current one expires - a necessity if the application is long-lived.
+     */
+    public void setRefreshToken(String refreshToken) {
+        this.refreshToken = refreshToken;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    /**
+     * Google mail application name. Example would be "camel-google-mail/1.0"
+     */
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
+
+    public Collection<String> getScopes() {
+        return scopes;
+    }
+
+    /**
+     * GMail scopes
+     * 
+     * @see com.google.api.services.gmail.GmailScopes
+     */
+    public void setScopes(Collection<String> scopes) {
+        this.scopes = scopes;
+    }
+}
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponent.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponent.java
index 9cd28eb..90f119b 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponent.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponent.java
@@ -52,10 +52,16 @@ public class GoogleMailStreamComponent extends DefaultComponent {
 
     public Gmail getClient(GoogleMailStreamConfiguration googleMailConfiguration) {
         if (client == null) {
-            client = getClientFactory().makeClient(googleMailConfiguration.getClientId(),
-                    googleMailConfiguration.getClientSecret(),
-                    googleMailConfiguration.getApplicationName(), googleMailConfiguration.getRefreshToken(),
-                    googleMailConfiguration.getAccessToken());
+            if (googleMailConfiguration.getClientSecret() != null) {
+                client = getClientFactory().makeClient(googleMailConfiguration.getClientId(),
+                        googleMailConfiguration.getClientSecret(), googleMailConfiguration.getScopes(),
+                        googleMailConfiguration.getApplicationName(), googleMailConfiguration.getRefreshToken(),
+                        googleMailConfiguration.getAccessToken());
+            } else if (googleMailConfiguration.getKeyResource() != null) {
+                client = getClientFactory().makeClient(getCamelContext(), googleMailConfiguration.getKeyResource(),
+                        googleMailConfiguration.getScopes(), googleMailConfiguration.getApplicationName(),
+                        googleMailConfiguration.getDelegate());
+            }
         }
         return client;
     }
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentVerifierExtension.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentVerifierExtension.java
index b820c58..54c4723 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentVerifierExtension.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamComponentVerifierExtension.java
@@ -65,7 +65,7 @@ public class GoogleMailStreamComponentVerifierExtension extends DefaultComponent
             GoogleMailConfiguration configuration = setProperties(new GoogleMailConfiguration(), parameters);
             GoogleMailClientFactory clientFactory = new BatchGoogleMailClientFactory();
             Gmail client = clientFactory.makeClient(configuration.getClientId(), configuration.getClientSecret(),
-                    configuration.getApplicationName(),
+                    configuration.getScopes(), configuration.getApplicationName(),
                     configuration.getRefreshToken(), configuration.getAccessToken());
             client.users().getProfile((String) parameters.get("userId")).execute();
         } catch (Exception e) {
diff --git a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamConfiguration.java b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamConfiguration.java
index c992d9c..eba2ebf 100644
--- a/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamConfiguration.java
+++ b/components/camel-google/camel-google-mail/src/main/java/org/apache/camel/component/google/mail/stream/GoogleMailStreamConfiguration.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.google.mail.stream;
 
+import java.util.List;
+
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriParam;
@@ -48,6 +50,13 @@ public class GoogleMailStreamConfiguration implements Cloneable {
     private String labels;
     @UriParam(defaultValue = "true")
     private boolean markAsRead = true;
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
+    @UriParam
+    private List<String> scopes;
 
     public String getClientId() {
         return clientId;
@@ -160,6 +169,43 @@ public class GoogleMailStreamConfiguration implements Cloneable {
         this.markAsRead = markAsRead;
     }
 
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
+
+    public List<String> getScopes() {
+        return scopes;
+    }
+
+    /**
+     * GMail scopes
+     * 
+     * @see com.google.api.services.gmail.GmailScopes
+     */
+    public void setScopes(List<String> scopes) {
+        this.scopes = scopes;
+    }
+
     // *************************************************
     //
     // *************************************************
diff --git a/components/camel-google/camel-google-mail/src/test/java/org/apache/camel/component/google/mail/AbstractGoogleMailTestSupport.java b/components/camel-google/camel-google-mail/src/test/java/org/apache/camel/component/google/mail/AbstractGoogleMailTestSupport.java
index 1305881..7715a98 100644
--- a/components/camel-google/camel-google-mail/src/test/java/org/apache/camel/component/google/mail/AbstractGoogleMailTestSupport.java
+++ b/components/camel-google/camel-google-mail/src/test/java/org/apache/camel/component/google/mail/AbstractGoogleMailTestSupport.java
@@ -56,7 +56,8 @@ public class AbstractGoogleMailTestSupport extends CamelTestSupport {
 
         return !properties.getProperty("clientId", "").isEmpty()
                 && !properties.getProperty("clientSecret", "").isEmpty()
-                && !properties.getProperty("accessToken", "").isEmpty();
+                && !properties.getProperty("accessToken", "").isEmpty()
+                || !properties.getProperty("keyResource", "").isEmpty();
     }
 
     @Override
diff --git a/components/camel-google/camel-google-mail/src/test/resources/test-options.properties b/components/camel-google/camel-google-mail/src/test/resources/test-options.properties
index 95356df..1131bc1 100644
--- a/components/camel-google/camel-google-mail/src/test/resources/test-options.properties
+++ b/components/camel-google/camel-google-mail/src/test/resources/test-options.properties
@@ -24,3 +24,7 @@ clientSecret=
 applicationName=test
 accessToken=
 refreshToken=
+
+keyResource=
+scopes[]=
+delegate=
\ No newline at end of file
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsComponentConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsComponentConfigurer.java
index 9c26312..b3d7eb0 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsComponentConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsComponentConfigurer.java
@@ -23,6 +23,8 @@ public class GoogleSheetsComponentConfigurer extends PropertyConfigurerSupport i
         map.put("applicationName", java.lang.String.class);
         map.put("clientId", java.lang.String.class);
         map.put("configuration", org.apache.camel.component.google.sheets.GoogleSheetsConfiguration.class);
+        map.put("delegate", java.lang.String.class);
+        map.put("scopes", java.util.Collection.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("splitResult", boolean.class);
         map.put("lazyStartProducer", boolean.class);
@@ -30,6 +32,7 @@ public class GoogleSheetsComponentConfigurer extends PropertyConfigurerSupport i
         map.put("clientFactory", org.apache.camel.component.google.sheets.GoogleSheetsClientFactory.class);
         map.put("accessToken", java.lang.String.class);
         map.put("clientSecret", java.lang.String.class);
+        map.put("keyResource", java.lang.String.class);
         map.put("refreshToken", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -60,10 +63,14 @@ public class GoogleSheetsComponentConfigurer extends PropertyConfigurerSupport i
         case "clientsecret":
         case "clientSecret": getOrCreateConfiguration(target).setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.google.sheets.GoogleSheetsConfiguration.class, value)); return true;
+        case "delegate": getOrCreateConfiguration(target).setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "keyResource": getOrCreateConfiguration(target).setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "refreshtoken":
         case "refreshToken": getOrCreateConfiguration(target).setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes": getOrCreateConfiguration(target).setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "splitresult":
         case "splitResult": getOrCreateConfiguration(target).setSplitResult(property(camelContext, boolean.class, value)); return true;
         default: return false;
@@ -93,10 +100,14 @@ public class GoogleSheetsComponentConfigurer extends PropertyConfigurerSupport i
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "configuration": return org.apache.camel.component.google.sheets.GoogleSheetsConfiguration.class;
+        case "delegate": return java.lang.String.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "refreshtoken":
         case "refreshToken": return java.lang.String.class;
+        case "scopes": return java.util.Collection.class;
         case "splitresult":
         case "splitResult": return boolean.class;
         default: return null;
@@ -122,14 +133,26 @@ public class GoogleSheetsComponentConfigurer extends PropertyConfigurerSupport i
         case "clientsecret":
         case "clientSecret": return getOrCreateConfiguration(target).getClientSecret();
         case "configuration": return target.getConfiguration();
+        case "delegate": return getOrCreateConfiguration(target).getDelegate();
+        case "keyresource":
+        case "keyResource": return getOrCreateConfiguration(target).getKeyResource();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "refreshtoken":
         case "refreshToken": return getOrCreateConfiguration(target).getRefreshToken();
+        case "scopes": return getOrCreateConfiguration(target).getScopes();
         case "splitresult":
         case "splitResult": return getOrCreateConfiguration(target).isSplitResult();
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsConfigurationConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsConfigurationConfigurer.java
index a248aa1..4eed880 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsConfigurationConfigurer.java
@@ -25,8 +25,11 @@ public class GoogleSheetsConfigurationConfigurer extends org.apache.camel.suppor
         map.put("ApplicationName", java.lang.String.class);
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("SplitResult", boolean.class);
         ALL_OPTIONS = map;
     }
@@ -45,10 +48,16 @@ public class GoogleSheetsConfigurationConfigurer extends org.apache.camel.suppor
         case "ClientId": target.setClientId(property(camelContext, java.lang.String.class, value)); return true;
         case "clientsecret":
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes":
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "splitresult":
         case "SplitResult": target.setSplitResult(property(camelContext, boolean.class, value)); return true;
         default: return false;
@@ -73,10 +82,16 @@ public class GoogleSheetsConfigurationConfigurer extends org.apache.camel.suppor
         case "ClientId": return java.lang.String.class;
         case "clientsecret":
         case "ClientSecret": return java.lang.String.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
+        case "scopes":
+        case "Scopes": return java.util.Collection.class;
         case "splitresult":
         case "SplitResult": return boolean.class;
         default: return null;
@@ -97,14 +112,29 @@ public class GoogleSheetsConfigurationConfigurer extends org.apache.camel.suppor
         case "ClientId": return target.getClientId();
         case "clientsecret":
         case "ClientSecret": return target.getClientSecret();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
         case "RefreshToken": return target.getRefreshToken();
+        case "scopes":
+        case "Scopes": return target.getScopes();
         case "splitresult":
         case "SplitResult": return target.isSplitResult();
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointConfigurer.java
index bfee020..252ccfb 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointConfigurer.java
@@ -24,7 +24,9 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         map.put("methodName", java.lang.String.class);
         map.put("applicationName", java.lang.String.class);
         map.put("clientId", java.lang.String.class);
+        map.put("delegate", java.lang.String.class);
         map.put("inBody", java.lang.String.class);
+        map.put("scopes", java.util.Collection.class);
         map.put("bridgeErrorHandler", boolean.class);
         map.put("sendEmptyMessageWhenIdle", boolean.class);
         map.put("splitResult", boolean.class);
@@ -48,6 +50,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         map.put("useFixedDelay", boolean.class);
         map.put("accessToken", java.lang.String.class);
         map.put("clientSecret", java.lang.String.class);
+        map.put("keyResource", java.lang.String.class);
         map.put("refreshToken", java.lang.String.class);
         ALL_OPTIONS = map;
     }
@@ -73,6 +76,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "clientsecret":
         case "clientSecret": target.getConfiguration().setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "delegate": target.getConfiguration().setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
@@ -82,6 +86,8 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "inBody": target.setInBody(property(camelContext, java.lang.String.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyresource":
+        case "keyResource": target.getConfiguration().setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "pollstrategy":
@@ -97,6 +103,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "scheduler": target.setScheduler(property(camelContext, java.lang.Object.class, value)); return true;
         case "schedulerproperties":
         case "schedulerProperties": target.setSchedulerProperties(property(camelContext, java.util.Map.class, value)); return true;
+        case "scopes": target.getConfiguration().setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": target.setSendEmptyMessageWhenIdle(property(camelContext, boolean.class, value)); return true;
         case "splitresult":
@@ -136,6 +143,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "delay": return long.class;
+        case "delegate": return java.lang.String.class;
         case "exceptionhandler":
         case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
         case "exchangepattern":
@@ -145,6 +153,8 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "inBody": return java.lang.String.class;
         case "initialdelay":
         case "initialDelay": return long.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "pollstrategy":
@@ -160,6 +170,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "scheduler": return java.lang.Object.class;
         case "schedulerproperties":
         case "schedulerProperties": return java.util.Map.class;
+        case "scopes": return java.util.Collection.class;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return boolean.class;
         case "splitresult":
@@ -195,6 +206,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "clientsecret":
         case "clientSecret": return target.getConfiguration().getClientSecret();
         case "delay": return target.getDelay();
+        case "delegate": return target.getConfiguration().getDelegate();
         case "exceptionhandler":
         case "exceptionHandler": return target.getExceptionHandler();
         case "exchangepattern":
@@ -204,6 +216,8 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "inBody": return target.getInBody();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
+        case "keyresource":
+        case "keyResource": return target.getConfiguration().getKeyResource();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "pollstrategy":
@@ -219,6 +233,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         case "scheduler": return target.getScheduler();
         case "schedulerproperties":
         case "schedulerProperties": return target.getSchedulerProperties();
+        case "scopes": return target.getConfiguration().getScopes();
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return target.isSendEmptyMessageWhenIdle();
         case "splitresult":
@@ -238,6 +253,7 @@ public class GoogleSheetsEndpointConfigurer extends PropertyConfigurerSupport im
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "schedulerproperties":
         case "schedulerProperties": return java.lang.Object.class;
+        case "scopes": return java.lang.String.class;
         default: return null;
         }
     }
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointUriFactory.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointUriFactory.java
index 82b9b57..8a58fe4 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointUriFactory.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/GoogleSheetsEndpointUriFactory.java
@@ -21,7 +21,7 @@ public class GoogleSheetsEndpointUriFactory extends org.apache.camel.support.com
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(40);
+        Set<String> props = new HashSet<>(43);
         props.add("backoffMultiplier");
         props.add("apiName");
         props.add("batchClearValuesRequest");
@@ -31,6 +31,7 @@ public class GoogleSheetsEndpointUriFactory extends org.apache.camel.support.com
         props.add("splitResult");
         props.add("initialDelay");
         props.add("content");
+        props.add("delegate");
         props.add("scheduler");
         props.add("bridgeErrorHandler");
         props.add("useFixedDelay");
@@ -45,6 +46,7 @@ public class GoogleSheetsEndpointUriFactory extends org.apache.camel.support.com
         props.add("repeatCount");
         props.add("timeUnit");
         props.add("clientId");
+        props.add("keyResource");
         props.add("batchUpdateSpreadsheetRequest");
         props.add("sendEmptyMessageWhenIdle");
         props.add("schedulerProperties");
@@ -59,6 +61,7 @@ public class GoogleSheetsEndpointUriFactory extends org.apache.camel.support.com
         props.add("delay");
         props.add("pollStrategy");
         props.add("startScheduler");
+        props.add("scopes");
         props.add("inBody");
         props.add("exceptionHandler");
         props.add("refreshToken");
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsEndpointConfigurationConfigurer.java
index 866f81b..3ba034f 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsEndpointConfigurationConfigurer.java
@@ -27,9 +27,12 @@ public class SheetsSpreadsheetsEndpointConfigurationConfigurer extends org.apach
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.sheets.v4.model.Spreadsheet.class);
+        map.put("Delegate", java.lang.String.class);
         map.put("GetSpreadsheetByDataFilterRequest", com.google.api.services.sheets.v4.model.GetSpreadsheetByDataFilterRequest.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("SplitResult", boolean.class);
         map.put("SpreadsheetId", java.lang.String.class);
         ALL_OPTIONS = map;
@@ -53,12 +56,18 @@ public class SheetsSpreadsheetsEndpointConfigurationConfigurer extends org.apach
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.sheets.v4.model.Spreadsheet.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "getspreadsheetbydatafilterrequest":
         case "GetSpreadsheetByDataFilterRequest": target.setGetSpreadsheetByDataFilterRequest(property(camelContext, com.google.api.services.sheets.v4.model.GetSpreadsheetByDataFilterRequest.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes":
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "splitresult":
         case "SplitResult": target.setSplitResult(property(camelContext, boolean.class, value)); return true;
         case "spreadsheetid":
@@ -89,12 +98,18 @@ public class SheetsSpreadsheetsEndpointConfigurationConfigurer extends org.apach
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.sheets.v4.model.Spreadsheet.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
         case "getspreadsheetbydatafilterrequest":
         case "GetSpreadsheetByDataFilterRequest": return com.google.api.services.sheets.v4.model.GetSpreadsheetByDataFilterRequest.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
+        case "scopes":
+        case "Scopes": return java.util.Collection.class;
         case "splitresult":
         case "SplitResult": return boolean.class;
         case "spreadsheetid":
@@ -121,12 +136,18 @@ public class SheetsSpreadsheetsEndpointConfigurationConfigurer extends org.apach
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
         case "getspreadsheetbydatafilterrequest":
         case "GetSpreadsheetByDataFilterRequest": return target.getGetSpreadsheetByDataFilterRequest();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "refreshtoken":
         case "RefreshToken": return target.getRefreshToken();
+        case "scopes":
+        case "Scopes": return target.getScopes();
         case "splitresult":
         case "SplitResult": return target.isSplitResult();
         case "spreadsheetid":
@@ -134,5 +155,14 @@ public class SheetsSpreadsheetsEndpointConfigurationConfigurer extends org.apach
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesEndpointConfigurationConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesEndpointConfigurationConfigurer.java
index 06afdaf..03f1140 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesEndpointConfigurationConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesEndpointConfigurationConfigurer.java
@@ -31,9 +31,12 @@ public class SheetsSpreadsheetsValuesEndpointConfigurationConfigurer extends org
         map.put("ClientId", java.lang.String.class);
         map.put("ClientSecret", java.lang.String.class);
         map.put("Content", com.google.api.services.sheets.v4.model.BatchClearValuesByDataFilterRequest.class);
+        map.put("Delegate", java.lang.String.class);
+        map.put("KeyResource", java.lang.String.class);
         map.put("MethodName", java.lang.String.class);
         map.put("Range", java.lang.String.class);
         map.put("RefreshToken", java.lang.String.class);
+        map.put("Scopes", java.util.Collection.class);
         map.put("SplitResult", boolean.class);
         map.put("SpreadsheetId", java.lang.String.class);
         map.put("Values", com.google.api.services.sheets.v4.model.ValueRange.class);
@@ -66,12 +69,18 @@ public class SheetsSpreadsheetsValuesEndpointConfigurationConfigurer extends org
         case "ClientSecret": target.setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "content":
         case "Content": target.setContent(property(camelContext, com.google.api.services.sheets.v4.model.BatchClearValuesByDataFilterRequest.class, value)); return true;
+        case "delegate":
+        case "Delegate": target.setDelegate(property(camelContext, java.lang.String.class, value)); return true;
+        case "keyresource":
+        case "KeyResource": target.setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "methodname":
         case "MethodName": target.setMethodName(property(camelContext, java.lang.String.class, value)); return true;
         case "range":
         case "Range": target.setRange(property(camelContext, java.lang.String.class, value)); return true;
         case "refreshtoken":
         case "RefreshToken": target.setRefreshToken(property(camelContext, java.lang.String.class, value)); return true;
+        case "scopes":
+        case "Scopes": target.setScopes(property(camelContext, java.util.Collection.class, value)); return true;
         case "splitresult":
         case "SplitResult": target.setSplitResult(property(camelContext, boolean.class, value)); return true;
         case "spreadsheetid":
@@ -112,12 +121,18 @@ public class SheetsSpreadsheetsValuesEndpointConfigurationConfigurer extends org
         case "ClientSecret": return java.lang.String.class;
         case "content":
         case "Content": return com.google.api.services.sheets.v4.model.BatchClearValuesByDataFilterRequest.class;
+        case "delegate":
+        case "Delegate": return java.lang.String.class;
+        case "keyresource":
+        case "KeyResource": return java.lang.String.class;
         case "methodname":
         case "MethodName": return java.lang.String.class;
         case "range":
         case "Range": return java.lang.String.class;
         case "refreshtoken":
         case "RefreshToken": return java.lang.String.class;
+        case "scopes":
+        case "Scopes": return java.util.Collection.class;
         case "splitresult":
         case "SplitResult": return boolean.class;
         case "spreadsheetid":
@@ -154,12 +169,18 @@ public class SheetsSpreadsheetsValuesEndpointConfigurationConfigurer extends org
         case "ClientSecret": return target.getClientSecret();
         case "content":
         case "Content": return target.getContent();
+        case "delegate":
+        case "Delegate": return target.getDelegate();
+        case "keyresource":
+        case "KeyResource": return target.getKeyResource();
         case "methodname":
         case "MethodName": return target.getMethodName();
         case "range":
         case "Range": return target.getRange();
         case "refreshtoken":
         case "RefreshToken": return target.getRefreshToken();
+        case "scopes":
+        case "Scopes": return target.getScopes();
         case "splitresult":
         case "SplitResult": return target.isSplitResult();
         case "spreadsheetid":
@@ -169,5 +190,14 @@ public class SheetsSpreadsheetsValuesEndpointConfigurationConfigurer extends org
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "scopes":
+        case "Scopes": return java.lang.String.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponentConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponentConfigurer.java
index 8c0ae6d..4dee045 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponentConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponentConfigurer.java
@@ -43,8 +43,11 @@ public class GoogleSheetsStreamComponentConfigurer extends PropertyConfigurerSup
         case "clientsecret":
         case "clientSecret": getOrCreateConfiguration(target).setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration.class, value)); return true;
+        case "delegate": getOrCreateConfiguration(target).setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "includegriddata":
         case "includeGridData": getOrCreateConfiguration(target).setIncludeGridData(property(camelContext, boolean.class, value)); return true;
+        case "keyresource":
+        case "keyResource": getOrCreateConfiguration(target).setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "majordimension":
         case "majorDimension": getOrCreateConfiguration(target).setMajorDimension(property(camelContext, java.lang.String.class, value)); return true;
         case "maxresults":
@@ -79,8 +82,11 @@ public class GoogleSheetsStreamComponentConfigurer extends PropertyConfigurerSup
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "configuration": return org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration.class;
+        case "delegate": return java.lang.String.class;
         case "includegriddata":
         case "includeGridData": return boolean.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "majordimension":
         case "majorDimension": return java.lang.String.class;
         case "maxresults":
@@ -116,8 +122,11 @@ public class GoogleSheetsStreamComponentConfigurer extends PropertyConfigurerSup
         case "clientsecret":
         case "clientSecret": return getOrCreateConfiguration(target).getClientSecret();
         case "configuration": return target.getConfiguration();
+        case "delegate": return getOrCreateConfiguration(target).getDelegate();
         case "includegriddata":
         case "includeGridData": return getOrCreateConfiguration(target).isIncludeGridData();
+        case "keyresource":
+        case "keyResource": return getOrCreateConfiguration(target).getKeyResource();
         case "majordimension":
         case "majorDimension": return getOrCreateConfiguration(target).getMajorDimension();
         case "maxresults":
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointConfigurer.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointConfigurer.java
index 840297c..de5e1b0 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointConfigurer.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointConfigurer.java
@@ -38,6 +38,7 @@ public class GoogleSheetsStreamEndpointConfigurer extends PropertyConfigurerSupp
         case "clientsecret":
         case "clientSecret": target.getConfiguration().setClientSecret(property(camelContext, java.lang.String.class, value)); return true;
         case "delay": target.setDelay(property(camelContext, long.class, value)); return true;
+        case "delegate": target.getConfiguration().setDelegate(property(camelContext, java.lang.String.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
@@ -47,6 +48,8 @@ public class GoogleSheetsStreamEndpointConfigurer extends PropertyConfigurerSupp
         case "includeGridData": target.getConfiguration().setIncludeGridData(property(camelContext, boolean.class, value)); return true;
         case "initialdelay":
         case "initialDelay": target.setInitialDelay(property(camelContext, long.class, value)); return true;
+        case "keyresource":
+        case "keyResource": target.getConfiguration().setKeyResource(property(camelContext, java.lang.String.class, value)); return true;
         case "majordimension":
         case "majorDimension": target.getConfiguration().setMajorDimension(property(camelContext, java.lang.String.class, value)); return true;
         case "maxresults":
@@ -102,6 +105,7 @@ public class GoogleSheetsStreamEndpointConfigurer extends PropertyConfigurerSupp
         case "clientsecret":
         case "clientSecret": return java.lang.String.class;
         case "delay": return long.class;
+        case "delegate": return java.lang.String.class;
         case "exceptionhandler":
         case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class;
         case "exchangepattern":
@@ -111,6 +115,8 @@ public class GoogleSheetsStreamEndpointConfigurer extends PropertyConfigurerSupp
         case "includeGridData": return boolean.class;
         case "initialdelay":
         case "initialDelay": return long.class;
+        case "keyresource":
+        case "keyResource": return java.lang.String.class;
         case "majordimension":
         case "majorDimension": return java.lang.String.class;
         case "maxresults":
@@ -167,6 +173,7 @@ public class GoogleSheetsStreamEndpointConfigurer extends PropertyConfigurerSupp
         case "clientsecret":
         case "clientSecret": return target.getConfiguration().getClientSecret();
         case "delay": return target.getDelay();
+        case "delegate": return target.getConfiguration().getDelegate();
         case "exceptionhandler":
         case "exceptionHandler": return target.getExceptionHandler();
         case "exchangepattern":
@@ -176,6 +183,8 @@ public class GoogleSheetsStreamEndpointConfigurer extends PropertyConfigurerSupp
         case "includeGridData": return target.getConfiguration().isIncludeGridData();
         case "initialdelay":
         case "initialDelay": return target.getInitialDelay();
+        case "keyresource":
+        case "keyResource": return target.getConfiguration().getKeyResource();
         case "majordimension":
         case "majorDimension": return target.getConfiguration().getMajorDimension();
         case "maxresults":
diff --git a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointUriFactory.java b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointUriFactory.java
index 715f732..7c987ba 100644
--- a/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointUriFactory.java
+++ b/components/camel-google/camel-google-sheets/src/generated/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamEndpointUriFactory.java
@@ -21,11 +21,12 @@ public class GoogleSheetsStreamEndpointUriFactory extends org.apache.camel.suppo
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(32);
+        Set<String> props = new HashSet<>(34);
         props.add("backoffMultiplier");
         props.add("majorDimension");
         props.add("range");
         props.add("initialDelay");
+        props.add("delegate");
         props.add("scheduler");
         props.add("bridgeErrorHandler");
         props.add("useFixedDelay");
@@ -40,6 +41,7 @@ public class GoogleSheetsStreamEndpointUriFactory extends org.apache.camel.suppo
         props.add("repeatCount");
         props.add("timeUnit");
         props.add("clientId");
+        props.add("keyResource");
         props.add("sendEmptyMessageWhenIdle");
         props.add("schedulerProperties");
         props.add("splitResults");
diff --git a/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/google-sheets.json b/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/google-sheets.json
index eac5da0..982b3d4 100644
--- a/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/google-sheets.json
+++ b/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/google-sheets.json
@@ -27,6 +27,8 @@
     "applicationName": { "kind": "property", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Google Sheets application name. Example would be camel-google-sheets\/1.0" },
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Client ID of the sheets application" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "common", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use the shared configuration" },
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
+    "scopes": { "kind": "property", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.Collection<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Sheets scopes" },
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "splitResult": { "kind": "property", "displayName": "Split Result", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "When consumer return an array or collection this will generate one exchange per element, a [...]
     "lazyStartProducer": { "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 fail during star [...]
@@ -34,6 +36,7 @@
     "clientFactory": { "kind": "property", "displayName": "Client Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.sheets.GoogleSheetsClientFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use the GoogleSheetsClientFactory as factory for creating the client. Will by default use BatchGoogleSheetsClientFactory" },
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term u [...]
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Client secret of the sheets application" },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Sheets component can obtain a new accessToken whenever th [...]
   },
   "properties": {
@@ -41,7 +44,9 @@
     "methodName": { "kind": "path", "displayName": "Method Name", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "enum": [ "create", "get", "update", "append", "batchUpdate", "clear" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "What sub operation to use [...]
     "applicationName": { "kind": "parameter", "displayName": "Application Name", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Google Sheets application name. Example would be camel-google-sheets\/1.0" },
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Client ID of the sheets application" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "inBody": { "kind": "parameter", "displayName": "In Body", "group": "common", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the name of a parameter to be passed in the exchange In Body" },
+    "scopes": { "kind": "parameter", "displayName": "Scopes", "group": "common", "label": "", "required": false, "type": "array", "javaType": "java.util.Collection<java.lang.String>", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Sheets scopes" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
     "sendEmptyMessageWhenIdle": { "kind": "parameter", "displayName": "Send Empty Message When Idle", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead." },
     "splitResult": { "kind": "parameter", "displayName": "Split Result", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "When consumer return an array or collection this will generate one exchange per element,  [...]
@@ -65,6 +70,7 @@
     "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term  [...]
     "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Client secret of the sheets application" },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.GoogleSheetsConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Sheets component can obtain a new accessToken whenever t [...]
   },
   "apis": {
diff --git a/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/stream/google-sheets-stream.json b/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/stream/google-sheets-stream.json
index 6e54be5..34eb0ae 100644
--- a/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/stream/google-sheets-stream.json
+++ b/components/camel-google/camel-google-sheets/src/generated/resources/org/apache/camel/component/google/sheets/stream/google-sheets-stream.json
@@ -27,6 +27,7 @@
     "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a me [...]
     "clientId": { "kind": "property", "displayName": "Client Id", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Client ID of the sheets application" },
     "configuration": { "kind": "property", "displayName": "Configuration", "group": "consumer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "To use the shared configuration" },
+    "delegate": { "kind": "property", "displayName": "Delegate", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "includeGridData": { "kind": "property", "displayName": "Include Grid Data", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "True if grid data should be returned." },
     "majorDimension": { "kind": "property", "displayName": "Major Dimension", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "ROWS", "COLUMNS", "DIMENSION_UNSPECIFIED" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ROWS", "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Specifies the [...]
     "maxResults": { "kind": "property", "displayName": "Max Results", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Specify the maximum number of returned results. This will limit the number of rows in a returned value range data [...]
@@ -38,6 +39,7 @@
     "clientFactory": { "kind": "property", "displayName": "Client Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.google.sheets.GoogleSheetsClientFactory", "deprecated": false, "autowired": false, "secret": false, "description": "To use the GoogleSheetsClientFactory as factory for creating the client. Will by default use BatchGoogleSheetsClientFactory" },
     "accessToken": { "kind": "property", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended fo [...]
     "clientSecret": { "kind": "property", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Client secret of the sheets application" },
+    "keyResource": { "kind": "property", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "property", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessTo [...]
   },
   "properties": {
@@ -45,6 +47,7 @@
     "applicationName": { "kind": "parameter", "displayName": "Application Name", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Google sheets application name. Example would be camel-google-sheets\/1.0" },
     "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a m [...]
     "clientId": { "kind": "parameter", "displayName": "Client Id", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Client ID of the sheets application" },
+    "delegate": { "kind": "parameter", "displayName": "Delegate", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Delegate for wide-domain service account" },
     "includeGridData": { "kind": "parameter", "displayName": "Include Grid Data", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "True if grid data should be returned." },
     "majorDimension": { "kind": "parameter", "displayName": "Major Dimension", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "ROWS", "COLUMNS", "DIMENSION_UNSPECIFIED" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ROWS", "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Specifies th [...]
     "maxResults": { "kind": "parameter", "displayName": "Max Results", "group": "consumer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Specify the maximum number of returned results. This will limit the number of rows in a returned value range dat [...]
@@ -72,6 +75,7 @@
     "useFixedDelay": { "kind": "parameter", "displayName": "Use Fixed Delay", "group": "scheduler", "label": "consumer,scheduler", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details." },
     "accessToken": { "kind": "parameter", "displayName": "Access Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 access token. This typically expires after an hour so refreshToken is recommended f [...]
     "clientSecret": { "kind": "parameter", "displayName": "Client Secret", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Client secret of the sheets application" },
+    "keyResource": { "kind": "parameter", "displayName": "Key Resource", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "Sets .json file with credentials for Service account" },
     "refreshToken": { "kind": "parameter", "displayName": "Refresh Token", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConfiguration", "configurationField": "configuration", "description": "OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessT [...]
   }
 }
diff --git a/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-component.adoc b/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-component.adoc
index 3a32af9..27571bf 100644
--- a/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-component.adoc
+++ b/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-component.adoc
@@ -29,6 +29,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is
 the https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/sheets/api/guides/authorizing[Sheets API Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-stream-component.adoc b/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-stream-component.adoc
index 85484a0..e281149 100644
--- a/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-stream-component.adoc
+++ b/components/camel-google/camel-google-sheets/src/main/docs/google-sheets-stream-component.adoc
@@ -29,6 +29,12 @@ clientId, clientSecret, and a refreshToken. A handy resource for
 generating a long-lived refreshToken is
 the https://developers.google.com/oauthplayground[OAuth playground].
 
+In the case of a https://developers.google.com/identity/protocols/oauth2#serviceaccount[service account],
+credentials comprise of a JSON-file (keyResource). You can also use
+https://developers.google.com/identity/protocols/oauth2/service-account#delegatingauthority[delegation domain-wide authority]
+(delegate) and one, several, or all possible
+https://developers.google.com/sheets/api/guides/authorizing[Sheets API Auth Scopes] (scopes).
+
 Maven users will need to add the following dependency to their pom.xml
 for this component:
 
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/BatchGoogleSheetsClientFactory.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/BatchGoogleSheetsClientFactory.java
index 9801cfe..af17075 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/BatchGoogleSheetsClientFactory.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/BatchGoogleSheetsClientFactory.java
@@ -1,97 +1,135 @@
-/*
- * 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.google.sheets;
-
-import com.google.api.client.auth.oauth2.Credential;
-import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
-import com.google.api.client.http.HttpTransport;
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.sheets.v4.Sheets;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.util.ObjectHelper;
-
-public class BatchGoogleSheetsClientFactory implements GoogleSheetsClientFactory {
-
-    private final HttpTransport transport;
-    private final JacksonFactory jsonFactory;
-
-    public BatchGoogleSheetsClientFactory() {
-        this(new NetHttpTransport(), new JacksonFactory());
-    }
-
-    public BatchGoogleSheetsClientFactory(HttpTransport httpTransport) {
-        this(httpTransport, new JacksonFactory());
-    }
-
-    public BatchGoogleSheetsClientFactory(HttpTransport httpTransport, JacksonFactory jacksonFactory) {
-        this.transport = httpTransport;
-        this.jsonFactory = jacksonFactory;
-    }
-
-    @Override
-    public Sheets makeClient(
-            String clientId,
-            String clientSecret,
-            String applicationName,
-            String refreshToken,
-            String accessToken) {
-        if (clientId == null || clientSecret == null) {
-            throw new IllegalArgumentException("clientId and clientSecret are required to create Google Sheets client.");
-        }
-
-        try {
-            Credential credential = authorize(clientId, clientSecret, refreshToken, accessToken);
-
-            Sheets.Builder clientBuilder = new Sheets.Builder(transport, jsonFactory, credential)
-                    .setApplicationName(applicationName);
-            configure(clientBuilder);
-            return clientBuilder.build();
-        } catch (Exception e) {
-            throw new RuntimeCamelException("Could not create Google Sheets client.", e);
-        }
-    }
-
-    /**
-     * Subclasses may add customized configuration to client builder.
-     * 
-     * @param clientBuilder
-     */
-    protected void configure(Sheets.Builder clientBuilder) {
-        clientBuilder.setRootUrl(Sheets.DEFAULT_ROOT_URL);
-    }
-
-    // Authorizes the installed application to access user's protected data.
-    private Credential authorize(String clientId, String clientSecret, String refreshToken, String accessToken) {
-        // authorize
-        Credential credential = new GoogleCredential.Builder()
-                .setJsonFactory(jsonFactory)
-                .setTransport(transport)
-                .setClientSecrets(clientId, clientSecret)
-                .build();
-
-        if (ObjectHelper.isNotEmpty(refreshToken)) {
-            credential.setRefreshToken(refreshToken);
-        }
-
-        if (ObjectHelper.isNotEmpty(accessToken)) {
-            credential.setAccessToken(accessToken);
-        }
-
-        return credential;
-    }
-}
+/*
+ * 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.google.sheets;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import com.google.api.client.auth.oauth2.Credential;
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.sheets.v4.Sheets;
+import org.apache.camel.CamelContext;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.util.ObjectHelper;
+
+public class BatchGoogleSheetsClientFactory implements GoogleSheetsClientFactory {
+
+    private final HttpTransport transport;
+    private final JacksonFactory jsonFactory;
+
+    public BatchGoogleSheetsClientFactory() {
+        this(new NetHttpTransport(), new JacksonFactory());
+    }
+
+    public BatchGoogleSheetsClientFactory(HttpTransport httpTransport) {
+        this(httpTransport, new JacksonFactory());
+    }
+
+    public BatchGoogleSheetsClientFactory(HttpTransport httpTransport, JacksonFactory jacksonFactory) {
+        this.transport = httpTransport;
+        this.jsonFactory = jacksonFactory;
+    }
+
+    @Override
+    public Sheets makeClient(
+            String clientId,
+            String clientSecret,
+            Collection<String> scopes,
+            String applicationName,
+            String refreshToken,
+            String accessToken) {
+        if (clientId == null || clientSecret == null) {
+            throw new IllegalArgumentException("clientId and clientSecret are required to create Google Sheets client.");
+        }
+
+        try {
+            Credential credential = authorize(clientId, clientSecret, scopes, refreshToken, accessToken);
+
+            Sheets.Builder clientBuilder = new Sheets.Builder(transport, jsonFactory, credential)
+                    .setApplicationName(applicationName);
+            configure(clientBuilder);
+            return clientBuilder.build();
+        } catch (Exception e) {
+            throw new RuntimeCamelException("Could not create Google Sheets client.", e);
+        }
+    }
+
+    /**
+     * Subclasses may add customized configuration to client builder.
+     * 
+     * @param clientBuilder
+     */
+    protected void configure(Sheets.Builder clientBuilder) {
+        clientBuilder.setRootUrl(Sheets.DEFAULT_ROOT_URL);
+    }
+
+    // Authorizes the installed application to access user's protected data.
+    private Credential authorize(
+            String clientId, String clientSecret, Collection<String> scopes, String refreshToken, String accessToken) {
+        // authorize
+        Credential credential = new GoogleCredential.Builder()
+                .setJsonFactory(jsonFactory)
+                .setTransport(transport)
+                .setClientSecrets(clientId, clientSecret)
+                .setServiceAccountScopes(scopes)
+                .build();
+
+        if (ObjectHelper.isNotEmpty(refreshToken)) {
+            credential.setRefreshToken(refreshToken);
+        }
+
+        if (ObjectHelper.isNotEmpty(accessToken)) {
+            credential.setAccessToken(accessToken);
+        }
+
+        return credential;
+    }
+
+    @Override
+    public Sheets makeClient(
+            CamelContext camelContext, String keyResource, Collection<String> scopes, String applicationName, String delegate) {
+        if (keyResource == null) {
+            throw new IllegalArgumentException("keyResource is required to create Google Sheets client.");
+        }
+        try {
+            Credential credential = authorizeServiceAccount(camelContext, keyResource, delegate, scopes);
+            return new Sheets.Builder(transport, jsonFactory, credential).setApplicationName(applicationName).build();
+        } catch (Exception e) {
+            throw new RuntimeCamelException("Could not create Google Sheets client.", e);
+        }
+    }
+
+    private Credential authorizeServiceAccount(
+            CamelContext camelContext, String keyResource, String delegate, Collection<String> scopes) {
+        // authorize
+        try {
+            GoogleCredential cred = GoogleCredential
+                    .fromStream(ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext, keyResource), transport,
+                            jsonFactory)
+                    .createScoped(scopes != null && scopes.size() != 0 ? scopes : null)
+                    .createDelegated(delegate);
+            cred.refreshToken();
+            return cred;
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsClientFactory.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsClientFactory.java
index 93833c2..3822464 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsClientFactory.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsClientFactory.java
@@ -1,30 +1,40 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.google.sheets;
-
-import com.google.api.services.sheets.v4.Sheets;
-
-public interface GoogleSheetsClientFactory {
-
-    Sheets makeClient(
-            String clientId,
-            String clientSecret,
-            String applicationName,
-            String refreshToken,
-            String accessToken);
-
-}
+/*
+ * 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.google.sheets;
+
+import java.util.Collection;
+
+import com.google.api.services.sheets.v4.Sheets;
+import org.apache.camel.CamelContext;
+
+public interface GoogleSheetsClientFactory {
+
+    Sheets makeClient(
+            String clientId,
+            String clientSecret,
+            Collection<String> scopes,
+            String applicationName,
+            String refreshToken,
+            String accessToken);
+
+    Sheets makeClient(
+            CamelContext camelContext,
+            String keyResource,
+            Collection<String> scopes,
+            String applicationName,
+            String delegate);
+}
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsComponent.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsComponent.java
index c6d5eac..0f17db9 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsComponent.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsComponent.java
@@ -54,11 +54,18 @@ public class GoogleSheetsComponent
 
     public Sheets getClient(GoogleSheetsConfiguration config) {
         if (client == null) {
-            client = getClientFactory().makeClient(config.getClientId(),
-                    config.getClientSecret(),
-                    config.getApplicationName(),
-                    config.getRefreshToken(),
-                    config.getAccessToken());
+            if (config.getClientId() != null && !config.getClientId().isBlank()
+                    && config.getClientSecret() != null && !config.getClientSecret().isBlank()) {
+                client = getClientFactory().makeClient(config.getClientId(),
+                        config.getClientSecret(), config.getScopes(),
+                        config.getApplicationName(), config.getRefreshToken(), config.getAccessToken());
+            } else if (config.getKeyResource() != null && !config.getKeyResource().isBlank()) {
+                client = getClientFactory().makeClient(getCamelContext(), config.getKeyResource(),
+                        config.getScopes(), config.getApplicationName(), config.getDelegate());
+            } else {
+                throw new IllegalArgumentException(
+                        "(clientId and clientSecret) or keyResource are required to create Google Sheets client");
+            }
         }
         return client;
     }
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsConfiguration.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsConfiguration.java
index 5e11908..9cd8c34 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsConfiguration.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsConfiguration.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.google.sheets;
 
+import java.util.Collection;
+
 import org.apache.camel.component.google.sheets.internal.GoogleSheetsApiName;
 import org.apache.camel.spi.Configurer;
 import org.apache.camel.spi.Metadata;
@@ -47,6 +49,13 @@ public class GoogleSheetsConfiguration extends AbstractApiConfiguration {
     private String refreshToken;
     @UriParam
     private String applicationName;
+    @UriParam
+    private Collection<String> scopes;
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
 
     public GoogleSheetsApiName getApiName() {
         return apiName;
@@ -125,4 +134,41 @@ public class GoogleSheetsConfiguration extends AbstractApiConfiguration {
     public void setApplicationName(String applicationName) {
         this.applicationName = applicationName;
     }
+
+    public Collection<String> getScopes() {
+        return scopes;
+    }
+
+    /**
+     * Sheets scopes
+     * 
+     * @see com.google.api.services.sheets.v4.SheetsScopes
+     */
+    public void setScopes(Collection<String> scopes) {
+        this.scopes = scopes;
+    }
+
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
 }
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsVerifierExtension.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsVerifierExtension.java
index 6f9232f..e36aafc 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsVerifierExtension.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/GoogleSheetsVerifierExtension.java
@@ -64,7 +64,7 @@ public class GoogleSheetsVerifierExtension extends DefaultComponentVerifierExten
             GoogleSheetsConfiguration configuration = setProperties(new GoogleSheetsConfiguration(), parameters);
             GoogleSheetsClientFactory clientFactory = new BatchGoogleSheetsClientFactory();
             Sheets client = clientFactory.makeClient(configuration.getClientId(), configuration.getClientSecret(),
-                    configuration.getApplicationName(),
+                    configuration.getScopes(), configuration.getApplicationName(),
                     configuration.getRefreshToken(), configuration.getAccessToken());
             client.spreadsheets().get(Optional.ofNullable(parameters.get("spreadsheetId"))
                     .map(Object::toString)
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponent.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponent.java
index ea3a9f0..4f3e288 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponent.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamComponent.java
@@ -49,13 +49,19 @@ public class GoogleSheetsStreamComponent extends DefaultComponent {
         this.configuration = new GoogleSheetsStreamConfiguration();
     }
 
-    public Sheets getClient(GoogleSheetsStreamConfiguration endpointConfiguration) {
+    public Sheets getClient(GoogleSheetsStreamConfiguration config) {
         if (client == null) {
-            client = getClientFactory().makeClient(endpointConfiguration.getClientId(),
-                    endpointConfiguration.getClientSecret(),
-                    endpointConfiguration.getApplicationName(),
-                    endpointConfiguration.getRefreshToken(),
-                    endpointConfiguration.getAccessToken());
+            if (config.getClientId() != null && config.getClientSecret() != null) {
+                client = getClientFactory().makeClient(config.getClientId(),
+                        config.getClientSecret(), config.getScopes(),
+                        config.getApplicationName(), config.getRefreshToken(), config.getAccessToken());
+            } else if (config.getKeyResource() != null) {
+                client = getClientFactory().makeClient(getCamelContext(), config.getKeyResource(),
+                        config.getScopes(), config.getApplicationName(), config.getDelegate());
+            } else {
+                throw new IllegalArgumentException(
+                        "(clientId and clientSecret) or keyResource are required to create Gmail client");
+            }
         }
         return client;
     }
diff --git a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamConfiguration.java b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamConfiguration.java
index 573b16e..94b0fc9 100644
--- a/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamConfiguration.java
+++ b/components/camel-google/camel-google-sheets/src/main/java/org/apache/camel/component/google/sheets/stream/GoogleSheetsStreamConfiguration.java
@@ -1,225 +1,254 @@
-/*
- * 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.google.sheets.stream;
-
-import java.util.Collections;
-import java.util.List;
-
-import com.google.api.services.sheets.v4.SheetsScopes;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.spi.Metadata;
-import org.apache.camel.spi.UriParam;
-import org.apache.camel.spi.UriParams;
-import org.apache.camel.spi.UriPath;
-
-/**
- * Component configuration for GoogleSheets stream component.
- */
-@UriParams
-public class GoogleSheetsStreamConfiguration implements Cloneable {
-
-    private static final List<String> DEFAULT_SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
-
-    @UriPath
-    @Metadata(required = true)
-    private String spreadsheetId;
-    @UriParam
-    private List<String> scopes = DEFAULT_SCOPES;
-    @UriParam
-    private String clientId;
-    @UriParam(label = "security", secret = true)
-    private String clientSecret;
-    @UriParam(label = "security", secret = true)
-    private String accessToken;
-    @UriParam(label = "security", secret = true)
-    private String refreshToken;
-    @UriParam
-    private String applicationName;
-    @UriParam
-    private int maxResults;
-    @UriParam
-    private String range;
-    @UriParam
-    private boolean includeGridData;
-    @UriParam
-    private boolean splitResults;
-    @UriParam(enums = "ROWS,COLUMNS,DIMENSION_UNSPECIFIED", defaultValue = "ROWS")
-    private String majorDimension = "ROWS";
-    @UriParam(enums = "FORMATTED_VALUE,UNFORMATTED_VALUE,FORMULA", defaultValue = "FORMATTED_VALUE")
-    private String valueRenderOption = "FORMATTED_VALUE";
-
-    public String getClientId() {
-        return clientId;
-    }
-
-    /**
-     * Client ID of the sheets application
-     */
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
-
-    public String getClientSecret() {
-        return clientSecret;
-    }
-
-    /**
-     * Client secret of the sheets application
-     */
-    public void setClientSecret(String clientSecret) {
-        this.clientSecret = clientSecret;
-    }
-
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    /**
-     * OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage.
-     */
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public String getRefreshToken() {
-        return refreshToken;
-    }
-
-    /**
-     * OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever the
-     * current one expires - a necessity if the application is long-lived.
-     */
-    public void setRefreshToken(String refreshToken) {
-        this.refreshToken = refreshToken;
-    }
-
-    public String getApplicationName() {
-        return applicationName;
-    }
-
-    /**
-     * Google sheets application name. Example would be "camel-google-sheets/1.0"
-     */
-    public void setApplicationName(String applicationName) {
-        this.applicationName = applicationName;
-    }
-
-    public List<String> getScopes() {
-        return scopes;
-    }
-
-    /**
-     * Specifies the level of permissions you want a sheets application to have to a user account. See
-     * https://developers.google.com/identity/protocols/googlescopes for more info.
-     */
-    public void setScopes(List<String> scopes) {
-        this.scopes = scopes;
-    }
-
-    public String getSpreadsheetId() {
-        return spreadsheetId;
-    }
-
-    /**
-     * Specifies the spreadsheet identifier that is used to identify the target to obtain.
-     */
-    public void setSpreadsheetId(String spreadsheetId) {
-        this.spreadsheetId = spreadsheetId;
-    }
-
-    public int getMaxResults() {
-        return maxResults;
-    }
-
-    /**
-     * Specify the maximum number of returned results. This will limit the number of rows in a returned value range data
-     * set or the number of returned value ranges in a batch request.
-     */
-    public void setMaxResults(int maxResults) {
-        this.maxResults = maxResults;
-    }
-
-    public String getRange() {
-        return range;
-    }
-
-    /**
-     * Specifies the range of rows and columns in a sheet to get data from.
-     */
-    public void setRange(String range) {
-        this.range = range;
-    }
-
-    public String getMajorDimension() {
-        return majorDimension;
-    }
-
-    /**
-     * Specifies the major dimension that results should use..
-     */
-    public void setMajorDimension(String majorDimension) {
-        this.majorDimension = majorDimension;
-    }
-
-    public String getValueRenderOption() {
-        return valueRenderOption;
-    }
-
-    /**
-     * Determines how values should be rendered in the output.
-     */
-    public void setValueRenderOption(String valueRenderOption) {
-        this.valueRenderOption = valueRenderOption;
-    }
-
-    public boolean isIncludeGridData() {
-        return includeGridData;
-    }
-
-    /**
-     * True if grid data should be returned.
-     */
-    public void setIncludeGridData(boolean includeGridData) {
-        this.includeGridData = includeGridData;
-    }
-
-    public boolean isSplitResults() {
-        return splitResults;
-    }
-
-    /**
-     * True if value range result should be split into rows or columns to process each of them individually. When true
-     * each row or column is represented with a separate exchange in batch processing. Otherwise value range object is
-     * used as exchange junk size.
-     */
-    public void setSplitResults(boolean splitResults) {
-        this.splitResults = splitResults;
-    }
-
-    // *************************************************
-    //
-    // *************************************************
-
-    public GoogleSheetsStreamConfiguration copy() {
-        try {
-            return (GoogleSheetsStreamConfiguration) super.clone();
-        } catch (CloneNotSupportedException e) {
-            throw new RuntimeCamelException(e);
-        }
-    }
-
-}
+/*
+ * 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.google.sheets.stream;
+
+import java.util.Collections;
+import java.util.List;
+
+import com.google.api.services.sheets.v4.SheetsScopes;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+/**
+ * Component configuration for GoogleSheets stream component.
+ */
+@UriParams
+public class GoogleSheetsStreamConfiguration implements Cloneable {
+
+    private static final List<String> DEFAULT_SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS);
+
+    @UriPath
+    @Metadata(required = true)
+    private String spreadsheetId;
+    @UriParam
+    private List<String> scopes = DEFAULT_SCOPES;
+    @UriParam
+    private String clientId;
+    @UriParam(label = "security", secret = true)
+    private String clientSecret;
+    @UriParam(label = "security", secret = true)
+    private String accessToken;
+    @UriParam(label = "security", secret = true)
+    private String refreshToken;
+    @UriParam
+    private String applicationName;
+    @UriParam
+    private int maxResults;
+    @UriParam
+    private String range;
+    @UriParam
+    private boolean includeGridData;
+    @UriParam
+    private boolean splitResults;
+    @UriParam(enums = "ROWS,COLUMNS,DIMENSION_UNSPECIFIED", defaultValue = "ROWS")
+    private String majorDimension = "ROWS";
+    @UriParam(enums = "FORMATTED_VALUE,UNFORMATTED_VALUE,FORMULA", defaultValue = "FORMATTED_VALUE")
+    private String valueRenderOption = "FORMATTED_VALUE";
+    /* Service account */
+    @UriParam(label = "security")
+    private String keyResource;
+    @UriParam
+    private String delegate;
+
+    public String getClientId() {
+        return clientId;
+    }
+
+    /**
+     * Client ID of the sheets application
+     */
+    public void setClientId(String clientId) {
+        this.clientId = clientId;
+    }
+
+    public String getClientSecret() {
+        return clientSecret;
+    }
+
+    /**
+     * Client secret of the sheets application
+     */
+    public void setClientSecret(String clientSecret) {
+        this.clientSecret = clientSecret;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    /**
+     * OAuth 2 access token. This typically expires after an hour so refreshToken is recommended for long term usage.
+     */
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public String getRefreshToken() {
+        return refreshToken;
+    }
+
+    /**
+     * OAuth 2 refresh token. Using this, the Google Calendar component can obtain a new accessToken whenever the
+     * current one expires - a necessity if the application is long-lived.
+     */
+    public void setRefreshToken(String refreshToken) {
+        this.refreshToken = refreshToken;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    /**
+     * Google sheets application name. Example would be "camel-google-sheets/1.0"
+     */
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public List<String> getScopes() {
+        return scopes;
+    }
+
+    /**
+     * Specifies the level of permissions you want a sheets application to have to a user account. See
+     * https://developers.google.com/identity/protocols/googlescopes for more info.
+     */
+    public void setScopes(List<String> scopes) {
+        this.scopes = scopes;
+    }
+
+    public String getSpreadsheetId() {
+        return spreadsheetId;
+    }
+
+    /**
+     * Specifies the spreadsheet identifier that is used to identify the target to obtain.
+     */
+    public void setSpreadsheetId(String spreadsheetId) {
+        this.spreadsheetId = spreadsheetId;
+    }
+
+    public int getMaxResults() {
+        return maxResults;
+    }
+
+    /**
+     * Specify the maximum number of returned results. This will limit the number of rows in a returned value range data
+     * set or the number of returned value ranges in a batch request.
+     */
+    public void setMaxResults(int maxResults) {
+        this.maxResults = maxResults;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    /**
+     * Specifies the range of rows and columns in a sheet to get data from.
+     */
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    public String getMajorDimension() {
+        return majorDimension;
+    }
+
+    /**
+     * Specifies the major dimension that results should use..
+     */
+    public void setMajorDimension(String majorDimension) {
+        this.majorDimension = majorDimension;
+    }
+
+    public String getValueRenderOption() {
+        return valueRenderOption;
+    }
+
+    /**
+     * Determines how values should be rendered in the output.
+     */
+    public void setValueRenderOption(String valueRenderOption) {
+        this.valueRenderOption = valueRenderOption;
+    }
+
+    public boolean isIncludeGridData() {
+        return includeGridData;
+    }
+
+    /**
+     * True if grid data should be returned.
+     */
+    public void setIncludeGridData(boolean includeGridData) {
+        this.includeGridData = includeGridData;
+    }
+
+    public boolean isSplitResults() {
+        return splitResults;
+    }
+
+    /**
+     * True if value range result should be split into rows or columns to process each of them individually. When true
+     * each row or column is represented with a separate exchange in batch processing. Otherwise value range object is
+     * used as exchange junk size.
+     */
+    public void setSplitResults(boolean splitResults) {
+        this.splitResults = splitResults;
+    }
+
+    public String getKeyResource() {
+        return keyResource;
+    }
+
+    /**
+     * Sets "*.json" file with credentials for Service account
+     * 
+     * @param keyResource String file, classpath, or http url
+     */
+    public void setKeyResource(String keyResource) {
+        this.keyResource = keyResource;
+    }
+
+    public String getDelegate() {
+        return delegate;
+    }
+
+    /**
+     * Delegate for wide-domain service account
+     */
+    public void setDelegate(String delegate) {
+        this.delegate = delegate;
+    }
+
+    // *************************************************
+    //
+    // *************************************************
+
+    public GoogleSheetsStreamConfiguration copy() {
+        try {
+            return (GoogleSheetsStreamConfiguration) super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/AbstractGoogleSheetsTestSupport.java b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/AbstractGoogleSheetsTestSupport.java
index f56fae2..3fa32e5 100644
--- a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/AbstractGoogleSheetsTestSupport.java
+++ b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/AbstractGoogleSheetsTestSupport.java
@@ -24,9 +24,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
-import com.google.api.client.http.javanet.NetHttpTransport;
-import com.google.api.client.json.jackson2.JacksonFactory;
-import com.google.api.services.sheets.v4.Sheets;
 import com.google.api.services.sheets.v4.model.Sheet;
 import com.google.api.services.sheets.v4.model.SheetProperties;
 import com.google.api.services.sheets.v4.model.Spreadsheet;
@@ -34,6 +31,7 @@ import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
 import com.google.api.services.sheets.v4.model.ValueRange;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelExecutionException;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.google.sheets.internal.GoogleSheetsConstants;
 import org.apache.camel.component.google.sheets.server.GoogleSheetsApiTestServer;
 import org.apache.camel.component.google.sheets.server.GoogleSheetsApiTestServerRule;
@@ -57,6 +55,29 @@ public class AbstractGoogleSheetsTestSupport extends CamelTestSupport {
 
     private Spreadsheet spreadsheet;
 
+    private static Properties loadProperties() {
+        // read GoogleMail component configuration from TEST_OPTIONS_PROPERTIES
+        final Properties properties = new Properties();
+        try {
+            properties.load(AbstractGoogleSheetsTestSupport.class.getResourceAsStream(TEST_OPTIONS_PROPERTIES));
+        } catch (Exception e) {
+            throw new RuntimeCamelException(
+                    String.format("%s could not be loaded: %s", TEST_OPTIONS_PROPERTIES, e.getMessage()), e);
+        }
+        return properties;
+    }
+
+    // Used by JUnit to determine whether or not to run the integration tests
+    @SuppressWarnings("unused")
+    private static boolean hasCredentials() {
+        Properties properties = loadProperties();
+
+        return !properties.getProperty("clientId", "").isEmpty()
+                && !properties.getProperty("clientSecret", "").isEmpty()
+                && !properties.getProperty("accessToken", "").isEmpty()
+                || !properties.getProperty("keyResource", "").isEmpty();
+    }
+
     /**
      * Create test spreadsheet that is used throughout all tests.
      */
@@ -105,23 +126,18 @@ public class AbstractGoogleSheetsTestSupport extends CamelTestSupport {
 
         final CamelContext context = super.createCamelContext();
 
+        final Properties properties = loadProperties();
+
+        Map<String, Object> options = new HashMap<>();
+        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+            options.put(entry.getKey().toString(), entry.getValue());
+        }
+
         final GoogleSheetsConfiguration configuration = new GoogleSheetsConfiguration();
-        PropertyBindingSupport.bindProperties(context, configuration, getTestOptions());
+        PropertyBindingSupport.bindProperties(context, configuration, options);
 
         // add GoogleSheetsComponent to Camel context and use localhost url
         final GoogleSheetsComponent component = new GoogleSheetsComponent(context);
-        component.setClientFactory(new BatchGoogleSheetsClientFactory(
-                new NetHttpTransport.Builder()
-                        .trustCertificatesFromJavaKeyStore(
-                                getClass().getResourceAsStream("/" + GoogleSheetsApiTestServerRule.SERVER_KEYSTORE),
-                                GoogleSheetsApiTestServerRule.SERVER_KEYSTORE_PASSWORD)
-                        .build(),
-                new JacksonFactory()) {
-            @Override
-            protected void configure(Sheets.Builder clientBuilder) {
-                clientBuilder.setRootUrl(String.format("https://localhost:%s/", googleSheetsApiTestServerRule.getServerPort()));
-            }
-        });
         component.setConfiguration(configuration);
         context.addComponent("google-sheets", component);
 
diff --git a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsIT.java b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsIT.java
index 216b7b2..12560e8 100644
--- a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsIT.java
+++ b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsIT.java
@@ -32,6 +32,7 @@ import org.apache.camel.component.google.sheets.internal.GoogleSheetsApiCollecti
 import org.apache.camel.component.google.sheets.internal.GoogleSheetsConstants;
 import org.apache.camel.component.google.sheets.internal.SheetsSpreadsheetsApiMethod;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,6 +43,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 /**
  * Test class for {@link com.google.api.services.sheets.v4.Sheets.Spreadsheets} APIs.
  */
+@EnabledIf(value = "org.apache.camel.component.google.sheets.AbstractGoogleSheetsTestSupport#hasCredentials",
+           disabledReason = "Google Sheets credentials were not provided")
 public class SheetsSpreadsheetsIT extends AbstractGoogleSheetsTestSupport {
 
     private static final Logger LOG = LoggerFactory.getLogger(SheetsSpreadsheetsIT.class);
diff --git a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesIT.java b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesIT.java
index d855d60..ece4837 100644
--- a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesIT.java
+++ b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/SheetsSpreadsheetsValuesIT.java
@@ -35,6 +35,7 @@ import org.apache.camel.component.google.sheets.internal.GoogleSheetsConstants;
 import org.apache.camel.component.google.sheets.internal.SheetsSpreadsheetsValuesApiMethod;
 import org.apache.camel.util.ObjectHelper;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,6 +47,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 /**
  * Test class for {@link com.google.api.services.sheets.v4.Sheets.Spreadsheets.Values} APIs.
  */
+@EnabledIf(value = "org.apache.camel.component.google.sheets.AbstractGoogleSheetsTestSupport#hasCredentials",
+           disabledReason = "Google Sheets credentials were not provided")
 public class SheetsSpreadsheetsValuesIT extends AbstractGoogleSheetsTestSupport {
 
     private static final Logger LOG = LoggerFactory.getLogger(SheetsSpreadsheetsValuesIT.class);
diff --git a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/stream/SheetsStreamConsumerIntegrationTest.java b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/stream/SheetsStreamConsumerIntegrationTest.java
index dee0f57..5be1862 100644
--- a/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/stream/SheetsStreamConsumerIntegrationTest.java
+++ b/components/camel-google/camel-google-sheets/src/test/java/org/apache/camel/component/google/sheets/stream/SheetsStreamConsumerIntegrationTest.java
@@ -26,6 +26,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
 
 import static org.apache.camel.component.google.sheets.server.GoogleSheetsApiTestServerAssert.assertThatGoogleApi;
 import static org.apache.camel.component.google.sheets.stream.GoogleSheetsStreamConstants.MAJOR_DIMENSION;
@@ -36,6 +37,8 @@ import static org.apache.camel.component.google.sheets.stream.GoogleSheetsStream
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@EnabledIf(value = "org.apache.camel.component.google.sheets.AbstractGoogleSheetsTestSupport#hasCredentials",
+           disabledReason = "Google Sheets credentials were not provided")
 public class SheetsStreamConsumerIntegrationTest extends AbstractGoogleSheetsStreamTestSupport {
 
     private String range = TEST_SHEET + "!A1:B2";
diff --git a/components/camel-google/camel-google-sheets/src/test/resources/test-options.properties b/components/camel-google/camel-google-sheets/src/test/resources/test-options.properties
index 723b597..5d63bcf 100644
--- a/components/camel-google/camel-google-sheets/src/test/resources/test-options.properties
+++ b/components/camel-google/camel-google-sheets/src/test/resources/test-options.properties
@@ -19,8 +19,12 @@
 ## Login properties for Google Sheets Component
 #####################################
 ## Application client id and secret
-clientId=camel-client
-clientSecret=camel
+clientId=
+clientSecret=
 applicationName=camel-google-sheets/1.0
-accessToken=cd887efc-7c7d-4e8e-9580-f7502123badf
-refreshToken=bdbbe5ec-6081-4c6c-8974-9c4abfc0fdcc
+accessToken=
+refreshToken=
+
+keyResource=
+scopes[]=
+delegate=
\ No newline at end of file
diff --git a/parent/pom.xml b/parent/pom.xml
index 48e02ee..f9c9e67 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -208,11 +208,11 @@
         <google-api-services-drive-version>v2-rev20220110-1.32.1</google-api-services-drive-version>
         <google-api-services-calendar-version>v3-rev20211229-1.32.1</google-api-services-calendar-version>
         <google-api-services-sheets-version>v4-rev20210629-1.32.1</google-api-services-sheets-version>
+        <google-api-services-mail-version>v1-rev20211108-1.32.1</google-api-services-mail-version>
         <google-cloud-bom-version>16.3.0</google-cloud-bom-version>
         <google-cloud-functions-bom-version>1.0.8</google-cloud-functions-bom-version>
         <google-cloud-functions-gax-grpc-version>1.62.0</google-cloud-functions-gax-grpc-version>
         <google-cloud-guava-version>30.0-jre</google-cloud-guava-version>
-        <google-api-services-mail-version>v1-rev20211108-1.32.1</google-api-services-mail-version>
         <graaljs-version>21.3.0</graaljs-version>
         <graphql-java-version>14.0</graphql-java-version>
         <grizzly-websockets-version>2.4.4</grizzly-websockets-version>