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 2025/01/28 06:43:18 UTC

(camel) branch main updated: CAMEL-21479 Use HttpJdkSolrClient as default SolrClient implementation (#16891)

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 8132e6954ec CAMEL-21479 Use HttpJdkSolrClient as default SolrClient implementation (#16891)
8132e6954ec is described below

commit 8132e6954ec31bfdc8074b72f7d2c17079a919e9
Author: Paul Blanchaert <pa...@search-solutions.net>
AuthorDate: Tue Jan 28 07:43:12 2025 +0100

    CAMEL-21479 Use HttpJdkSolrClient as default SolrClient implementation (#16891)
    
    * CAMEL-21479 Use HttpJdkSolrClient as default SolrClient implementation
    
    * CAMEL-21479 Use HttpJdkSolrClient as default SolrClient implementation - minor enhancements
    
    * CAMEL-21479 Update migration guide
    
    * CAMEL-21479 Update camel-test-infra-solr to latest solr version
    
    * CAMEL-21479 Remove deprecated SolrConstants.CamelSolrClient to prevent build issue with SolrEndpointBuilderFactory
    
    * CAMEL-21479 Update generated artifacts
---
 .../org/apache/camel/catalog/components.properties |   2 -
 .../org/apache/camel/catalog/components/solr.json  |  85 ++--
 .../apache/camel/catalog/components/solrCloud.json |  60 ---
 .../org/apache/camel/catalog/components/solrs.json |  60 ---
 components/camel-solr/pom.xml                      | 101 +---
 .../component/solr/SolrComponentConfigurer.java    |  47 ++
 .../component/solr/SolrEndpointConfigurer.java     | 114 +++--
 .../component/solr/SolrEndpointUriFactory.java     |  26 +-
 .../solr/converter/SolrRequestConverterLoader.java |  60 +++
 .../converter/SolrResponseConverterLoader.java     |  60 +++
 .../org/apache/camel/component/solr/solr.json      |  85 ++--
 .../org/apache/camel/component/solr/solrCloud.json |  60 ---
 .../org/apache/camel/component/solr/solrs.json     |  60 ---
 .../services/org/apache/camel/TypeConverterLoader  |   3 +
 .../services/org/apache/camel/component.properties |   2 +-
 .../services/org/apache/camel/component/solrCloud  |   2 -
 .../services/org/apache/camel/component/solrs      |   2 -
 .../org/apache/camel/urifactory/solrCloud-endpoint |   2 -
 .../org/apache/camel/urifactory/solrs-endpoint     |   2 -
 .../camel-solr/src/main/docs/solr-component.adoc   |  75 ++-
 .../camel/component/solr/SolrClientHandler.java    | 154 ------
 .../component/solr/SolrClientHandlerCloud.java     |  54 --
 .../solr/SolrClientHandlerConcurrentUpdate.java    |  47 --
 .../component/solr/SolrClientHandlerHttp.java      |  50 --
 .../component/solr/SolrClientHandlerLbHttp.java    |  46 --
 .../apache/camel/component/solr/SolrComponent.java | 211 +++++---
 .../solr/SolrComponentVerifierExtension.java       |  90 ++++
 .../camel/component/solr/SolrConfiguration.java    | 516 +++++++++++--------
 .../apache/camel/component/solr/SolrConstants.java |  88 +++-
 .../apache/camel/component/solr/SolrEndpoint.java  | 159 ++++--
 .../apache/camel/component/solr/SolrOperation.java | 147 ++++++
 .../apache/camel/component/solr/SolrProducer.java  | 428 ++++++++--------
 .../org/apache/camel/component/solr/SolrUtils.java | 109 ++++
 .../solr/converter/SolrRequestConverter.java       | 309 ++++++++++++
 .../solr/converter/SolrResponseConverter.java      |  72 +++
 .../camel/component/solr/InitSolrEndpointTest.java | 165 +++---
 .../camel/component/solr/JettySolrFactory.java     | 131 -----
 .../camel/component/solr/MapBodyManualIT.java      |  77 ---
 .../camel/component/solr/SolrAddBeanTest.java      |  48 --
 .../camel/component/solr/SolrAddBeansTest.java     |  62 ---
 .../camel/component/solr/SolrCloudFixture.java     | 177 -------
 .../component/solr/SolrComponentTestSupport.java   | 132 -----
 .../solr/SolrComponentVerifierExtensionTest.java   |  63 +++
 .../camel/component/solr/SolrDeleteTest.java       |  77 ---
 .../apache/camel/component/solr/SolrFixtures.java  | 137 -----
 .../component/solr/SolrServerMissingTest.java      |  47 --
 .../camel/component/solr/SolrTestSupport.java      |  44 --
 .../camel/component/solr/SolrTransactionsTest.java | 107 ----
 .../component/solr/SolrUpdateAutocommitTest.java   | 336 -------------
 .../camel/component/solr/SolrUpdateTest.java       | 363 --------------
 .../solr/integration/SolrCloudITSupport.java       |  62 ---
 .../solr/integration/SolrCloudProducerIT.java      |  41 --
 .../component/solr/integration/SolrITSupport.java  |  42 --
 .../solr/integration/SolrInsertAndDeleteTest.java  | 535 ++++++++++++++++++++
 .../solr/integration/SolrPingAndSearchTest.java    | 137 +++++
 .../solr/integration/SolrTestSupport.java          | 238 +++++++++
 .../camel-solr/src/test/resources/data/books.csv   |   2 +-
 .../src/test/resources/log4j2.properties           |  18 +-
 .../org/apache/camel/main/components.properties    |   2 -
 .../ROOT/pages/camel-4-migration-guide.adoc        |   1 -
 .../ROOT/pages/camel-4x-upgrade-guide-4_10.adoc    |   4 +
 .../component/ComponentsBuilderFactory.java        |  28 +-
 .../dsl/SolrcloudComponentBuilderFactory.java      | 120 -----
 .../dsl/SolrsComponentBuilderFactory.java          | 120 -----
 .../builder/endpoint/StaticEndpointBuilders.java   |  74 +--
 .../endpoint/dsl/SolrEndpointBuilderFactory.java   | 554 +++++++++++++++------
 test-infra/camel-test-infra-solr/pom.xml           |  14 +-
 .../test/infra/solr/common/SolrProperties.java     |   4 +-
 .../test/infra/solr/services/SolrContainer.java    |  19 +-
 .../test/infra/solr/services/SolrInfraService.java |  12 +-
 .../services/SolrLocalContainerInfraService.java   |  22 +-
 .../solr/services/SolrRemoteInfraService.java      |  12 +-
 .../test/infra/solr/services/container.properties  |   2 +-
 .../services/SolrLocalContainerCloudService.java   |  24 -
 .../infra/solr/services/SolrServiceFactory.java    |   1 +
 75 files changed, 3521 insertions(+), 3921 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index df0aaa04167..faf25dd6e75 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -297,8 +297,6 @@ smtp
 smtps
 snmp
 solr
-solrCloud
-solrs
 splunk
 splunk-hec
 spring-batch
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json
index 84dce7bb0ef..b37fad9a310 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solr.json
@@ -6,7 +6,7 @@
     "description": "Perform operations against Apache Lucene Solr.",
     "deprecated": false,
     "firstVersion": "4.8.0",
-    "label": "monitoring,search",
+    "label": "search,monitoring",
     "javaType": "org.apache.camel.component.solr.SolrComponent",
     "supportLevel": "Stable",
     "groupId": "org.apache.camel",
@@ -14,8 +14,7 @@
     "version": "4.10.0-SNAPSHOT",
     "scheme": "solr",
     "extendsScheme": "",
-    "alternativeSchemes": "solr,solrs,solrCloud",
-    "syntax": "solr:url",
+    "syntax": "solr:host:port",
     "async": false,
     "api": false,
     "consumerOnly": false,
@@ -25,36 +24,62 @@
     "remote": true
   },
   "componentProperties": {
-    "lazyStartProducer": { "index": 0, "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 [...]
-    "autowiredEnabled": { "index": 1, "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 t [...]
+    "connectionTimeout": { "index": 0, "kind": "property", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 60000, "description": "The time in ms to wait before connection will time out." },
+    "defaultCollection": { "index": 1, "kind": "property", "displayName": "Default Collection", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Solr default collection name" },
+    "host": { "index": 2, "kind": "property", "displayName": "Host", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The solr instance host name" },
+    "lazyStartProducer": { "index": 3, "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 [...]
+    "port": { "index": 4, "kind": "property", "displayName": "Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The solr instance port number" },
+    "requestTimeout": { "index": 5, "kind": "property", "displayName": "Request Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 600000, "description": "The timeout in ms to wait before the socket will time out." },
+    "autowiredEnabled": { "index": 6, "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 t [...]
+    "solrClient": { "index": 7, "kind": "property", "displayName": "Solr Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": true, "secret": false, "description": "To use an existing configured solr client, instead of creating a client per endpoint. This allows customizing the client with specific advanced settings." },
+    "enableSSL": { "index": 8, "kind": "property", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable SSL" },
+    "password": { "index": 9, "kind": "property", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Password for authenticating" },
+    "username": { "index": 10, "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Basic authenticate user" }
   },
   "headers": {
-    "CamelSolrClient": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The client.", "constantName": "org.apache.camel.component.solr.SolrConstants#CLIENT" },
-    "CamelSolrCollection": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request again.", "constantName": "org.apache.camel.component.solr.SolrConstants#COLLECTION" },
-    "SolrOperation": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#OPERATION" },
-    "CamelSolrQueryString": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#QUERY_STRING" },
-    "Content-Type": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type.", "constantName": "org.apache.camel.component.solr.SolrConstants#CONTENT_TYPE" }
+    "operation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_OPERATION" },
+    "SolrOperation": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Use header 'operation' instead", "autowired": false, "secret": false, "description": "The operation to perform. Deprecation note: Use header 'operation' instead", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_OPERATION_DEPRECATED" },
+    "collection": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request against.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_COLLECTION" },
+    "CamelSolrCollection": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Use header 'collection' instead", "autowired": false, "secret": false, "description": "The collection to execute the request against. Deprecation note: Use header 'collection' instead", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_COLLECTION_DEPRECATED" },
+    "requestHandler": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request handler to execute the solr request against.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_REQUEST_HANDLER" },
+    "queryString": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_QUERY_STRING" },
+    "CamelSolrQueryString": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Use header 'queryString' instead", "autowired": false, "secret": false, "description": "The query to execute. Deprecation note: Use header 'queryString' instead", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_QUERY_STRING_DEPRECATED" },
+    "size": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The size of the response.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_SIZE" },
+    "from": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The starting index of the response.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_FROM" },
+    "solrClient": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The solr client to use for the request.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_SOLR_CLIENT" },
+    "solrParams": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "SolrParams", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The solr parameters to use for the request.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_SOLR_PARAMS" },
+    "deleteByQuery": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "false", "description": "For the delete instruction, interprete body as query\/queries instead of id\/ids.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_DELETE_BY_QUERY" },
+    "Content-Type": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type is used to identify the type when inserting files.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_CONTENT_TYPE" }
   },
   "properties": {
-    "url": { "index": 0, "kind": "path", "displayName": "Url", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Hostname and port for the Solr server(s). Multiple hosts can be specified, separated with a comma. See the solrC [...]
-    "autoCommit": { "index": 1, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "If true, each producer operation will be automatically followed by a commit" },
-    "connectionTimeout": { "index": 2, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the connection timeout on the SolrClient" },
-    "defaultMaxConnectionsPerHost": { "index": 3, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
-    "httpClient": { "index": 4, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.http.client.HttpClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not [...]
-    "maxRetries": { "index": 5, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Maximum number of retries to attempt in the event of transient errors" },
-    "maxTotalConnections": { "index": 6, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
-    "requestHandler": { "index": 7, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the request handler to be used" },
-    "solrClient": { "index": 8, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Uses the provided solr client to connect to solr. When this parameter is not specified, cam [...]
-    "soTimeout": { "index": 9, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the socket timeout on the SolrClient" },
-    "streamingQueueSize": { "index": 10, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
-    "streamingThreadCount": { "index": 11, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
-    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
-    "collection": { "index": 13, "kind": "parameter", "displayName": "Collection", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the default collection for SolrCloud" },
-    "zkChroot": { "index": 14, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
-    "zkHost": { "index": 15, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost [...]
-    "allowCompression": { "index": 16, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Server side must support gzip or deflate for this to have any effect" },
-    "followRedirects": { "index": 17, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Indicates whether redirects are used to get to the Solr server" },
-    "password": { "index": 18, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets password for basic auth plugin enabled servers" },
-    "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets username for basic auth plugin enabled servers" }
+    "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The solr instance host name (set to 'default' to use the host name defined on component level)" },
+    "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The solr instance port number" },
+    "async": { "index": 2, "kind": "parameter", "displayName": "Async", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Use async request processing (when supported by the solr client)" },
+    "autoCommit": { "index": 3, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "If true, each producer insert\/delete operation will be automatically performing a commit" },
+    "collection": { "index": 4, "kind": "parameter", "displayName": "Collection", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The name of the collection to act against" },
+    "connectionTimeout": { "index": 5, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The time in ms to wait before connection will time out." },
+    "defaultMaxConnectionsPerHost": { "index": 6, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
+    "deleteByQuery": { "index": 7, "kind": "parameter", "displayName": "Delete By Query", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "For the delete instruction, interprete body as query\/queries instead of id\/ids." },
+    "from": { "index": 8, "kind": "parameter", "displayName": "From", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Starting index of the response." },
+    "httpClient": { "index": 9, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.net.http.HttpClient", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not set." },
+    "maxRetries": { "index": 10, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Maximum number of retries to attempt in the event of transient errors" },
+    "maxTotalConnections": { "index": 11, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
+    "operation": { "index": 12, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.solr.SolrOperation", "enum": [ "DELETE", "INSERT", "PING", "SEARCH" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "What operation to perform" },
+    "requestHandler": { "index": 13, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The path of the update request handler (use for update requests \/ set solr parameter qt for search requests)" },
+    "requestTimeout": { "index": 14, "kind": "parameter", "displayName": "Request Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The time in ms to wait before the request will time out (former soTimeout)." },
+    "size": { "index": 15, "kind": "parameter", "displayName": "Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Size of the response." },
+    "solrClient": { "index": 16, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The solr client to connect to solr. When solrClient bean is provided, all connection propertie [...]
+    "soTimeout": { "index": 17, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The time in ms to wait before the request will time out (former soTimeout)." },
+    "streamingQueueSize": { "index": 18, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
+    "streamingThreadCount": { "index": 19, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
+    "lazyStartProducer": { "index": 20, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
+    "zkChroot": { "index": 21, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
+    "zkHost": { "index": 22, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost:2182 [...]
+    "allowCompression": { "index": 23, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Server side must support gzip or deflate for this to have any effect" },
+    "followRedirects": { "index": 24, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Indicates whether redirects are used to get to the Solr server" },
+    "certificatePath": { "index": 25, "kind": "parameter", "displayName": "Certificate Path", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The certificate that can be used to access the [...]
+    "enableSSL": { "index": 26, "kind": "parameter", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Enable SSL" },
+    "password": { "index": 27, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Password for authenticating" },
+    "username": { "index": 28, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Basic authenticate user" }
   }
 }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solrCloud.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solrCloud.json
deleted file mode 100644
index 9b392359334..00000000000
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solrCloud.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "component": {
-    "kind": "component",
-    "name": "solrCloud",
-    "title": "Solr",
-    "description": "Perform operations against Apache Lucene Solr.",
-    "deprecated": false,
-    "firstVersion": "4.8.0",
-    "label": "monitoring,search",
-    "javaType": "org.apache.camel.component.solr.SolrComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-solr",
-    "version": "4.10.0-SNAPSHOT",
-    "scheme": "solrCloud",
-    "extendsScheme": "",
-    "alternativeSchemes": "solr,solrs,solrCloud",
-    "syntax": "solrCloud:url",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": true,
-    "lenientProperties": false,
-    "browsable": false,
-    "remote": true
-  },
-  "componentProperties": {
-    "lazyStartProducer": { "index": 0, "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 [...]
-    "autowiredEnabled": { "index": 1, "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 t [...]
-  },
-  "headers": {
-    "CamelSolrClient": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The client.", "constantName": "org.apache.camel.component.solr.SolrConstants#CLIENT" },
-    "CamelSolrCollection": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request again.", "constantName": "org.apache.camel.component.solr.SolrConstants#COLLECTION" },
-    "SolrOperation": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#OPERATION" },
-    "CamelSolrQueryString": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#QUERY_STRING" },
-    "Content-Type": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type.", "constantName": "org.apache.camel.component.solr.SolrConstants#CONTENT_TYPE" }
-  },
-  "properties": {
-    "url": { "index": 0, "kind": "path", "displayName": "Url", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Hostname and port for the Solr server(s). Multiple hosts can be specified, separated with a comma. See the solrC [...]
-    "autoCommit": { "index": 1, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "If true, each producer operation will be automatically followed by a commit" },
-    "connectionTimeout": { "index": 2, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the connection timeout on the SolrClient" },
-    "defaultMaxConnectionsPerHost": { "index": 3, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
-    "httpClient": { "index": 4, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.http.client.HttpClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not [...]
-    "maxRetries": { "index": 5, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Maximum number of retries to attempt in the event of transient errors" },
-    "maxTotalConnections": { "index": 6, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
-    "requestHandler": { "index": 7, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the request handler to be used" },
-    "solrClient": { "index": 8, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Uses the provided solr client to connect to solr. When this parameter is not specified, cam [...]
-    "soTimeout": { "index": 9, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the socket timeout on the SolrClient" },
-    "streamingQueueSize": { "index": 10, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
-    "streamingThreadCount": { "index": 11, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
-    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
-    "collection": { "index": 13, "kind": "parameter", "displayName": "Collection", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the default collection for SolrCloud" },
-    "zkChroot": { "index": 14, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
-    "zkHost": { "index": 15, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost [...]
-    "allowCompression": { "index": 16, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Server side must support gzip or deflate for this to have any effect" },
-    "followRedirects": { "index": 17, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Indicates whether redirects are used to get to the Solr server" },
-    "password": { "index": 18, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets password for basic auth plugin enabled servers" },
-    "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets username for basic auth plugin enabled servers" }
-  }
-}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solrs.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solrs.json
deleted file mode 100644
index 444ec195ffc..00000000000
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/solrs.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "component": {
-    "kind": "component",
-    "name": "solrs",
-    "title": "Solr (Secure)",
-    "description": "Perform operations against Apache Lucene Solr.",
-    "deprecated": false,
-    "firstVersion": "4.8.0",
-    "label": "monitoring,search",
-    "javaType": "org.apache.camel.component.solr.SolrComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-solr",
-    "version": "4.10.0-SNAPSHOT",
-    "scheme": "solrs",
-    "extendsScheme": "",
-    "alternativeSchemes": "solr,solrs,solrCloud",
-    "syntax": "solrs:url",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": true,
-    "lenientProperties": false,
-    "browsable": false,
-    "remote": true
-  },
-  "componentProperties": {
-    "lazyStartProducer": { "index": 0, "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 [...]
-    "autowiredEnabled": { "index": 1, "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 t [...]
-  },
-  "headers": {
-    "CamelSolrClient": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The client.", "constantName": "org.apache.camel.component.solr.SolrConstants#CLIENT" },
-    "CamelSolrCollection": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request again.", "constantName": "org.apache.camel.component.solr.SolrConstants#COLLECTION" },
-    "SolrOperation": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#OPERATION" },
-    "CamelSolrQueryString": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#QUERY_STRING" },
-    "Content-Type": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type.", "constantName": "org.apache.camel.component.solr.SolrConstants#CONTENT_TYPE" }
-  },
-  "properties": {
-    "url": { "index": 0, "kind": "path", "displayName": "Url", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Hostname and port for the Solr server(s). Multiple hosts can be specified, separated with a comma. See the solrC [...]
-    "autoCommit": { "index": 1, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "If true, each producer operation will be automatically followed by a commit" },
-    "connectionTimeout": { "index": 2, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the connection timeout on the SolrClient" },
-    "defaultMaxConnectionsPerHost": { "index": 3, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
-    "httpClient": { "index": 4, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.http.client.HttpClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not [...]
-    "maxRetries": { "index": 5, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Maximum number of retries to attempt in the event of transient errors" },
-    "maxTotalConnections": { "index": 6, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
-    "requestHandler": { "index": 7, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the request handler to be used" },
-    "solrClient": { "index": 8, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Uses the provided solr client to connect to solr. When this parameter is not specified, cam [...]
-    "soTimeout": { "index": 9, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the socket timeout on the SolrClient" },
-    "streamingQueueSize": { "index": 10, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
-    "streamingThreadCount": { "index": 11, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
-    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
-    "collection": { "index": 13, "kind": "parameter", "displayName": "Collection", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the default collection for SolrCloud" },
-    "zkChroot": { "index": 14, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
-    "zkHost": { "index": 15, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost [...]
-    "allowCompression": { "index": 16, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Server side must support gzip or deflate for this to have any effect" },
-    "followRedirects": { "index": 17, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Indicates whether redirects are used to get to the Solr server" },
-    "password": { "index": 18, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets password for basic auth plugin enabled servers" },
-    "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets username for basic auth plugin enabled servers" }
-  }
-}
diff --git a/components/camel-solr/pom.xml b/components/camel-solr/pom.xml
index 699a861a980..f04f2713c5e 100644
--- a/components/camel-solr/pom.xml
+++ b/components/camel-solr/pom.xml
@@ -39,49 +39,31 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-support</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
-            <artifactId>camel-attachments</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.angus</groupId>
-            <artifactId>angus-mail</artifactId>
-            <version>${angus-mail-version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.solr</groupId>
             <artifactId>solr-solrj</artifactId>
             <version>${solr-version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
+        <!-- org.apache.solr.solr-api still needed
+                for interpretation of update request body -->
         <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>${httpclient4-version}</version>
+            <groupId>org.apache.solr</groupId>
+            <artifactId>solr-api</artifactId>
+            <version>${solr-version}</version>
         </dependency>
+        <!-- org.apache.httpcomponents.httpmime still needed
+                for interpretation of remote solr server exception by HttpJdkSolrClient -->
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpmime</artifactId>
             <version>${httpclient4-version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.zookeeper</groupId>
-            <artifactId>zookeeper</artifactId>
-            <version>${solr-zookeeper-version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-log4j12</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>log4j</groupId>
-                    <artifactId>log4j</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
 
         <!-- test dependencies -->
         <dependency>
@@ -90,54 +72,19 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.solr</groupId>
-            <artifactId>solr-test-framework</artifactId>
-            <version>${solr-version}</version>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.google.protobuf</groupId>
-                    <artifactId>protobuf-java</artifactId>
-                </exclusion>
-                <!-- exclude rome 0.9 which is not a valid Maven artifact -->
-                <!-- rome is not a needed dependency -->
-                <exclusion>
-                    <groupId>rome</groupId>
-                    <artifactId>rome</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>jdk.tools</groupId>
-                    <artifactId>jdk.tools</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>com.google.protobuf</groupId>
-            <artifactId>protobuf-java</artifactId>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-catalog</artifactId>
             <scope>test</scope>
         </dependency>
-
-		<dependency>
-    		<groupId>org.apache.solr</groupId>
-    		<artifactId>solr-extraction</artifactId>
-            <version>${solr-version}</version>
-            <scope>test</scope>    
-		</dependency>
-
+        <!-- test infra -->
         <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-            <version>${jetty-for-solr-version}</version>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-core</artifactId>
+            <version>${project.version}</version>
             <scope>test</scope>
+            <type>test-jar</type>
         </dependency>
         <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <version>${jetty-for-solr-version}</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- test infra -->
-       <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-test-infra-solr</artifactId>
             <version>${project.version}</version>
@@ -150,7 +97,13 @@
             <version>${log4j2-version}</version>
             <scope>test</scope>
         </dependency>
-
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-solr</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+    
     </dependencies>
 
     <build>
diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java
index 970d5a32d5a..54c32b57f06 100644
--- a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java
+++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrComponentConfigurer.java
@@ -25,19 +25,52 @@ public class SolrComponentConfigurer extends PropertyConfigurerSupport implement
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "autowiredenabled":
         case "autowiredEnabled": target.setAutowiredEnabled(property(camelContext, boolean.class, value)); return true;
+        case "connectiontimeout":
+        case "connectionTimeout": target.setConnectionTimeout(property(camelContext, long.class, value)); return true;
+        case "defaultcollection":
+        case "defaultCollection": target.setDefaultCollection(property(camelContext, java.lang.String.class, value)); return true;
+        case "enablessl":
+        case "enableSSL": target.setEnableSSL(property(camelContext, boolean.class, value)); return true;
+        case "host": target.setHost(property(camelContext, java.lang.String.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "password": target.setPassword(property(camelContext, java.lang.String.class, value)); return true;
+        case "port": target.setPort(property(camelContext, int.class, value)); return true;
+        case "requesttimeout":
+        case "requestTimeout": target.setRequestTimeout(property(camelContext, long.class, value)); return true;
+        case "solrclient":
+        case "solrClient": target.setSolrClient(property(camelContext, org.apache.solr.client.solrj.SolrClient.class, value)); return true;
+        case "username": target.setUsername(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
         }
     }
 
+    @Override
+    public String[] getAutowiredNames() {
+        return new String[]{"solrClient"};
+    }
+
     @Override
     public Class<?> getOptionType(String name, boolean ignoreCase) {
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "autowiredenabled":
         case "autowiredEnabled": return boolean.class;
+        case "connectiontimeout":
+        case "connectionTimeout": return long.class;
+        case "defaultcollection":
+        case "defaultCollection": return java.lang.String.class;
+        case "enablessl":
+        case "enableSSL": return boolean.class;
+        case "host": return java.lang.String.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
+        case "password": return java.lang.String.class;
+        case "port": return int.class;
+        case "requesttimeout":
+        case "requestTimeout": return long.class;
+        case "solrclient":
+        case "solrClient": return org.apache.solr.client.solrj.SolrClient.class;
+        case "username": return java.lang.String.class;
         default: return null;
         }
     }
@@ -48,8 +81,22 @@ public class SolrComponentConfigurer extends PropertyConfigurerSupport implement
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "autowiredenabled":
         case "autowiredEnabled": return target.isAutowiredEnabled();
+        case "connectiontimeout":
+        case "connectionTimeout": return target.getConnectionTimeout();
+        case "defaultcollection":
+        case "defaultCollection": return target.getDefaultCollection();
+        case "enablessl":
+        case "enableSSL": return target.isEnableSSL();
+        case "host": return target.getHost();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
+        case "password": return target.getPassword();
+        case "port": return target.getPort();
+        case "requesttimeout":
+        case "requestTimeout": return target.getRequestTimeout();
+        case "solrclient":
+        case "solrClient": return target.getSolrClient();
+        case "username": return target.getUsername();
         default: return null;
         }
     }
diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java
index ecf55ffd6e5..205beee3104 100644
--- a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java
+++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointConfigurer.java
@@ -24,40 +24,52 @@ public class SolrEndpointConfigurer extends PropertyConfigurerSupport implements
         SolrEndpoint target = (SolrEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "allowcompression":
-        case "allowCompression": target.getSolrConfiguration().setAllowCompression(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "allowCompression": target.getConfiguration().setAllowCompression(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "async": target.getConfiguration().setAsync(property(camelContext, boolean.class, value)); return true;
         case "autocommit":
-        case "autoCommit": target.getSolrConfiguration().setAutoCommit(property(camelContext, boolean.class, value)); return true;
-        case "collection": target.getSolrConfiguration().setCollection(property(camelContext, java.lang.String.class, value)); return true;
+        case "autoCommit": target.getConfiguration().setAutoCommit(property(camelContext, boolean.class, value)); return true;
+        case "certificatepath":
+        case "certificatePath": target.getConfiguration().setCertificatePath(property(camelContext, java.lang.String.class, value)); return true;
+        case "collection": target.getConfiguration().setCollection(property(camelContext, java.lang.String.class, value)); return true;
         case "connectiontimeout":
-        case "connectionTimeout": target.getSolrConfiguration().setConnectionTimeout(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "connectionTimeout": target.getConfiguration().setConnectionTimeout(property(camelContext, java.lang.Long.class, value)); return true;
         case "defaultmaxconnectionsperhost":
-        case "defaultMaxConnectionsPerHost": target.getSolrConfiguration().setDefaultMaxConnectionsPerHost(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "defaultMaxConnectionsPerHost": target.getConfiguration().setDefaultMaxConnectionsPerHost(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "deletebyquery":
+        case "deleteByQuery": target.getConfiguration().setDeleteByQuery(property(camelContext, boolean.class, value)); return true;
+        case "enablessl":
+        case "enableSSL": target.getConfiguration().setEnableSSL(property(camelContext, boolean.class, value)); return true;
         case "followredirects":
-        case "followRedirects": target.getSolrConfiguration().setFollowRedirects(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "followRedirects": target.getConfiguration().setFollowRedirects(property(camelContext, java.lang.Boolean.class, value)); return true;
+        case "from": target.getConfiguration().setFrom(property(camelContext, java.lang.Integer.class, value)); return true;
         case "httpclient":
-        case "httpClient": target.getSolrConfiguration().setHttpClient(property(camelContext, org.apache.http.client.HttpClient.class, value)); return true;
+        case "httpClient": target.getConfiguration().setHttpClient(property(camelContext, java.net.http.HttpClient.class, value)); return true;
         case "lazystartproducer":
         case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
         case "maxretries":
-        case "maxRetries": target.getSolrConfiguration().setMaxRetries(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "maxRetries": target.getConfiguration().setMaxRetries(property(camelContext, java.lang.Integer.class, value)); return true;
         case "maxtotalconnections":
-        case "maxTotalConnections": target.getSolrConfiguration().setMaxTotalConnections(property(camelContext, java.lang.Integer.class, value)); return true;
-        case "password": target.getSolrConfiguration().setPassword(property(camelContext, java.lang.String.class, value)); return true;
+        case "maxTotalConnections": target.getConfiguration().setMaxTotalConnections(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "operation": target.getConfiguration().setOperation(property(camelContext, org.apache.camel.component.solr.SolrOperation.class, value)); return true;
+        case "password": target.getConfiguration().setPassword(property(camelContext, java.lang.String.class, value)); return true;
         case "requesthandler":
-        case "requestHandler": target.getSolrConfiguration().setRequestHandler(property(camelContext, java.lang.String.class, value)); return true;
+        case "requestHandler": target.getConfiguration().setRequestHandler(property(camelContext, java.lang.String.class, value)); return true;
+        case "requesttimeout":
+        case "requestTimeout": target.getConfiguration().setRequestTimeout(property(camelContext, java.lang.Long.class, value)); return true;
+        case "size": target.getConfiguration().setSize(property(camelContext, java.lang.Integer.class, value)); return true;
         case "sotimeout":
-        case "soTimeout": target.getSolrConfiguration().setSoTimeout(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "soTimeout": target.getConfiguration().setSoTimeout(property(camelContext, int.class, value)); return true;
         case "solrclient":
-        case "solrClient": target.getSolrConfiguration().setSolrClient(property(camelContext, org.apache.solr.client.solrj.SolrClient.class, value)); return true;
+        case "solrClient": target.getConfiguration().setSolrClient(property(camelContext, org.apache.solr.client.solrj.SolrClient.class, value)); return true;
         case "streamingqueuesize":
-        case "streamingQueueSize": target.getSolrConfiguration().setStreamingQueueSize(property(camelContext, int.class, value)); return true;
+        case "streamingQueueSize": target.getConfiguration().setStreamingQueueSize(property(camelContext, int.class, value)); return true;
         case "streamingthreadcount":
-        case "streamingThreadCount": target.getSolrConfiguration().setStreamingThreadCount(property(camelContext, int.class, value)); return true;
-        case "username": target.getSolrConfiguration().setUsername(property(camelContext, java.lang.String.class, value)); return true;
+        case "streamingThreadCount": target.getConfiguration().setStreamingThreadCount(property(camelContext, int.class, value)); return true;
+        case "username": target.getConfiguration().setUsername(property(camelContext, java.lang.String.class, value)); return true;
         case "zkchroot":
-        case "zkChroot": target.getSolrConfiguration().setZkChroot(property(camelContext, java.lang.String.class, value)); return true;
+        case "zkChroot": target.getConfiguration().setZkChroot(property(camelContext, java.lang.String.class, value)); return true;
         case "zkhost":
-        case "zkHost": target.getSolrConfiguration().setZkHost(property(camelContext, java.lang.String.class, value)); return true;
+        case "zkHost": target.getConfiguration().setZkHost(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
         }
     }
@@ -67,28 +79,40 @@ public class SolrEndpointConfigurer extends PropertyConfigurerSupport implements
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "allowcompression":
         case "allowCompression": return java.lang.Boolean.class;
+        case "async": return boolean.class;
         case "autocommit":
         case "autoCommit": return boolean.class;
+        case "certificatepath":
+        case "certificatePath": return java.lang.String.class;
         case "collection": return java.lang.String.class;
         case "connectiontimeout":
-        case "connectionTimeout": return java.lang.Integer.class;
+        case "connectionTimeout": return java.lang.Long.class;
         case "defaultmaxconnectionsperhost":
         case "defaultMaxConnectionsPerHost": return java.lang.Integer.class;
+        case "deletebyquery":
+        case "deleteByQuery": return boolean.class;
+        case "enablessl":
+        case "enableSSL": return boolean.class;
         case "followredirects":
         case "followRedirects": return java.lang.Boolean.class;
+        case "from": return java.lang.Integer.class;
         case "httpclient":
-        case "httpClient": return org.apache.http.client.HttpClient.class;
+        case "httpClient": return java.net.http.HttpClient.class;
         case "lazystartproducer":
         case "lazyStartProducer": return boolean.class;
         case "maxretries":
         case "maxRetries": return java.lang.Integer.class;
         case "maxtotalconnections":
         case "maxTotalConnections": return java.lang.Integer.class;
+        case "operation": return org.apache.camel.component.solr.SolrOperation.class;
         case "password": return java.lang.String.class;
         case "requesthandler":
         case "requestHandler": return java.lang.String.class;
+        case "requesttimeout":
+        case "requestTimeout": return java.lang.Long.class;
+        case "size": return java.lang.Integer.class;
         case "sotimeout":
-        case "soTimeout": return java.lang.Integer.class;
+        case "soTimeout": return int.class;
         case "solrclient":
         case "solrClient": return org.apache.solr.client.solrj.SolrClient.class;
         case "streamingqueuesize":
@@ -109,40 +133,52 @@ public class SolrEndpointConfigurer extends PropertyConfigurerSupport implements
         SolrEndpoint target = (SolrEndpoint) obj;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "allowcompression":
-        case "allowCompression": return target.getSolrConfiguration().getAllowCompression();
+        case "allowCompression": return target.getConfiguration().getAllowCompression();
+        case "async": return target.getConfiguration().isAsync();
         case "autocommit":
-        case "autoCommit": return target.getSolrConfiguration().isAutoCommit();
-        case "collection": return target.getSolrConfiguration().getCollection();
+        case "autoCommit": return target.getConfiguration().isAutoCommit();
+        case "certificatepath":
+        case "certificatePath": return target.getConfiguration().getCertificatePath();
+        case "collection": return target.getConfiguration().getCollection();
         case "connectiontimeout":
-        case "connectionTimeout": return target.getSolrConfiguration().getConnectionTimeout();
+        case "connectionTimeout": return target.getConfiguration().getConnectionTimeout();
         case "defaultmaxconnectionsperhost":
-        case "defaultMaxConnectionsPerHost": return target.getSolrConfiguration().getDefaultMaxConnectionsPerHost();
+        case "defaultMaxConnectionsPerHost": return target.getConfiguration().getDefaultMaxConnectionsPerHost();
+        case "deletebyquery":
+        case "deleteByQuery": return target.getConfiguration().isDeleteByQuery();
+        case "enablessl":
+        case "enableSSL": return target.getConfiguration().isEnableSSL();
         case "followredirects":
-        case "followRedirects": return target.getSolrConfiguration().getFollowRedirects();
+        case "followRedirects": return target.getConfiguration().getFollowRedirects();
+        case "from": return target.getConfiguration().getFrom();
         case "httpclient":
-        case "httpClient": return target.getSolrConfiguration().getHttpClient();
+        case "httpClient": return target.getConfiguration().getHttpClient();
         case "lazystartproducer":
         case "lazyStartProducer": return target.isLazyStartProducer();
         case "maxretries":
-        case "maxRetries": return target.getSolrConfiguration().getMaxRetries();
+        case "maxRetries": return target.getConfiguration().getMaxRetries();
         case "maxtotalconnections":
-        case "maxTotalConnections": return target.getSolrConfiguration().getMaxTotalConnections();
-        case "password": return target.getSolrConfiguration().getPassword();
+        case "maxTotalConnections": return target.getConfiguration().getMaxTotalConnections();
+        case "operation": return target.getConfiguration().getOperation();
+        case "password": return target.getConfiguration().getPassword();
         case "requesthandler":
-        case "requestHandler": return target.getSolrConfiguration().getRequestHandler();
+        case "requestHandler": return target.getConfiguration().getRequestHandler();
+        case "requesttimeout":
+        case "requestTimeout": return target.getConfiguration().getRequestTimeout();
+        case "size": return target.getConfiguration().getSize();
         case "sotimeout":
-        case "soTimeout": return target.getSolrConfiguration().getSoTimeout();
+        case "soTimeout": return target.getConfiguration().getSoTimeout();
         case "solrclient":
-        case "solrClient": return target.getSolrConfiguration().getSolrClient();
+        case "solrClient": return target.getConfiguration().getSolrClient();
         case "streamingqueuesize":
-        case "streamingQueueSize": return target.getSolrConfiguration().getStreamingQueueSize();
+        case "streamingQueueSize": return target.getConfiguration().getStreamingQueueSize();
         case "streamingthreadcount":
-        case "streamingThreadCount": return target.getSolrConfiguration().getStreamingThreadCount();
-        case "username": return target.getSolrConfiguration().getUsername();
+        case "streamingThreadCount": return target.getConfiguration().getStreamingThreadCount();
+        case "username": return target.getConfiguration().getUsername();
         case "zkchroot":
-        case "zkChroot": return target.getSolrConfiguration().getZkChroot();
+        case "zkChroot": return target.getConfiguration().getZkChroot();
         case "zkhost":
-        case "zkHost": return target.getSolrConfiguration().getZkHost();
+        case "zkHost": return target.getConfiguration().getZkHost();
         default: return null;
         }
     }
diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java
index 73f07937b8b..0ff010895d1 100644
--- a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java
+++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/SolrEndpointUriFactory.java
@@ -17,31 +17,39 @@ import org.apache.camel.spi.EndpointUriFactory;
 @Generated("org.apache.camel.maven.packaging.GenerateEndpointUriFactoryMojo")
 public class SolrEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
 
-    private static final String BASE = ":url";
-    private static final String[] SCHEMES = new String[]{"solr", "solrs", "solrCloud"};
+    private static final String BASE = ":host:port";
 
     private static final Set<String> PROPERTY_NAMES;
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(20);
+        Set<String> props = new HashSet<>(29);
         props.add("allowCompression");
+        props.add("async");
         props.add("autoCommit");
+        props.add("certificatePath");
         props.add("collection");
         props.add("connectionTimeout");
         props.add("defaultMaxConnectionsPerHost");
+        props.add("deleteByQuery");
+        props.add("enableSSL");
         props.add("followRedirects");
+        props.add("from");
+        props.add("host");
         props.add("httpClient");
         props.add("lazyStartProducer");
         props.add("maxRetries");
         props.add("maxTotalConnections");
+        props.add("operation");
         props.add("password");
+        props.add("port");
         props.add("requestHandler");
+        props.add("requestTimeout");
+        props.add("size");
         props.add("soTimeout");
         props.add("solrClient");
         props.add("streamingQueueSize");
         props.add("streamingThreadCount");
-        props.add("url");
         props.add("username");
         props.add("zkChroot");
         props.add("zkHost");
@@ -55,12 +63,7 @@ public class SolrEndpointUriFactory extends org.apache.camel.support.component.E
 
     @Override
     public boolean isEnabled(String scheme) {
-        for (String s : SCHEMES) {
-            if (s.equals(scheme)) {
-                return true;
-            }
-        }
-        return false;
+        return "solr".equals(scheme);
     }
 
     @Override
@@ -70,7 +73,8 @@ public class SolrEndpointUriFactory extends org.apache.camel.support.component.E
 
         Map<String, Object> copy = new HashMap<>(properties);
 
-        uri = buildPathParameter(syntax, uri, "url", null, true, copy);
+        uri = buildPathParameter(syntax, uri, "host", null, true, copy);
+        uri = buildPathParameter(syntax, uri, "port", null, false, copy);
         uri = buildQueryParameters(uri, copy, encode);
         return uri;
     }
diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/converter/SolrRequestConverterLoader.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/converter/SolrRequestConverterLoader.java
new file mode 100644
index 00000000000..627cc686fb5
--- /dev/null
+++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/converter/SolrRequestConverterLoader.java
@@ -0,0 +1,60 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.solr.converter;
+
+import javax.annotation.processing.Generated;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.TypeConverterLoaderGeneratorMojo")
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class SolrRequestConverterLoader implements TypeConverterLoader, CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public SolrRequestConverterLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {
+        registerConverters(registry);
+    }
+
+    private void registerConverters(TypeConverterRegistry registry) {
+        addTypeConverter(registry, org.apache.solr.client.solrj.request.ContentStreamUpdateRequest.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrRequestConverter.createContentStreamUpdateRequest(value, exchange));
+        addTypeConverter(registry, org.apache.solr.client.solrj.request.QueryRequest.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrRequestConverter.createQueryRequest(value, exchange));
+        addTypeConverter(registry, org.apache.solr.client.solrj.request.SolrPing.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrRequestConverter.createSolrPing(value, exchange));
+        addTypeConverter(registry, org.apache.solr.client.solrj.request.UpdateRequest.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrRequestConverter.createUpdateRequest(value, exchange));
+    }
+
+    private static void addTypeConverter(TypeConverterRegistry registry, Class<?> toType, Class<?> fromType, boolean allowNull, SimpleTypeConverter.ConversionMethod method) {
+        registry.addTypeConverter(toType, fromType, new SimpleTypeConverter(allowNull, method));
+    }
+}
diff --git a/components/camel-solr/src/generated/java/org/apache/camel/component/solr/converter/SolrResponseConverterLoader.java b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/converter/SolrResponseConverterLoader.java
new file mode 100644
index 00000000000..1bd135e6a55
--- /dev/null
+++ b/components/camel-solr/src/generated/java/org/apache/camel/component/solr/converter/SolrResponseConverterLoader.java
@@ -0,0 +1,60 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.solr.converter;
+
+import javax.annotation.processing.Generated;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.TypeConverterLoaderGeneratorMojo")
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class SolrResponseConverterLoader implements TypeConverterLoader, CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public SolrResponseConverterLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {
+        registerConverters(registry);
+    }
+
+    private void registerConverters(TypeConverterRegistry registry) {
+        addTypeConverter(registry, java.util.Map.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrResponseConverter.createSolrResponseMap(value, exchange));
+        addTypeConverter(registry, org.apache.solr.client.solrj.SolrResponse.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrResponseConverter.createSolrResponse(value, exchange));
+        addTypeConverter(registry, org.apache.solr.client.solrj.response.QueryResponse.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrResponseConverter.createQueryResponse(value, exchange));
+        addTypeConverter(registry, org.apache.solr.client.solrj.response.SolrPingResponse.class, java.lang.Object.class, false,
+            (type, exchange, value) -> org.apache.camel.component.solr.converter.SolrResponseConverter.createSolrPingResponse(value, exchange));
+    }
+
+    private static void addTypeConverter(TypeConverterRegistry registry, Class<?> toType, Class<?> fromType, boolean allowNull, SimpleTypeConverter.ConversionMethod method) {
+        registry.addTypeConverter(toType, fromType, new SimpleTypeConverter(allowNull, method));
+    }
+}
diff --git a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json b/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json
index 84dce7bb0ef..b37fad9a310 100644
--- a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json
+++ b/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solr.json
@@ -6,7 +6,7 @@
     "description": "Perform operations against Apache Lucene Solr.",
     "deprecated": false,
     "firstVersion": "4.8.0",
-    "label": "monitoring,search",
+    "label": "search,monitoring",
     "javaType": "org.apache.camel.component.solr.SolrComponent",
     "supportLevel": "Stable",
     "groupId": "org.apache.camel",
@@ -14,8 +14,7 @@
     "version": "4.10.0-SNAPSHOT",
     "scheme": "solr",
     "extendsScheme": "",
-    "alternativeSchemes": "solr,solrs,solrCloud",
-    "syntax": "solr:url",
+    "syntax": "solr:host:port",
     "async": false,
     "api": false,
     "consumerOnly": false,
@@ -25,36 +24,62 @@
     "remote": true
   },
   "componentProperties": {
-    "lazyStartProducer": { "index": 0, "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 [...]
-    "autowiredEnabled": { "index": 1, "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 t [...]
+    "connectionTimeout": { "index": 0, "kind": "property", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 60000, "description": "The time in ms to wait before connection will time out." },
+    "defaultCollection": { "index": 1, "kind": "property", "displayName": "Default Collection", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Solr default collection name" },
+    "host": { "index": 2, "kind": "property", "displayName": "Host", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The solr instance host name" },
+    "lazyStartProducer": { "index": 3, "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 [...]
+    "port": { "index": 4, "kind": "property", "displayName": "Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "description": "The solr instance port number" },
+    "requestTimeout": { "index": 5, "kind": "property", "displayName": "Request Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 600000, "description": "The timeout in ms to wait before the socket will time out." },
+    "autowiredEnabled": { "index": 6, "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 t [...]
+    "solrClient": { "index": 7, "kind": "property", "displayName": "Solr Client", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": true, "secret": false, "description": "To use an existing configured solr client, instead of creating a client per endpoint. This allows customizing the client with specific advanced settings." },
+    "enableSSL": { "index": 8, "kind": "property", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Enable SSL" },
+    "password": { "index": 9, "kind": "property", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Password for authenticating" },
+    "username": { "index": 10, "kind": "property", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "description": "Basic authenticate user" }
   },
   "headers": {
-    "CamelSolrClient": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The client.", "constantName": "org.apache.camel.component.solr.SolrConstants#CLIENT" },
-    "CamelSolrCollection": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request again.", "constantName": "org.apache.camel.component.solr.SolrConstants#COLLECTION" },
-    "SolrOperation": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#OPERATION" },
-    "CamelSolrQueryString": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#QUERY_STRING" },
-    "Content-Type": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type.", "constantName": "org.apache.camel.component.solr.SolrConstants#CONTENT_TYPE" }
+    "operation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_OPERATION" },
+    "SolrOperation": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Use header 'operation' instead", "autowired": false, "secret": false, "description": "The operation to perform. Deprecation note: Use header 'operation' instead", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_OPERATION_DEPRECATED" },
+    "collection": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request against.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_COLLECTION" },
+    "CamelSolrCollection": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Use header 'collection' instead", "autowired": false, "secret": false, "description": "The collection to execute the request against. Deprecation note: Use header 'collection' instead", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_COLLECTION_DEPRECATED" },
+    "requestHandler": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request handler to execute the solr request against.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_REQUEST_HANDLER" },
+    "queryString": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_QUERY_STRING" },
+    "CamelSolrQueryString": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": true, "deprecationNote": "Use header 'queryString' instead", "autowired": false, "secret": false, "description": "The query to execute. Deprecation note: Use header 'queryString' instead", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_QUERY_STRING_DEPRECATED" },
+    "size": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The size of the response.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_SIZE" },
+    "from": { "index": 8, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The starting index of the response.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_FROM" },
+    "solrClient": { "index": 9, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The solr client to use for the request.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_SOLR_CLIENT" },
+    "solrParams": { "index": 10, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "SolrParams", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The solr parameters to use for the request.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_SOLR_PARAMS" },
+    "deleteByQuery": { "index": 11, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "false", "description": "For the delete instruction, interprete body as query\/queries instead of id\/ids.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_DELETE_BY_QUERY" },
+    "Content-Type": { "index": 12, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type is used to identify the type when inserting files.", "constantName": "org.apache.camel.component.solr.SolrConstants#PARAM_CONTENT_TYPE" }
   },
   "properties": {
-    "url": { "index": 0, "kind": "path", "displayName": "Url", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Hostname and port for the Solr server(s). Multiple hosts can be specified, separated with a comma. See the solrC [...]
-    "autoCommit": { "index": 1, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "If true, each producer operation will be automatically followed by a commit" },
-    "connectionTimeout": { "index": 2, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the connection timeout on the SolrClient" },
-    "defaultMaxConnectionsPerHost": { "index": 3, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
-    "httpClient": { "index": 4, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.http.client.HttpClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not [...]
-    "maxRetries": { "index": 5, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Maximum number of retries to attempt in the event of transient errors" },
-    "maxTotalConnections": { "index": 6, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
-    "requestHandler": { "index": 7, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the request handler to be used" },
-    "solrClient": { "index": 8, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Uses the provided solr client to connect to solr. When this parameter is not specified, cam [...]
-    "soTimeout": { "index": 9, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the socket timeout on the SolrClient" },
-    "streamingQueueSize": { "index": 10, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
-    "streamingThreadCount": { "index": 11, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
-    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
-    "collection": { "index": 13, "kind": "parameter", "displayName": "Collection", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the default collection for SolrCloud" },
-    "zkChroot": { "index": 14, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
-    "zkHost": { "index": 15, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost [...]
-    "allowCompression": { "index": 16, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Server side must support gzip or deflate for this to have any effect" },
-    "followRedirects": { "index": 17, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Indicates whether redirects are used to get to the Solr server" },
-    "password": { "index": 18, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets password for basic auth plugin enabled servers" },
-    "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets username for basic auth plugin enabled servers" }
+    "host": { "index": 0, "kind": "path", "displayName": "Host", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The solr instance host name (set to 'default' to use the host name defined on component level)" },
+    "port": { "index": 1, "kind": "path", "displayName": "Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The solr instance port number" },
+    "async": { "index": 2, "kind": "parameter", "displayName": "Async", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Use async request processing (when supported by the solr client)" },
+    "autoCommit": { "index": 3, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "If true, each producer insert\/delete operation will be automatically performing a commit" },
+    "collection": { "index": 4, "kind": "parameter", "displayName": "Collection", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The name of the collection to act against" },
+    "connectionTimeout": { "index": 5, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The time in ms to wait before connection will time out." },
+    "defaultMaxConnectionsPerHost": { "index": 6, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
+    "deleteByQuery": { "index": 7, "kind": "parameter", "displayName": "Delete By Query", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "For the delete instruction, interprete body as query\/queries instead of id\/ids." },
+    "from": { "index": 8, "kind": "parameter", "displayName": "From", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Starting index of the response." },
+    "httpClient": { "index": 9, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "java.net.http.HttpClient", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not set." },
+    "maxRetries": { "index": 10, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Maximum number of retries to attempt in the event of transient errors" },
+    "maxTotalConnections": { "index": 11, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
+    "operation": { "index": 12, "kind": "parameter", "displayName": "Operation", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.solr.SolrOperation", "enum": [ "DELETE", "INSERT", "PING", "SEARCH" ], "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "What operation to perform" },
+    "requestHandler": { "index": 13, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The path of the update request handler (use for update requests \/ set solr parameter qt for search requests)" },
+    "requestTimeout": { "index": 14, "kind": "parameter", "displayName": "Request Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Long", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The time in ms to wait before the request will time out (former soTimeout)." },
+    "size": { "index": 15, "kind": "parameter", "displayName": "Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Size of the response." },
+    "solrClient": { "index": 16, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The solr client to connect to solr. When solrClient bean is provided, all connection propertie [...]
+    "soTimeout": { "index": 17, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The time in ms to wait before the request will time out (former soTimeout)." },
+    "streamingQueueSize": { "index": 18, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
+    "streamingThreadCount": { "index": 19, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
+    "lazyStartProducer": { "index": 20, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
+    "zkChroot": { "index": 21, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
+    "zkHost": { "index": 22, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost:2182 [...]
+    "allowCompression": { "index": 23, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Server side must support gzip or deflate for this to have any effect" },
+    "followRedirects": { "index": 24, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Indicates whether redirects are used to get to the Solr server" },
+    "certificatePath": { "index": 25, "kind": "parameter", "displayName": "Certificate Path", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "supportFileReference": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "The certificate that can be used to access the [...]
+    "enableSSL": { "index": 26, "kind": "parameter", "displayName": "Enable SSL", "group": "security", "label": "security", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Enable SSL" },
+    "password": { "index": 27, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Password for authenticating" },
+    "username": { "index": 28, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "configuration", "description": "Basic authenticate user" }
   }
 }
diff --git a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solrCloud.json b/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solrCloud.json
deleted file mode 100644
index 9b392359334..00000000000
--- a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solrCloud.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "component": {
-    "kind": "component",
-    "name": "solrCloud",
-    "title": "Solr",
-    "description": "Perform operations against Apache Lucene Solr.",
-    "deprecated": false,
-    "firstVersion": "4.8.0",
-    "label": "monitoring,search",
-    "javaType": "org.apache.camel.component.solr.SolrComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-solr",
-    "version": "4.10.0-SNAPSHOT",
-    "scheme": "solrCloud",
-    "extendsScheme": "",
-    "alternativeSchemes": "solr,solrs,solrCloud",
-    "syntax": "solrCloud:url",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": true,
-    "lenientProperties": false,
-    "browsable": false,
-    "remote": true
-  },
-  "componentProperties": {
-    "lazyStartProducer": { "index": 0, "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 [...]
-    "autowiredEnabled": { "index": 1, "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 t [...]
-  },
-  "headers": {
-    "CamelSolrClient": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The client.", "constantName": "org.apache.camel.component.solr.SolrConstants#CLIENT" },
-    "CamelSolrCollection": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request again.", "constantName": "org.apache.camel.component.solr.SolrConstants#COLLECTION" },
-    "SolrOperation": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#OPERATION" },
-    "CamelSolrQueryString": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#QUERY_STRING" },
-    "Content-Type": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type.", "constantName": "org.apache.camel.component.solr.SolrConstants#CONTENT_TYPE" }
-  },
-  "properties": {
-    "url": { "index": 0, "kind": "path", "displayName": "Url", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Hostname and port for the Solr server(s). Multiple hosts can be specified, separated with a comma. See the solrC [...]
-    "autoCommit": { "index": 1, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "If true, each producer operation will be automatically followed by a commit" },
-    "connectionTimeout": { "index": 2, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the connection timeout on the SolrClient" },
-    "defaultMaxConnectionsPerHost": { "index": 3, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
-    "httpClient": { "index": 4, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.http.client.HttpClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not [...]
-    "maxRetries": { "index": 5, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Maximum number of retries to attempt in the event of transient errors" },
-    "maxTotalConnections": { "index": 6, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
-    "requestHandler": { "index": 7, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the request handler to be used" },
-    "solrClient": { "index": 8, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Uses the provided solr client to connect to solr. When this parameter is not specified, cam [...]
-    "soTimeout": { "index": 9, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the socket timeout on the SolrClient" },
-    "streamingQueueSize": { "index": 10, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
-    "streamingThreadCount": { "index": 11, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
-    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
-    "collection": { "index": 13, "kind": "parameter", "displayName": "Collection", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the default collection for SolrCloud" },
-    "zkChroot": { "index": 14, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
-    "zkHost": { "index": 15, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost [...]
-    "allowCompression": { "index": 16, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Server side must support gzip or deflate for this to have any effect" },
-    "followRedirects": { "index": 17, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Indicates whether redirects are used to get to the Solr server" },
-    "password": { "index": 18, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets password for basic auth plugin enabled servers" },
-    "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets username for basic auth plugin enabled servers" }
-  }
-}
diff --git a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solrs.json b/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solrs.json
deleted file mode 100644
index 444ec195ffc..00000000000
--- a/components/camel-solr/src/generated/resources/META-INF/org/apache/camel/component/solr/solrs.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "component": {
-    "kind": "component",
-    "name": "solrs",
-    "title": "Solr (Secure)",
-    "description": "Perform operations against Apache Lucene Solr.",
-    "deprecated": false,
-    "firstVersion": "4.8.0",
-    "label": "monitoring,search",
-    "javaType": "org.apache.camel.component.solr.SolrComponent",
-    "supportLevel": "Stable",
-    "groupId": "org.apache.camel",
-    "artifactId": "camel-solr",
-    "version": "4.10.0-SNAPSHOT",
-    "scheme": "solrs",
-    "extendsScheme": "",
-    "alternativeSchemes": "solr,solrs,solrCloud",
-    "syntax": "solrs:url",
-    "async": false,
-    "api": false,
-    "consumerOnly": false,
-    "producerOnly": true,
-    "lenientProperties": false,
-    "browsable": false,
-    "remote": true
-  },
-  "componentProperties": {
-    "lazyStartProducer": { "index": 0, "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 [...]
-    "autowiredEnabled": { "index": 1, "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 t [...]
-  },
-  "headers": {
-    "CamelSolrClient": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The client.", "constantName": "org.apache.camel.component.solr.SolrConstants#CLIENT" },
-    "CamelSolrCollection": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection to execute the request again.", "constantName": "org.apache.camel.component.solr.SolrConstants#COLLECTION" },
-    "SolrOperation": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform.", "constantName": "org.apache.camel.component.solr.SolrConstants#OPERATION" },
-    "CamelSolrQueryString": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The query to execute.", "constantName": "org.apache.camel.component.solr.SolrConstants#QUERY_STRING" },
-    "Content-Type": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The content type.", "constantName": "org.apache.camel.component.solr.SolrConstants#CONTENT_TYPE" }
-  },
-  "properties": {
-    "url": { "index": 0, "kind": "path", "displayName": "Url", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Hostname and port for the Solr server(s). Multiple hosts can be specified, separated with a comma. See the solrC [...]
-    "autoCommit": { "index": 1, "kind": "parameter", "displayName": "Auto Commit", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "If true, each producer operation will be automatically followed by a commit" },
-    "connectionTimeout": { "index": 2, "kind": "parameter", "displayName": "Connection Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the connection timeout on the SolrClient" },
-    "defaultMaxConnectionsPerHost": { "index": 3, "kind": "parameter", "displayName": "Default Max Connections Per Host", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxConnectionsPerHost on the underlying HttpConnectionManager" },
-    "httpClient": { "index": 4, "kind": "parameter", "displayName": "Http Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.http.client.HttpClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the http client to be used by the solrClient. This is only applicable when solrClient is not [...]
-    "maxRetries": { "index": 5, "kind": "parameter", "displayName": "Max Retries", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Maximum number of retries to attempt in the event of transient errors" },
-    "maxTotalConnections": { "index": 6, "kind": "parameter", "displayName": "Max Total Connections", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": true, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "maxTotalConnection on the underlying HttpConnectionManager" },
-    "requestHandler": { "index": 7, "kind": "parameter", "displayName": "Request Handler", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the request handler to be used" },
-    "solrClient": { "index": 8, "kind": "parameter", "displayName": "Solr Client", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.solr.client.solrj.SolrClient", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Uses the provided solr client to connect to solr. When this parameter is not specified, cam [...]
-    "soTimeout": { "index": 9, "kind": "parameter", "displayName": "So Timeout", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the socket timeout on the SolrClient" },
-    "streamingQueueSize": { "index": 10, "kind": "parameter", "displayName": "Streaming Queue Size", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 10, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the queue size for the ConcurrentUpdateSolrClient" },
-    "streamingThreadCount": { "index": 11, "kind": "parameter", "displayName": "Streaming Thread Count", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets the number of threads for the ConcurrentUpdateSolrClient" },
-    "lazyStartProducer": { "index": 12, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "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 produ [...]
-    "collection": { "index": 13, "kind": "parameter", "displayName": "Collection", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the default collection for SolrCloud" },
-    "zkChroot": { "index": 14, "kind": "parameter", "displayName": "Zk Chroot", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the chroot of the zookeeper connection (include the leading slash; e.g. '\/mychroot')" },
-    "zkHost": { "index": 15, "kind": "parameter", "displayName": "Zk Host", "group": "CloudSolrClient", "label": "CloudSolrClient", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. zkHost=localhost:2181,localhost [...]
-    "allowCompression": { "index": 16, "kind": "parameter", "displayName": "Allow Compression", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Server side must support gzip or deflate for this to have any effect" },
-    "followRedirects": { "index": 17, "kind": "parameter", "displayName": "Follow Redirects", "group": "HttpSolrClient", "label": "HttpSolrClient", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Indicates whether redirects are used to get to the Solr server" },
-    "password": { "index": 18, "kind": "parameter", "displayName": "Password", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets password for basic auth plugin enabled servers" },
-    "username": { "index": 19, "kind": "parameter", "displayName": "Username", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.solr.SolrConfiguration", "configurationField": "solrConfiguration", "description": "Sets username for basic auth plugin enabled servers" }
-  }
-}
diff --git a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 00000000000..0a6af2e51c9
--- /dev/null
+++ b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -0,0 +1,3 @@
+# Generated by camel build tools - do NOT edit this file!
+org.apache.camel.component.solr.converter.SolrRequestConverterLoader
+org.apache.camel.component.solr.converter.SolrResponseConverterLoader
diff --git a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component.properties
index f3f6b8016c7..4aad88fdf5b 100644
--- a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component.properties
+++ b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -1,5 +1,5 @@
 # Generated by camel build tools - do NOT edit this file!
-components=solr solrCloud solrs
+components=solr
 groupId=org.apache.camel
 artifactId=camel-solr
 version=4.10.0-SNAPSHOT
diff --git a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component/solrCloud b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component/solrCloud
deleted file mode 100644
index 96b68397057..00000000000
--- a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component/solrCloud
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.solr.SolrComponent
diff --git a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component/solrs b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component/solrs
deleted file mode 100644
index 96b68397057..00000000000
--- a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/component/solrs
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.solr.SolrComponent
diff --git a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/urifactory/solrCloud-endpoint b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/urifactory/solrCloud-endpoint
deleted file mode 100644
index ca05dd4eb92..00000000000
--- a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/urifactory/solrCloud-endpoint
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.solr.SolrEndpointUriFactory
diff --git a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/urifactory/solrs-endpoint b/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/urifactory/solrs-endpoint
deleted file mode 100644
index ca05dd4eb92..00000000000
--- a/components/camel-solr/src/generated/resources/META-INF/services/org/apache/camel/urifactory/solrs-endpoint
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generated by camel build tools - do NOT edit this file!
-class=org.apache.camel.component.solr.SolrEndpointUriFactory
diff --git a/components/camel-solr/src/main/docs/solr-component.adoc b/components/camel-solr/src/main/docs/solr-component.adoc
index c12d8a28cfa..267a28aabf3 100644
--- a/components/camel-solr/src/main/docs/solr-component.adoc
+++ b/components/camel-solr/src/main/docs/solr-component.adoc
@@ -33,9 +33,7 @@ for this component:
 == URI format
 
 --------------------------------------
-solr://host[:port]/solr?[options]
-solrs://host[:port]/solr?[options]
-solrCloud://host[:port]/solr?[options]
+solr://host[:port]?[options]
 --------------------------------------
 
 // component-configure options: START
@@ -59,64 +57,52 @@ include::partial$component-endpoint-headers.adoc[]
 === Message Operations
 
 The following Solr operations are currently supported. Set an
-exchange header with a key of `SolrOperation` and a value set to one of
+exchange header with a key of "operation" and a value set to one of
 the following. Some operations also require the message body to be set.
 
 * `INSERT`
-* `INSERT_STREAMING`
+* `DELETE`
+* `SEARCH`
+* `PING`
 
 [width="100%",cols="10%,10%,80%",options="header",]
 |=======================================================================
 |Operation |Message body |Description
 
-|`INSERT/INSERT_STREAMING` |n/a |adds an index using message headers (must be prefixed with "SolrField.")
+|`INSERT` | n/a |inserts/updates a document using message headers (solr fields must be prefixed with "SolrField.")
 
-|`INSERT/INSERT_STREAMING` |File |adds an index using the given File (using `ContentStreamUpdateRequest`)
+|`INSERT` | File |inserts/updates a document or documents using the given File (using ContentStreamUpdateRequest)
 
-|`INSERT/INSERT_STREAMING` |`SolrInputDocument` |updates index based on the given `SolrInputDocument`
+|`INSERT` | SolrInputDocument or Collection<SolrInputDocument>|inserts/updates a document or documents based on the given (collection of) SolrInputDocument
 
-|`INSERT/INSERT_STREAMING` |String XML |updates index based on the given XML (must follow
-`SolrInputDocument` format)
+|`INSERT` | bean or Collection<bean> |inserts/updates a document or documents based on values in an http://wiki.apache.org/solr/Solrj#Directly_adding_POJOs_to_Solr[annotated bean]
 
-|`ADD_BEAN` |bean instance |adds an index based on values in an
-http://wiki.apache.org/solr/Solrj#Directly_adding_POJOs_to_Solr[annotated
-bean]
+|`INSERT` | String |inserts/updates a document or documents index based on the given XML or json as string (must follow SolrInputDocument format)
 
-|`ADD_BEANS` |`collection<bean>` |adds index based on a collection of
-http://wiki.apache.org/solr/Solrj#Directly_adding_POJOs_to_Solr[annotated
-bean]
+|`DELETE` | String or Collection<String> | delete a record by ID (or collection of ids) or by a query (or a collection of queries) when header "deleteByQuery=true"
 
-|`DELETE_BY_ID` |index id to delete |delete a record by ID
+|`PING` |n/a | Pings the solr instance
 
-|`DELETE_BY_QUERY` |query string |delete a record by a query
-
-|`COMMIT` |n/a |performs a commit on any pending index changes
-
-|`SOFT_COMMIT` |n/a |performs a `soft commit` (without guarantee that Lucene index files are written to stable storage; useful for Near Real Time operations) on any pending index changes
-
-|`ROLLBACK` |n/a |performs a rollback on any pending index changes
-
-|`OPTIMIZE` |n/a |performs a commit on any pending index changes and then runs the
-optimize command (This command reorganizes the Solr index and might be a heavy task)
+|`SEARCH` |n/a | Performs a search request to the solr instance
 |=======================================================================
 
 == Example
 
-Below is a simple `INSERT`, `DELETE` and `COMMIT` example
+Below is a simple `INSERT`, `DELETE` and `SEARCH` example
 
 [source,java]
 ---------------------------------------------------------------------------------------
 from("direct:insert")
-    .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_INSERT))
+    .setHeader(SolrConstants.PARAM_OPERATION, constant(SolrOperation.INSERT))
     .setHeader(SolrConstants.FIELD + "id", body())
     .to("solr://localhost:8983/solr");
 
 from("direct:delete")
-    .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_DELETE_BY_ID))
+    .setHeader(SolrConstants.PARAM_OPERATION, constant(SolrOperation.DELETE))
     .to("solr://localhost:8983/solr");
 
-from("direct:commit")
-    .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT))
+from("direct:search")
+    .setHeader(SolrConstants.PARAM_OPERATION, constant(SolrOperation.SEARCH))
     .to("solr://localhost:8983/solr");
 ---------------------------------------------------------------------------------------
 
@@ -124,7 +110,7 @@ from("direct:commit")
 ------------------------------------------
 <route>
     <from uri="direct:insert"/>
-    <setHeader name="SolrOperation">
+    <setHeader name="operation">
         <constant>INSERT</constant>
     </setHeader>
     <setHeader name="SolrField.id">
@@ -134,15 +120,15 @@ from("direct:commit")
 </route>
 <route>
     <from uri="direct:delete"/>
-    <setHeader name="SolrOperation">
-        <constant>DELETE_BY_ID</constant>
+    <setHeader name="operation">
+        <constant>DELETE</constant>
     </setHeader>
     <to uri="solr://localhost:8983/solr"/>
 </route>
 <route>
-    <from uri="direct:commit"/>
-    <setHeader name="SolrOperation">
-        <constant>COMMIT</constant>
+    <from uri="direct:search"/>
+    <setHeader name="operation">
+        <constant>SEARCH</constant>
     </setHeader>
     <to uri="solr://localhost:8983/solr"/>
 </route>
@@ -153,19 +139,14 @@ delete routes and then call the commit route.
 
 [source,java]
 -----------------------------------------------
-template.sendBody("direct:insert", "1234");
-template.sendBody("direct:commit", null);
-template.sendBody("direct:delete", "1234");
-template.sendBody("direct:commit", null);
+template.sendBodyAndHeader("direct:insert", "1234", "SolrParam.commit", true);
+template.sendBodyAndHeader("direct:delete", "1234", "SolrParam.commit", true);
+template.sendBody("direct:search", "id:1234");
 -----------------------------------------------
 
-=== Querying Solr
-
-The components provide a producer operation to query Solr.
-
 For more information:
 
-https://solr.apache.org/guide/solr/latest/query-guide/standard-query-parser.html[Solr Query Syntax]
+https://solr.apache.org/guide/solr/latest/[Apache Solr Reference Guide]
 
 
 
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandler.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandler.java
deleted file mode 100644
index ffcdaa8e36a..00000000000
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandler.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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.solr;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import org.apache.camel.util.StringHelper;
-import org.apache.solr.client.solrj.SolrClient;
-
-public abstract class SolrClientHandler {
-
-    public final SolrConfiguration solrConfiguration;
-
-    public SolrClientHandler(SolrConfiguration solrConfiguration) {
-        this.solrConfiguration = solrConfiguration;
-    }
-
-    protected abstract SolrClient getSolrClient();
-
-    protected static Optional<String> getZkChrootFromUrl(String path) {
-        path = StringHelper.removeStartingCharacters(path, '/');
-        if (!path.contains("/")) {
-            return Optional.empty();
-        }
-        // find first entry of csv that has /
-        String pathWithZkChroot = Arrays.stream(path.split(",")).filter(s -> s.contains("/")).findFirst().orElse("");
-        // don't consider as zkChroot when 1st subPath = 'solr'
-        return Arrays.asList(pathWithZkChroot.split("/")).get(1).equals("solr")
-                ? Optional.empty() : Optional.of(pathWithZkChroot.substring(pathWithZkChroot.indexOf('/')));
-    }
-
-    protected static String parseHostsFromUrl(String path, Optional<String> zkChroot) {
-        String hostsPath = StringHelper.removeStartingCharacters(path, '/');
-        return (zkChroot.isPresent()) ? hostsPath.substring(0, hostsPath.indexOf('/')) : hostsPath;
-    }
-
-    protected String getFirstUrlFromList() {
-        return getUrlListFrom(solrConfiguration).get(0);
-    }
-
-    protected static List<String> getUrlListFrom(SolrConfiguration solrConfiguration) {
-        String url = solrConfiguration.getZkHost() != null && !solrConfiguration.getZkHost().isEmpty()
-                ? solrConfiguration.getZkHost() : solrConfiguration.getUrl();
-        // add scheme when required
-        List<String> urlList = Arrays
-                .asList(url.split(","))
-                .stream()
-                .map(s -> solrConfiguration.getSolrScheme().getScheme().concat(s))
-                .collect(Collectors.toList());
-        // validate url syntax via parsing in URL instance
-        for (String s : urlList) {
-            try {
-                // solrCloud requires addition of HTTP scheme to be able to consider it as a valid URL scheme
-                new URL(
-                        SolrConfiguration.SolrScheme.SOLRCLOUD.equals(solrConfiguration.getSolrScheme())
-                                ? SolrConfiguration.SolrScheme.SOLR.getScheme().concat(s) : s);
-            } catch (MalformedURLException e) {
-                throw new IllegalArgumentException(
-                        String.format(
-                                "Url '%s' not valid for endpoint with uri=%s",
-                                s,
-                                solrConfiguration.getSolrScheme().getUri()));
-            }
-        }
-        return urlList;
-    }
-
-    /**
-     * Signature defines parameters deciding whether or not to share the solrClient - sharing allowed: same signature -
-     * sharing not allowed: different signature
-     */
-    public static String getSignature(SolrConfiguration solrConfiguration) {
-        if (solrConfiguration.getSolrClient() != null) {
-            return solrConfiguration.getSolrClient().toString();
-        }
-        StringBuilder sb = new StringBuilder();
-        if (solrConfiguration.getSolrEndpoint() != null) {
-            sb.append(solrConfiguration.getSolrEndpoint());
-        }
-        if (solrConfiguration.getUseConcurrentUpdateSolrClient()) {
-            sb.append("_");
-            sb.append(solrConfiguration.getUseConcurrentUpdateSolrClient());
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Allows to override solrClient configuration based on processing solrOperation
-     */
-    public static SolrConfiguration initializeFor(
-            String solrOperation, SolrConfiguration solrConfiguration) {
-        if (solrOperation == null) {
-            return solrConfiguration;
-        }
-        switch (solrOperation) {
-            case SolrConstants.OPERATION_INSERT_STREAMING:
-                if (!SolrConfiguration.SolrScheme.SOLRCLOUD.equals(solrConfiguration.getSolrScheme())) {
-                    SolrConfiguration newSolrConfiguration = solrConfiguration.deepCopy();
-                    newSolrConfiguration.setUseConcurrentUpdateSolrClient(true);
-                    return newSolrConfiguration;
-                }
-                return solrConfiguration;
-            default:
-                return solrConfiguration;
-        }
-    }
-
-    protected static SolrClient getSolrClient(SolrConfiguration solrConfiguration) {
-        // explicilty defined solrClient
-        if (solrConfiguration.getSolrClient() != null) {
-            return solrConfiguration.getSolrClient();
-        }
-        SolrClientHandler solrClientHandler = null;
-        List<String> urlList = getUrlListFrom(solrConfiguration);
-        // solrCloud scheme is set
-        if (SolrConfiguration.SolrScheme.SOLRCLOUD.equals(solrConfiguration.getSolrScheme())) {
-            solrClientHandler = new SolrClientHandlerCloud(solrConfiguration);
-        } else {
-            // more than 1 server provided:
-            if (urlList.size() > 1) {
-                solrClientHandler = new SolrClientHandlerLbHttp(solrConfiguration);
-            } else {
-                // config with ConcurrentUpdateSolrClient
-                if (solrConfiguration.getUseConcurrentUpdateSolrClient()) {
-                    solrClientHandler = new SolrClientHandlerConcurrentUpdate(solrConfiguration);
-                } else {
-                    // base HttpSolrClient
-                    solrClientHandler = new SolrClientHandlerHttp(solrConfiguration);
-                }
-            }
-        }
-        return solrClientHandler.getSolrClient();
-    }
-
-}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerCloud.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerCloud.java
deleted file mode 100644
index b2141bd2163..00000000000
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerCloud.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.solr;
-
-import java.util.List;
-import java.util.Optional;
-
-import org.apache.camel.util.ObjectHelper;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
-
-public class SolrClientHandlerCloud extends SolrClientHandler {
-
-    public SolrClientHandlerCloud(SolrConfiguration solrConfiguration) {
-        super(solrConfiguration);
-    }
-
-    protected SolrClient getSolrClient() {
-        Optional<String> zkChrootOptional = Optional.ofNullable(solrConfiguration.getZkChroot());
-        List<String> urlList = getUrlListFrom(solrConfiguration);
-        CloudLegacySolrClient.Builder builder = new CloudLegacySolrClient.Builder(
-                urlList,
-                zkChrootOptional);
-        if (!ObjectHelper.isEmpty(solrConfiguration.getCollection())) {
-            builder.withDefaultCollection(solrConfiguration.getCollection());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getConnectionTimeout())) {
-            builder.withConnectionTimeout(solrConfiguration.getConnectionTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getSoTimeout())) {
-            builder.withSocketTimeout(solrConfiguration.getSoTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getHttpClient())) {
-            builder.withHttpClient(solrConfiguration.getHttpClient());
-        }
-
-        return builder.build();
-    }
-
-}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerConcurrentUpdate.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerConcurrentUpdate.java
deleted file mode 100644
index 48c36a612e0..00000000000
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerConcurrentUpdate.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.util.ObjectHelper;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
-
-public class SolrClientHandlerConcurrentUpdate extends SolrClientHandler {
-
-    public SolrClientHandlerConcurrentUpdate(SolrConfiguration solrConfiguration) {
-        super(solrConfiguration);
-    }
-
-    protected SolrClient getSolrClient() {
-
-        ConcurrentUpdateSolrClient.Builder builder = new ConcurrentUpdateSolrClient.Builder(
-                getFirstUrlFromList());
-        if (!ObjectHelper.isEmpty(solrConfiguration.getConnectionTimeout())) {
-            builder.withConnectionTimeout(solrConfiguration.getConnectionTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getSoTimeout())) {
-            builder.withSocketTimeout(solrConfiguration.getSoTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getHttpClient())) {
-            builder.withHttpClient(solrConfiguration.getHttpClient());
-        }
-        builder.withQueueSize(solrConfiguration.getStreamingQueueSize());
-        builder.withThreadCount(solrConfiguration.getStreamingThreadCount());
-        return builder.build();
-    }
-
-}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerHttp.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerHttp.java
deleted file mode 100644
index 29a7b049774..00000000000
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerHttp.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.util.ObjectHelper;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-
-public class SolrClientHandlerHttp extends SolrClientHandler {
-
-    public SolrClientHandlerHttp(SolrConfiguration solrConfiguration) {
-        super(solrConfiguration);
-    }
-
-    protected SolrClient getSolrClient() {
-        HttpSolrClient.Builder builder = new HttpSolrClient.Builder(getFirstUrlFromList());
-        if (!ObjectHelper.isEmpty(solrConfiguration.getConnectionTimeout())) {
-            builder.withConnectionTimeout(solrConfiguration.getConnectionTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getSoTimeout())) {
-            builder.withSocketTimeout(solrConfiguration.getSoTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getHttpClient())) {
-            builder.withHttpClient(solrConfiguration.getHttpClient());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getAllowCompression())) {
-            builder.allowCompression(solrConfiguration.getAllowCompression());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getFollowRedirects())) {
-            builder.withFollowRedirects(solrConfiguration.getFollowRedirects());
-        }
-        HttpSolrClient httpSolrClient = builder.build();
-        return httpSolrClient;
-    }
-
-}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerLbHttp.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerLbHttp.java
deleted file mode 100644
index 7bea4efe9da..00000000000
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrClientHandlerLbHttp.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.util.ObjectHelper;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
-
-public class SolrClientHandlerLbHttp extends SolrClientHandler {
-
-    public SolrClientHandlerLbHttp(SolrConfiguration solrConfiguration) {
-        super(solrConfiguration);
-    }
-
-    protected SolrClient getSolrClient() {
-        LBHttpSolrClient.Builder builder = new LBHttpSolrClient.Builder();
-        for (String serverUrl : getUrlListFrom(solrConfiguration)) {
-            builder.withBaseSolrUrl(serverUrl);
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getConnectionTimeout())) {
-            builder.withConnectionTimeout(solrConfiguration.getConnectionTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getSoTimeout())) {
-            builder.withSocketTimeout(solrConfiguration.getSoTimeout());
-        }
-        if (!ObjectHelper.isEmpty(solrConfiguration.getHttpClient())) {
-            builder.withHttpClient(solrConfiguration.getHttpClient());
-        }
-        return builder.build();
-    }
-
-}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java
index f0790cc9858..76ffd94f069 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponent.java
@@ -16,106 +16,173 @@
  */
 package org.apache.camel.component.solr;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.DefaultComponent;
 import org.apache.solr.client.solrj.SolrClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Represents the component that manages {@link SolrEndpoint}.
  */
-@Component("solr,solrCloud,solrs")
+@Component("solr")
 public class SolrComponent extends DefaultComponent {
 
-    private static final Logger LOG = LoggerFactory.getLogger(SolrComponent.class);
+    @Metadata(label = "advanced", autowired = true)
+    private SolrClient solrClient;
+    @Metadata
+    private String host;
+    @Metadata
+    private int port;
+    @Metadata
+    private String defaultCollection;
+    @Metadata(defaultValue = "" + SolrConstants.DEFAULT_REQUEST_TIMEOUT)
+    private long requestTimeout = SolrConstants.DEFAULT_REQUEST_TIMEOUT;
+    @Metadata(defaultValue = "" + SolrConstants.DEFAULT_CONNECT_TIMEOUT)
+    private long connectionTimeout = SolrConstants.DEFAULT_CONNECT_TIMEOUT;
+    @Metadata(label = "security", secret = true)
+    private String username;
+    @Metadata(label = "security", secret = true)
+    private String password;
+    @Metadata(label = "security")
+    private boolean enableSSL;
 
-    private final Map<String, SolrClientReference> solrClientMap = new HashMap<>();
+    public SolrComponent() {
+        this(null);
+    }
 
-    protected static final class SolrClientReference {
-        private final SolrClient solrClient;
-        private final List<SolrProducer> solrProducerList = new ArrayList<>();
+    public SolrComponent(CamelContext context) {
+        super(context);
+        registerExtension(new SolrComponentVerifierExtension());
+    }
 
-        public SolrClientReference(SolrClient solrClient) {
-            this.solrClient = solrClient;
-        }
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        SolrConfiguration config = new SolrConfiguration();
+        config.setSolrClient(this.getSolrClient());
+        config.setHost(this.getHost());
+        config.setPort(this.getPort());
+        config.setCollection(this.getDefaultCollection());
+        config.setRequestTimeout(this.getRequestTimeout());
+        config.setConnectionTimeout(this.getConnectionTimeout());
+        config.setEnableSSL(this.isEnableSSL());
+        config.setUsername(this.getUsername());
+        config.setPassword(this.getPassword());
+        config.configure(uri);
+
+        Endpoint endpoint = new SolrEndpoint(uri, this, config);
+        setProperties(endpoint, parameters);
 
-        public SolrClient getSolrClient() {
-            return solrClient;
+        // add collection from solrclient if it is not yet defined
+        //     while it might be set on the solr client that could be set from parameters
+        if (config.getCollection() == null && config.getSolrClient() != null) {
+            config.setCollection(config.getSolrClient().getDefaultCollection());
         }
 
-        public int unRegisterSolrProducer(SolrProducer solrProducer) {
-            solrProducerList.remove(solrProducer);
-            return solrProducerList.size();
-        }
+        return endpoint;
+    }
 
-        public int registerSolrProducer(SolrProducer solrProducer) {
-            solrProducerList.add(solrProducer);
-            return solrProducerList.size();
-        }
+    /**
+     * To use an existing configured solr client, instead of creating a client per endpoint. This allows customizing the
+     * client with specific advanced settings.
+     */
+    public SolrClient getSolrClient() {
+        return solrClient;
+    }
 
+    public void setSolrClient(SolrClient solrClient) {
+        this.solrClient = solrClient;
     }
 
-    public SolrComponent() {
+    /**
+     * The solr instance host name
+     */
+    public String getHost() {
+        return host;
     }
 
-    @Override
-    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
-        SolrConfiguration configuration = SolrConfiguration.newInstance(uri, remaining);
-        Endpoint endpoint = new SolrEndpoint(uri, this, configuration);
-        setProperties(endpoint, parameters);
-        return endpoint;
+    public void setHost(String host) {
+        this.host = host;
     }
 
-    public SolrClient getSolrClient(SolrProducer solrProducer, SolrConfiguration solrConfiguration) {
-        String signature = SolrClientHandler.getSignature(solrConfiguration);
-        SolrClientReference solrClientReference;
-        if (!solrClientMap.containsKey(signature)) {
-            solrClientReference = new SolrClientReference(SolrClientHandler.getSolrClient(solrConfiguration));
-            solrClientMap.put(signature, solrClientReference);
-        } else {
-            solrClientReference = solrClientMap.get(signature);
-        }
-        // register producer against solrClient (for later close of client)
-        solrClientReference.registerSolrProducer(solrProducer);
-        return solrClientReference.getSolrClient();
-    }
-
-    public void closeSolrClient(SolrProducer solrProducer) {
-        // close when generated for endpoint
-        List<String> signatureToRemoveList = new ArrayList<>();
-        for (Map.Entry<String, SolrClientReference> entry : solrClientMap.entrySet()) {
-            SolrClientReference solrClientReference = entry.getValue();
-            if (solrClientReference.unRegisterSolrProducer(solrProducer) == 0) {
-                signatureToRemoveList.add(entry.getKey());
-            }
-        }
-        removeFromSolrClientMap(signatureToRemoveList);
-    }
-
-    private void removeFromSolrClientMap(Collection<String> signatureToRemoveList) {
-        for (String signature : signatureToRemoveList) {
-            SolrClientReference solrClientReference = solrClientMap.get(signature);
-            solrClientMap.remove(signature);
-            try {
-                solrClientReference.getSolrClient().close();
-            } catch (IOException e) {
-                LOG.warn("Error shutting down solr client. This exception is ignored.", e);
-            }
-        }
+    /**
+     * The solr instance port number
+     */
+    public int getPort() {
+        return port;
     }
 
-    @Override
-    protected void doShutdown() throws Exception {
-        removeFromSolrClientMap(solrClientMap.keySet());
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /**
+     * Solr default collection name
+     */
+    public String getDefaultCollection() {
+        return defaultCollection;
+    }
+
+    public void setDefaultCollection(String defaultCollection) {
+        this.defaultCollection = defaultCollection;
+    }
+
+    /**
+     * The timeout in ms to wait before the socket will time out.
+     */
+    public long getRequestTimeout() {
+        return requestTimeout;
+    }
+
+    public void setRequestTimeout(long requestTimeout) {
+        this.requestTimeout = requestTimeout;
+    }
+
+    /**
+     * The time in ms to wait before connection will time out.
+     */
+    public long getConnectionTimeout() {
+        return connectionTimeout;
+    }
+
+    public void setConnectionTimeout(long connectionTimeout) {
+        this.connectionTimeout = connectionTimeout;
+    }
+
+    /**
+     * Basic authenticate user
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    /**
+     * Password for authenticating
+     */
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    /**
+     * Enable SSL
+     */
+    public boolean isEnableSSL() {
+        return enableSSL;
+    }
+
+    public void setEnableSSL(boolean enableSSL) {
+        this.enableSSL = enableSSL;
     }
 
 }
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponentVerifierExtension.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponentVerifierExtension.java
new file mode 100644
index 00000000000..9378da38d3e
--- /dev/null
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrComponentVerifierExtension.java
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.solr;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
+import org.apache.camel.component.extension.verifier.ResultBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorHelper;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.HttpJdkSolrClient;
+
+public class SolrComponentVerifierExtension extends DefaultComponentVerifierExtension {
+
+    public SolrComponentVerifierExtension() {
+        this("solr");
+    }
+
+    public SolrComponentVerifierExtension(String scheme) {
+        super(scheme);
+    }
+
+    // *********************************
+    // Parameters validation
+    // *********************************
+
+    @Override
+    protected Result verifyParameters(Map<String, Object> parameters) {
+
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS)
+                .error(ResultErrorHelper.requiresOption(parameters, "host"));
+        // Validate using the catalog
+        super.verifyParametersAgainstCatalog(builder, parameters);
+
+        return builder.build();
+    }
+
+    // *********************************
+    // Connectivity validation
+    // *********************************
+
+    @Override
+    protected Result verifyConnectivity(Map<String, Object> parameters) {
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
+
+        try {
+            SolrConfiguration configuration = setProperties(new SolrConfiguration(), parameters);
+            if (configuration.getSolrClient() != null) {
+                configuration.getSolrClient().ping();
+            } else {
+                try (SolrClient client = getDefaultSolrClientBuilder(configuration).build()) {
+                    client.ping();
+                }
+            }
+        } catch (IOException e) {
+            ResultErrorBuilder errorBuilder
+                    = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, e.getMessage())
+                            .detail("solr_exception_message", e.getMessage())
+                            .detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, e.getClass().getName())
+                            .detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, e);
+
+            builder.error(errorBuilder.build());
+        } catch (Exception e) {
+            builder.error(ResultErrorBuilder.withException(e).build());
+        }
+        return builder.build();
+    }
+
+    private static HttpJdkSolrClient.Builder getDefaultSolrClientBuilder(SolrConfiguration configuration) {
+        HttpJdkSolrClient.Builder builder = new HttpJdkSolrClient.Builder(configuration.getSolrBaseUrl());
+        builder.withDefaultCollection(configuration.getCollection());
+        return builder;
+    }
+}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java
index 366bd09dbf2..f686654f3c3 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConfiguration.java
@@ -16,61 +16,83 @@
  */
 package org.apache.camel.component.solr;
 
-import java.util.Optional;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
 
+import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
-import org.apache.http.client.HttpClient;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.solr.client.solrj.SolrClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-@UriParams
-public class SolrConfiguration implements Cloneable {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SolrConfiguration.class);
+import static org.apache.camel.component.solr.SolrConstants.DEFAULT_BASE_PATH;
 
-    private boolean useConcurrentUpdateSolrClient;
-    private SolrEndpoint solrEndpoint;
-    private SolrScheme solrScheme;
+@UriParams
+public class SolrConfiguration {
 
-    @UriPath(description = "Hostname and port for the Solr server(s). " +
-                           "Multiple hosts can be specified, separated with a comma. " +
-                           "See the solrClient parameter for more information on the SolrClient used to connect to Solr.")
+    @UriPath
     @Metadata(required = true)
-    private final String url;
-    @UriParam(defaultValue = "" + SolrConstants.DEFUALT_STREAMING_QUEUE_SIZE)
-    private int streamingQueueSize = SolrConstants.DEFUALT_STREAMING_QUEUE_SIZE;
-    @UriParam(defaultValue = "" + SolrConstants.DEFAULT_STREAMING_THREAD_COUNT)
-    private int streamingThreadCount = SolrConstants.DEFAULT_STREAMING_THREAD_COUNT;
+    private String host;
+    @UriPath
+    private int port = -1;
+    @UriParam(label = "security", secret = true)
+    private String username;
+    @UriParam(label = "security", secret = true)
+    private String password;
     @UriParam
-    private Integer soTimeout;
+    private SolrOperation operation;
+    @UriParam(defaultValue = "false")
+    private boolean autoCommit;
+    @UriParam
+    private Integer size;
+    @UriParam
+    private Integer from;
+    @UriParam
+    private SolrClient solrClient;
+    @UriParam
+    private String collection;
+    @UriParam
+    private String requestHandler;
+    @UriParam(defaultValue = "true")
+    private boolean deleteByQuery = false;
+    @UriParam(label = "security")
+    private boolean enableSSL;
+    @UriParam(label = "security")
+    @Metadata(supportFileReference = true)
+    private String certificatePath;
     @UriParam
-    private Integer connectionTimeout;
+    private Long requestTimeout;
+    @UriParam
+    private Long connectionTimeout;
+    @UriParam(defaultValue = "true")
+    private boolean async = true;
+    @Deprecated
+    @UriParam()
+    private int soTimeout;
+    @Deprecated
+    @UriParam()
+    private int streamingQueueSize = 10;
+    @Deprecated
+    @UriParam()
+    private int streamingThreadCount = 2;
+    @Deprecated
     @UriParam(label = "HttpSolrClient")
     private Boolean followRedirects;
+    @Deprecated
     @UriParam(label = "HttpSolrClient")
     private Boolean allowCompression;
+    @Deprecated
     @UriParam(label = "CloudSolrClient")
     private String zkHost;
+    @Deprecated
     @UriParam(label = "CloudSolrClient")
     private String zkChroot;
-    @UriParam(label = "CloudSolrClient")
-    private String collection;
-    @UriParam
-    private SolrClient solrClient;
+    @Deprecated
     @UriParam
     private HttpClient httpClient;
-    @UriParam
-    private String requestHandler;
-    @UriParam(label = "security", secret = true)
-    private String username;
-    @UriParam(label = "security", secret = true)
-    private String password;
-    @UriParam(defaultValue = "false")
-    private boolean autoCommit;
     @Deprecated
     @UriParam
     private Integer maxRetries;
@@ -80,307 +102,405 @@ public class SolrConfiguration implements Cloneable {
     @Deprecated
     @UriParam
     private Integer maxTotalConnections;
+    private String basePath;
 
-    public SolrConfiguration(SolrScheme solrScheme, String url, String zkChroot) {
-        this.solrScheme = solrScheme;
-        this.url = url;
-        this.zkChroot = zkChroot;
+    /**
+     * Uri of the solr instance with :host:port. Only a single solr instance should be targeted. When failover multiple
+     * instances is required, use a camel Failover Load Balancer with sticky mode or provide your configured
+     * CloudSolrClient as client. Only host and port are "documented" for the endpoint uri, without a base path
+     * (currently /solr and /api). This is to promote the use of solr endpoint without a base path: we want to avoid
+     * locking in (this evolution of) the base path into the camel configuration of the endpoint.
+     */
+    public void configure(String uriString) throws URISyntaxException {
+        URI uri = new URI(uriString);
+        String value = uri.getHost();
+        if (value != null) {
+            if (!value.equalsIgnoreCase("default")) {
+                setHost(value);
+            }
+        } else {
+            throw new ResolveEndpointFailedException(uriString, "Solr instance host must be configured on the endpoint");
+        }
+        int uriPort = uri.getPort();
+        if (uriPort > 0) {
+            setPort(uriPort);
+        } else if (this.port <= 0) {
+            // resolve the default port if no port number was provided, and not already configured with a port number
+            setPort(SolrConstants.DEFAULT_PORT);
+        }
+        String userInfo = uri.getUserInfo();
+        if (userInfo != null) {
+            String[] parts = uri.getUserInfo().split(":");
+            if (parts.length == 2) {
+                setUsername(parts[0]);
+                setPassword(parts[1]);
+            } else {
+                setUsername(userInfo);
+            }
+        }
+        // parse remaining path when set and not equal to "/solr"
+        String remainingPath = uri.getPath();
+        if (ObjectHelper.isNotEmpty(remainingPath)
+                && !remainingPath.equals(DEFAULT_BASE_PATH)) {
+            if (remainingPath.startsWith(DEFAULT_BASE_PATH.concat("/"))) {
+                // the default solr base path //host:port/solr/<collection>/<requestHandler>
+                // --> use collection and request handler
+                String[] parts = remainingPath.substring(DEFAULT_BASE_PATH.concat("/").length()).split("/");
+                if (parts.length > 0) {
+                    setCollection(parts[0]);
+                }
+                if (parts.length > 1) {
+                    StringBuilder sb = new StringBuilder();
+                    for (int i = 1; i < parts.length; i++) {
+                        sb.append("/").append(parts[i]);
+                    }
+                    setRequestHandler(sb.toString());
+                }
+            } else {
+                // NOT the default solr base path --> use path as base path for backward compatibility
+                // (collection and requesthandler can be set via endpoint parameters)
+                setBasePath(remainingPath);
+            }
+        }
     }
 
-    public static SolrConfiguration newInstance(String endpointUri, String remaining) {
-        SolrScheme solrScheme = SolrScheme.SOLR.getFrom(endpointUri);
-        Optional<String> zkChrootOptional = SolrClientHandler.getZkChrootFromUrl(remaining);
-        String url = SolrClientHandler.parseHostsFromUrl(remaining, zkChrootOptional);
-        SolrConfiguration solrConfiguration = new SolrConfiguration(solrScheme, url, zkChrootOptional.orElse(null));
-        // validate url
-        SolrClientHandler.getUrlListFrom(solrConfiguration);
-        // return configuration
-        return solrConfiguration;
+    public String getSolrBaseUrl() {
+        return getSolrBaseUrl(isEnableSSL(), getHost(), getPort(), getBasePath());
     }
 
-    public SolrScheme getSolrScheme() {
-        return solrScheme;
+    public static String getSolrBaseUrl(boolean sslEnabled, String host, int port, String basePath) {
+        return String.format(
+                "%s://%s:%d%s",
+                sslEnabled ? "https" : "http",
+                host == null ? SolrConstants.DEFAULT_HOST : host,
+                port == -1 ? SolrConstants.DEFAULT_PORT : port,
+                basePath == null ? "/solr" : basePath);
     }
 
-    public void setSolrScheme(SolrScheme solrScheme) {
-        this.solrScheme = solrScheme;
+    public String getHost() {
+        return host;
     }
 
-    public String getUrl() {
-        return url;
+    /**
+     * The solr instance host name (set to 'default' to use the host name defined on component level)
+     */
+    public void setHost(String host) {
+        this.host = host;
     }
 
-    public int getStreamingQueueSize() {
-        return streamingQueueSize;
+    public int getPort() {
+        return port;
     }
 
     /**
-     * Sets the queue size for the ConcurrentUpdateSolrClient
+     * The solr instance base path (usually "/solr")
      */
-    public void setStreamingQueueSize(int streamingQueueSize) {
-        this.streamingQueueSize = streamingQueueSize;
+    public void setBasePath(String basePath) {
+        this.basePath = basePath;
     }
 
-    public int getStreamingThreadCount() {
-        return streamingThreadCount;
+    public String getBasePath() {
+        return basePath;
     }
 
     /**
-     * Sets the number of threads for the ConcurrentUpdateSolrClient
+     * The solr instance port number
      */
-    public void setStreamingThreadCount(int streamingThreadCount) {
-        this.streamingThreadCount = streamingThreadCount;
+    public void setPort(int port) {
+        this.port = port;
     }
 
-    public Integer getMaxRetries() {
-        return maxRetries;
+    public SolrOperation getOperation() {
+        return operation;
     }
 
     /**
-     * Maximum number of retries to attempt in the event of transient errors
+     * What operation to perform
      */
-    public void setMaxRetries(Integer maxRetries) {
-        this.maxRetries = maxRetries;
+    public void setOperation(SolrOperation operation) {
+        this.operation = operation;
     }
 
-    public Integer getSoTimeout() {
-        return soTimeout;
+    public boolean isAutoCommit() {
+        return autoCommit;
     }
 
     /**
-     * Sets the socket timeout on the SolrClient
+     * If true, each producer insert/delete operation will be automatically performing a commit
      */
-    public void setSoTimeout(Integer soTimeout) {
-        this.soTimeout = soTimeout;
+    public void setAutoCommit(boolean autoCommit) {
+        this.autoCommit = autoCommit;
     }
 
-    public Integer getConnectionTimeout() {
-        return connectionTimeout;
+    /**
+     * Starting index of the response.
+     */
+    public Integer getFrom() {
+        return from;
+    }
+
+    public void setFrom(Integer from) {
+        this.from = from;
     }
 
     /**
-     * Sets the connection timeout on the SolrClient
+     * Size of the response.
      */
-    public void setConnectionTimeout(Integer connectionTimeout) {
-        this.connectionTimeout = connectionTimeout;
+    public Integer getSize() {
+        return size;
     }
 
-    public Integer getDefaultMaxConnectionsPerHost() {
-        return defaultMaxConnectionsPerHost;
+    public void setSize(Integer size) {
+        this.size = size;
     }
 
     /**
-     * maxConnectionsPerHost on the underlying HttpConnectionManager
+     * The name of the collection to act against
      */
-    public void setDefaultMaxConnectionsPerHost(Integer defaultMaxConnectionsPerHost) {
-        this.defaultMaxConnectionsPerHost = defaultMaxConnectionsPerHost;
+    public String getCollection() {
+        return collection;
     }
 
-    public Integer getMaxTotalConnections() {
-        return maxTotalConnections;
+    public void setCollection(String collection) {
+        this.collection = collection;
     }
 
     /**
-     * maxTotalConnection on the underlying HttpConnectionManager
+     * The path of the update request handler (use for update requests / set solr parameter qt for search requests)
      */
-    public void setMaxTotalConnections(Integer maxTotalConnections) {
-        this.maxTotalConnections = maxTotalConnections;
+    public String getRequestHandler() {
+        return requestHandler;
     }
 
-    public Boolean getFollowRedirects() {
-        return followRedirects;
+    public void setRequestHandler(String requestHandler) {
+        this.requestHandler = requestHandler;
     }
 
     /**
-     * Indicates whether redirects are used to get to the Solr server
+     * The solr client to connect to solr. When solrClient bean is provided, all connection properties will be used from
+     * that solrClient (host, port, username, password, connectionTimeout, requestTimeout, enableSSL, ...). When not
+     * explicitly configured, camel uses the HttpJdkSolrClient.
      */
-    public void setFollowRedirects(Boolean followRedirects) {
-        this.followRedirects = followRedirects;
+    public SolrClient getSolrClient() {
+        return solrClient;
     }
 
-    public Boolean getAllowCompression() {
-        return allowCompression;
+    public void setSolrClient(SolrClient solrClient) {
+        this.solrClient = solrClient;
     }
 
     /**
-     * Server side must support gzip or deflate for this to have any effect
+     * For the delete instruction, interprete body as query/queries instead of id/ids.
      */
-    public void setAllowCompression(Boolean allowCompression) {
-        this.allowCompression = allowCompression;
+    public boolean isDeleteByQuery() {
+        return deleteByQuery;
     }
 
-    public String getZkHost() {
-        return zkHost;
+    public void setDeleteByQuery(boolean deleteByQuery) {
+        this.deleteByQuery = deleteByQuery;
     }
 
     /**
-     * Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. "zkHost=localhost:2181,localhost:2182".
-     * Optionally add the chroot, e.g. "zkHost=localhost:2181,localhost:2182/rootformysolr". In case the first part of
-     * the url path (='contextroot') is set to 'solr' (e.g. 'localhost:2181/solr' or 'localhost:2181/solr/..'), then
-     * that path is not considered as zookeeper chroot for backward compatibility reasons (this behaviour can be
-     * overridden via zkChroot parameter).
+     * Basic authenticate user
      */
-    public void setZkHost(String zkHost) {
-        Optional<String> zkChrootFromZkHost = SolrClientHandler.getZkChrootFromUrl(zkHost);
-        if (zkChrootFromZkHost.isPresent() && getZkChroot() == null) {
-            setZkChroot(zkChrootFromZkHost.get());
-        }
-        this.zkHost = SolrClientHandler.parseHostsFromUrl(zkHost, zkChrootFromZkHost);
-        setSolrScheme(SolrScheme.SOLRCLOUD);
+    public String getUsername() {
+        return username;
     }
 
-    public String getZkChroot() {
-        return zkChroot;
+    public void setUsername(String username) {
+        this.username = username;
     }
 
     /**
-     * Set the chroot of the zookeeper connection (include the leading slash; e.g. '/mychroot')
+     * Password for authenticating
      */
-    public void setZkChroot(String zkChroot) {
-        this.zkChroot = zkChroot;
-        setSolrScheme(SolrScheme.SOLRCLOUD);
+    public String getPassword() {
+        return password;
     }
 
-    public String getCollection() {
-        return collection;
+    public void setPassword(String password) {
+        this.password = password;
     }
 
     /**
-     * Set the default collection for SolrCloud
+     * Enable SSL
      */
-    public void setCollection(String collection) {
-        this.collection = collection;
+    public boolean isEnableSSL() {
+        return enableSSL;
     }
 
-    public String getRequestHandler() {
-        return requestHandler;
+    public void setEnableSSL(boolean enableSSL) {
+        this.enableSSL = enableSSL;
     }
 
     /**
-     * Set the request handler to be used
+     * The certificate that can be used to access the solr host. It can be loaded by default from classpath, but you can
+     * prefix with classpath:, file:, or http: to load the resource from different systems.
      */
-    public void setRequestHandler(String requestHandler) {
-        this.requestHandler = requestHandler;
+    public String getCertificatePath() {
+        return certificatePath;
     }
 
-    public String getUsername() {
-        return username;
+    public void setCertificatePath(String certificatePath) {
+        this.certificatePath = certificatePath;
     }
 
     /**
-     * Sets username for basic auth plugin enabled servers
+     * The time in ms to wait before the request will time out (former soTimeout).
      */
-    public void setUsername(String username) {
-        this.username = username;
+    public int getSoTimeout() {
+        return soTimeout;
     }
 
-    public String getPassword() {
-        return password;
+    public void setSoTimeout(int soTimeout) {
+        this.soTimeout = soTimeout;
     }
 
     /**
-     * Sets password for basic auth plugin enabled servers
+     * The time in ms to wait before connection will time out.
      */
-    public void setPassword(String password) {
-        this.password = password;
+    public Long getConnectionTimeout() {
+        return connectionTimeout;
     }
 
-    public boolean isAutoCommit() {
-        return autoCommit;
+    public void setConnectionTimeout(Long connectionTimeout) {
+        this.connectionTimeout = connectionTimeout;
     }
 
     /**
-     * If true, each producer operation will be automatically followed by a commit
+     * Use async request processing (when supported by the solr client)
      */
-    public void setAutoCommit(boolean autoCommit) {
-        this.autoCommit = autoCommit;
+    public boolean isAsync() {
+        return async;
     }
 
-    public SolrClient getSolrClient() {
-        return solrClient;
+    public void setAsync(boolean async) {
+        this.async = async;
     }
 
     /**
-     * Uses the provided solr client to connect to solr. When this parameter is not specified, camel applies the
-     * following rules to determine the SolrClient: 1) when zkHost or zkChroot (=zookeeper root) parameter is set, then
-     * the CloudSolrClient is used. 2) when multiple hosts are specified in the uri (separated with a comma), then the
-     * CloudSolrClient (uri scheme is 'solrCloud') or the LBHttpSolrClient (uri scheme is not 'solrCloud') is used. 3)
-     * when the solr operation is INSERT_STREAMING, then the ConcurrentUpdateSolrClient is used. 4) otherwise, the
-     * HttpSolrClient is used. Note: A CloudSolrClient should point to zookeeper endpoint(s); other clients point to
-     * Solr endpoint(s). The SolrClient can also be set via the exchange header 'CamelSolrClient'.
+     * The time in ms to wait before the request will time out (former soTimeout).
      */
-    public void setSolrClient(SolrClient solrClient) {
-        this.solrClient = solrClient;
+    public Long getRequestTimeout() {
+        return requestTimeout;
     }
 
-    public HttpClient getHttpClient() {
-        return httpClient;
+    public void setRequestTimeout(Long requestTimeout) {
+        this.requestTimeout = requestTimeout;
+    }
+
+    public int getStreamingQueueSize() {
+        return streamingQueueSize;
     }
 
     /**
-     * Sets the http client to be used by the solrClient. This is only applicable when solrClient is not set.
+     * Sets the queue size for the ConcurrentUpdateSolrClient
      */
-    public void setHttpClient(HttpClient httpClient) {
-        this.httpClient = httpClient;
+    public void setStreamingQueueSize(int streamingQueueSize) {
+        this.streamingQueueSize = streamingQueueSize;
     }
 
-    public boolean getUseConcurrentUpdateSolrClient() {
-        return useConcurrentUpdateSolrClient;
+    public int getStreamingThreadCount() {
+        return streamingThreadCount;
     }
 
-    void setUseConcurrentUpdateSolrClient(boolean useConcurrentUpdateSolrClient) {
-        this.useConcurrentUpdateSolrClient = useConcurrentUpdateSolrClient;
+    /**
+     * Sets the number of threads for the ConcurrentUpdateSolrClient
+     */
+    public void setStreamingThreadCount(int streamingThreadCount) {
+        this.streamingThreadCount = streamingThreadCount;
     }
 
-    public SolrEndpoint getSolrEndpoint() {
-        return solrEndpoint;
+    public Integer getMaxRetries() {
+        return maxRetries;
     }
 
-    void setSolrEndpoint(SolrEndpoint solrEndpoint) {
-        this.solrEndpoint = solrEndpoint;
+    /**
+     * Maximum number of retries to attempt in the event of transient errors
+     */
+    public void setMaxRetries(Integer maxRetries) {
+        this.maxRetries = maxRetries;
     }
 
-    public SolrConfiguration deepCopy() {
-        try {
-            return (SolrConfiguration) this.clone();
-        } catch (CloneNotSupportedException e) {
-            LOG.error("Could not generate new configuration based on configuration of existing endpoint {}",
-                    getSolrEndpoint(), e);
-        }
-        return null;
+    public Integer getDefaultMaxConnectionsPerHost() {
+        return defaultMaxConnectionsPerHost;
     }
 
-    public enum SolrScheme {
+    /**
+     * maxConnectionsPerHost on the underlying HttpConnectionManager
+     */
+    public void setDefaultMaxConnectionsPerHost(Integer defaultMaxConnectionsPerHost) {
+        this.defaultMaxConnectionsPerHost = defaultMaxConnectionsPerHost;
+    }
 
-        SOLR("solr:", "http://"),
-        SOLRS("solrs:", "https://"),
-        SOLRCLOUD("solrCloud:", "");
+    public Integer getMaxTotalConnections() {
+        return maxTotalConnections;
+    }
 
-        private final String uri;
-        private final String scheme;
+    /**
+     * maxTotalConnection on the underlying HttpConnectionManager
+     */
+    public void setMaxTotalConnections(Integer maxTotalConnections) {
+        this.maxTotalConnections = maxTotalConnections;
+    }
 
-        SolrScheme(String uri, String scheme) {
-            this.uri = uri;
-            this.scheme = scheme;
-        }
+    public Boolean getFollowRedirects() {
+        return followRedirects;
+    }
 
-        public SolrScheme getFrom(String endpointUri) {
-            for (SolrScheme solrScheme : SolrScheme.values()) {
-                if (endpointUri.startsWith(solrScheme.uri)) {
-                    return solrScheme;
-                }
-            }
-            throw new IllegalArgumentException("Invalid endpoint uri");
-        }
+    /**
+     * Indicates whether redirects are used to get to the Solr server
+     */
+    public void setFollowRedirects(Boolean followRedirects) {
+        this.followRedirects = followRedirects;
+    }
 
-        public String getUri() {
-            return uri;
-        }
+    public Boolean getAllowCompression() {
+        return allowCompression;
+    }
 
-        public String getScheme() {
-            return scheme;
-        }
+    /**
+     * Server side must support gzip or deflate for this to have any effect
+     */
+    public void setAllowCompression(Boolean allowCompression) {
+        this.allowCompression = allowCompression;
+    }
 
+    public String getZkHost() {
+        return zkHost;
+    }
+
+    /**
+     * Set the ZooKeeper host(s) urls which the CloudSolrClient uses, e.g. "zkHost=localhost:2181,localhost:2182".
+     * Optionally add the chroot, e.g. "zkHost=localhost:2181,localhost:2182/rootformysolr". In case the first part of
+     * the url path (='contextroot') is set to 'solr' (e.g. 'localhost:2181/solr' or 'localhost:2181/solr/..'), then
+     * that path is not considered as zookeeper chroot for backward compatibility reasons (this behaviour can be
+     * overridden via zkChroot parameter).
+     */
+    public void setZkHost(String zkHost) {
+        this.zkHost = zkHost;
+    }
+
+    public String getZkChroot() {
+        return zkChroot;
+    }
+
+    /**
+     * Set the chroot of the zookeeper connection (include the leading slash; e.g. '/mychroot')
+     */
+    public void setZkChroot(String zkChroot) {
+        this.zkChroot = zkChroot;
+    }
+
+    public HttpClient getHttpClient() {
+        return httpClient;
+    }
+
+    /**
+     * Sets the http client to be used by the solrClient. This is only applicable when solrClient is not set.
+     */
+    public void setHttpClient(HttpClient httpClient) {
+        this.httpClient = httpClient;
     }
 
 }
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
index fff9447770b..18bb2a3da75 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrConstants.java
@@ -19,36 +19,70 @@ package org.apache.camel.component.solr;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.Metadata;
 
-public final class SolrConstants {
+public interface SolrConstants {
 
-    @Metadata(description = "The client.", javaType = "org.apache.solr.client.solrj.SolrClient")
-    public static final String CLIENT = "CamelSolrClient";
-    @Metadata(description = "The collection to execute the request again.", javaType = "String")
-    public static final String COLLECTION = "CamelSolrCollection";
-    public static final String FIELD = "SolrField.";
     @Metadata(description = "The operation to perform.", javaType = "String")
-    public static final String OPERATION = "SolrOperation";
-    public static final String OPERATION_COMMIT = "COMMIT";
-    public static final String OPERATION_SOFT_COMMIT = "SOFT_COMMIT";
-    public static final String OPERATION_ROLLBACK = "ROLLBACK";
-    public static final String OPERATION_OPTIMIZE = "OPTIMIZE";
-    public static final String OPERATION_INSERT = "INSERT";
-    public static final String OPERATION_INSERT_STREAMING = "INSERT_STREAMING";
-    public static final String OPERATION_ADD_BEAN = "ADD_BEAN";
-    public static final String OPERATION_ADD_BEANS = "ADD_BEANS";
-    public static final String OPERATION_DELETE_BY_ID = "DELETE_BY_ID";
-    public static final String OPERATION_DELETE_BY_QUERY = "DELETE_BY_QUERY";
-    public static final String OPERATION_QUERY = "QUERY";
-    public static final String PARAM = "SolrParam.";
+    String PARAM_OPERATION = "operation";
+    @Deprecated
+    @Metadata(description = "The operation to perform.", javaType = "String",
+              deprecationNote = "Use header 'operation' instead")
+    String PARAM_OPERATION_DEPRECATED = "SolrOperation";
+    @Metadata(description = "The collection to execute the request against.", javaType = "String")
+    String PARAM_COLLECTION = "collection";
+    @Deprecated
+    @Metadata(description = "The collection to execute the request against.", javaType = "String",
+              deprecationNote = "Use header 'collection' instead")
+    String PARAM_COLLECTION_DEPRECATED = "CamelSolrCollection";
+    @Metadata(description = "The request handler to execute the solr request against.", javaType = "String")
+    String PARAM_REQUEST_HANDLER = "requestHandler";
     @Metadata(description = "The query to execute.", javaType = "String")
-    public static final String QUERY_STRING = "CamelSolrQueryString";
-    @Metadata(description = "The content type.", javaType = "String")
-    public static final String CONTENT_TYPE = Exchange.CONTENT_TYPE;
+    String PARAM_QUERY_STRING = "queryString";
+    @Deprecated
+    @Metadata(description = "The query to execute.", javaType = "String", deprecationNote = "Use header 'queryString' instead")
+    String PARAM_QUERY_STRING_DEPRECATED = "CamelSolrQueryString";
+    @Metadata(description = "The size of the response.", javaType = "Integer")
+    String PARAM_SIZE = "size";
+    @Metadata(description = "The starting index of the response.", javaType = "Integer")
+    String PARAM_FROM = "from";
+    @Metadata(description = "The solr client to use for the request.", javaType = "SolrClient")
+    String PARAM_SOLR_CLIENT = "solrClient";
+    @Metadata(description = "The solr parameters to use for the request.", javaType = "SolrParams")
+    String PARAM_SOLR_PARAMS = "solrParams";
+    @Metadata(description = "For the delete instruction, interprete body as query/queries instead of id/ids.",
+              javaType = "boolean", defaultValue = "false")
+    String PARAM_DELETE_BY_QUERY = "deleteByQuery";
+    @Metadata(description = "The content type is used to identify the type when inserting files.", javaType = "String")
+    String PARAM_CONTENT_TYPE = Exchange.CONTENT_TYPE;
 
-    public static final int DEFUALT_STREAMING_QUEUE_SIZE = 10;
-    public static final int DEFAULT_STREAMING_THREAD_COUNT = 2;
+    String HEADER_FIELD_PREFIX = "SolrField.";
+    String HEADER_PARAM_PREFIX = "SolrParam.";
+
+    String PROPERTY_ACTION_CONTEXT = "SolrActionContext";
+
+    String OPERATION_COMMIT = "COMMIT";
+    String OPERATION_SOFT_COMMIT = "SOFT_COMMIT";
+    String OPERATION_ROLLBACK = "ROLLBACK";
+    String OPERATION_OPTIMIZE = "OPTIMIZE";
+    String OPERATION_INSERT = "INSERT";
+    String OPERATION_INSERT_STREAMING = "INSERT_STREAMING";
+    String OPERATION_ADD_BEAN = "ADD_BEAN";
+    String OPERATION_ADD_BEANS = "ADD_BEANS";
+    String OPERATION_DELETE_BY_ID = "DELETE_BY_ID";
+    String OPERATION_DELETE_BY_QUERY = "DELETE_BY_QUERY";
+    String OPERATION_QUERY = "QUERY";
+    String OPERATION_SEARCH = "SEARCH";
+
+    String HEADER_PARAM_OPERATION_COMMIT = "commit";
+    String HEADER_PARAM_OPERATION_SOFT_COMMIT = "softCommit";
+    String HEADER_PARAM_OPERATION_OPTIMIZE = "optimize";
+    String HEADER_PARAM_OPERATION_ROLLBACK = "rollback";
+
+    String DEFAULT_HOST = "localhost";
+    int DEFAULT_PORT = 8983;
+    String DEFAULT_BASE_PATH = "/solr";
+    String DEFAULT_COLLECTION = "collection1";
+
+    int DEFAULT_CONNECT_TIMEOUT = 60000;
+    int DEFAULT_REQUEST_TIMEOUT = 600000;
 
-    private SolrConstants() {
-        throw new AssertionError();
-    }
 }
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java
index e5b0f5ec3e0..6b6577d6f69 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrEndpoint.java
@@ -16,82 +16,157 @@
  */
 package org.apache.camel.component.solr;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.HashMap;
-import java.util.Map;
+import java.io.InputStream;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.util.concurrent.TimeUnit;
 
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.camel.CamelContext;
 import org.apache.camel.Category;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
-import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.EndpointServiceLocation;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.impl.HttpJdkSolrClient;
+import org.apache.solr.client.solrj.impl.HttpSolrClientBase;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Perform operations against Apache Lucene Solr.
  */
-@UriEndpoint(firstVersion = "4.8.0", scheme = "solr,solrs,solrCloud", title = "Solr", syntax = "solr:url", producerOnly = true,
-             category = { Category.MONITORING, Category.SEARCH }, headersClass = SolrConstants.class)
-public class SolrEndpoint extends DefaultEndpoint {
+@UriEndpoint(firstVersion = "4.8.0", scheme = "solr", title = "Solr", syntax = "solr:host:port", producerOnly = true,
+             category = { Category.SEARCH, Category.MONITORING }, headersClass = SolrConstants.class)
+public class SolrEndpoint extends DefaultEndpoint implements EndpointServiceLocation {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SolrEndpoint.class);
 
     @UriParam
-    private SolrConfiguration solrConfiguration;
+    private final SolrConfiguration configuration;
 
-    private final Map<String, SolrConfiguration> solrConfigurationsMap = new HashMap<>();
+    private SolrClient solrClient;
 
-    public SolrEndpoint(String endpointUri, SolrComponent component, SolrConfiguration solrConfiguration) {
-        super(endpointUri, component);
-        solrConfiguration.setSolrEndpoint(this);
-        this.solrConfiguration = solrConfiguration;
-        this.solrConfigurationsMap.put(SolrConstants.OPERATION, solrConfiguration);
+    public SolrEndpoint(String uri, SolrComponent component, SolrConfiguration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
     }
 
-    public void setZkHost(String zkHost) {
-        try {
-            String decoded = URLDecoder.decode(zkHost, "UTF-8");
-            this.solrConfiguration.setZkHost(decoded);
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeCamelException(e);
-        }
+    public SolrConfiguration getConfiguration() {
+        return configuration;
     }
 
-    public SolrConfiguration getSolrConfiguration() {
-        return getSolrConfiguration(null);
+    @Override
+    public Producer createProducer() {
+        return new SolrProducer(this, configuration);
     }
 
-    public SolrConfiguration getSolrConfiguration(String solrOperation) {
-        if (solrConfigurationsMap.containsKey(solrOperation)) {
-            return solrConfigurationsMap.get(solrOperation);
-        }
-        SolrConfiguration newSolrConfiguration = SolrClientHandler.initializeFor(solrOperation, solrConfiguration);
-        solrConfigurationsMap.put(solrOperation, newSolrConfiguration);
-        return newSolrConfiguration;
+    @Override
+    public Consumer createConsumer(Processor processor) {
+        throw new UnsupportedOperationException("Cannot consume from a Solr endpoint: " + getEndpointUri());
     }
 
-    public void setRequestHandler(String requestHandler) {
-        solrConfiguration.setRequestHandler(requestHandler);
+    @Override
+    public String getServiceUrl() {
+        return configuration.getSolrBaseUrl();
     }
 
     @Override
-    public SolrComponent getComponent() {
-        return (SolrComponent) super.getComponent();
+    public String getServiceProtocol() {
+        return "solr";
     }
 
     @Override
-    public Producer createProducer() throws Exception {
-        return new SolrProducer(this);
+    protected void doShutdown() throws Exception {
+        // stop solr client when created (not pre-configured)
+        if (solrClient != null) {
+            LOG.info("Stop using "
+                     + getSolrClientInfoString(solrClient, isProcessAsync(solrClient, configuration), this.getEndpointUri()));
+            solrClient.close();
+        }
     }
 
-    protected void onProducerShutdown(SolrProducer producer) {
-        getComponent().closeSolrClient(producer);
+    public SolrClient getSolrClient() {
+        // preconfigured solr client
+        if (configuration.getSolrClient() != null) {
+            return configuration.getSolrClient();
+        }
+        if (solrClient == null) {
+            // create solr client from config
+            solrClient = createSolrClient();
+            LOG.info("Start using "
+                     + getSolrClientInfoString(solrClient, isProcessAsync(solrClient, configuration), this.getEndpointUri()));
+        }
+        return solrClient;
     }
 
-    @Override
-    public Consumer createConsumer(Processor processor) throws Exception {
-        throw new UnsupportedOperationException("Consumer not supported for Solr endpoint.");
+    public static String getSolrClientInfoString(SolrClient solrClient, boolean async, String endpointUri) {
+        return String.format(
+                "%s %s (async=%s; endpoint=%s)",
+                solrClient.getClass().getSimpleName(),
+                solrClient instanceof HttpJdkSolrClient httpJdkSolrClient
+                        ? "@ " + httpJdkSolrClient.getBaseURL()
+                        : "",
+                async,
+                endpointUri);
+    }
+
+    public SolrClient createSolrClient() {
+        final HttpJdkSolrClient.Builder builder = new HttpJdkSolrClient.Builder(configuration.getSolrBaseUrl());
+        builder.withConnectionTimeout(configuration.getConnectionTimeout(), TimeUnit.MILLISECONDS);
+        builder.withRequestTimeout(configuration.getRequestTimeout(), TimeUnit.MILLISECONDS);
+        if (ObjectHelper.isNotEmpty(configuration.getUsername()) && ObjectHelper.isNotEmpty(configuration.getPassword())) {
+            builder.withBasicAuthCredentials(configuration.getUsername(), configuration.getPassword());
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getCertificatePath())) {
+            builder.withSSLContext(createSslContextFromCa(getCamelContext(), configuration.getCertificatePath()));
+        }
+        if (configuration.getCollection() != null) {
+            builder.withDefaultCollection(configuration.getCollection());
+        }
+        return builder.build();
+    }
+
+    protected static boolean isProcessAsync(SolrClient solrClient, SolrConfiguration configuration) {
+        if (!(solrClient instanceof HttpSolrClientBase)) {
+            return false;
+        }
+        return configuration.isAsync();
+    }
+
+    /**
+     * An SSL context based on the self-signed CA, so that using this SSL Context allows to connect to the solr instance
+     *
+     * @return a customized SSL Context
+     */
+    private static SSLContext createSslContextFromCa(CamelContext camelContext, String certificatePath) {
+        try {
+            CertificateFactory factory = CertificateFactory.getInstance("X.509");
+            InputStream resolveMandatoryResourceAsInputStream
+                    = ResourceHelper.resolveMandatoryResourceAsInputStream(
+                            camelContext, certificatePath);
+            Certificate trustedCa = factory.generateCertificate(resolveMandatoryResourceAsInputStream);
+            KeyStore trustStore = KeyStore.getInstance("pkcs12");
+            trustStore.load(null, null);
+            trustStore.setCertificateEntry("ca", trustedCa);
+            final SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
+            TrustManagerFactory trustManagerFactory
+                    = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            trustManagerFactory.init(trustStore);
+            sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
+            return sslContext;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
     }
 
 }
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrOperation.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrOperation.java
new file mode 100644
index 00000000000..9b6d892fddd
--- /dev/null
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrOperation.java
@@ -0,0 +1,147 @@
+/*
+ * 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.solr;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.component.solr.converter.SolrRequestConverter;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.request.SolrPing;
+import org.apache.solr.client.solrj.request.UpdateRequest;
+
+/**
+ *
+ * The Solr server operations list that is implemented
+ *
+ * <p>
+ * <ul>
+ * <li>DELETE - Deletes a document from the solr collection by the record id(s)</li>
+ * <li>DELETE_BY_QUERY - Deletes documents from the solr collection that match the query(queries)</li>
+ * <li>INSERT - Updates the solr collection with a file, a solr-document, a bean, a list of solr-documents or a list of
+ * beans</li>
+ * <li>PING - Pings the solr base url</li>
+ * <li>SEARCH - Searches for solr documents</li>
+ * </ul>
+ *
+ */
+public enum SolrOperation {
+
+    DELETE(Map.of(
+            SolrConstants.OPERATION_DELETE_BY_ID, "",
+            SolrConstants.OPERATION_DELETE_BY_QUERY, SolrConstants.PARAM_DELETE_BY_QUERY)) {
+        @Override
+        SolrRequest<?> getSolrRequest(SolrProducer.ActionContext ctx) throws InvalidPayloadException {
+            return SolrOperation.getSolrRequestForUpdates(ctx);
+        }
+    },
+    INSERT(Map.of(
+            SolrConstants.OPERATION_INSERT_STREAMING, "",
+            SolrConstants.OPERATION_ADD_BEAN, "",
+            SolrConstants.OPERATION_ADD_BEANS, "",
+            SolrConstants.OPERATION_COMMIT,
+            SolrConstants.HEADER_PARAM_PREFIX + SolrConstants.HEADER_PARAM_OPERATION_COMMIT,
+            SolrConstants.OPERATION_SOFT_COMMIT,
+            SolrConstants.HEADER_PARAM_PREFIX + SolrConstants.HEADER_PARAM_OPERATION_SOFT_COMMIT,
+            SolrConstants.OPERATION_OPTIMIZE,
+            SolrConstants.HEADER_PARAM_PREFIX + SolrConstants.HEADER_PARAM_OPERATION_OPTIMIZE,
+            SolrConstants.OPERATION_ROLLBACK,
+            SolrConstants.HEADER_PARAM_PREFIX + SolrConstants.HEADER_PARAM_OPERATION_ROLLBACK)) {
+        @Override
+        SolrRequest<?> getSolrRequest(SolrProducer.ActionContext ctx) throws InvalidPayloadException {
+            return SolrOperation.getSolrRequestForUpdates(ctx);
+        }
+    },
+    PING(Map.of()) {
+        @Override
+        SolrRequest<?> getSolrRequest(SolrProducer.ActionContext ctx) throws InvalidPayloadException {
+            return ctx.exchange().getMessage().getMandatoryBody(SolrPing.class);
+        }
+    },
+    SEARCH(Map.of(SolrConstants.OPERATION_QUERY, "")) {
+        @Override
+        SolrRequest<?> getSolrRequest(SolrProducer.ActionContext ctx) throws InvalidPayloadException {
+            return ctx.exchange().getMessage().getMandatoryBody(QueryRequest.class);
+        }
+    };
+
+    final Map<String, String> actionsToDeprecate;
+
+    SolrOperation(Map<String, String> actionsToDeprecate) {
+        this.actionsToDeprecate = actionsToDeprecate;
+    }
+
+    abstract SolrRequest<?> getSolrRequest(SolrProducer.ActionContext ctx) throws InvalidPayloadException;
+
+    private static SolrRequest<?> getSolrRequestForUpdates(SolrProducer.ActionContext ctx) throws InvalidPayloadException {
+        if (SolrRequestConverter.isUseContentStreamUpdateRequest(ctx)) {
+            return ctx.exchange().getMessage().getMandatoryBody(ContentStreamUpdateRequest.class);
+        }
+        return ctx.exchange().getMessage().getMandatoryBody(UpdateRequest.class);
+    }
+
+    public static SolrOperation getSolrOperationFrom(String actionString) {
+        try {
+            return SolrOperation.valueOf(actionString);
+        } catch (IllegalArgumentException ignored) {
+        }
+        for (SolrOperation op : SolrOperation.values()) {
+            for (String futureDeprecatedAction : op.getActionsToDeprecate()) {
+                if (futureDeprecatedAction.equalsIgnoreCase(actionString)) {
+                    return op;
+                }
+            }
+        }
+        return null;
+    }
+
+    public Set<String> getActionsToDeprecate() {
+        return actionsToDeprecate.keySet();
+    }
+
+    public String getActionParameter(String actionString) {
+        String actionParameter = actionsToDeprecate.get(actionString);
+        return ObjectHelper.isNotEmpty(actionParameter)
+                ? actionParameter
+                : null;
+    }
+
+    public String createFutureDeprecationMessage(String actionString, String actionParameter) {
+        String message = String.format(
+                "The operation obtained from the exchange header '%s=%s' is going to be deprecated in future versions of camel-solr."
+                                       + " Please use the operation value '%1$s=%s' instead",
+                SolrConstants.PARAM_OPERATION,
+                actionString,
+                name());
+        if (actionParameter == null) {
+            message += ".";
+        } else {
+            message += "and add the header '" + actionParameter
+                       + "=true' to the exchange for the desired operation. ";
+            if (!actionString.equals(SolrConstants.OPERATION_DELETE_BY_QUERY)) {
+                message += "For info on the solr parameters for commit related update requests, have a look at the solr documentation "
+                           + "on https://solr.apache.org/guide/solr/latest/configuration-guide/commits-transaction-logs.html#explicit-commits";
+            }
+        }
+        return message;
+    }
+
+}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
index c5c3ed80d51..871e03844fa 100644
--- a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrProducer.java
@@ -19,285 +19,249 @@ package org.apache.camel.component.solr;
 import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
-
-import jakarta.activation.MimetypesFileTypeMap;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
 
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.CamelExchangeException;
 import org.apache.camel.Exchange;
-import org.apache.camel.NoSuchHeaderException;
+import org.apache.camel.Message;
 import org.apache.camel.WrappedFile;
-import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.support.DefaultAsyncProducer;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
-import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
-import org.apache.solr.client.solrj.request.DirectXmlRequest;
+import org.apache.solr.client.solrj.impl.HttpSolrClientBase;
 import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.request.SolrPing;
 import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.params.SolrParams;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The Solr producer.
  */
-public class SolrProducer extends DefaultProducer {
+public class SolrProducer extends DefaultAsyncProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SolrProducer.class);
+
+    protected final SolrConfiguration configuration;
 
-    public SolrProducer(SolrEndpoint endpoint) {
+    public SolrProducer(SolrEndpoint endpoint, SolrConfiguration config) {
         super(endpoint);
+        this.configuration = config;
     }
 
     @Override
-    public void process(Exchange exchange) throws Exception {
+    public boolean process(Exchange exchange, AsyncCallback callback) {
+        Message message = exchange.getMessage();
 
-        String operation = exchange.getIn().getHeader(SolrConstants.OPERATION, String.class);
-        if (operation == null) {
-            throw new NoSuchHeaderException(exchange, SolrConstants.OPERATION, String.class);
-        }
+        // Retrieve values from header or from config
+        SolrClient solrClient = Optional.ofNullable(message.getHeader(SolrConstants.PARAM_SOLR_CLIENT, SolrClient.class))
+                .orElse(getSolrClient());
+        String collection = Optional.ofNullable(message.getHeader(SolrConstants.PARAM_COLLECTION, String.class))
+                .orElse(configuration.getCollection());
+        String requestHandler = message.getHeaders().containsKey(SolrConstants.PARAM_REQUEST_HANDLER)
+                ? message.getHeader(SolrConstants.PARAM_REQUEST_HANDLER, String.class)
+                : configuration.getRequestHandler();
 
-        // solr configuration
-        SolrConfiguration solrConfiguration = getEndpoint().getSolrConfiguration(operation);
+        // Retrieve all SolrParams: SolrParams header and SolrParam.xxx headers
+        ModifiableSolrParams modifiableSolrParams = getAndGroupedSolrParams(message);
+        boolean hasSolrParams = modifiableSolrParams.size() > 0;
 
-        // solr client
-        SolrClient solrClient = exchange.getIn().getHeader(SolrConstants.CLIENT, SolrClient.class);
-        if (solrClient == null) {
-            solrClient = getEndpoint().getComponent().getSolrClient(this, solrConfiguration);
+        // add commit when autocommit is set
+        if (configuration.isAutoCommit()) {
+            SolrUtils.addHeadersForCommit(modifiableSolrParams);
         }
 
-        // solr parameters
-        ModifiableSolrParams solrParams = new ModifiableSolrParams();
-        for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
-            if (entry.getKey().startsWith(SolrConstants.PARAM)) {
-                String paramName = entry.getKey().substring(SolrConstants.PARAM.length());
-                solrParams.add(paramName, entry.getValue().toString());
-            }
+        // SolrRequest<?> are generated via SolrRequestConverter when not provided in exchange body:
+        // The code below ensures the body is not null in order to ensure conversion via SolrRequestConverter is run
+        // if conversion is not valid, an InvalidPayloadException will be thrown by the converter
+        if (message.getBody() == null) {
+            message.setBody(new Object());
         }
 
-        // solr collection
-        String solrCollection = exchange.getIn().getHeader(SolrConstants.COLLECTION, String.class);
+        // Determine solr operation
+        final SolrOperation operation = resolveSolrOperation(exchange, hasSolrParams);
 
-        // solr operations
-        if (operation.equalsIgnoreCase(SolrConstants.OPERATION_INSERT)) {
-            insert(exchange, solrClient, solrConfiguration, solrParams);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_INSERT_STREAMING)) {
-            insert(exchange, solrClient, solrConfiguration, solrParams);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_DELETE_BY_ID)) {
-            UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-            updateRequest.deleteById(exchange.getIn().getBody(String.class));
-            updateRequest.process(solrClient, solrCollection);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_DELETE_BY_QUERY)) {
-            UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-            updateRequest.deleteByQuery(exchange.getIn().getBody(String.class));
-            updateRequest.process(solrClient, solrCollection);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ADD_BEAN)) {
-            UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-            updateRequest.add(solrClient.getBinder().toSolrInputDocument(exchange.getIn().getBody()));
-            updateRequest.process(solrClient, solrCollection);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ADD_BEANS)) {
-            UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-            Collection<Object> body = exchange.getIn().getBody(Collection.class);
-            updateRequest.add(body.stream().map(solrClient.getBinder()::toSolrInputDocument).collect(Collectors.toList()));
-            updateRequest.process(solrClient, solrCollection);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_COMMIT)) {
-            commit(exchange, solrClient, solrConfiguration, solrParams);
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_SOFT_COMMIT)) {
-            commit(exchange, solrClient, solrConfiguration, solrParams, true);
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_ROLLBACK)) {
-            UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-            updateRequest.rollback();
-            updateRequest.process(solrClient, solrCollection);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_OPTIMIZE)) {
-            UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-            updateRequest.setAction(ACTION.OPTIMIZE, true, true, 1);
-            updateRequest.process(solrClient, solrCollection);
-            if (solrConfiguration.isAutoCommit()) {
-                commit(exchange, solrClient, solrConfiguration, solrParams);
-            }
-        } else if (operation.equalsIgnoreCase(SolrConstants.OPERATION_QUERY)) {
-            query(exchange, solrClient, solrConfiguration, solrParams);
-        } else {
-            throw new IllegalArgumentException(
-                    SolrConstants.OPERATION + " header value '" + operation + "' is not supported");
+        // set action context and add to message to be accessible for converter methods
+        ActionContext ctx = new ActionContext(
+                configuration, exchange, callback, solrClient, operation, collection, requestHandler, modifiableSolrParams);
+        exchange.setProperty(SolrConstants.PROPERTY_ACTION_CONTEXT, ctx);
+
+        // perform solr operation
+        boolean doneSync;
+        try {
+            SolrRequest<?> solrRequest = operation == null
+                    ? exchange.getMessage().getMandatoryBody(SolrRequest.class)
+                    : operation.getSolrRequest(ctx);
+            doneSync = SolrEndpoint.isProcessAsync(ctx.solrClient(), ctx.configuration())
+                    ? processSolrActionAsync(ctx, solrRequest)
+                    : processSolrAction(ctx, solrRequest);
+        } catch (Exception e) {
+            exchange.setException(e);
+            ctx.callback.done(true);
+            return true;
+        } finally {
+            exchange.removeProperty(SolrConstants.PROPERTY_ACTION_CONTEXT);
         }
+        return doneSync;
     }
 
-    private void commit(
-            Exchange exchange,
-            SolrClient solrClient,
-            SolrConfiguration solrConfiguration,
-            ModifiableSolrParams solrParams)
-            throws SolrServerException, IOException {
-        commit(exchange, solrClient, solrConfiguration, solrParams, false);
+    private boolean processSolrActionAsync(ActionContext ctx, final SolrRequest<?> solrRequest) {
+        onComplete(ctx.getAsyncSolrClient().requestAsync(solrRequest, ctx.collection()), ctx);
+        return false;
     }
 
-    private void commit(
-            Exchange exchange,
-            SolrClient solrClient,
-            SolrConfiguration solrConfiguration,
-            ModifiableSolrParams solrParams,
-            boolean softCommit)
+    private boolean processSolrAction(ActionContext ctx, final SolrRequest<?> solrRequest)
             throws SolrServerException, IOException {
-        String solrCollection = exchange.getIn().getHeader(SolrConstants.COLLECTION, String.class);
-        UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-        updateRequest.setAction(
-                ACTION.COMMIT,
-                solrParams.getBool("waitFlush", true),
-                solrParams.getBool("waitSearcher", true),
-                softCommit);
-        updateRequest.process(solrClient, solrCollection);
+        ctx.exchange().getMessage().setBody(ctx.solrClient().request(solrRequest, ctx.collection()));
+        ctx.callback.done(true);
+        return true;
     }
 
-    private void query(
-            Exchange exchange, SolrClient solrClient, SolrConfiguration solrConfiguration, ModifiableSolrParams solrParams)
-            throws SolrServerException, IOException, NoSuchHeaderException {
-        String solrCollection = exchange.getIn().getHeader(SolrConstants.COLLECTION, String.class);
-        SolrQuery solrQuery = new SolrQuery();
-        if (ObjectHelper.isNotEmpty(exchange.getMessage().getHeader(SolrConstants.QUERY_STRING))) {
-            solrQuery.setQuery(exchange.getMessage().getHeader(SolrConstants.QUERY_STRING, String.class));
-        } else {
-            throw new NoSuchHeaderException(exchange, SolrConstants.QUERY_STRING, String.class);
-        }
-        solrQuery.add(solrParams);
-        QueryRequest queryRequest = new QueryRequest(solrQuery);
-        queryRequest.setBasicAuthCredentials(solrConfiguration.getUsername(), solrConfiguration.getPassword());
-        QueryResponse p = queryRequest.process(solrClient, solrCollection);
-        exchange.getMessage().setBody(p.getResults());
+    private static ModifiableSolrParams getAndGroupedSolrParams(Message message) {
+        // use 'solrParams' header to initiate the ModifiableSolrParams
+        SolrParams solrParams = message.getHeader(SolrConstants.PARAM_SOLR_PARAMS, SolrParams.class);
+        ModifiableSolrParams modifiableSolrParams = solrParams instanceof ModifiableSolrParams
+                ? (ModifiableSolrParams) solrParams
+                : new ModifiableSolrParams(solrParams);
+        // add possible headers that start with "SolrParam." prefix
+        message.getHeaders().entrySet().stream()
+                .filter(entry -> entry.getKey().startsWith(SolrConstants.HEADER_PARAM_PREFIX))
+                .forEach(entry -> {
+                    String paramName = entry.getKey().substring(SolrConstants.HEADER_PARAM_PREFIX.length());
+                    modifiableSolrParams.add(paramName, entry.getValue().toString());
+                });
+        return modifiableSolrParams;
     }
 
-    private void insert(
-            Exchange exchange, SolrClient solrClient, SolrConfiguration solrConfiguration, ModifiableSolrParams solrParams)
-            throws Exception {
-        String solrCollection = exchange.getIn().getHeader(SolrConstants.COLLECTION, String.class);
-        Object body = exchange.getIn().getBody();
-        boolean invalid = false;
-        if (body instanceof WrappedFile) {
-            body = ((WrappedFile<?>) body).getFile();
+    /**
+     * Add actions to perform once the given future is complete.
+     *
+     * @param future the future to complete with specific actions.
+     * @param ctx    the context of the asynchronous task.
+     * @param <T>    the result type returned by the future.
+     */
+    private <T> void onComplete(CompletableFuture<T> future, ActionContext ctx) {
+        final Exchange exchange = ctx.exchange();
+        future.thenAccept(r -> exchange.getMessage().setBody(r))
+                .whenComplete(
+                        (r, e) -> {
+                            try {
+                                if (e != null) {
+                                    exchange.setException(new CamelExchangeException(
+                                            "An error occurred while executing the action", exchange, e));
+                                }
+                            } finally {
+                                ctx.callback().done(false);
+                            }
+                        });
+    }
+
+    public SolrClient getSolrClient() {
+        return ((SolrEndpoint) super.getEndpoint()).getSolrClient();
+    }
+
+    private SolrOperation resolveSolrOperation(Exchange exchange, boolean hasSolrParams) {
+        // Operation can be driven by either (in order of preference):
+        // a. If the body is a specific class (SolrQuery, QueryRequest, UpdateRequest, SolrInputDocument(=Map)).
+        // b. If the body is not one of the specific classes, the operation is set by the
+        // header if it exists.
+        // c. If neither the operation can not be derived from the body or
+        // header, the configuration is used.
+        // In the event we can't discover the operation from a, b or c we throw
+        // an error.
+
+        Object body = exchange.getMessage().getBody();
+        if (ObjectHelper.isNotEmpty(body)) {
+            LOG.debug("Operation request body: {}", body);
         }
-        if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(SolrConstants.CONTENT_TYPE, String.class))) {
-            String mimeType = exchange.getIn().getHeader(SolrConstants.CONTENT_TYPE, String.class);
-            ContentStreamUpdateRequest updateRequest = new ContentStreamUpdateRequest(getRequestHandler(solrConfiguration));
-            updateRequest.setParams(solrParams);
-            updateRequest.setBasicAuthCredentials(solrConfiguration.getUsername(), solrConfiguration.getPassword());
-            updateRequest.addFile((File) body, mimeType);
-            updateRequest.process(solrClient, solrCollection);
-        } else {
-            if (body instanceof File) {
-                MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
-                String mimeType = mimeTypesMap.getContentType((File) body);
-                ContentStreamUpdateRequest updateRequest = new ContentStreamUpdateRequest(getRequestHandler(solrConfiguration));
-                updateRequest.setParams(solrParams);
-                updateRequest.setBasicAuthCredentials(solrConfiguration.getUsername(), solrConfiguration.getPassword());
-                updateRequest.addFile((File) body, mimeType);
-                updateRequest.process(solrClient, solrCollection);
-            } else if (body instanceof SolrInputDocument) {
-                UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-                updateRequest.add((SolrInputDocument) body);
-                updateRequest.process(solrClient, solrCollection);
-            } else if (body instanceof List<?>) {
-                List<?> list = (List<?>) body;
-                if (!list.isEmpty() && list.get(0) instanceof SolrInputDocument) {
-                    UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-                    updateRequest.add((List<SolrInputDocument>) list);
-                    updateRequest.process(solrClient, solrCollection);
-                } else {
-                    invalid = true;
-                }
-            } else {
-                boolean hasSolrHeaders = false;
-                for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
-                    if (entry.getKey().startsWith(SolrConstants.FIELD)) {
-                        hasSolrHeaders = true;
-                        break;
-                    }
-                }
-                if (hasSolrHeaders) {
-                    UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-                    SolrInputDocument doc = new SolrInputDocument();
-                    for (Map.Entry<String, Object> entry : exchange.getIn().getHeaders().entrySet()) {
-                        if (entry.getKey().startsWith(SolrConstants.FIELD)) {
-                            String fieldName = entry.getKey().substring(SolrConstants.FIELD.length());
-                            doc.setField(fieldName, entry.getValue());
-                        }
-                    }
-                    updateRequest.add(doc);
-                    updateRequest.process(solrClient, solrCollection);
-                } else if (body instanceof String) {
-                    String bodyAsString = (String) body;
-                    if (!bodyAsString.startsWith("<add")) {
-                        bodyAsString = "<add>" + bodyAsString + "</add>";
-                    }
-                    DirectXmlRequest xmlRequest = new DirectXmlRequest(getRequestHandler(solrConfiguration), bodyAsString);
-                    xmlRequest.setParams(solrParams);
-                    xmlRequest.setBasicAuthCredentials(solrConfiguration.getUsername(), solrConfiguration.getPassword());
-                    xmlRequest.process(solrClient, solrCollection);
-                } else if (body instanceof Map) {
-                    UpdateRequest updateRequest = createUpdateRequest(solrConfiguration, solrParams);
-                    SolrInputDocument doc = new SolrInputDocument();
-                    Map<String, Object> bodyMap = (Map<String, Object>) body;
-                    for (Map.Entry<String, Object> entry : bodyMap.entrySet()) {
-                        doc.setField(entry.getKey(), entry.getValue());
-                    }
-                    updateRequest.add(doc);
-                    updateRequest.process(solrClient, solrCollection);
-                } else {
-                    invalid = true;
-                }
-            }
+        if (body instanceof SolrPing) {
+            return SolrOperation.PING;
+        }
+        if (body instanceof SolrQuery
+                || body instanceof QueryRequest
+                || exchange.getMessage().getHeader(SolrConstants.PARAM_QUERY_STRING) != null) {
+            return SolrOperation.SEARCH;
+        }
+        if (body instanceof Map
+                || body instanceof WrappedFile
+                || body instanceof File
+                || body instanceof UpdateRequest) {
+            return SolrOperation.INSERT;
+        }
+        if (body instanceof SolrRequest) {
+            return null;
+        }
+        // collection: if strings then delete else insert
+        if (body instanceof Collection<?> collection) {
+            return SolrUtils.isCollectionOfType(collection, String.class)
+                    ? SolrOperation.DELETE
+                    : SolrOperation.INSERT;
         }
 
-        if (invalid) {
-            throw new SolrException(
-                    SolrException.ErrorCode.BAD_REQUEST,
-                    "unable to find data in Exchange to update Solr");
+        SolrOperation operation;
+        String actionString = exchange.getMessage().getHeader(SolrConstants.PARAM_OPERATION, String.class);
+        if (ObjectHelper.isNotEmpty(actionString)) {
+            operation = SolrOperation.getSolrOperationFrom(actionString);
+            if (operation != null && !operation.name().equalsIgnoreCase(actionString)) {
+                LOG.warn(operation.createFutureDeprecationMessage(actionString,
+                        operation.getActionParameter(actionString)));
+            }
+            LOG.debug("Operation obtained from header '{}': {}", SolrConstants.PARAM_OPERATION, actionString);
+            return operation;
+        }
+        if (configuration.getOperation() != null) {
+            operation = configuration.getOperation();
+            LOG.debug("Operation obtained from config: {}", operation);
+            return operation;
         }
+        // when "invalid" body with solr params (e.g. commit),
+        // assume insert request and allow processing without "body"
+        if (hasSolrParams) {
+            return SolrOperation.INSERT;
+        }
+        throw new IllegalArgumentException(
+                SolrConstants.PARAM_OPERATION + " value is mandatory");
     }
 
-    private String getRequestHandler(SolrConfiguration solrConfiguration) {
-        String requestHandler = solrConfiguration.getRequestHandler();
-        return (requestHandler == null) ? "/update" : requestHandler;
-    }
+    /**
+     * An inner class providing all the information that an asynchronous action could need.
+     */
+    public record ActionContext(SolrConfiguration configuration,
+            Exchange exchange,
+            AsyncCallback callback,
+            SolrClient solrClient,
+            SolrOperation operation,
+            String collection,
+            String requestHandler,
+            ModifiableSolrParams solrParams) {
 
-    private UpdateRequest createUpdateRequest(SolrConfiguration solrConfiguration, ModifiableSolrParams solrParams) {
-        UpdateRequest updateRequest = new UpdateRequest(getRequestHandler(solrConfiguration));
-        updateRequest.setParams(solrParams);
-        updateRequest.setBasicAuthCredentials(solrConfiguration.getUsername(), solrConfiguration.getPassword());
-        return updateRequest;
-    }
+        public ActionContext {
+            ObjectHelper.notNull(solrClient, SolrConstants.PARAM_SOLR_CLIENT);
+            ObjectHelper.notNull(collection, SolrConstants.PARAM_COLLECTION);
+            ObjectHelper.notNull(solrParams, SolrConstants.PARAM_SOLR_PARAMS);
+        }
 
-    @Override
-    public SolrEndpoint getEndpoint() {
-        return (SolrEndpoint) super.getEndpoint();
-    }
+        public HttpSolrClientBase getAsyncSolrClient() {
+            if (solrClient instanceof HttpSolrClientBase httpSolrClientBase) {
+                return httpSolrClientBase;
+            }
+            throw new UnsupportedOperationException(getAsyncProcessingErrorDetails(solrClient));
+        }
+
+        private static String getAsyncProcessingErrorDetails(SolrClient solrClient) {
+            return String.format(
+                    "Async processing requires a solr client instance of HttpSolrClientBase. This solr client is of type %s.",
+                    solrClient.getClass().getCanonicalName());
+        }
 
-    @Override
-    protected void doShutdown() throws Exception {
-        getEndpoint().onProducerShutdown(this);
     }
 
 }
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrUtils.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrUtils.java
new file mode 100644
index 00000000000..e88cc195275
--- /dev/null
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/SolrUtils.java
@@ -0,0 +1,109 @@
+/*
+ * 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.solr;
+
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.camel.Exchange;
+import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.SimpleOrderedMap;
+
+public class SolrUtils {
+
+    public static Map<String, Object> parseAsMap(SolrResponse solrResponse) {
+        return solrResponse == null || solrResponse.getResponse() == null
+                ? Map.of()
+                : solrResponse.getResponse().asShallowMap(true);
+    }
+
+    public static Map<String, Object> parseAsFlatMap(SolrResponse solrResponse) {
+        return parseAsFlatMap(parseAsMap(solrResponse));
+    }
+
+    public static Map<String, Object> parseAsFlatMap(Map<String, Object> map1) {
+        return parseAsFlatMap(map1, null, null);
+    }
+
+    public static Map<String, Object> parseAsFlatMap(Map<String, Object> map1, String startsWith, String endsWith) {
+        return map1.entrySet().stream()
+                .flatMap(SolrUtils::flatten)
+                .filter(e -> e != null && e.getKey() != null && e.getValue() != null)
+                .filter(e -> startsWith == null || e.getKey().startsWith(startsWith))
+                .filter(e -> endsWith == null || e.getKey().endsWith(endsWith))
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+    }
+
+    @SuppressWarnings("unchecked")
+    public static Stream<Map.Entry<String, Object>> flatten(Map.Entry<String, Object> entry) {
+        Map<String, Object> nestedMap = null;
+        if (entry.getValue() instanceof final SimpleOrderedMap<?> nested) {
+            nestedMap = (Map<String, Object>) nested.asShallowMap(true);
+        } else if (entry.getValue() instanceof final Map<?, ?> nested) {
+            nestedMap = (Map<String, Object>) nested;
+        }
+        if (nestedMap != null) {
+            return nestedMap.entrySet().stream()
+                    .map(e -> new AbstractMap.SimpleEntry<>(entry.getKey() + "." + e.getKey(), e.getValue()))
+                    .flatMap(SolrUtils::flatten);
+        }
+        return Stream.of(entry);
+    }
+
+    public static void addHeadersForCommit(ModifiableSolrParams solrParams) {
+        getHeadersForCommit("commit", null)
+                .forEach((k, v) -> solrParams.add(k, String.valueOf(v)));
+    }
+
+    public static void addHeadersForCommit(Exchange exchange) {
+        addHeadersForCommit(exchange, "commit");
+    }
+
+    public static void addHeadersForCommit(Exchange exchange, String commitParam) {
+        exchange.getMessage().getHeaders().putAll(getHeadersForCommit(commitParam));
+    }
+
+    public static Map<String, Object> getHeadersForCommit() {
+        return getHeadersForCommit("commit");
+    }
+
+    public static Map<String, Object> getHeadersForCommit(String commitParam) {
+        return getHeadersForCommit(commitParam, SolrConstants.HEADER_PARAM_PREFIX);
+    }
+
+    public static Map<String, Object> getHeadersForCommit(String commitParam, String prefix) {
+        String finalPrefix = prefix == null ? "" : prefix;
+        return Map.of(finalPrefix + commitParam, "true");
+    }
+
+    public static boolean isCollectionOfType(Object body, Class<?> clazz) {
+        return body instanceof Collection<?> collection && collection.stream().allMatch(clazz::isInstance);
+    }
+
+    public static <T> List<T> convertToList(Collection<T> collection) {
+        return collection instanceof List
+                ? (List<T>) collection
+                : new ArrayList<>(collection);
+    }
+
+}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/converter/SolrRequestConverter.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/converter/SolrRequestConverter.java
new file mode 100644
index 00000000000..46f3bdc914f
--- /dev/null
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/converter/SolrRequestConverter.java
@@ -0,0 +1,309 @@
+/*
+ * 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.solr.converter;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.WrappedFile;
+import org.apache.camel.component.solr.SolrConfiguration;
+import org.apache.camel.component.solr.SolrConstants;
+import org.apache.camel.component.solr.SolrOperation;
+import org.apache.camel.component.solr.SolrProducer;
+import org.apache.camel.component.solr.SolrUtils;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.beans.BindingException;
+import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
+import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.request.SolrPing;
+import org.apache.solr.client.solrj.request.UpdateRequest;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.ContentStreamBase;
+
+@Converter(generateLoader = true)
+@SuppressWarnings("unchecked")
+public final class SolrRequestConverter {
+
+    public static final String DEFAULT_UPDATE_REQUEST_HANDLER = "/update";
+
+    private SolrRequestConverter() {
+    }
+
+    @Converter
+    public static SolrPing createSolrPing(Object body, Exchange exchange) {
+        return new SolrPing();
+    }
+
+    @Converter
+    public static QueryRequest createQueryRequest(Object body, Exchange exchange) {
+        if (body instanceof QueryRequest queryRequest) {
+            return queryRequest;
+        }
+        SolrQuery solrQuery;
+        // set query
+        if (body instanceof SolrQuery solrQuery1) {
+            solrQuery = solrQuery1;
+        } else {
+            String queryString = exchange.getMessage().getHeader(SolrConstants.PARAM_QUERY_STRING, String.class);
+            if (ObjectHelper.isEmpty(queryString)) {
+                queryString = exchange.getMessage().getBody(String.class);
+            }
+            solrQuery = new SolrQuery(queryString);
+        }
+        SolrProducer.ActionContext ctx
+                = exchange.getProperty(SolrConstants.PROPERTY_ACTION_CONTEXT, SolrProducer.ActionContext.class);
+        SolrConfiguration configuration = ctx.configuration();
+
+        // Set size parameter and from parameter for search
+        Integer from = exchange.getMessage().getHeader(SolrConstants.PARAM_FROM, configuration.getFrom(), Integer.class);
+        if (from != null) {
+            solrQuery.setStart(from);
+        }
+        Integer size = exchange.getMessage().getHeader(SolrConstants.PARAM_SIZE, configuration.getSize(), Integer.class);
+        if (size != null) {
+            solrQuery.setRows(size);
+        }
+        // Set requestHandler parameter as solr param qt (search only)
+        String requestHandler = ctx.requestHandler();
+        if (requestHandler != null) {
+            solrQuery.add("qt", requestHandler);
+        }
+        solrQuery.add(ctx.solrParams());
+        return new QueryRequest(solrQuery);
+    }
+
+    public static boolean isUseContentStreamUpdateRequest(SolrProducer.ActionContext ctx) {
+        if (!SolrOperation.INSERT.equals(ctx.operation())) {
+            return false;
+        }
+        Object body = ctx.exchange().getMessage().getBody();
+        if (body instanceof String bodyAsString) {
+            // string body --> determine content type to use for the string
+            // if not detected, use regular update request
+            String contentType = ctx.exchange().getMessage().getHeader(SolrConstants.PARAM_CONTENT_TYPE, String.class);
+            if (ObjectHelper.isEmpty(contentType)) {
+                contentType = ContentStreamBase.StringStream.detect(bodyAsString);
+            }
+            if (ObjectHelper.isEmpty(contentType)) {
+                // couldn't detect -> use regular update request
+                return false;
+            }
+            appendAddCommandToXML(ctx, bodyAsString, contentType);
+            return true;
+        }
+        return (body instanceof File || body instanceof WrappedFile<?>);
+    }
+
+    private static ContentStreamUpdateRequest createNewContentStreamUpdateRequest(SolrProducer.ActionContext ctx) {
+        ContentStreamUpdateRequest updateRequest = ctx.requestHandler() != null
+                ? new ContentStreamUpdateRequest(ctx.requestHandler())
+                : new ContentStreamUpdateRequest(DEFAULT_UPDATE_REQUEST_HANDLER);
+        updateRequest.setParams(ctx.solrParams());
+        return updateRequest;
+    }
+
+    @Converter
+    public static ContentStreamUpdateRequest createContentStreamUpdateRequest(Object body, Exchange exchange)
+            throws NoTypeConversionAvailableException {
+        SolrProducer.ActionContext ctx
+                = exchange.getProperty(SolrConstants.PROPERTY_ACTION_CONTEXT, SolrProducer.ActionContext.class);
+        String contentType = ctx.exchange().getMessage().getHeader(SolrConstants.PARAM_CONTENT_TYPE, String.class);
+        ContentStreamUpdateRequest streamUpdateRequest = createNewContentStreamUpdateRequest(ctx);
+        if (body instanceof WrappedFile<?> wrappedFile) {
+            body = wrappedFile.getFile();
+        }
+        if (body instanceof File file) {
+            ContentStreamBase.FileStream stream = new ContentStreamBase.FileStream(file);
+            if (ObjectHelper.isEmpty(contentType)) {
+                contentType = stream.getContentType();
+            }
+            stream.setContentType(contentType);
+            streamUpdateRequest.addContentStream(stream);
+            return streamUpdateRequest;
+        }
+        if (body instanceof String string) {
+            ContentStreamBase.StringStream stream;
+            if (ObjectHelper.isEmpty(contentType)) {
+                stream = new ContentStreamBase.StringStream(string);
+            } else {
+                stream = new ContentStreamBase.StringStream(string, contentType);
+            }
+            streamUpdateRequest.addContentStream(stream);
+            return streamUpdateRequest;
+        }
+        throw new NoTypeConversionAvailableException(body, SolrRequestConverter.class);
+    }
+
+    private static UpdateRequest createNewUpdateRequest(SolrProducer.ActionContext ctx) {
+        UpdateRequest updateRequest = ctx.requestHandler() != null
+                ? new UpdateRequest(ctx.requestHandler())
+                : new UpdateRequest();
+        updateRequest.setParams(ctx.solrParams());
+        return updateRequest;
+    }
+
+    @Converter
+    public static UpdateRequest createUpdateRequest(Object body, Exchange exchange) throws NoTypeConversionAvailableException {
+        SolrProducer.ActionContext ctx
+                = exchange.getProperty(SolrConstants.PROPERTY_ACTION_CONTEXT, SolrProducer.ActionContext.class);
+        switch (ctx.operation()) {
+            case DELETE -> {
+                return createUpdateRequestForDelete(body, exchange, ctx);
+            }
+            case INSERT -> {
+                return createUpdateRequestForInsert(body, exchange, ctx);
+            }
+            default -> throw new IllegalArgumentException(
+                    SolrConstants.PARAM_OPERATION + " value '" + ctx.operation() + "' is not implemented");
+        }
+    }
+
+    private static UpdateRequest createUpdateRequestForDelete(Object body, Exchange exchange, SolrProducer.ActionContext ctx) {
+        UpdateRequest updateRequest = createNewUpdateRequest(ctx);
+        boolean deleteByQuery = ctx.exchange().getMessage()
+                .getHeader(SolrConstants.PARAM_DELETE_BY_QUERY, ctx.configuration().isDeleteByQuery(), Boolean.class);
+        // for now, keep old operation supported until deprecation
+        deleteByQuery = deleteByQuery
+                || SolrConstants.OPERATION_DELETE_BY_QUERY
+                        .equalsIgnoreCase(exchange.getMessage()
+                                .getHeader(SolrConstants.PARAM_OPERATION, "", String.class));
+        if (deleteByQuery) {
+            if (SolrUtils.isCollectionOfType(body, String.class)) {
+                updateRequest.setDeleteQuery(SolrUtils.convertToList((Collection<String>) body));
+                return updateRequest;
+            } else {
+                return updateRequest.deleteByQuery(String.valueOf(body));
+            }
+        }
+        if (SolrUtils.isCollectionOfType(body, String.class)) {
+            return updateRequest.deleteById(SolrUtils.convertToList((Collection<String>) body));
+        }
+        return updateRequest.deleteById(String.valueOf(body));
+    }
+
+    private static UpdateRequest createUpdateRequestForInsert(Object body, Exchange exchange, SolrProducer.ActionContext ctx)
+            throws NoTypeConversionAvailableException {
+        UpdateRequest updateRequest = createNewUpdateRequest(ctx);
+        // SolrInputDocument
+        if (body instanceof SolrInputDocument solrInputDocument) {
+            updateRequest.add(solrInputDocument);
+            return updateRequest;
+        }
+        // Collection<SolrInputDocument>
+        if (SolrUtils.isCollectionOfType(body, SolrInputDocument.class)) {
+            updateRequest.add((Collection<SolrInputDocument>) body);
+            return updateRequest;
+        }
+        // Collection<Map>
+        if (SolrUtils.isCollectionOfType(body, Map.class)) {
+            Optional<Collection<SolrInputDocument>> docs
+                    = getOptionalCollectionOfSolrInputDocument((Collection<Map<?, ?>>) body, exchange);
+            docs.ifPresent(updateRequest::add);
+            return updateRequest;
+        }
+        // Map: gather solr fields from body and merge with solr fields from headers (gathered from SolrField.xxx headers)
+        //      The header solr fields have priority
+        Map<String, Object> map = new LinkedHashMap<>(getMapFromBody(body));
+        map.putAll(getMapFromHeaderSolrFields(exchange));
+        if (!map.isEmpty()) {
+            body = map;
+        }
+        // Map: translate to SolrInputDocument (possibly gathered from SolrField.xxx headers
+        Optional<SolrInputDocument> doc = getOptionalSolrInputDocumentFromMap(body, exchange);
+        if (doc.isPresent()) {
+            updateRequest.add(doc.get());
+            return updateRequest;
+        }
+        // beans
+        try {
+            DocumentObjectBinder binder = new DocumentObjectBinder();
+            if (SolrUtils.isCollectionOfType(body, Object.class)) {
+                Collection<?> objects = (Collection<?>) body;
+                objects.forEach(o -> updateRequest.add(binder.toSolrInputDocument(o)));
+                return updateRequest;
+            }
+            updateRequest.add(binder.toSolrInputDocument(body));
+            return updateRequest;
+        } catch (BindingException ignored) {
+        }
+        // when "invalid" body with solr params, allow processing (e.g. commit) without "body"
+        if (ctx.solrParams().size() > 0) {
+            return updateRequest;
+        }
+        throw new NoTypeConversionAvailableException(body, SolrRequestConverter.class);
+    }
+
+    private static void appendAddCommandToXML(SolrProducer.ActionContext ctx, String bodyAsString, String contentType) {
+        if ((contentType.startsWith(ContentStreamBase.TEXT_XML)
+                || contentType.startsWith(ContentStreamBase.APPLICATION_XML))
+                && !(bodyAsString.startsWith("<add"))) {
+            ctx.exchange().getMessage().setBody("<add>" + bodyAsString + "</add>");
+        }
+    }
+
+    private static Map<String, Object> getMapFromBody(Object body) {
+        if (body instanceof Map) {
+            return ((Map<?, ?>) body).entrySet().stream()
+                    .collect(
+                            Collectors.toMap(
+                                    entry -> String.valueOf(entry.getKey()),
+                                    Map.Entry::getValue));
+        }
+        return Collections.emptyMap();
+    }
+
+    private static Map<String, Object> getMapFromHeaderSolrFields(Exchange exchange) {
+        return exchange.getMessage().getHeaders().entrySet().stream()
+                .filter(entry -> entry.getKey().startsWith(SolrConstants.HEADER_FIELD_PREFIX))
+                .collect(
+                        Collectors.toMap(
+                                entry -> entry.getKey().substring(SolrConstants.HEADER_FIELD_PREFIX.length()),
+                                Map.Entry::getValue));
+    }
+
+    private static Optional<Collection<SolrInputDocument>> getOptionalCollectionOfSolrInputDocument(
+            Collection<Map<?, ?>> maps, Exchange exchange) {
+        Collection<SolrInputDocument> docs = new ArrayList<>();
+        for (Map<?, ?> map : maps) {
+            Optional<SolrInputDocument> doc = getOptionalSolrInputDocumentFromMap(map, exchange);
+            doc.ifPresent(docs::add);
+        }
+        return docs.isEmpty() ? Optional.empty() : Optional.of(docs);
+    }
+
+    private static Optional<SolrInputDocument> getOptionalSolrInputDocumentFromMap(Object body, Exchange exchange) {
+        Map<String, Object> map = getMapFromBody(body);
+        if (!map.isEmpty()) {
+            SolrInputDocument doc = new SolrInputDocument();
+            map.forEach(doc::setField);
+            return Optional.of(doc);
+        }
+        return Optional.empty();
+    }
+
+}
diff --git a/components/camel-solr/src/main/java/org/apache/camel/component/solr/converter/SolrResponseConverter.java b/components/camel-solr/src/main/java/org/apache/camel/component/solr/converter/SolrResponseConverter.java
new file mode 100644
index 00000000000..b04fa05823d
--- /dev/null
+++ b/components/camel-solr/src/main/java/org/apache/camel/component/solr/converter/SolrResponseConverter.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.solr.converter;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.solr.SolrUtils;
+import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.response.SolrPingResponse;
+import org.apache.solr.client.solrj.response.SolrResponseBase;
+import org.apache.solr.common.util.NamedList;
+
+@Converter(generateLoader = true)
+@SuppressWarnings("unchecked")
+public final class SolrResponseConverter {
+
+    private SolrResponseConverter() {
+    }
+
+    @Converter
+    public static Map<String, Object> createSolrResponseMap(Object body, Exchange exchange) {
+        return SolrUtils.parseAsFlatMap(SolrUtils.parseAsMap(createSolrResponse(body, exchange)));
+    }
+
+    @Converter
+    public static SolrResponse createSolrResponse(Object body, Exchange exchange) {
+        return createSolrResponse(body, SolrResponseBase.class);
+    }
+
+    @Converter
+    public static SolrPingResponse createSolrPingResponse(Object body, Exchange exchange) {
+        return createSolrResponse(body, SolrPingResponse.class);
+    }
+
+    @Converter
+    public static QueryResponse createQueryResponse(Object body, Exchange exchange) {
+        return createSolrResponse(body, QueryResponse.class);
+    }
+
+    private static <T extends SolrResponse> T createSolrResponse(Object body, Class<T> type) {
+        if (body instanceof NamedList<?> namedList) {
+            T t;
+            try {
+                t = type.getDeclaredConstructor().newInstance();
+            } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+                throw new RuntimeException(e);
+            }
+            t.setResponse((NamedList<Object>) namedList);
+            return t;
+        }
+        return null;
+    }
+
+}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java
index 5eaded5b5af..928f423135c 100644
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/InitSolrEndpointTest.java
@@ -16,123 +16,86 @@
  */
 package org.apache.camel.component.solr;
 
-import java.util.stream.Stream;
-
+import org.apache.camel.CamelContext;
 import org.apache.camel.ResolveEndpointFailedException;
-import org.apache.http.client.HttpClient;
+import org.apache.camel.test.junit5.CamelTestSupport;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
-import org.apache.solr.client.solrj.impl.HttpClientUtil;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
-import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.client.solrj.impl.HttpJdkSolrClient;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.EnumSource;
-import org.junit.jupiter.params.provider.MethodSource;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.*;
 
-public class InitSolrEndpointTest extends SolrTestSupport {
+public class InitSolrEndpointTest extends CamelTestSupport {
 
-    private String solrUrl = "solr://localhost:" + getPort() + "/solr";
+    private final String dummyUri = "solr://localhost:8983";
+    private final SolrClient solrClient = new HttpJdkSolrClient.Builder(dummyUri).build();
 
     @Test
-    public void endpointCreatedCorrectlyWithAllOptions() {
-        HttpClient httpClient = HttpClientUtil.createClient(new ModifiableSolrParams());
-        context.getRegistry().bind("http", httpClient);
-        SolrClient httpSolrClient = new HttpSolrClient.Builder(solrUrl).build();
-        context.getRegistry().bind("client", httpSolrClient);
-        SolrEndpoint solrEndpoint = context.getEndpoint(solrUrl + getFullOptions(), SolrEndpoint.class);
-        assertEquals(5, solrEndpoint.getSolrConfiguration().getStreamingQueueSize(), "queue size incorrect");
-        assertEquals(1, solrEndpoint.getSolrConfiguration().getStreamingThreadCount(), "thread count incorrect");
-        assertNotNull(solrEndpoint);
+    public void endpointCreatedCorrectlyWithAutoWireEnabled() throws Exception {
+        SolrEndpoint solrEndpoint;
+        try (CamelContext camelContext = context()) {
+            camelContext.getRegistry().bind("mySolrClient", solrClient);
+            solrEndpoint = camelContext.getEndpoint(dummyUri, SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertNotNull(solrEndpoint.getConfiguration().getSolrClient());
+            assertEquals(solrClient, solrEndpoint.getConfiguration().getSolrClient());
+        }
     }
 
     @Test
-    public void streamingEndpointCreatedCorrectly() {
-        SolrEndpoint solrEndpoint = context.getEndpoint(solrUrl, SolrEndpoint.class);
-        assertNotNull(solrEndpoint);
-        assertEquals(SolrConstants.DEFUALT_STREAMING_QUEUE_SIZE, solrEndpoint.getSolrConfiguration().getStreamingQueueSize(),
-                "queue size incorrect");
-        assertEquals(SolrConstants.DEFAULT_STREAMING_THREAD_COUNT,
-                solrEndpoint.getSolrConfiguration().getStreamingThreadCount(),
-                "thread count incorrect");
+    public void endpointCreatedCorrectlyWithAutoWireDisabled() throws Exception {
+        SolrEndpoint solrEndpoint;
+        SolrClient solrClient1 = new HttpJdkSolrClient.Builder(dummyUri.replace("solr://", "http://")).build();
+        try (CamelContext camelContext = context()) {
+            camelContext.setAutowiredEnabled(false);
+            camelContext.getRegistry().bind("client1", solrClient1);
+            solrEndpoint = camelContext.getEndpoint(dummyUri, SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertNull(solrEndpoint.getConfiguration().getSolrClient());
+            solrEndpoint
+                    = camelContext.getEndpoint(dummyUri + "?solrClient=#client1", SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertNotNull(solrEndpoint.getConfiguration().getSolrClient());
+            assertEquals(solrClient1, solrEndpoint.getConfiguration().getSolrClient());
+        }
     }
 
     @Test
-    public void wrongURLFormatFailsEndpointCreation() {
-        assertThrows(ResolveEndpointFailedException.class,
-                () -> context.getEndpoint("solr://localhost:x99/solr"));
-    }
-
-    @ParameterizedTest
-    @EnumSource(SolrConfiguration.SolrScheme.class)
-    public void endpointWithSolrAndHttpClient(SolrConfiguration.SolrScheme solrScheme) throws Exception {
-        String solrClientBaseUrl = "http://localhost:8983/solr/collection1";
-        String solrEndpointUri = solrClientBaseUrl.replace("http://", solrScheme.getUri());
-        // httpClient
-        HttpClient httpClient = HttpClientUtil.createClient(new ModifiableSolrParams());
-        context.getRegistry().bind("http", httpClient);
-        SolrEndpoint solrEndpoint = context.getEndpoint(solrEndpointUri.concat("?httpClient=#http"), SolrEndpoint.class);
-        SolrClient solrClient = solrEndpoint.getComponent().getSolrClient(
-                (SolrProducer) solrEndpoint.createProducer(),
-                solrEndpoint.getSolrConfiguration());
-        HttpClient httpClient1 = solrClient instanceof CloudLegacySolrClient
-                ? ((CloudLegacySolrClient) solrClient).getHttpClient() : ((HttpSolrClient) solrClient).getHttpClient();
-        assertNotNull(httpClient1);
-        assertEquals(httpClient, httpClient1);
-        // solrClient
-        SolrClient httpSolrClient = new HttpSolrClient.Builder(solrClientBaseUrl).build();
-        context.getRegistry().bind("client", httpSolrClient);
-        solrEndpoint = context.getEndpoint(solrEndpointUri.concat("?solrClient=#client"), SolrEndpoint.class);
-        assertNotNull(solrEndpoint.getSolrConfiguration().getSolrClient());
-        assertEquals(httpSolrClient, solrEndpoint.getSolrConfiguration().getSolrClient());
-    }
-
-    @ParameterizedTest
-    @MethodSource("provideSolrEndpointStringsWithExpectedSolrClientClass")
-    public void endpointCreatedMatchesExpectedSolrClient(
-            String endpointUri, Class expectedSolrClientClass, String expectedZkChroot)
-            throws Exception {
-        SolrComponent solrComponent = context.getComponent("solr", SolrComponent.class);
-        SolrEndpoint solrEndpoint = context.getEndpoint(endpointUri, SolrEndpoint.class);
-        SolrClient solrClient = solrComponent.getSolrClient((SolrProducer) solrEndpoint.createProducer(),
-                solrEndpoint.getSolrConfiguration());
-        assertNotNull(solrClient);
-        assertEquals(expectedSolrClientClass, solrClient.getClass());
-        assertEquals(expectedZkChroot, solrEndpoint.getSolrConfiguration().getZkChroot());
-    }
-
-    private static Stream<Arguments> provideSolrEndpointStringsWithExpectedSolrClientClass() {
-        return Stream.of(
-                Arguments.of("solr:localhost:8983/solr", HttpSolrClient.class, null),
-                Arguments.of("solr://localhost:8983/solr", HttpSolrClient.class, null),
-                // note: zkChroot will not be used but we can't get it from the client directly, so we need to set it
-                Arguments.of("solr://localhost:2181/solr?zkChroot=/mytest", CloudLegacySolrClient.class, "/mytest"),
-                Arguments.of("solr://localhost:8983/solr,localhost:8984/solr,localhost:8985/solr", LBHttpSolrClient.class,
-                        null),
-                Arguments.of("solr://localhost:8983/solr?zkHost=zk1:2181", CloudLegacySolrClient.class, null),
-                Arguments.of("solr://localhost:8983/solr?zkHost=zk1:2181,zk2:2181,zk3:2181/mytest", CloudLegacySolrClient.class,
-                        "/mytest"),
-                Arguments.of("solr://localhost:8983/solr?zkHost=zk1:2181,zk2:2181,zk3:2181/mytest&zkChroot=/myZkChroot",
-                        CloudLegacySolrClient.class, "/myZkChroot"),
-                Arguments.of("solrCloud:zk1:2181,zk2:2181,zk3:2181", CloudLegacySolrClient.class, null),
-                Arguments.of("solrCloud:zk1:2181,zk2:2181,zk3:2181/myZkChroot", CloudLegacySolrClient.class, "/myZkChroot"),
-                Arguments.of("solrCloud:zk1,zk2,zk3/myZkChroot", CloudLegacySolrClient.class, "/myZkChroot"));
+    public void wrongURLFormatFailsEndpointCreation() throws Exception {
+        SolrEndpoint solrEndpoint;
+        String testUri = dummyUri.replace(":8983", ":89xx");
+        try (CamelContext camelContext = context()) {
+            // should fail as invalid uri
+            assertThrows(ResolveEndpointFailedException.class,
+                    () -> camelContext.getEndpoint(testUri));
+            // should not fail as valid uri
+            solrEndpoint = camelContext.getEndpoint(testUri.replace(":89xx", ""), SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+        }
     }
 
-    private String getFullOptions() {
-        return "?streamingQueueSize=5&streamingThreadCount=1"
-               + "&maxRetries=1&soTimeout=100&connectionTimeout=100"
-               + "&defaultMaxConnectionsPerHost=100&maxTotalConnections=100"
-               + "&followRedirects=false&allowCompression=true"
-               + "&requestHandler=/update"
-               + "&solrClient=#client&httpClient=#http&zkChroot=/test"
-               + "&username=solr&password=SolrRocks";
+    @Test
+    public void endpointCreatedWithSolrUriPath() throws Exception {
+        SolrEndpoint solrEndpoint;
+        try (CamelContext camelContext = context()) {
+            solrEndpoint = camelContext.getEndpoint(dummyUri.concat("/solr/testcollection/update/xml"), SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertEquals("testcollection", solrEndpoint.getConfiguration().getCollection());
+            assertEquals("/update/xml", solrEndpoint.getConfiguration().getRequestHandler());
+            solrEndpoint = camelContext.getEndpoint(dummyUri.concat("/solr/testcollection/update/"), SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertEquals("testcollection", solrEndpoint.getConfiguration().getCollection());
+            assertEquals("/update", solrEndpoint.getConfiguration().getRequestHandler());
+            solrEndpoint = camelContext.getEndpoint(dummyUri.concat("/solr/testcollection"), SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertEquals("testcollection", solrEndpoint.getConfiguration().getCollection());
+            assertNull(solrEndpoint.getConfiguration().getRequestHandler());
+            solrEndpoint = camelContext.getEndpoint(dummyUri.concat("/sub-app/solr2/"), SolrEndpoint.class);
+            assertNotNull(solrEndpoint);
+            assertNull(solrEndpoint.getConfiguration().getCollection());
+            assertNull(solrEndpoint.getConfiguration().getRequestHandler());
+            assertEquals("/sub-app/solr2/", solrEndpoint.getConfiguration().getBasePath());
+        }
     }
 
 }
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/JettySolrFactory.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/JettySolrFactory.java
deleted file mode 100644
index 0b939763cde..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/JettySolrFactory.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.solr;
-
-import java.io.File;
-import java.security.KeyManagementException;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.X509Certificate;
-import java.util.SortedMap;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
-import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
-import org.apache.http.ssl.SSLContextBuilder;
-import org.apache.solr.client.solrj.embedded.SSLConfig;
-import org.apache.solr.embedded.JettyConfig;
-import org.apache.solr.embedded.JettySolrRunner;
-import org.eclipse.jetty.servlet.ServletHolder;
-
-// Create embedded's Solrs for testing,
-// based on SolrJettyTestBase
-public final class JettySolrFactory {
-
-    public static final File TEST_KEYSTORE = new File("./target/test-classes/solrtest.keystore");
-    private static final String TEST_KEYSTORE_PATH = TEST_KEYSTORE.getAbsolutePath();
-    private static final String TEST_KEYSTORE_PASSWORD = "secret";
-    private static boolean mockedSslClient;
-    private static int dataDirNo;
-
-    private JettySolrFactory() {
-        // Util class
-    }
-
-    private static SSLConfig buildSSLConfig(boolean useSsl, boolean sslClientAuth) {
-        SSLConfig sslConfig = new SSLConfig(
-                useSsl, false, TEST_KEYSTORE_PATH, TEST_KEYSTORE_PASSWORD,
-                TEST_KEYSTORE_PATH, TEST_KEYSTORE_PASSWORD);
-        return sslConfig;
-    }
-
-    private static void installAllTrustingClientSsl()
-            throws KeyManagementException,
-            NoSuchAlgorithmException, KeyStoreException {
-        SSLContextBuilder builder = new SSLContextBuilder();
-        builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
-
-        // Create a trust manager that does not validate certificate chains
-        final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
-            @Override
-            public void checkClientTrusted(final X509Certificate[] chain, final String authType) {
-            }
-
-            @Override
-            public void checkServerTrusted(final X509Certificate[] chain, final String authType) {
-            }
-
-            @Override
-            public X509Certificate[] getAcceptedIssuers() {
-                return null;
-            }
-        } };
-        final SSLContext sslContext = SSLContext.getInstance("TLS");
-        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
-        SSLContext.setDefault(sslContext);
-    }
-
-    private static JettySolrRunner createJetty(
-            String solrHome, String configFile, String schemaFile,
-            String context, boolean stopAtShutdown,
-            SortedMap<ServletHolder, String> extraServlets, boolean ssl)
-            throws Exception {
-        if (!mockedSslClient) {
-            installAllTrustingClientSsl();
-            mockedSslClient = true;
-        }
-        // Set appropriate paths for Solr to use.
-        System.setProperty("solr.solr.home", solrHome);
-        System.setProperty("jetty.testMode", "true");
-        System.setProperty("solr.data.dir", "target/test-classes/solr/data" + (dataDirNo++));
-        System.setProperty("solr.log.dir", "target/");
-
-        // Instruct Solr to keep the index in memory, for faster testing.
-        System.setProperty("solr.directoryFactory", "solr.RAMDirectoryFactory");
-        System.setProperty("solr.lock.type", "single");
-
-        SSLConfig sslConfig = buildSSLConfig(ssl, false);
-
-        context = context == null ? "/solr" : context;
-        JettyConfig jettyConfig = new JettyConfig.Builder().setContext(context).setPort(0).stopAtShutdown(false)
-                .withServlets(extraServlets).withSSLConfig(sslConfig).build();
-        JettySolrRunner jetty = new JettySolrRunner(solrHome, jettyConfig);
-
-        jetty.start();
-
-        return jetty;
-    }
-
-    public static JettySolrRunner createJettyTestFixture(boolean useSsl) throws Exception {
-        String solrHome = "src/test/resources/solr";
-        String configFile = solrHome + "/solr-no-core.xml";
-        String schemaFile = solrHome + "/collection1/conf/schema.xml";
-        String context = "/solr";
-        boolean stopAtShutdown = true;
-        SortedMap<ServletHolder, String> extraServlets = null;
-
-        if (!useSsl) {
-            System.setProperty("tests.jettySsl", "false");
-        }
-
-        return createJetty(solrHome, configFile, schemaFile, context, stopAtShutdown, extraServlets, useSsl);
-
-    }
-
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/MapBodyManualIT.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/MapBodyManualIT.java
deleted file mode 100644
index b1248da9afc..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/MapBodyManualIT.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.solr;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
-
-@EnabledIfSystemProperty(named = "solr.address", matches = ".*",
-                         disabledReason = "The Solr address (host:port) was not provided")
-public class MapBodyManualIT extends CamelTestSupport {
-
-    @EndpointInject
-    private ProducerTemplate template;
-
-    @EndpointInject("mock:result")
-    private MockEndpoint result;
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void sendIn() throws Exception {
-        result.expectedMessageCount(1);
-
-        template.send("direct:start", new Processor() {
-
-            @Override
-            public void process(Exchange exchange) {
-                Map<String, String> map = new HashMap<>();
-                map.put("id", "0553579923");
-                map.put("cat", "Test");
-                map.put("name", "Test");
-                map.put("price", "Test");
-                map.put("author_t", "Test");
-                map.put("series_t", "Test");
-                map.put("sequence_i", "3");
-                map.put("genre_s", "Test");
-                exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-                exchange.getMessage().setBody(map);
-            }
-        });
-
-        MockEndpoint.assertIsSatisfied(context);
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() {
-                from("direct:start").to("{{solr.address}}").to("mock:result");
-            }
-        };
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrAddBeanTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrAddBeanTest.java
deleted file mode 100644
index e233d6a457e..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrAddBeanTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.test.junit5.params.Test;
-import org.apache.solr.client.solrj.beans.Field;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class SolrAddBeanTest extends SolrComponentTestSupport {
-
-    @Test
-    public void testAddBean() throws Exception {
-
-        //add bean
-        Item item = new Item();
-        item.id = TEST_ID;
-        item.categories = new String[] { "aaa", "bbb", "ccc" };
-
-        template.sendBodyAndHeader("direct:start", item, SolrConstants.OPERATION, SolrConstants.OPERATION_ADD_BEAN);
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_COMMIT);
-
-        //verify
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    public class Item {
-        @Field
-        String id;
-
-        @Field("cat")
-        String[] categories;
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrAddBeansTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrAddBeansTest.java
deleted file mode 100644
index cdf21ba10dc..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrAddBeansTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.solr;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.camel.test.junit5.params.Test;
-import org.apache.solr.client.solrj.beans.Field;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class SolrAddBeansTest extends SolrComponentTestSupport {
-
-    @Test
-    public void testAddBeans() throws Exception {
-
-        List<Item> beans = new ArrayList<>();
-
-        //add bean1
-        Item item1 = new Item();
-        item1.id = TEST_ID;
-        item1.categories = new String[] { "aaa", "bbb", "ccc" };
-        beans.add(item1);
-
-        //add bean2
-        Item item2 = new Item();
-        item2.id = TEST_ID2;
-        item2.categories = new String[] { "aaa", "bbb", "ccc" };
-        beans.add(item2);
-
-        template.sendBodyAndHeader("direct:start", beans, SolrConstants.OPERATION, SolrConstants.OPERATION_ADD_BEANS);
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_COMMIT);
-
-        //verify
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID2).getResults().getNumFound(), "wrong number of entries found");
-        assertEquals(2, executeSolrQuery("*:*").getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    public class Item {
-        @Field
-        String id;
-
-        @Field("cat")
-        String[] categories;
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrCloudFixture.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrCloudFixture.java
deleted file mode 100644
index cddcdaf1b89..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrCloudFixture.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * 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.solr;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
-
-import org.apache.camel.util.IOHelper;
-import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
-import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.cloud.MiniSolrCloudCluster;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.params.CollectionParams.CollectionAction;
-import org.apache.solr.common.params.CoreAdminParams;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.embedded.JettySolrRunner;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SolrCloudFixture {
-
-    private static final Logger LOG;
-    private static final Path TEMP_DIR;
-
-    /**
-     * Create a temp dir under the maven target folder
-     */
-    static {
-        LOG = LoggerFactory.getLogger(SolrCloudFixture.class);
-        TEMP_DIR = Paths.get("target", "tmp");
-        try {
-            Files.createDirectories(TEMP_DIR);
-            LOG.info("Created: {}", TEMP_DIR);
-        } catch (IOException e) {
-            LOG.error("Unable to create {}", TEMP_DIR, e);
-        }
-
-    }
-
-    MiniSolrCloudCluster miniCluster;
-    File testDir;
-    SolrZkClient zkClient;
-
-    CloudLegacySolrClient solrClient;
-
-    public SolrCloudFixture(String solrHome) throws Exception {
-        String xml = IOHelper.loadText(new FileInputStream(new File(solrHome, "solr-no-core.xml")));
-        miniCluster = new MiniSolrCloudCluster(1, "/solr", TEMP_DIR, xml, null, null);
-        String zkAddr = miniCluster.getZkServer().getZkAddress();
-        String zkHost = miniCluster.getZkServer().getZkHost();
-
-        buildZooKeeper(zkHost, zkAddr, new File(solrHome), "solrconfig.xml", "schema.xml");
-        List<JettySolrRunner> jettys = miniCluster.getJettySolrRunners();
-        for (JettySolrRunner jetty : jettys) {
-            if (!jetty.isRunning()) {
-                LOG.warn("JETTY NOT RUNNING!");
-            } else {
-                LOG.info("JETTY RUNNING AT {}:{}", jetty.getBaseUrl(), jetty.getLocalPort());
-            }
-        }
-
-        solrClient = new CloudLegacySolrClient.Builder(Arrays.asList(zkAddr), Optional.empty()).build();
-        solrClient.connect();
-
-        createCollection(solrClient, "collection1", 1, 1, "conf1");
-        Thread.sleep(1000); // takes some time to setup the collection...
-                           // otherwise you'll get no live solr servers
-        solrClient.setDefaultCollection("collection1");
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.setField("id", "1");
-
-        solrClient.add(doc);
-        solrClient.commit();
-    }
-
-    public static void putConfig(String confName, SolrZkClient zkClient, File solrhome, final String name)
-            throws Exception {
-        putConfig(confName, zkClient, solrhome, name, name);
-    }
-
-    protected NamedList<Object> createCollection(
-            CloudLegacySolrClient server, String name, int numShards,
-            int replicationFactor, String configName)
-            throws Exception {
-        ModifiableSolrParams modParams = new ModifiableSolrParams();
-        modParams.set(CoreAdminParams.ACTION, CollectionAction.CREATE.name());
-        modParams.set("name", name);
-        modParams.set("numShards", numShards);
-        modParams.set("replicationFactor", replicationFactor);
-        modParams.set("collection.configName", configName);
-        QueryRequest request = new QueryRequest(modParams);
-        request.setPath("/admin/collections");
-        return server.request(request);
-    }
-
-    public static void putConfig(
-            String confName, SolrZkClient zkClient, File solrhome, final String srcName,
-            String destName)
-            throws Exception {
-        File file = new File(solrhome, "collection1" + File.separator + "conf" + File.separator + srcName);
-        if (!file.exists()) {
-            LOG.info("zk skipping {} because it doesn't exist", file.getAbsolutePath());
-            return;
-        }
-
-        String destPath = "/configs/" + confName + "/" + destName;
-        LOG.info("zk put {} to {}", file.getAbsolutePath(), destPath);
-        zkClient.makePath(destPath, Files.readAllBytes(file.toPath()), false, true);
-    }
-
-    // static to share with distrib test
-    public void buildZooKeeper(String zkHost, String zkAddress, File solrhome, String config, String schema)
-            throws Exception {
-        zkClient = new SolrZkClient.Builder()
-                .withUrl(zkAddress)
-                .withTimeout(60000, TimeUnit.MILLISECONDS)
-                .build();
-        Map<String, Object> props = new HashMap<>();
-        props.put("configName", "conf1");
-
-        // for now, always upload the config and schema to the canonical names
-        putConfig("conf1", zkClient, solrhome, config, "solrconfig.xml");
-        putConfig("conf1", zkClient, solrhome, schema, "schema.xml");
-
-        putConfig("conf1", zkClient, solrhome, "stopwords.txt");
-        putConfig("conf1", zkClient, solrhome, "stopwords_en.txt");
-        putConfig("conf1", zkClient, solrhome, "protwords.txt");
-        putConfig("conf1", zkClient, solrhome, "currency.xml");
-        putConfig("conf1", zkClient, solrhome, "enumsConfig.xml");
-        putConfig("conf1", zkClient, solrhome, "open-exchange-rates.json");
-        putConfig("conf1", zkClient, solrhome, "mapping-ISOLatin1Accent.txt");
-        putConfig("conf1", zkClient, solrhome, "old_synonyms.txt");
-        putConfig("conf1", zkClient, solrhome, "synonyms.txt");
-        putConfig("conf1", zkClient, solrhome, "elevate.xml");
-        zkClient.close();
-    }
-
-    public void teardown() throws Exception {
-        solrClient.close();
-        miniCluster.shutdown();
-        try (Stream<File> stream = Files.walk(TEMP_DIR).sorted(Comparator.reverseOrder()).map(Path::toFile)) {
-            stream.forEach(File::delete);
-        }
-        solrClient = null;
-        miniCluster = null;
-    }
-
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java
deleted file mode 100644
index ffaf7beec9d..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentTestSupport.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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.solr;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.junit5.params.Parameter;
-import org.apache.camel.test.junit5.params.Parameterized;
-import org.apache.camel.test.junit5.params.Parameters;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrQuery;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.BeforeEach;
-
-@Parameterized
-public abstract class SolrComponentTestSupport extends SolrTestSupport {
-    protected static final String TEST_ID = "test1";
-    protected static final String TEST_ID2 = "test2";
-
-    @Parameter
-    SolrFixtures.TestServerType serverToTest;
-
-    SolrFixtures solrFixtures;
-
-    protected void solrInsertTestEntry() {
-        solrInsertTestEntry(TEST_ID);
-    }
-
-    protected static Collection<Object[]> secureOrNot() {
-        return Arrays.asList(new Object[][] { { true }, { false } });
-    }
-
-    SolrFixtures getSolrFixtures() {
-        if (solrFixtures == null) {
-            solrFixtures = new SolrFixtures(serverToTest);
-        }
-        return solrFixtures;
-    }
-
-    String solrRouteUri() {
-        return getSolrFixtures().solrRouteUri();
-    }
-
-    String solrRouteAutocommitUri() {
-        return getSolrFixtures().solrRouteAutocommitUri();
-    }
-
-    protected void solrInsertTestEntry(String id) {
-        Map<String, Object> headers = new HashMap<>();
-        headers.put(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        headers.put("SolrField.id", id);
-        template.sendBodyAndHeaders("direct:start", "", headers);
-    }
-
-    protected void solrCommit() {
-        template.sendBodyAndHeader("direct:start", "", SolrConstants.OPERATION, SolrConstants.OPERATION_COMMIT);
-    }
-
-    protected QueryResponse executeSolrQuery(String query) throws SolrServerException, IOException {
-        SolrQuery solrQuery = new SolrQuery();
-        solrQuery.setQuery(query);
-        QueryRequest queryRequest = new QueryRequest(solrQuery);
-        queryRequest.setBasicAuthCredentials("solr", "SolrRocks");
-        SolrClient solrServer = getSolrFixtures().getServer();
-        return queryRequest.process(solrServer, "collection1");
-    }
-
-    @BeforeAll
-    public static void beforeClass() throws Exception {
-        SolrFixtures.createSolrFixtures();
-    }
-
-    @AfterAll
-    public static void afterClass() throws Exception {
-        SolrFixtures.teardownSolrFixtures();
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() {
-                from("direct:start").to(solrRouteUri());
-                from("direct:splitThenCommit")
-                        .split(body())
-                        .to(solrRouteUri())
-                        .end()
-                        .setHeader(SolrConstants.OPERATION, constant(SolrConstants.OPERATION_COMMIT))
-                        .to(solrRouteUri());
-                from("direct:startAutoCommit").to(solrRouteAutocommitUri());
-            }
-        };
-    }
-
-    @Parameters
-    public static Collection<Object[]> serverTypes() {
-        Object[][] serverTypes = {
-                { SolrFixtures.TestServerType.USE_CLOUD },
-                { SolrFixtures.TestServerType.USE_HTTPS },
-                { SolrFixtures.TestServerType.USE_HTTP }
-        };
-        return Arrays.asList(serverTypes);
-    }
-
-    @BeforeEach
-    public void clearIndex() throws Exception {
-        SolrFixtures.clearIndex();
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentVerifierExtensionTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentVerifierExtensionTest.java
new file mode 100644
index 00000000000..3246b76627c
--- /dev/null
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrComponentVerifierExtensionTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.solr;
+
+import java.net.ConnectException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.extension.ComponentVerifierExtension;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class SolrComponentVerifierExtensionTest extends CamelTestSupport {
+
+    @Test
+    void testParameters() {
+        Component component = context().getComponent("solr");
+
+        ComponentVerifierExtension verifier
+                = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("host", "localhost");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+
+    @Test
+    void testConnectivity() {
+        Component component = context().getComponent("solr");
+        ComponentVerifierExtension verifier
+                = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("host", "localhost");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+        assertEquals(ConnectException.class.getCanonicalName(), result.getErrors().get(0)
+                .getDetail(ComponentVerifierExtension.VerificationError.ExceptionAttribute.EXCEPTION_CLASS));
+    }
+
+}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrDeleteTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrDeleteTest.java
deleted file mode 100644
index d08f32493e6..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrDeleteTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.solr;
-
-import java.util.Arrays;
-
-import org.apache.camel.test.junit5.params.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public class SolrDeleteTest extends SolrComponentTestSupport {
-
-    @Test
-    public void testDeleteById() throws Exception {
-
-        //insert, commit and verify
-        solrInsertTestEntry();
-        solrCommit();
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-
-        //delete
-        template.sendBodyAndHeader("direct:start", TEST_ID, SolrConstants.OPERATION, SolrConstants.OPERATION_DELETE_BY_ID);
-        solrCommit();
-
-        //verify
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    @Test
-    public void testDeleteListOfIDs() throws Exception {
-
-        //insert, commit and verify
-        solrInsertTestEntry(TEST_ID);
-        solrInsertTestEntry(TEST_ID2);
-        solrCommit();
-        assertEquals(2, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
-
-        //delete
-        template.sendBodyAndHeader("direct:splitThenCommit", Arrays.asList(TEST_ID, TEST_ID2), SolrConstants.OPERATION,
-                SolrConstants.OPERATION_DELETE_BY_ID);
-
-        //verify
-        assertEquals(0, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    @Test
-    public void testDeleteByQuery() throws Exception {
-
-        //insert, commit and verify
-        solrInsertTestEntry(TEST_ID);
-        solrInsertTestEntry(TEST_ID2);
-        solrCommit();
-        assertEquals(2, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
-
-        //delete
-        template.sendBodyAndHeader("direct:start", "id:test*", SolrConstants.OPERATION,
-                SolrConstants.OPERATION_DELETE_BY_QUERY);
-        solrCommit();
-
-        //verify
-        assertEquals(0, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java
deleted file mode 100644
index 84ba4822f7c..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrFixtures.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.solr;
-
-import java.io.IOException;
-
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
-import org.apache.solr.client.solrj.request.UpdateRequest;
-import org.apache.solr.embedded.JettySolrRunner;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SolrFixtures {
-    static Logger log = LoggerFactory.getLogger(SolrFixtures.class);
-
-    private static JettySolrRunner solrRunner;
-    private static JettySolrRunner solrHttpsRunner;
-    private static HttpSolrClient solrServer;
-    private static HttpSolrClient solrHttpsServer;
-    private static SolrCloudFixture cloudFixture;
-
-    private static int port;
-    private static int httpsPort;
-
-    public enum TestServerType {
-        USE_HTTP,
-        USE_HTTPS,
-        USE_CLOUD
-    }
-
-    TestServerType serverType;
-
-    SolrFixtures(TestServerType serverType) {
-        this.serverType = serverType;
-    }
-
-    String solrRouteUri() {
-        if (serverType == TestServerType.USE_HTTPS) {
-            return "solrs://127.0.0.1:" + httpsPort + "/solr/collection1"
-                   + "?username=solr&password=SolrRocks";
-        } else if (serverType == TestServerType.USE_CLOUD) {
-            String zkAddrStr = cloudFixture.miniCluster.getZkServer().getZkAddress();
-            return "solrCloud://localhost:" + httpsPort + "/solr?zkHost=" + zkAddrStr
-                   + "&collection=collection1&username=solr&password=SolrRocks";
-        } else {
-            return "solr://localhost:" + port + "/solr/collection1"
-                   + "?username=solr&password=SolrRocks";
-        }
-    }
-
-    String solrRouteAutocommitUri() {
-        if (serverType == TestServerType.USE_HTTPS) {
-            return "solrs://127.0.0.1:" + httpsPort + "/solr/collection1"
-                   + "?username=solr&password=SolrRocks&autoCommit=true";
-        } else if (serverType == TestServerType.USE_CLOUD) {
-            String zkAddrStr = cloudFixture.miniCluster.getZkServer().getZkAddress();
-            return "solrCloud://localhost:" + httpsPort + "/solr?zkHost=" + zkAddrStr
-                   + "&collection=collection1&username=solr&password=SolrRocks&autoCommit=true";
-        } else {
-            return "solr://localhost:" + port + "/solr/collection1"
-                   + "?username=solr&password=SolrRocks&autoCommit=true";
-        }
-    }
-
-    SolrClient getServer() {
-        if (serverType == TestServerType.USE_HTTPS) {
-            return solrHttpsServer;
-        } else if (serverType == TestServerType.USE_CLOUD) {
-            return cloudFixture.solrClient;
-        } else {
-            return solrServer;
-        }
-    }
-
-    static void createSolrFixtures() throws Exception {
-        solrHttpsRunner = JettySolrFactory.createJettyTestFixture(true);
-        httpsPort = solrHttpsRunner.getLocalPort();
-        log.info("Started Https Test Server: {}", solrHttpsRunner.getBaseUrl());
-        solrHttpsServer = new HttpSolrClient.Builder("https://127.0.0.1:" + httpsPort + "/solr")
-                .withConnectionTimeout(60000)
-                .build();
-
-        solrRunner = JettySolrFactory.createJettyTestFixture(false);
-        port = solrRunner.getLocalPort();
-
-        solrServer = new HttpSolrClient.Builder("http://localhost:" + port + "/solr").build();
-
-        log.info("Started Test Server: {}", solrRunner.getBaseUrl());
-        cloudFixture = new SolrCloudFixture("src/test/resources/solr");
-    }
-
-    public static void teardownSolrFixtures() throws Exception {
-        if (solrRunner != null) {
-            solrRunner.stop();
-        }
-        if (solrHttpsRunner != null) {
-            solrHttpsRunner.stop();
-        }
-        if (cloudFixture != null) {
-            cloudFixture.teardown();
-        }
-    }
-
-    public static void clearIndex() throws SolrServerException, IOException {
-        UpdateRequest updateRequest = new UpdateRequest();
-        updateRequest.setBasicAuthCredentials("solr", "SolrRocks");
-        updateRequest.deleteByQuery("*:*");
-        updateRequest.setAction(ACTION.COMMIT, true, true);
-        if (solrServer != null) {
-            // Clear the Solr index.
-            updateRequest.process(solrServer, "collection1");
-        }
-        if (solrHttpsServer != null) {
-            updateRequest.process(solrHttpsServer, "collection1");
-        }
-        if (cloudFixture != null) {
-            updateRequest.process(cloudFixture.solrClient);
-        }
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrServerMissingTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrServerMissingTest.java
deleted file mode 100644
index 40c1451c5a6..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrServerMissingTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.builder.RouteBuilder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class SolrServerMissingTest extends SolrTestSupport {
-
-    @Test
-    public void indexSingleDocumentToNonexistentServer() {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-
-        template.send("direct:start", exchange);
-
-        assertTrue(exchange.isFailed());
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() {
-                from("direct:start").to("solr://localhost:" + getPort() + "/missingSolr");
-            }
-        };
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrTestSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrTestSupport.java
deleted file mode 100644
index 73a03f39a8b..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrTestSupport.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.test.AvailablePortFinder;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.BeforeAll;
-
-public abstract class SolrTestSupport extends CamelTestSupport {
-
-    private static int port;
-    private static int httpsPort;
-
-    @BeforeAll
-    public static void initPort() {
-        port = AvailablePortFinder.getNextAvailable();
-        httpsPort = AvailablePortFinder.getNextAvailable();
-        System.setProperty("jdk.tls.client.protocols", "TLSv1.3");
-        System.setProperty("jdk.tls.server.protocols", "TLSv1.3");
-    }
-
-    protected static int getPort() {
-        return port;
-    }
-
-    protected static int getHttpsPort() {
-        return httpsPort;
-    }
-
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrTransactionsTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrTransactionsTest.java
deleted file mode 100644
index d812b7f88b2..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrTransactionsTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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.solr;
-
-import org.apache.camel.CamelExecutionException;
-import org.apache.camel.test.junit5.params.Test;
-import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
-
-import static org.apache.camel.test.junit5.TestSupport.assertIsInstanceOf;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-public class SolrTransactionsTest extends SolrComponentTestSupport {
-
-    @Test
-    public void testCommit() throws Exception {
-
-        //insert and verify
-        solrInsertTestEntry();
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-
-        //commit
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_COMMIT);
-
-        //verify exists after commit
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    @Test
-    public void testSoftCommit() throws Exception {
-
-        //insert and verify
-        solrInsertTestEntry();
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-
-        //commit
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_SOFT_COMMIT);
-
-        //verify exists after commit
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    @Test
-    public void testRollback() throws Exception {
-
-        if (SolrFixtures.TestServerType.USE_CLOUD == getSolrFixtures().serverType) {
-            // Twisting expectations in this case as rollback is currently no
-            // more supported in SolrCloud mode. See SOLR-4895
-            Exception e = assertThrows(CamelExecutionException.class,
-                    () -> doRollback());
-            assertIsInstanceOf(BaseHttpSolrClient.RemoteSolrException.class, e.getCause());
-            assertTrue(
-                    e.getCause().getMessage().contains("Rollback is currently not supported in SolrCloud mode. (SOLR-4895)"));
-        } else {
-            doRollback();
-        }
-
-    }
-
-    protected void doRollback() throws Exception {
-        //insert and verify
-        solrInsertTestEntry();
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-
-        //rollback
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_ROLLBACK);
-
-        //verify after rollback
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-
-        //commit
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_COMMIT);
-
-        //verify after commit (again)
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-    }
-
-    @Test
-    public void testOptimize() throws Exception {
-
-        //insert and verify
-        solrInsertTestEntry();
-        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-
-        //optimize
-        template.sendBodyAndHeader("direct:start", null, SolrConstants.OPERATION, SolrConstants.OPERATION_OPTIMIZE);
-
-        //verify exists after optimize
-        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
-    }
-
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateAutocommitTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateAutocommitTest.java
deleted file mode 100644
index cba1918b266..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateAutocommitTest.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * 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.solr;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.test.junit5.params.Test;
-import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.client.solrj.util.ClientUtils;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.params.UpdateParams;
-
-import static org.apache.camel.test.junit5.TestSupport.assertIsInstanceOf;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-public class SolrUpdateAutocommitTest extends SolrComponentTestSupport {
-
-    @Test
-    public void testInsertSolrInputDocumentAsXMLWithoutAddRoot() throws Exception {
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        String docAsXml = ClientUtils.toXML(doc);
-        template.sendBodyAndHeader("direct:startAutoCommit", docAsXml, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertSolrInputDocumentAsXMLWithAddRoot() throws Exception {
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        String docAsXml = "<add>" + ClientUtils.toXML(doc) + "</add>";
-        template.sendBodyAndHeader("direct:startAutoCommit", docAsXml, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertSolrInputDocument() throws Exception {
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        template.sendBodyAndHeader("direct:startAutoCommit", doc, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertSolrInputDocumentList() throws Exception {
-        List<SolrInputDocument> docList = new ArrayList<>(2);
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        docList.add(doc);
-
-        doc = new SolrInputDocument();
-        doc.addField("id", "KP147LL/A");
-        docList.add(doc);
-
-        template.sendBodyAndHeader("direct:startAutoCommit", docList, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        response = executeSolrQuery("id:KP147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        response = executeSolrQuery("id:KP147LL/ABC");
-        assertEquals(0, response.getStatus());
-        assertEquals(0, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertStreaming() throws Exception {
-
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT_STREAMING);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        template.send("direct:startAutoCommit", exchange);
-
-        Thread.sleep(500);
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void indexSingleDocumentOnlyWithId() throws Exception {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-
-        template.send("direct:startAutoCommit", exchange);
-
-        // Check things were indexed.
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void caughtSolrExceptionIsHandledElegantly() {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.name", "Missing required field throws exception.");
-
-        template.send("direct:startAutoCommit", exchange);
-
-        //noinspection ThrowableResultOfMethodCallIgnored
-        assertIsInstanceOf(BaseHttpSolrClient.RemoteSolrException.class, exchange.getException());
-    }
-
-    @Test
-    public void setHeadersAsSolrFields() throws Exception {
-        Exchange exchange = createExchangeWithBody("Body is ignored");
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black");
-        exchange.getIn().setHeader("SolrField.manu", "Apple Computer Inc.");
-
-        template.send("direct:startAutoCommit", exchange);
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertEquals("Apple 60 GB iPod with Video Playback Black", doc.getFieldValue("name"));
-        assertEquals("Apple Computer Inc.", doc.getFieldValue("manu"));
-    }
-
-    @Test
-    public void setMultiValuedFieldInHeader() throws Exception {
-        String[] categories = { "electronics", "apple" };
-        Exchange exchange = createExchangeWithBody("Test body for iPod.");
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.cat", categories);
-
-        template.send("direct:startAutoCommit", exchange);
-
-        // Check things were indexed.
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertArrayEquals(categories, ((List<?>) doc.getFieldValue("cat")).toArray());
-    }
-
-    @Test
-    public void indexDocuments() throws Exception {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black");
-        exchange.getIn().setHeader("SolrField.manu", "Apple Computer Inc.");
-        template.send("direct:startAutoCommit", exchange);
-
-        QueryResponse afterCommitResponse = executeSolrQuery("*:*");
-        assertEquals(0, afterCommitResponse.getStatus());
-        assertEquals(1, afterCommitResponse.getResults().getNumFound());
-    }
-
-    @Test
-    public void invalidSolrParametersAreIgnored() throws Exception {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black");
-        exchange.getIn().setHeader("SolrParam.invalid-param", "this is ignored");
-
-        template.send("direct:startAutoCommit", exchange);
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void indexDocumentsToCSVUpdateHandlerWithoutParameters() throws Exception {
-        SolrEndpoint solrEndpoint = getMandatoryEndpoint(solrRouteAutocommitUri(), SolrEndpoint.class);
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        template.send("direct:startAutoCommit", exchange);
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(10, response.getResults().getNumFound());
-
-        response = executeSolrQuery("id:0553573403");
-        SolrDocument doc = response.getResults().get(0);
-        assertEquals("A Game of Thrones", doc.getFieldValue("name"));
-        assertEquals(7.99f, doc.getFieldValue("price"));
-    }
-
-    @Test
-    public void queryDocumentsToCSVUpdateHandlerWithoutParameters() {
-        SolrEndpoint solrEndpoint = getMandatoryEndpoint(solrRouteAutocommitUri(), SolrEndpoint.class);
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        template.send("direct:startAutoCommit", exchange);
-
-        Exchange exchange1 = createExchangeWithBody(null);
-        exchange1.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_QUERY);
-        exchange1.getIn().setHeader(SolrConstants.QUERY_STRING, "id:0553573403");
-        Exchange result = template.send("direct:startAutoCommit", exchange1);
-
-        SolrDocumentList list = result.getMessage().getBody(SolrDocumentList.class);
-        assertEquals("A Game of Thrones", list.get(0).getFieldValue("name"));
-        assertEquals(7.99f, list.get(0).getFieldValue("price"));
-    }
-
-    @Test
-    public void queryDocumentsToMap() throws Exception {
-        SolrEndpoint solrEndpoint = getMandatoryEndpoint(solrRouteAutocommitUri(), SolrEndpoint.class);
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        template.send("direct:startAutoCommit", exchange);
-
-        // Required to reset request handler:
-        // The Map-based insert request used to not respect the requesthandler that was explicitly set on the endpoint:
-        // The insert-request was always using '/update' even when '/update/csv' was set on the endpoint.
-        // This has now been changed: the explicitly set requesthandler is used.
-        solrEndpoint.setRequestHandler(null);
-        // 0553579908,book,A Clash of Kings,7.99,true,George R.R. Martin,"A Song of Ice and Fire",2,fantasy
-        Exchange exchange1 = createExchangeWithBody(null);
-        Map<String, String> map = new HashMap<>();
-        map.put("id", "0553579934");
-        map.put("cat", "Test");
-        map.put("name", "Test");
-        map.put("price", "7.99");
-        map.put("author_t", "Test");
-        map.put("series_t", "Test");
-        map.put("sequence_i", "3");
-        map.put("genre_s", "Test");
-        exchange1.getMessage().setBody(map);
-        exchange1.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        template.send("direct:startAutoCommit", exchange1);
-
-        QueryResponse response = executeSolrQuery("id:0553579934");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void indexDocumentsToCSVUpdateHandlerWithParameters() throws Exception {
-        SolrEndpoint solrEndpoint = getMandatoryEndpoint(solrRouteAutocommitUri(), SolrEndpoint.class);
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        exchange.getIn().setHeader("SolrParam.fieldnames", "id,cat,name,price,inStock,author_t,series_t,sequence_i,genre_s");
-        exchange.getIn().setHeader("SolrParam.skip", "cat,sequence_i,genre_s");
-        exchange.getIn().setHeader("SolrParam.skipLines", 1);
-
-        template.send("direct:startAutoCommit", exchange);
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(10, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertFalse(doc.getFieldNames().contains("cat"));
-    }
-
-    @Test
-    public void indexPDFDocumentToExtractingRequestHandler() throws Exception {
-        SolrEndpoint solrEndpoint = getMandatoryEndpoint(solrRouteAutocommitUri(), SolrEndpoint.class);
-        solrEndpoint.setRequestHandler("/update/extract");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/tutorial.pdf"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrParam.literal.id", "tutorial.pdf");
-
-        template.send("direct:startAutoCommit", exchange);
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertEquals("Solr", doc.getFieldValue("subject"));
-        assertEquals("tutorial.pdf", doc.getFieldValue("id"));
-        assertEquals(Arrays.asList("application/pdf"), doc.getFieldValue("content_type"));
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java
deleted file mode 100644
index e0a34d98982..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/SolrUpdateTest.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * 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.solr;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.test.junit5.params.Test;
-import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
-import org.apache.solr.client.solrj.response.QueryResponse;
-import org.apache.solr.client.solrj.util.ClientUtils;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.params.UpdateParams;
-import org.junit.jupiter.api.BeforeEach;
-
-import static org.apache.camel.test.junit5.TestSupport.assertIsInstanceOf;
-import static org.junit.jupiter.api.Assertions.assertArrayEquals;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-public class SolrUpdateTest extends SolrComponentTestSupport {
-
-    private SolrEndpoint solrEndpoint;
-
-    @BeforeEach
-    public void init() {
-        solrEndpoint = getMandatoryEndpoint(solrRouteUri(), SolrEndpoint.class);
-    }
-
-    @Test
-    public void testInsertSolrInputDocumentAsXMLWithoutAddRoot() throws Exception {
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        String docAsXml = ClientUtils.toXML(doc);
-        template.sendBodyAndHeader("direct:start", docAsXml, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertSolrInputDocumentAsXMLWithAddRoot() throws Exception {
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        String docAsXml = "<add>" + ClientUtils.toXML(doc) + "</add>";
-        template.sendBodyAndHeader("direct:start", docAsXml, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertSolrInputDocument() throws Exception {
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        template.sendBodyAndHeader("direct:start", doc, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertSolrInputDocumentList() throws Exception {
-        List<SolrInputDocument> docList = new ArrayList<>(2);
-
-        SolrInputDocument doc = new SolrInputDocument();
-        doc.addField("id", "MA147LL/A");
-        docList.add(doc);
-
-        doc = new SolrInputDocument();
-        doc.addField("id", "KP147LL/A");
-        docList.add(doc);
-
-        template.sendBodyAndHeader("direct:start", docList, SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        response = executeSolrQuery("id:KP147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        response = executeSolrQuery("id:KP147LL/ABC");
-        assertEquals(0, response.getStatus());
-        assertEquals(0, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void testInsertStreaming() throws Exception {
-
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT_STREAMING);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        template.send("direct:start", exchange);
-
-        Thread.sleep(500);
-
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void indexSingleDocumentOnlyWithId() throws Exception {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        // Check things were indexed.
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void caughtSolrExceptionIsHandledElegantly() {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.name", "Missing required field throws exception.");
-
-        template.send("direct:start", exchange);
-
-        //noinspection ThrowableResultOfMethodCallIgnored
-        assertIsInstanceOf(BaseHttpSolrClient.RemoteSolrException.class, exchange.getException());
-    }
-
-    @Test
-    public void setHeadersAsSolrFields() throws Exception {
-        Exchange exchange = createExchangeWithBody("Body is ignored");
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black");
-        exchange.getIn().setHeader("SolrField.manu", "Apple Computer Inc.");
-
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertEquals("Apple 60 GB iPod with Video Playback Black", doc.getFieldValue("name"));
-        assertEquals("Apple Computer Inc.", doc.getFieldValue("manu"));
-    }
-
-    @Test
-    public void setMultiValuedFieldInHeader() throws Exception {
-        String[] categories = { "electronics", "apple" };
-        Exchange exchange = createExchangeWithBody("Test body for iPod.");
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.cat", categories);
-
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        // Check things were indexed.
-        QueryResponse response = executeSolrQuery("id:MA147LL/A");
-
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertArrayEquals(categories, ((List<?>) doc.getFieldValue("cat")).toArray());
-    }
-
-    @Test
-    public void indexDocumentsAndThenCommit() throws Exception {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black");
-        exchange.getIn().setHeader("SolrField.manu", "Apple Computer Inc.");
-        template.send("direct:start", exchange);
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(0, response.getResults().getNumFound());
-
-        solrCommit();
-
-        QueryResponse afterCommitResponse = executeSolrQuery("*:*");
-        assertEquals(0, afterCommitResponse.getStatus());
-        assertEquals(1, afterCommitResponse.getResults().getNumFound());
-    }
-
-    @Test
-    public void invalidSolrParametersAreIgnored() throws Exception {
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrField.id", "MA147LL/A");
-        exchange.getIn().setHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black");
-        exchange.getIn().setHeader("SolrParam.invalid-param", "this is ignored");
-
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void indexDocumentsToCSVUpdateHandlerWithoutParameters() throws Exception {
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(10, response.getResults().getNumFound());
-
-        response = executeSolrQuery("id:0553573403");
-        SolrDocument doc = response.getResults().get(0);
-        assertEquals("A Game of Thrones", doc.getFieldValue("name"));
-        assertEquals(7.99f, doc.getFieldValue("price"));
-    }
-
-    @Test
-    public void queryDocumentsToCSVUpdateHandlerWithoutParameters() {
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        Exchange exchange1 = createExchangeWithBody(null);
-        exchange1.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_QUERY);
-        exchange1.getIn().setHeader(SolrConstants.QUERY_STRING, "id:0553573403");
-        Exchange result = template.send("direct:start", exchange1);
-
-        SolrDocumentList list = result.getMessage().getBody(SolrDocumentList.class);
-        assertEquals("A Game of Thrones", list.get(0).getFieldValue("name"));
-        assertEquals(7.99f, list.get(0).getFieldValue("price"));
-    }
-
-    @Test
-    public void queryDocumentsToMap() throws Exception {
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        // Required to reset request handler:
-        // The Map-based insert request used to not respect the requesthandler that was explicitly set on the endpoint:
-        // The insert-request was always using '/update' even when '/update/csv' was set on the endpoint.
-        // This has now been changed: the explicitly set requesthandler is used.
-        solrEndpoint.setRequestHandler(null);
-        // 0553579908,book,A Clash of Kings,7.99,true,George R.R. Martin,"A Song of Ice and Fire",2,fantasy
-        Exchange exchange1 = createExchangeWithBody(null);
-        Map<String, String> map = new HashMap<>();
-        map.put("id", "0553579934");
-        map.put("cat", "Test");
-        map.put("name", "Test");
-        map.put("price", "7.99");
-        map.put("author_t", "Test");
-        map.put("series_t", "Test");
-        map.put("sequence_i", "3");
-        map.put("genre_s", "Test");
-        exchange1.getMessage().setBody(map);
-        exchange1.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        template.send("direct:start", exchange1);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("id:0553579934");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-    }
-
-    @Test
-    public void indexDocumentsToCSVUpdateHandlerWithParameters() throws Exception {
-        solrEndpoint.setRequestHandler("/update/csv");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/books.csv"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader(SolrConstants.PARAM + UpdateParams.ASSUME_CONTENT_TYPE, "text/csv");
-        exchange.getIn().setHeader("SolrParam.fieldnames", "id,cat,name,price,inStock,author_t,series_t,sequence_i,genre_s");
-        exchange.getIn().setHeader("SolrParam.skip", "cat,sequence_i,genre_s");
-        exchange.getIn().setHeader("SolrParam.skipLines", 1);
-
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(10, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertFalse(doc.getFieldNames().contains("cat"));
-    }
-
-    @Test
-    public void indexPDFDocumentToExtractingRequestHandler() throws Exception {
-        solrEndpoint.setRequestHandler("/update/extract");
-
-        Exchange exchange = createExchangeWithBody(new File("src/test/resources/data/tutorial.pdf"));
-        exchange.getIn().setHeader(SolrConstants.OPERATION, SolrConstants.OPERATION_INSERT);
-        exchange.getIn().setHeader("SolrParam.literal.id", "tutorial.pdf");
-
-        template.send("direct:start", exchange);
-        solrCommit();
-
-        QueryResponse response = executeSolrQuery("*:*");
-        assertEquals(0, response.getStatus());
-        assertEquals(1, response.getResults().getNumFound());
-
-        SolrDocument doc = response.getResults().get(0);
-        assertEquals("Solr", doc.getFieldValue("subject"));
-        assertEquals("tutorial.pdf", doc.getFieldValue("id"));
-        assertEquals(Arrays.asList("application/pdf"), doc.getFieldValue("content_type"));
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrCloudITSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrCloudITSupport.java
deleted file mode 100644
index e761d7af814..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrCloudITSupport.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.solr.integration;
-
-import java.io.IOException;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.component.solr.SolrComponent;
-import org.apache.camel.test.infra.solr.services.SolrLocalContainerCloudService;
-import org.apache.camel.test.infra.solr.services.SolrLocalContainerService;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.Http2SolrClient;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.junit.jupiter.api.extension.RegisterExtension;
-
-public class SolrCloudITSupport extends CamelTestSupport {
-
-    @RegisterExtension
-    static SolrLocalContainerService service = new SolrLocalContainerCloudService();
-
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        createCollection("collection1");
-        SolrComponent solr = context.getComponent("solr", SolrComponent.class);
-        return context;
-    }
-
-    protected String getSolrUri(String collection) {
-        return getSolrUrl(collection).replace("http:", "solr:");
-    }
-
-    protected String getSolrUrl(String collection) {
-        String collectionPath = collection == null ? "" : "/".concat(collection);
-        return service
-                .getSolrBaseUrl()
-                .concat(collectionPath);
-    }
-
-    public void createCollection(String collection) throws SolrServerException, IOException {
-        SolrClient solrClient = new Http2SolrClient.Builder(service.getSolrBaseUrl()).build();
-        CollectionAdminRequest.Create creator = CollectionAdminRequest.createCollection(collection, "_default", 1, 1);
-        creator.process(solrClient);
-    }
-
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrCloudProducerIT.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrCloudProducerIT.java
deleted file mode 100644
index 56fe5d56942..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrCloudProducerIT.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.solr.integration;
-
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.solr.SolrConstants;
-import org.junit.jupiter.api.Test;
-
-public class SolrCloudProducerIT extends SolrCloudITSupport {
-
-    String solrEndpointUri = getSolrUri("collection1");
-
-    @Test
-    public void sendTest() {
-        template.sendBodyAndHeader("direct:send", "pippo", SolrConstants.OPERATION, "COMMIT");
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() {
-        return new RouteBuilder() {
-            @Override
-            public void configure() {
-                from("direct:send").to(solrEndpointUri);
-            }
-        };
-    }
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrITSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrITSupport.java
deleted file mode 100644
index 856f4389a20..00000000000
--- a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrITSupport.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.solr.integration;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.component.solr.SolrComponent;
-import org.apache.camel.test.infra.solr.services.SolrService;
-import org.apache.camel.test.infra.solr.services.SolrServiceFactory;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.extension.RegisterExtension;
-
-public class SolrITSupport extends CamelTestSupport {
-
-    @RegisterExtension
-    static SolrService service = SolrServiceFactory.createService();
-
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        SolrComponent solr = context.getComponent("solr", SolrComponent.class);
-        return context;
-    }
-
-    protected String getSolrServiceAddress() {
-        return service.getSolrBaseUrl();
-    }
-
-}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrInsertAndDeleteTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrInsertAndDeleteTest.java
new file mode 100644
index 00000000000..c78a3e71d3b
--- /dev/null
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrInsertAndDeleteTest.java
@@ -0,0 +1,535 @@
+/*
+ * 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.solr.integration;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.ExchangeBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.solr.SolrConstants;
+import org.apache.camel.component.solr.SolrOperation;
+import org.apache.camel.component.solr.SolrUtils;
+import org.apache.solr.client.solrj.beans.Field;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.util.ClientUtils;
+import org.apache.solr.common.SolrDocument;
+import org.apache.solr.common.SolrDocumentList;
+import org.apache.solr.common.SolrInputDocument;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class SolrInsertAndDeleteTest extends SolrTestSupport {
+
+    @Test
+    public void testDeleteById() throws Exception {
+
+        //insert, commit and verify
+        solrInsertTestEntry();
+        solrCommit();
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+
+        //delete
+        template.sendBodyAndHeader("direct:start", TEST_ID, SolrConstants.PARAM_OPERATION,
+                SolrConstants.OPERATION_DELETE_BY_ID);
+        solrCommit();
+
+        //verify
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testDeleteListOfIDsViaSplit() throws Exception {
+
+        //insert, commit and verify
+        solrInsertTestEntry(TEST_ID);
+        solrInsertTestEntry(TEST_ID2);
+        solrCommit();
+        assertEquals(2, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
+
+        //delete
+        template.sendBodyAndHeader(DEFAULT_START_ENDPOINT_SPLIT_THEN_COMMIT, Arrays.asList(TEST_ID, TEST_ID2),
+                SolrConstants.PARAM_OPERATION,
+                SolrConstants.OPERATION_DELETE_BY_ID);
+
+        //verify
+        assertEquals(0, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testDeleteListOfIDsInOneDeleteOperation() throws Exception {
+
+        //insert, commit and verify
+        solrInsertTestEntry(TEST_ID);
+        solrInsertTestEntry(TEST_ID2);
+        solrCommit();
+        assertEquals(2, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
+
+        //delete
+        Map<String, Object> headers = new HashMap<>(SolrUtils.getHeadersForCommit());
+        headers.put(SolrConstants.PARAM_OPERATION, SolrConstants.OPERATION_DELETE_BY_ID);
+        template.sendBodyAndHeaders(DEFAULT_START_ENDPOINT, Arrays.asList(TEST_ID, TEST_ID2), headers);
+
+        //verify
+        assertEquals(0, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testDeleteByQuery() throws Exception {
+
+        //insert, commit and verify
+        solrInsertTestEntry(TEST_ID);
+        solrInsertTestEntry(TEST_ID2);
+        solrCommit();
+        assertEquals(2, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
+
+        //delete
+        Map<String, Object> headers = new HashMap<>(SolrUtils.getHeadersForCommit());
+        headers.put(SolrConstants.PARAM_OPERATION, SolrConstants.OPERATION_DELETE_BY_QUERY);
+        template.sendBodyAndHeaders("direct:start", "id:test*", headers);
+
+        //verify
+        assertEquals(0, executeSolrQuery("id:test*").getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testInsertSolrInputDocumentAsXMLWithoutAddRoot() {
+
+        SolrInputDocument doc = new SolrInputDocument();
+        doc.addField("id", "MA147LL/A");
+        String docAsXml = ClientUtils.toXML(doc);
+        executeInsertFor(docAsXml);
+
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void testInsertSolrInputDocumentAsXMLWithAddRoot() {
+
+        SolrInputDocument doc = new SolrInputDocument();
+        doc.addField("id", "MA147LL/A");
+        String docAsXml = "<add>" + ClientUtils.toXML(doc) + "</add>";
+        Map<String, Object> headers = Map.of(Exchange.CONTENT_TYPE, "text/xml");
+        executeInsertFor(docAsXml, headers);
+
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void testInsertSolrInputDocument() {
+
+        SolrInputDocument doc = new SolrInputDocument();
+        doc.addField("id", "MA147LL/A");
+        executeInsertFor(doc);
+
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void testInsertSolrInputDocumentList() {
+        List<SolrInputDocument> docList = new ArrayList<>(2);
+
+        SolrInputDocument doc = new SolrInputDocument();
+        doc.addField("id", "MA147LL/A");
+        docList.add(doc);
+
+        doc = new SolrInputDocument();
+        doc.addField("id", "KP147LL/A");
+        docList.add(doc);
+
+        executeInsertFor(docList);
+
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+
+        response = executeSolrQuery("id:KP147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+
+        response = executeSolrQuery("id:KP147LL/ABC");
+        assertEquals(0, response.getStatus());
+        assertEquals(0, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void testInsertStreaming() {
+        // TODO rename method
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withHeader("SolrField.id", "MA147LL/A");
+        executeInsert(builder.build());
+
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void indexSingleDocumentOnlyWithId() {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withHeader("SolrField.id", "MA147LL/A");
+        executeInsert(builder.build());
+
+        // Check things were indexed.
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void caughtSolrExceptionIsHandledElegantly() {
+        // empty request
+        Exchange exchange = executeInsertFor(null, Map.of(), false);
+        assertInstanceOf(org.apache.camel.InvalidPayloadException.class, exchange.getException());
+    }
+
+    @Test
+    public void setHeadersAsSolrFields() {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody("Body is ignored")
+                .withHeader("SolrField.id", "MA147LL/A")
+                .withHeader("SolrField.name_s", "Apple 60 GB iPod with Video Playback Black")
+                .withHeader("SolrField.manu_s", "Apple Computer Inc.");
+        executeInsert(builder.build());
+
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+
+        SolrDocument doc = response.getResults().get(0);
+        assertEquals("Apple 60 GB iPod with Video Playback Black", doc.getFieldValue("name_s"));
+        assertEquals("Apple Computer Inc.", doc.getFieldValue("manu_s"));
+    }
+
+    @Test
+    public void setMultiValuedFieldInHeader() {
+        String[] categories = { "electronics", "apple" };
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody("Test body for iPod.")
+                .withHeader("SolrField.id", "MA147LL/A")
+                .withHeader("SolrField.cat", categories);
+        executeInsert(builder.build());
+
+        // Check things were indexed.
+        QueryResponse response = executeSolrQuery("id:MA147LL/A");
+
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+
+        SolrDocument doc = response.getResults().get(0);
+        assertArrayEquals(categories, ((List<?>) doc.getFieldValue("cat")).toArray());
+    }
+
+    @Test
+    public void indexDocumentsAndThenCommit() {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withHeader("SolrField.id", "MA147LL/A")
+                .withHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black")
+                .withHeader("SolrField.manu", "Apple Computer Inc.");
+        executeInsert(builder.build(), false);
+
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(0, response.getResults().getNumFound());
+
+        executeInsertFor(null);
+
+        QueryResponse afterCommitResponse = executeSolrQuery("*:*");
+        assertEquals(0, afterCommitResponse.getStatus());
+        assertEquals(1, afterCommitResponse.getResults().getNumFound());
+    }
+
+    @Test
+    public void indexWithAutoCommit() {
+        // new exchange - not autocommit route
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withHeader("SolrField.content", "NO_AUTO_COMMIT");
+        executeInsert(DEFAULT_START_ENDPOINT, builder.build(), false);
+        // not committed
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(0, response.getResults().getNumFound());
+        // perform commit
+        executeInsertFor(null);
+        response = executeSolrQuery("*:*");
+        assertEquals(1, response.getResults().getNumFound());
+
+        // new exchange - autocommit route
+        builder = ExchangeBuilder.anExchange(camelContext())
+                .withHeader("SolrField.content", "AUTO_COMMIT");
+        executeInsert(DEFAULT_START_ENDPOINT_AUTO_COMMIT, builder.build(), false);
+        // should be committed
+        response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(2, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void invalidSolrParametersAreIgnored() {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withHeader("SolrField.id", "MA147LL/A")
+                .withHeader("SolrField.name", "Apple 60 GB iPod with Video Playback Black")
+                .withHeader("SolrParam.invalid-param", "this is ignored");
+        executeInsert(builder.build());
+
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void queryDocumentsToCSVUpdateHandlerWithFileConsumer() throws Exception {
+        context.getRouteController().startRoute("file-route");
+        MockEndpoint mock = getMockEndpoint(DEFAULT_MOCK_ENDPOINT);
+        mock.setExpectedMessageCount(1);
+        mock.assertIsSatisfied();
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(10, response.getResults().getNumFound());
+        response = executeSolrQuery("id:0553573403");
+        SolrDocumentList list = response.getResults();
+        assertEquals("A Game of Thrones", list.get(0).getFieldValue("name_s"));
+        assertEquals(7.99, list.get(0).getFieldValue("price_d"));
+        context.getRouteController().stopRoute("file-route");
+    }
+
+    @Test
+    public void queryDocumentsToMap() {
+        solrEndpoint.getConfiguration().setRequestHandler("/update/csv");
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody(new File("src/test/resources/data/books.csv"))
+                .withHeader(SolrConstants.PARAM_CONTENT_TYPE, "text/csv");
+        executeInsert(builder.build());
+        solrEndpoint.getConfiguration().setRequestHandler(null);
+        Map<String, String> map = new HashMap<>();
+        map.put("id", "0553579934");
+        map.put("cat", "Test");
+        map.put("name", "Test");
+        map.put("price", "7.99");
+        map.put("author_t", "Test");
+        map.put("series_t", "Test");
+        map.put("sequence_i", "3");
+        map.put("genre_s", "Test");
+        builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody(map);
+        executeInsert(builder.build());
+        QueryResponse response = executeSolrQuery("id:0553579934");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+    }
+
+    @Test
+    public void queryDocumentsToCSVUpdateHandlerWithoutParameters() {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody(new File("src/test/resources/data/books.csv"));
+        executeInsert(builder.build());
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(10, response.getResults().getNumFound());
+        response = executeSolrQuery("id:0553573403");
+        SolrDocumentList list = response.getResults();
+        assertEquals("A Game of Thrones", list.get(0).getFieldValue("name_s"));
+        assertEquals(7.99, list.get(0).getFieldValue("price_d"));
+    }
+
+    @Test
+    public void indexDocumentsToCSVUpdateHandlerWithParameters() {
+        solrEndpoint.getConfiguration().setRequestHandler("/update/csv");
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody(new File("src/test/resources/data/books.csv"))
+                .withHeader(SolrConstants.PARAM_CONTENT_TYPE, "text/csv")
+                .withHeader("SolrParam.fieldnames", "id,cat,name,price,inStock,author_t,series_t,sequence_i,genre_s")
+                .withHeader("SolrParam.skip", "cat,sequence_i,genre_s")
+                .withHeader("SolrParam.skipLines", 1);
+        executeInsert(builder.build());
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(10, response.getResults().getNumFound());
+        SolrDocument doc = response.getResults().get(0);
+        assertFalse(doc.getFieldNames().contains("cat"));
+    }
+
+    @Test
+    @Disabled("The extraction Solr Module is not available in slim version of solr test infra.")
+    public void indexPDFDocumentToExtractingRequestHandler() {
+        solrEndpoint.getConfiguration().setRequestHandler("/update/extract");
+
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext())
+                .withBody(new File("src/test/resources/data/tutorial.pdf"))
+                .withHeader("SolrParam.literal.id", "tutorial.pdf");
+        executeInsert(builder.build());
+
+        QueryResponse response = executeSolrQuery("*:*");
+        assertEquals(0, response.getStatus());
+        assertEquals(1, response.getResults().getNumFound());
+
+        SolrDocument doc = response.getResults().get(0);
+        assertEquals("Solr", doc.getFieldValue("subject"));
+        assertEquals("tutorial.pdf", doc.getFieldValue("id"));
+        assertEquals(List.of("application/pdf"), doc.getFieldValue("content_type"));
+    }
+
+    @Test
+    public void testCommit() {
+        //insert and verify
+        solrInsertTestEntry();
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+        //commit
+        template.sendBodyAndHeaders("direct:start", null, SolrUtils.getHeadersForCommit());
+        //verify exists after commit
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testSoftCommit() {
+        //insert and verify
+        solrInsertTestEntry();
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+        //commit
+        template.sendBodyAndHeaders("direct:start", null, SolrUtils.getHeadersForCommit("softCommit"));
+        //verify exists after commit
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testRollback() {
+        //insert and verify
+        solrInsertTestEntry();
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+        //rollback
+        template.sendBodyAndHeaders("direct:start", null, SolrUtils.getHeadersForCommit("rollback"));
+        //verify after rollback
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+        //commit
+        template.sendBodyAndHeaders("direct:start", null, SolrUtils.getHeadersForCommit());
+        //verify after commit (again)
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+
+    }
+
+    @Test
+    public void testOptimize() {
+        //insert and verify
+        solrInsertTestEntry();
+        assertEquals(0, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+        //optimize (be careful with this operation: it reorganizes your index!)
+        template.sendBodyAndHeaders("direct:start", null, SolrUtils.getHeadersForCommit("optimize"));
+        //verify exists after optimize
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testAddBean() {
+
+        //add bean
+        SolrInsertAndDeleteTest.Item item = new Item();
+        item.id = TEST_ID;
+        item.categories = new String[] { "aaa", "bbb", "ccc" };
+
+        template.sendBodyAndHeaders(
+                "direct:start",
+                item,
+                Map.of(
+                        SolrConstants.PARAM_OPERATION, SolrConstants.OPERATION_ADD_BEAN,
+                        SolrConstants.HEADER_PARAM_PREFIX + "commit", "true"));
+
+        //verify
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    @Test
+    public void testAddBeans() {
+
+        List<SolrInsertAndDeleteTest.Item> beans = new ArrayList<>();
+
+        //add bean1
+        SolrInsertAndDeleteTest.Item item1 = new Item();
+        item1.id = TEST_ID;
+        item1.categories = new String[] { "aaa", "bbb", "ccc" };
+        beans.add(item1);
+
+        //add bean2
+        SolrInsertAndDeleteTest.Item item2 = new Item();
+        item2.id = TEST_ID2;
+        item2.categories = new String[] { "aaa", "bbb", "ccc" };
+        beans.add(item2);
+
+        template.sendBodyAndHeaders(
+                "direct:start",
+                beans,
+                Map.of(
+                        SolrConstants.PARAM_OPERATION, SolrConstants.OPERATION_ADD_BEAN,
+                        SolrConstants.HEADER_PARAM_PREFIX + "commit", "true"));
+
+        //verify
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID).getResults().getNumFound(), "wrong number of entries found");
+        assertEquals(1, executeSolrQuery("id:" + TEST_ID2).getResults().getNumFound(), "wrong number of entries found");
+        assertEquals(2, executeSolrQuery("*:*").getResults().getNumFound(), "wrong number of entries found");
+    }
+
+    public static class Item {
+        @Field
+        String id;
+
+        @Field("cat")
+        String[] categories;
+    }
+
+    protected RouteBuilder createRouteBuilder() {
+
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() {
+                from(DEFAULT_START_ENDPOINT)
+                        .to(DEFAULT_SOLR_ENDPOINT);
+                from(DEFAULT_START_ENDPOINT_AUTO_COMMIT)
+                        .to(DEFAULT_SOLR_ENDPOINT + "?autoCommit=true");
+                from(DEFAULT_START_ENDPOINT_SPLIT_THEN_COMMIT)
+                        .filter(header(SolrConstants.PARAM_OPERATION).isNull())
+                        .setHeader(SolrConstants.PARAM_OPERATION, constant(SolrOperation.INSERT))
+                        .end()
+                        .split(body())
+                        .to(DEFAULT_SOLR_ENDPOINT)
+                        .end()
+                        .setBody(constant((Object) null))
+                        .setHeader(SolrConstants.HEADER_PARAM_PREFIX + "commit", constant(true))
+                        .to(DEFAULT_SOLR_ENDPOINT);
+                from(TEST_DATA_PATH_URI + "?noop=true&initialDelay=0&filename=books.csv").autoStartup(false)
+                        .routeId("file-route")
+                        .to(DEFAULT_SOLR_ENDPOINT + "?autoCommit=true")
+                        .to(DEFAULT_MOCK_ENDPOINT);
+            }
+        };
+    }
+
+}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java
new file mode 100644
index 00000000000..c46c2c42a4c
--- /dev/null
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrPingAndSearchTest.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.solr.integration;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.solr.SolrConstants;
+import org.apache.camel.component.solr.SolrUtils;
+import org.apache.solr.client.solrj.SolrResponse;
+import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
+import org.apache.solr.client.solrj.request.CollectionAdminRequest;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.response.SolrPingResponse;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class SolrPingAndSearchTest extends SolrTestSupport {
+
+    @Test
+    public void pingToToNonexistentInstance() {
+
+        Exchange exchange = pingInstance("direct:start-missing");
+        assertTrue(exchange.isFailed());
+
+    }
+
+    @Test
+    public void pingToTestInfraInstance() throws InvalidPayloadException {
+
+        // no collection specified - default collection from component
+        assertFalse(pingInstance("direct:start", (String) null).isFailed());
+        assertFalse(pingInstance("direct:start-sync", (String) null).isFailed());
+
+        // collection as endpoint parameter
+        // convert to SolrPingResponse
+        SolrPingResponse solrPingResponse = pingInstance("direct:start-collection")
+                .getMessage().getMandatoryBody(SolrPingResponse.class);
+        assertEquals(0, solrPingResponse.getStatus());
+        // convert to SolrResponse
+        SolrResponse solrResponse = pingInstance("direct:start-collection")
+                .getMessage().getMandatoryBody(SolrResponse.class);
+        assertEquals("OK", solrResponse.getResponse().get("status"));
+        // convert to Map
+        Map<String, Object> responseMap = SolrUtils.parseAsFlatMap(solrPingResponse);
+        assertEquals(0, responseMap.get("responseHeader.status"));
+        assertEquals("OK", responseMap.get("status"));
+
+        // collection as exchange header
+        Map<?, ?> map = pingInstance("direct:start", SolrConstants.DEFAULT_COLLECTION)
+                .getMessage().getMandatoryBody(Map.class);
+        LOG.info("Solr response = {}", map);
+        assertEquals("OK", map.get("status"));
+
+        // invalid collection
+        assertTrue(pingInstance("direct:start", "invalid-collection").isFailed());
+        assertTrue(pingInstance("direct:start-sync", "invalid-collection").isFailed());
+
+    }
+
+    @Test
+    public void clusterStatusToTestInfraInstance() throws InvalidPayloadException {
+
+        Exchange responseExchange = processRequest("direct:start", new CollectionAdminRequest.ClusterStatus(), Map.of());
+        Map<?, ?> map = responseExchange.getMessage().getMandatoryBody(Map.class);
+        LOG.info("Solr response = {}", map);
+        // clusterstatus should fail as we're not running in solrCloud mode
+        assertTrue(responseExchange.isFailed());
+        assertInstanceOf(CamelExchangeException.class, responseExchange.getException());
+        assertInstanceOf(BaseHttpSolrClient.RemoteSolrException.class, responseExchange.getException().getCause().getCause());
+        assertEquals(400,
+                ((BaseHttpSolrClient.RemoteSolrException) responseExchange.getException().getCause().getCause()).code());
+        assertTrue(responseExchange.getException().getCause().getCause().getMessage()
+                .endsWith("Solr instance is not running in SolrCloud mode."));
+
+    }
+
+    @Test
+    void testQueryWithFromAndSizeParameters() {
+
+        List<Map<String, String>> content = IntStream.range(0, 4).mapToObj(i -> Map.of("content", "content" + i)).toList();
+        template.requestBodyAndHeaders("direct:index", content, SolrUtils.getHeadersForCommit());
+
+        QueryResponse responseWithSizeTwo = executeSolrQuery("direct:searchWithSizeTwo", "*:*");
+        QueryResponse responseFrom3 = executeSolrQuery("direct:searchFrom3", "*:*");
+        assertEquals(2, responseWithSizeTwo.getResults().size());
+        assertEquals(1, responseFrom3.getResults().size());
+    }
+
+    protected RouteBuilder createRouteBuilder() {
+
+        return new RouteBuilder() {
+
+            @Override
+            public void configure() {
+
+                from(DEFAULT_START_ENDPOINT)
+                        .to(DEFAULT_SOLR_ENDPOINT);
+                // ping tests
+                from("direct:start-missing")
+                        .to("solr:default/missing");
+                from("direct:start-sync")
+                        .to("solr:default?async=false");
+                from("direct:start-collection")
+                        .to("solr:default?collection=" + SolrConstants.DEFAULT_COLLECTION);
+                // query tests
+                from("direct:index")
+                        .to("solr:default?operation=insert");
+                from("direct:searchWithSizeTwo")
+                        .to("solr:default?operation=search&size=2");
+                from("direct:searchFrom3")
+                        .to("solr:default?operation=search&from=3");
+            }
+        };
+    }
+
+}
diff --git a/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java
new file mode 100644
index 00000000000..e25a83aa0ca
--- /dev/null
+++ b/components/camel-solr/src/test/java/org/apache/camel/component/solr/integration/SolrTestSupport.java
@@ -0,0 +1,238 @@
+/*
+ * 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.solr.integration;
+
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ConsumerTemplate;
+import org.apache.camel.Exchange;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.ExchangeBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.solr.SolrComponent;
+import org.apache.camel.component.solr.SolrConstants;
+import org.apache.camel.component.solr.SolrEndpoint;
+import org.apache.camel.component.solr.SolrOperation;
+import org.apache.camel.component.solr.SolrUtils;
+import org.apache.camel.test.infra.core.CamelContextExtension;
+import org.apache.camel.test.infra.core.DefaultCamelContextExtension;
+import org.apache.camel.test.infra.core.annotations.ContextFixture;
+import org.apache.camel.test.infra.core.annotations.RouteFixture;
+import org.apache.camel.test.infra.core.api.CamelTestSupportHelper;
+import org.apache.camel.test.infra.core.api.ConfigurableContext;
+import org.apache.camel.test.infra.core.api.ConfigurableRoute;
+import org.apache.camel.test.infra.solr.services.SolrService;
+import org.apache.camel.test.infra.solr.services.SolrServiceFactory;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public abstract class SolrTestSupport implements CamelTestSupportHelper, ConfigurableRoute, ConfigurableContext {
+
+    @Order(1)
+    @RegisterExtension
+    public static final SolrService service = SolrServiceFactory.createService();
+
+    @Order(2)
+    @RegisterExtension
+    public static final CamelContextExtension contextExtension = new DefaultCamelContextExtension();
+
+    static final Logger LOG = LoggerFactory.getLogger(SolrTestSupport.class);
+    static final String DEFAULT_START_ENDPOINT = "direct:start";
+    static final String DEFAULT_START_ENDPOINT_AUTO_COMMIT = DEFAULT_START_ENDPOINT + "AutoCommit";
+    static final String DEFAULT_START_ENDPOINT_SPLIT_THEN_COMMIT = DEFAULT_START_ENDPOINT + "SplitThenCommit";
+    static final String DEFAULT_SOLR_ENDPOINT = "solr:default";
+    static final String DEFAULT_MOCK_ENDPOINT = "mock:result";
+    static final String TEST_DATA_PATH_URI = Objects.requireNonNull(Path
+            .of(Objects.requireNonNull(SolrTestSupport.class.getClassLoader().getResource("data/books.csv")).getFile())
+            .getParent().toUri().toString());
+    static final String TEST_ID = "test1";
+    static final String TEST_ID2 = "test2";
+
+    SolrEndpoint solrEndpoint;
+    CamelContext context;
+    ProducerTemplate template;
+    ConsumerTemplate consumer;
+
+    String prefix;
+
+    @BeforeEach
+    public void beforeEach(TestInfo testInfo) {
+        // make use of the test method name to avoid collision
+        prefix = testInfo.getDisplayName().toLowerCase() + "-";
+        context = contextExtension.getContext();
+        template = contextExtension.getProducerTemplate();
+        consumer = contextExtension.getConsumerTemplate();
+        // clean solr endpoints
+        executeDeleteAll();
+        solrEndpoint = context.getEndpoint(DEFAULT_SOLR_ENDPOINT, SolrEndpoint.class);
+        solrEndpoint.getConfiguration().setRequestHandler(null);
+        template.setDefaultEndpoint(solrEndpoint);
+    }
+
+    @Override
+    public CamelContextExtension getCamelContextExtension() {
+        return contextExtension;
+    }
+
+    protected CamelContext camelContext() {
+        return getCamelContextExtension().getContext();
+    }
+
+    protected ProducerTemplate template() {
+        return getCamelContextExtension().getProducerTemplate();
+    }
+
+    @ContextFixture
+    @Override
+    public void configureContext(CamelContext context) {
+        final SolrComponent solrComponent = new SolrComponent();
+        solrComponent.setHost(service.getSolrHost());
+        solrComponent.setPort(service.getPort());
+        solrComponent.setDefaultCollection(SolrConstants.DEFAULT_COLLECTION);
+        context.addComponent("solr", solrComponent);
+    }
+
+    @RouteFixture
+    @Override
+    public void createRouteBuilder(CamelContext context) throws Exception {
+        final RouteBuilder routeBuilder = createRouteBuilder();
+        if (routeBuilder != null) {
+            context.addRoutes(routeBuilder);
+        }
+    }
+
+    protected abstract RouteBuilder createRouteBuilder();
+
+    public Exchange processRequest(String uri, Object body, Map<String, Object> headers) {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext()).withBody(body);
+        for (Map.Entry<String, Object> entry : headers.entrySet()) {
+            builder.withHeader(entry.getKey(), entry.getValue());
+        }
+        return processRequest(uri, builder.build());
+    }
+
+    public Exchange processRequest(String uri, Exchange exchange) {
+        return template.send(uri, exchange);
+    }
+
+    protected void solrInsertTestEntry() {
+        solrInsertTestEntry(TEST_ID);
+    }
+
+    protected void solrInsertTestEntry(String id) {
+        Map<String, Object> headers = new HashMap<>();
+        headers.put(SolrConstants.PARAM_OPERATION, SolrConstants.OPERATION_INSERT);
+        headers.put("SolrField.id", id);
+        template.sendBodyAndHeaders(DEFAULT_START_ENDPOINT, "", headers);
+    }
+
+    protected void solrCommit() {
+        template.sendBodyAndHeaders(
+                DEFAULT_START_ENDPOINT,
+                null,
+                Map.of(
+                        SolrConstants.PARAM_OPERATION, SolrOperation.INSERT.name(),
+                        SolrConstants.HEADER_PARAM_PREFIX + "commit", "true"));
+    }
+
+    public Exchange executeInsertFor(Object body) {
+        return executeInsertFor(body, new HashMap<>(), true);
+    }
+
+    public Exchange executeInsertFor(Object body, boolean withCommit) {
+        return executeInsertFor(body, new HashMap<>(), withCommit);
+    }
+
+    public Exchange executeInsertFor(Object body, Map<String, Object> headers) {
+        return executeInsertFor(body, headers, true);
+    }
+
+    public Exchange executeInsertFor(Object body, Map<String, Object> headers, boolean withCommit) {
+        ExchangeBuilder builder = ExchangeBuilder.anExchange(camelContext());
+        builder.withBody(body);
+        headers.forEach(builder::withHeader);
+        return executeInsert(builder.build(), withCommit);
+    }
+
+    public Exchange executeInsert(Exchange exchange) {
+        return executeInsert(exchange, true);
+    }
+
+    public Exchange executeInsert(Exchange exchange, boolean withCommit) {
+        return executeInsert(DEFAULT_SOLR_ENDPOINT, exchange, withCommit);
+    }
+
+    public Exchange executeInsert(String uri, Exchange exchange, boolean withCommit) {
+        exchange.getMessage().getHeaders().put(SolrConstants.PARAM_OPERATION, SolrOperation.INSERT);
+        if (withCommit) {
+            SolrUtils.addHeadersForCommit(exchange);
+        }
+        return processRequest(uri, exchange);
+    }
+
+    public void executeDeleteAll() {
+        Exchange exchange = ExchangeBuilder.anExchange(camelContext())
+                .withBody("*:*")
+                .withHeader(SolrConstants.PARAM_OPERATION, SolrOperation.DELETE)
+                .withHeader(SolrConstants.PARAM_DELETE_BY_QUERY, true)
+                .build();
+        SolrUtils.addHeadersForCommit(exchange);
+        processRequest(DEFAULT_SOLR_ENDPOINT, exchange);
+    }
+
+    public QueryResponse executeSolrQuery(String queryString) {
+        return executeSolrQuery(DEFAULT_SOLR_ENDPOINT, queryString);
+    }
+
+    public QueryResponse executeSolrQuery(String uri, String queryString) {
+        Exchange exchange = ExchangeBuilder.anExchange(camelContext())
+                .withHeader(SolrConstants.PARAM_OPERATION, SolrOperation.SEARCH)
+                .withHeader(SolrConstants.PARAM_QUERY_STRING, queryString)
+                .withHeader(SolrConstants.PARAM_REQUEST_HANDLER, null)
+                .build();
+        Exchange exchange1 = processRequest(uri, exchange);
+        return exchange1.getMessage().getBody(QueryResponse.class);
+    }
+
+    public Exchange pingInstance(String uri) {
+        return pingInstance(uri, SolrConstants.DEFAULT_COLLECTION);
+    }
+
+    public Exchange pingInstance(String uri, String collection) {
+        return pingInstance(uri, collection == null ? Map.of() : Map.of(SolrConstants.PARAM_COLLECTION, collection));
+    }
+
+    public Exchange pingInstance(String uri, Map<String, Object> headers) {
+        if (!headers.containsKey(SolrConstants.PARAM_OPERATION)) {
+            headers = new HashMap<>(headers);
+            headers.put(SolrConstants.PARAM_OPERATION, SolrOperation.PING);
+        }
+        return processRequest(uri, null, headers);
+    }
+
+}
diff --git a/components/camel-solr/src/test/resources/data/books.csv b/components/camel-solr/src/test/resources/data/books.csv
index cfbc14755c6..9c9bbbe972d 100644
--- a/components/camel-solr/src/test/resources/data/books.csv
+++ b/components/camel-solr/src/test/resources/data/books.csv
@@ -1,4 +1,4 @@
-id,cat,name,price,inStock,author_t,series_t,sequence_i,genre_s
+id,cat_s,name_s,price_d,inStock,author_t,series_t,sequence_i,genre_s
 0553573403,book,A Game of Thrones,7.99,true,George R.R. Martin,"A Song of Ice and Fire",1,fantasy
 0553579908,book,A Clash of Kings,7.99,true,George R.R. Martin,"A Song of Ice and Fire",2,fantasy
 055357342X,book,A Storm of Swords,7.99,true,George R.R. Martin,"A Song of Ice and Fire",3,fantasy
diff --git a/components/camel-solr/src/test/resources/log4j2.properties b/components/camel-solr/src/test/resources/log4j2.properties
index f16ce7c64b3..0e64154a89b 100644
--- a/components/camel-solr/src/test/resources/log4j2.properties
+++ b/components/camel-solr/src/test/resources/log4j2.properties
@@ -14,17 +14,23 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
+appender.stdout.type = Console
+appender.stdout.name = stdout
+appender.stdout.layout.type = PatternLayout
+appender.stdout.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
 
 appender.file.type = File
 appender.file.name = file
 appender.file.fileName = target/camel-solr-test.log
+appender.file.append = true
 appender.file.layout.type = PatternLayout
 appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
-appender.stdout.type = Console
-appender.stdout.name = stdout
-appender.stdout.layout.type = PatternLayout
-appender.stdout.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
-logger.springframework.name = org.springframework
-logger.springframework.level = WARN
+
 rootLogger.level = INFO
 rootLogger.appenderRef.file.ref = file
+rootLogger.appenderRef.stdout.ref = stdout
+
+logger.solr-test-infra-container.name = container.solr
+logger.solr-test-infra-container.level = INFO
+logger.solr-camel-test.name = org.apache.camel.test.junit5
+logger.solr-camel-test.level = INFO
diff --git a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
index df0aaa04167..faf25dd6e75 100644
--- a/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
+++ b/core/camel-main/src/generated/resources/org/apache/camel/main/components.properties
@@ -297,8 +297,6 @@ smtp
 smtps
 snmp
 solr
-solrCloud
-solrs
 splunk
 splunk-hec
 spring-batch
diff --git a/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc b/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc
index 451256672bc..f57a4960e22 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc
@@ -43,7 +43,6 @@ The following components have been removed:
 | camel-rest-swagger                   | camel-openapi-rest
 | camel-restdsl-swagger-plugin         | camel-restdsl-openapi-plugin
 | camel-resteasy                       | camel-cxf, camel-rest
-| camel-solr                           | none
 | camel-spark                          | none
 | camel-spring-integration             | none
 | camel-swagger-java                   | camel-openapi-java
diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_10.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_10.adoc
index 6a70780ce33..66c5747156b 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_10.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_10.adoc
@@ -206,6 +206,10 @@ The `camel-smb` component has been updated to extend `GenericFile` classes and n
 The Consumer includes options for filtering, pre and post processing, duplicate handling, directory traversal, polling, and readlocks.
 The Producer includes options for writing to temporary files, writing content, and handling existing files.
 
+=== camel-solr
+
+The `camel-solr` component has been refactored. The `solrs` and `solrCloud` schemes have been deprecated in the uri format (but can still be enabled via the enableSSL and solrClient configuration options). The solr operations have been simplified and some solr operations will be no longer be available in the next release. For those operations, a warning message will tell you how to get the same results with the new operations. The Solr component exchange headers have been renamed and ext [...]
+
 == camel-spring-boot
 
 The `camel-k-starter` has been removed.
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 16dbc3c41e8..e3fbb3a40be 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -4020,32 +4020,6 @@ public interface ComponentsBuilderFactory {
     static SolrComponentBuilderFactory.SolrComponentBuilder solr() {
         return SolrComponentBuilderFactory.solr();
     }
-    /**
-     * Solr (camel-solr)
-     * Perform operations against Apache Lucene Solr.
-     * 
-     * Category: monitoring,search
-     * Since: 4.8
-     * Maven coordinates: org.apache.camel:camel-solr
-     * 
-     * @return the dsl builder
-     */
-    static SolrcloudComponentBuilderFactory.SolrcloudComponentBuilder solrcloud() {
-        return SolrcloudComponentBuilderFactory.solrcloud();
-    }
-    /**
-     * Solr (Secure) (camel-solr)
-     * Perform operations against Apache Lucene Solr.
-     * 
-     * Category: monitoring,search
-     * Since: 4.8
-     * Maven coordinates: org.apache.camel:camel-solr
-     * 
-     * @return the dsl builder
-     */
-    static SolrsComponentBuilderFactory.SolrsComponentBuilder solrs() {
-        return SolrsComponentBuilderFactory.solrs();
-    }
     /**
      * Splunk (camel-splunk)
      * Publish or search for events in Splunk.
@@ -4785,4 +4759,4 @@ public interface ComponentsBuilderFactory {
     static ZookeeperMasterComponentBuilderFactory.ZookeeperMasterComponentBuilder zookeeperMaster() {
         return ZookeeperMasterComponentBuilderFactory.zookeeperMaster();
     }
-}
\ No newline at end of file
+}
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrcloudComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrcloudComponentBuilderFactory.java
deleted file mode 100644
index 246d1c2e7c5..00000000000
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrcloudComponentBuilderFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.builder.component.dsl;
-
-import javax.annotation.processing.Generated;
-import org.apache.camel.Component;
-import org.apache.camel.builder.component.AbstractComponentBuilder;
-import org.apache.camel.builder.component.ComponentBuilder;
-import org.apache.camel.component.solr.SolrComponent;
-
-/**
- * Perform operations against Apache Lucene Solr.
- * 
- * Generated by camel build tools - do NOT edit this file!
- */
-@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
-public interface SolrcloudComponentBuilderFactory {
-
-    /**
-     * Solr (camel-solr)
-     * Perform operations against Apache Lucene Solr.
-     * 
-     * Category: monitoring,search
-     * Since: 4.8
-     * Maven coordinates: org.apache.camel:camel-solr
-     * 
-     * @return the dsl builder
-     */
-    static SolrcloudComponentBuilder solrcloud() {
-        return new SolrcloudComponentBuilderImpl();
-    }
-
-    /**
-     * Builder for the Solr component.
-     */
-    interface SolrcloudComponentBuilder extends ComponentBuilder<SolrComponent> {
-    
-        
-        /**
-         * Whether the producer should be started lazy (on the first message).
-         * By starting lazy you can use this to allow CamelContext and routes to
-         * startup in situations where a producer may otherwise fail during
-         * starting and cause the route to fail being started. By deferring this
-         * startup to be lazy then the startup failure can be handled during
-         * routing messages via Camel's routing error handlers. Beware that when
-         * the first message is processed then creating and starting the
-         * producer may take a little time and prolong the total processing time
-         * of the processing.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: false
-         * Group: producer
-         * 
-         * @param lazyStartProducer the value to set
-         * @return the dsl builder
-         */
-        default SolrcloudComponentBuilder lazyStartProducer(boolean lazyStartProducer) {
-            doSetProperty("lazyStartProducer", lazyStartProducer);
-            return this;
-        }
-    
-        
-        /**
-         * 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 then gets configured on the component. This can be used for
-         * automatic configuring JDBC data sources, JMS connection factories,
-         * AWS Clients, etc.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: true
-         * Group: advanced
-         * 
-         * @param autowiredEnabled the value to set
-         * @return the dsl builder
-         */
-        default SolrcloudComponentBuilder autowiredEnabled(boolean autowiredEnabled) {
-            doSetProperty("autowiredEnabled", autowiredEnabled);
-            return this;
-        }
-    }
-
-    class SolrcloudComponentBuilderImpl
-            extends AbstractComponentBuilder<SolrComponent>
-            implements SolrcloudComponentBuilder {
-        @Override
-        protected SolrComponent buildConcreteComponent() {
-            return new SolrComponent();
-        }
-        @Override
-        protected boolean setPropertyOnComponent(
-                Component component,
-                String name,
-                Object value) {
-            switch (name) {
-            case "lazyStartProducer": ((SolrComponent) component).setLazyStartProducer((boolean) value); return true;
-            case "autowiredEnabled": ((SolrComponent) component).setAutowiredEnabled((boolean) value); return true;
-            default: return false;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrsComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrsComponentBuilderFactory.java
deleted file mode 100644
index 3f9f105e14c..00000000000
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SolrsComponentBuilderFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Generated by camel build tools - do NOT edit this file! */
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.builder.component.dsl;
-
-import javax.annotation.processing.Generated;
-import org.apache.camel.Component;
-import org.apache.camel.builder.component.AbstractComponentBuilder;
-import org.apache.camel.builder.component.ComponentBuilder;
-import org.apache.camel.component.solr.SolrComponent;
-
-/**
- * Perform operations against Apache Lucene Solr.
- * 
- * Generated by camel build tools - do NOT edit this file!
- */
-@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
-public interface SolrsComponentBuilderFactory {
-
-    /**
-     * Solr (Secure) (camel-solr)
-     * Perform operations against Apache Lucene Solr.
-     * 
-     * Category: monitoring,search
-     * Since: 4.8
-     * Maven coordinates: org.apache.camel:camel-solr
-     * 
-     * @return the dsl builder
-     */
-    static SolrsComponentBuilder solrs() {
-        return new SolrsComponentBuilderImpl();
-    }
-
-    /**
-     * Builder for the Solr (Secure) component.
-     */
-    interface SolrsComponentBuilder extends ComponentBuilder<SolrComponent> {
-    
-        
-        /**
-         * Whether the producer should be started lazy (on the first message).
-         * By starting lazy you can use this to allow CamelContext and routes to
-         * startup in situations where a producer may otherwise fail during
-         * starting and cause the route to fail being started. By deferring this
-         * startup to be lazy then the startup failure can be handled during
-         * routing messages via Camel's routing error handlers. Beware that when
-         * the first message is processed then creating and starting the
-         * producer may take a little time and prolong the total processing time
-         * of the processing.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: false
-         * Group: producer
-         * 
-         * @param lazyStartProducer the value to set
-         * @return the dsl builder
-         */
-        default SolrsComponentBuilder lazyStartProducer(boolean lazyStartProducer) {
-            doSetProperty("lazyStartProducer", lazyStartProducer);
-            return this;
-        }
-    
-        
-        /**
-         * 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 then gets configured on the component. This can be used for
-         * automatic configuring JDBC data sources, JMS connection factories,
-         * AWS Clients, etc.
-         * 
-         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
-         * 
-         * Default: true
-         * Group: advanced
-         * 
-         * @param autowiredEnabled the value to set
-         * @return the dsl builder
-         */
-        default SolrsComponentBuilder autowiredEnabled(boolean autowiredEnabled) {
-            doSetProperty("autowiredEnabled", autowiredEnabled);
-            return this;
-        }
-    }
-
-    class SolrsComponentBuilderImpl
-            extends AbstractComponentBuilder<SolrComponent>
-            implements SolrsComponentBuilder {
-        @Override
-        protected SolrComponent buildConcreteComponent() {
-            return new SolrComponent();
-        }
-        @Override
-        protected boolean setPropertyOnComponent(
-                Component component,
-                String name,
-                Object value) {
-            switch (name) {
-            case "lazyStartProducer": ((SolrComponent) component).setLazyStartProducer((boolean) value); return true;
-            case "autowiredEnabled": ((SolrComponent) component).setAutowiredEnabled((boolean) value); return true;
-            default: return false;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 76eb2712904..0e35e12795d 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -13469,18 +13469,20 @@ public class StaticEndpointBuilders {
      * Solr (camel-solr)
      * Perform operations against Apache Lucene Solr.
      * 
-     * Category: monitoring,search
+     * Category: search,monitoring
      * Since: 4.8
      * Maven coordinates: org.apache.camel:camel-solr
      * 
-     * Syntax: <code>solr:url</code>
+     * Syntax: <code>solr:host:port</code>
      * 
-     * Path parameter: url (required)
-     * Hostname and port for the Solr server(s). Multiple hosts can be
-     * specified, separated with a comma. See the solrClient parameter for more
-     * information on the SolrClient used to connect to Solr.
+     * Path parameter: host (required)
+     * The solr instance host name (set to 'default' to use the host name
+     * defined on component level)
      * 
-     * @param path url
+     * Path parameter: port
+     * The solr instance port number
+     * 
+     * @param path host:port
      * @return the dsl builder
      */
     public static SolrEndpointBuilderFactory.SolrEndpointBuilder solr(String path) {
@@ -13490,67 +13492,27 @@ public class StaticEndpointBuilders {
      * Solr (camel-solr)
      * Perform operations against Apache Lucene Solr.
      * 
-     * Category: monitoring,search
+     * Category: search,monitoring
      * Since: 4.8
      * Maven coordinates: org.apache.camel:camel-solr
      * 
-     * Syntax: <code>solr:url</code>
+     * Syntax: <code>solr:host:port</code>
      * 
-     * Path parameter: url (required)
-     * Hostname and port for the Solr server(s). Multiple hosts can be
-     * specified, separated with a comma. See the solrClient parameter for more
-     * information on the SolrClient used to connect to Solr.
+     * Path parameter: host (required)
+     * The solr instance host name (set to 'default' to use the host name
+     * defined on component level)
+     * 
+     * Path parameter: port
+     * The solr instance port number
      * 
      * @param componentName to use a custom component name for the endpoint
      * instead of the default name
-     * @param path url
+     * @param path host:port
      * @return the dsl builder
      */
     public static SolrEndpointBuilderFactory.SolrEndpointBuilder solr(String componentName, String path) {
         return SolrEndpointBuilderFactory.endpointBuilder(componentName, path);
     }
-    /**
-     * Solr (camel-solr)
-     * Perform operations against Apache Lucene Solr.
-     * 
-     * Category: monitoring,search
-     * Since: 4.8
-     * Maven coordinates: org.apache.camel:camel-solr
-     * 
-     * Syntax: <code>solrCloud:url</code>
-     * 
-     * Path parameter: url (required)
-     * Hostname and port for the Solr server(s). Multiple hosts can be
-     * specified, separated with a comma. See the solrClient parameter for more
-     * information on the SolrClient used to connect to Solr.
-     * 
-     * @param path url
-     * @return the dsl builder
-     */
-    public static SolrEndpointBuilderFactory.SolrEndpointBuilder solrCloud(String path) {
-        return solr("solrCloud", path);
-    }
-    /**
-     * Solr (Secure) (camel-solr)
-     * Perform operations against Apache Lucene Solr.
-     * 
-     * Category: monitoring,search
-     * Since: 4.8
-     * Maven coordinates: org.apache.camel:camel-solr
-     * 
-     * Syntax: <code>solrs:url</code>
-     * 
-     * Path parameter: url (required)
-     * Hostname and port for the Solr server(s). Multiple hosts can be
-     * specified, separated with a comma. See the solrClient parameter for more
-     * information on the SolrClient used to connect to Solr.
-     * 
-     * @param path url
-     * @return the dsl builder
-     */
-    public static SolrEndpointBuilderFactory.SolrEndpointBuilder solrs(String path) {
-        return solr("solrs", path);
-    }
     /**
      * Splunk (camel-splunk)
      * Publish or search for events in Splunk.
diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java
index 3981c6adf09..342a1ea233b 100644
--- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java
+++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SolrEndpointBuilderFactory.java
@@ -45,8 +45,38 @@ public interface SolrEndpointBuilderFactory {
         }
 
         /**
-         * If true, each producer operation will be automatically followed by a
-         * commit.
+         * Use async request processing (when supported by the solr client).
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: producer
+         * 
+         * @param async the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder async(boolean async) {
+            doSetProperty("async", async);
+            return this;
+        }
+        /**
+         * Use async request processing (when supported by the solr client).
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: producer
+         * 
+         * @param async the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder async(String async) {
+            doSetProperty("async", async);
+            return this;
+        }
+        /**
+         * If true, each producer insert/delete operation will be automatically
+         * performing a commit.
          * 
          * The option is a: <code>boolean</code> type.
          * 
@@ -61,8 +91,8 @@ public interface SolrEndpointBuilderFactory {
             return this;
         }
         /**
-         * If true, each producer operation will be automatically followed by a
-         * commit.
+         * If true, each producer insert/delete operation will be automatically
+         * performing a commit.
          * 
          * The option will be converted to a <code>boolean</code> type.
          * 
@@ -77,24 +107,37 @@ public interface SolrEndpointBuilderFactory {
             return this;
         }
         /**
-         * Sets the connection timeout on the SolrClient.
+         * The name of the collection to act against.
          * 
-         * The option is a: <code>java.lang.Integer</code> type.
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param collection the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder collection(String collection) {
+            doSetProperty("collection", collection);
+            return this;
+        }
+        /**
+         * The time in ms to wait before connection will time out.
+         * 
+         * The option is a: <code>java.lang.Long</code> type.
          * 
          * Group: producer
          * 
          * @param connectionTimeout the value to set
          * @return the dsl builder
          */
-        default SolrEndpointBuilder connectionTimeout(Integer connectionTimeout) {
+        default SolrEndpointBuilder connectionTimeout(Long connectionTimeout) {
             doSetProperty("connectionTimeout", connectionTimeout);
             return this;
         }
         /**
-         * Sets the connection timeout on the SolrClient.
+         * The time in ms to wait before connection will time out.
          * 
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
+         * The option will be converted to a <code>java.lang.Long</code> type.
          * 
          * Group: producer
          * 
@@ -136,18 +179,80 @@ public interface SolrEndpointBuilderFactory {
             doSetProperty("defaultMaxConnectionsPerHost", defaultMaxConnectionsPerHost);
             return this;
         }
+        /**
+         * For the delete instruction, interprete body as query/queries instead
+         * of id/ids.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: producer
+         * 
+         * @param deleteByQuery the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder deleteByQuery(boolean deleteByQuery) {
+            doSetProperty("deleteByQuery", deleteByQuery);
+            return this;
+        }
+        /**
+         * For the delete instruction, interprete body as query/queries instead
+         * of id/ids.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: producer
+         * 
+         * @param deleteByQuery the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder deleteByQuery(String deleteByQuery) {
+            doSetProperty("deleteByQuery", deleteByQuery);
+            return this;
+        }
+        /**
+         * Starting index of the response.
+         * 
+         * The option is a: <code>java.lang.Integer</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param from the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder from(Integer from) {
+            doSetProperty("from", from);
+            return this;
+        }
+        /**
+         * Starting index of the response.
+         * 
+         * The option will be converted to a <code>java.lang.Integer</code>
+         * type.
+         * 
+         * Group: producer
+         * 
+         * @param from the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder from(String from) {
+            doSetProperty("from", from);
+            return this;
+        }
         /**
          * Sets the http client to be used by the solrClient. This is only
          * applicable when solrClient is not set.
          * 
-         * The option is a: <code>org.apache.http.client.HttpClient</code> type.
+         * The option is a: <code>java.net.http.HttpClient</code> type.
          * 
          * Group: producer
          * 
          * @param httpClient the value to set
          * @return the dsl builder
          */
-        default SolrEndpointBuilder httpClient(org.apache.http.client.HttpClient httpClient) {
+        @Deprecated
+        default SolrEndpointBuilder httpClient(java.net.http.HttpClient httpClient) {
             doSetProperty("httpClient", httpClient);
             return this;
         }
@@ -156,13 +261,14 @@ public interface SolrEndpointBuilderFactory {
          * applicable when solrClient is not set.
          * 
          * The option will be converted to a
-         * <code>org.apache.http.client.HttpClient</code> type.
+         * <code>java.net.http.HttpClient</code> type.
          * 
          * Group: producer
          * 
          * @param httpClient the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder httpClient(String httpClient) {
             doSetProperty("httpClient", httpClient);
             return this;
@@ -232,7 +338,38 @@ public interface SolrEndpointBuilderFactory {
             return this;
         }
         /**
-         * Set the request handler to be used.
+         * What operation to perform.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.solr.SolrOperation</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param operation the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder operation(org.apache.camel.component.solr.SolrOperation operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * What operation to perform.
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.component.solr.SolrOperation</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param operation the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder operation(String operation) {
+            doSetProperty("operation", operation);
+            return this;
+        }
+        /**
+         * The path of the update request handler (use for update requests / set
+         * solr parameter qt for search requests).
          * 
          * The option is a: <code>java.lang.String</code> type.
          * 
@@ -246,82 +383,111 @@ public interface SolrEndpointBuilderFactory {
             return this;
         }
         /**
-         * Uses the provided solr client to connect to solr. When this parameter
-         * is not specified, camel applies the following rules to determine the
-         * SolrClient: 1) when zkHost or zkChroot (=zookeeper root) parameter is
-         * set, then the CloudSolrClient is used. 2) when multiple hosts are
-         * specified in the uri (separated with a comma), then the
-         * CloudSolrClient (uri scheme is 'solrCloud') or the LBHttpSolrClient
-         * (uri scheme is not 'solrCloud') is used. 3) when the solr operation
-         * is INSERT_STREAMING, then the ConcurrentUpdateSolrClient is used. 4)
-         * otherwise, the HttpSolrClient is used. Note: A CloudSolrClient should
-         * point to zookeeper endpoint(s); other clients point to Solr
-         * endpoint(s). The SolrClient can also be set via the exchange header
-         * 'CamelSolrClient'.
+         * The time in ms to wait before the request will time out (former
+         * soTimeout).
          * 
-         * The option is a: <code>org.apache.solr.client.solrj.SolrClient</code>
+         * The option is a: <code>java.lang.Long</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param requestTimeout the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder requestTimeout(Long requestTimeout) {
+            doSetProperty("requestTimeout", requestTimeout);
+            return this;
+        }
+        /**
+         * The time in ms to wait before the request will time out (former
+         * soTimeout).
+         * 
+         * The option will be converted to a <code>java.lang.Long</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param requestTimeout the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder requestTimeout(String requestTimeout) {
+            doSetProperty("requestTimeout", requestTimeout);
+            return this;
+        }
+        /**
+         * Size of the response.
+         * 
+         * The option is a: <code>java.lang.Integer</code> type.
+         * 
+         * Group: producer
+         * 
+         * @param size the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder size(Integer size) {
+            doSetProperty("size", size);
+            return this;
+        }
+        /**
+         * Size of the response.
+         * 
+         * The option will be converted to a <code>java.lang.Integer</code>
          * type.
          * 
          * Group: producer
          * 
-         * @param solrClient the value to set
+         * @param size the value to set
          * @return the dsl builder
          */
-        default SolrEndpointBuilder solrClient(org.apache.solr.client.solrj.SolrClient solrClient) {
-            doSetProperty("solrClient", solrClient);
+        default SolrEndpointBuilder size(String size) {
+            doSetProperty("size", size);
             return this;
         }
         /**
-         * Uses the provided solr client to connect to solr. When this parameter
-         * is not specified, camel applies the following rules to determine the
-         * SolrClient: 1) when zkHost or zkChroot (=zookeeper root) parameter is
-         * set, then the CloudSolrClient is used. 2) when multiple hosts are
-         * specified in the uri (separated with a comma), then the
-         * CloudSolrClient (uri scheme is 'solrCloud') or the LBHttpSolrClient
-         * (uri scheme is not 'solrCloud') is used. 3) when the solr operation
-         * is INSERT_STREAMING, then the ConcurrentUpdateSolrClient is used. 4)
-         * otherwise, the HttpSolrClient is used. Note: A CloudSolrClient should
-         * point to zookeeper endpoint(s); other clients point to Solr
-         * endpoint(s). The SolrClient can also be set via the exchange header
-         * 'CamelSolrClient'.
+         * The solr client to connect to solr. When solrClient bean is provided,
+         * all connection properties will be used from that solrClient (host,
+         * port, username, password, connectionTimeout, requestTimeout,
+         * enableSSL, ...). When not explicitly configured, camel uses the
+         * HttpJdkSolrClient.
          * 
-         * The option will be converted to a
-         * <code>org.apache.solr.client.solrj.SolrClient</code> type.
+         * The option is a: <code>org.apache.solr.client.solrj.SolrClient</code>
+         * type.
          * 
          * Group: producer
          * 
          * @param solrClient the value to set
          * @return the dsl builder
          */
-        default SolrEndpointBuilder solrClient(String solrClient) {
+        default SolrEndpointBuilder solrClient(org.apache.solr.client.solrj.SolrClient solrClient) {
             doSetProperty("solrClient", solrClient);
             return this;
         }
         /**
-         * Sets the socket timeout on the SolrClient.
+         * The time in ms to wait before the request will time out (former
+         * soTimeout).
          * 
-         * The option is a: <code>java.lang.Integer</code> type.
+         * The option is a: <code>int</code> type.
          * 
          * Group: producer
          * 
          * @param soTimeout the value to set
          * @return the dsl builder
          */
-        default SolrEndpointBuilder soTimeout(Integer soTimeout) {
+        @Deprecated
+        default SolrEndpointBuilder soTimeout(int soTimeout) {
             doSetProperty("soTimeout", soTimeout);
             return this;
         }
         /**
-         * Sets the socket timeout on the SolrClient.
+         * The time in ms to wait before the request will time out (former
+         * soTimeout).
          * 
-         * The option will be converted to a <code>java.lang.Integer</code>
-         * type.
+         * The option will be converted to a <code>int</code> type.
          * 
          * Group: producer
          * 
          * @param soTimeout the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder soTimeout(String soTimeout) {
             doSetProperty("soTimeout", soTimeout);
             return this;
@@ -331,12 +497,12 @@ public interface SolrEndpointBuilderFactory {
          * 
          * The option is a: <code>int</code> type.
          * 
-         * Default: 10
          * Group: producer
          * 
          * @param streamingQueueSize the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder streamingQueueSize(int streamingQueueSize) {
             doSetProperty("streamingQueueSize", streamingQueueSize);
             return this;
@@ -346,12 +512,12 @@ public interface SolrEndpointBuilderFactory {
          * 
          * The option will be converted to a <code>int</code> type.
          * 
-         * Default: 10
          * Group: producer
          * 
          * @param streamingQueueSize the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder streamingQueueSize(String streamingQueueSize) {
             doSetProperty("streamingQueueSize", streamingQueueSize);
             return this;
@@ -361,12 +527,12 @@ public interface SolrEndpointBuilderFactory {
          * 
          * The option is a: <code>int</code> type.
          * 
-         * Default: 2
          * Group: producer
          * 
          * @param streamingThreadCount the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder streamingThreadCount(int streamingThreadCount) {
             doSetProperty("streamingThreadCount", streamingThreadCount);
             return this;
@@ -376,30 +542,16 @@ public interface SolrEndpointBuilderFactory {
          * 
          * The option will be converted to a <code>int</code> type.
          * 
-         * Default: 2
          * Group: producer
          * 
          * @param streamingThreadCount the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder streamingThreadCount(String streamingThreadCount) {
             doSetProperty("streamingThreadCount", streamingThreadCount);
             return this;
         }
-        /**
-         * Set the default collection for SolrCloud.
-         * 
-         * The option is a: <code>java.lang.String</code> type.
-         * 
-         * Group: CloudSolrClient
-         * 
-         * @param collection the value to set
-         * @return the dsl builder
-         */
-        default SolrEndpointBuilder collection(String collection) {
-            doSetProperty("collection", collection);
-            return this;
-        }
         /**
          * Set the chroot of the zookeeper connection (include the leading
          * slash; e.g. '/mychroot').
@@ -411,6 +563,7 @@ public interface SolrEndpointBuilderFactory {
          * @param zkChroot the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder zkChroot(String zkChroot) {
             doSetProperty("zkChroot", zkChroot);
             return this;
@@ -431,6 +584,7 @@ public interface SolrEndpointBuilderFactory {
          * @param zkHost the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder zkHost(String zkHost) {
             doSetProperty("zkHost", zkHost);
             return this;
@@ -445,6 +599,7 @@ public interface SolrEndpointBuilderFactory {
          * @param allowCompression the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder allowCompression(Boolean allowCompression) {
             doSetProperty("allowCompression", allowCompression);
             return this;
@@ -460,6 +615,7 @@ public interface SolrEndpointBuilderFactory {
          * @param allowCompression the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder allowCompression(String allowCompression) {
             doSetProperty("allowCompression", allowCompression);
             return this;
@@ -474,6 +630,7 @@ public interface SolrEndpointBuilderFactory {
          * @param followRedirects the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder followRedirects(Boolean followRedirects) {
             doSetProperty("followRedirects", followRedirects);
             return this;
@@ -489,12 +646,62 @@ public interface SolrEndpointBuilderFactory {
          * @param followRedirects the value to set
          * @return the dsl builder
          */
+        @Deprecated
         default SolrEndpointBuilder followRedirects(String followRedirects) {
             doSetProperty("followRedirects", followRedirects);
             return this;
         }
         /**
-         * Sets password for basic auth plugin enabled servers.
+         * The certificate that can be used to access the solr host. It can be
+         * loaded by default from classpath, but you can prefix with classpath:,
+         * file:, or http: to load the resource from different systems.
+         * 
+         * This option can also be loaded from an existing file, by prefixing
+         * with file: or classpath: followed by the location of the file.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: security
+         * 
+         * @param certificatePath the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder certificatePath(String certificatePath) {
+            doSetProperty("certificatePath", certificatePath);
+            return this;
+        }
+        /**
+         * Enable SSL.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param enableSSL the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder enableSSL(boolean enableSSL) {
+            doSetProperty("enableSSL", enableSSL);
+            return this;
+        }
+        /**
+         * Enable SSL.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: security
+         * 
+         * @param enableSSL the value to set
+         * @return the dsl builder
+         */
+        default SolrEndpointBuilder enableSSL(String enableSSL) {
+            doSetProperty("enableSSL", enableSSL);
+            return this;
+        }
+        /**
+         * Password for authenticating.
          * 
          * The option is a: <code>java.lang.String</code> type.
          * 
@@ -508,7 +715,7 @@ public interface SolrEndpointBuilderFactory {
             return this;
         }
         /**
-         * Sets username for basic auth plugin enabled servers.
+         * Basic authenticate user.
          * 
          * The option is a: <code>java.lang.String</code> type.
          * 
@@ -586,7 +793,7 @@ public interface SolrEndpointBuilderFactory {
          * Solr (camel-solr)
          * Perform operations against Apache Lucene Solr.
          * 
-         * Category: monitoring,search
+         * Category: search,monitoring
          * Since: 4.8
          * Maven coordinates: org.apache.camel:camel-solr
          * 
@@ -599,18 +806,20 @@ public interface SolrEndpointBuilderFactory {
          * Solr (camel-solr)
          * Perform operations against Apache Lucene Solr.
          * 
-         * Category: monitoring,search
+         * Category: search,monitoring
          * Since: 4.8
          * Maven coordinates: org.apache.camel:camel-solr
          * 
-         * Syntax: <code>solr:url</code>
+         * Syntax: <code>solr:host:port</code>
          * 
-         * Path parameter: url (required)
-         * Hostname and port for the Solr server(s). Multiple hosts can be
-         * specified, separated with a comma. See the solrClient parameter for
-         * more information on the SolrClient used to connect to Solr.
+         * Path parameter: host (required)
+         * The solr instance host name (set to 'default' to use the host name
+         * defined on component level)
          * 
-         * @param path url
+         * Path parameter: port
+         * The solr instance port number
+         * 
+         * @param path host:port
          * @return the dsl builder
          */
         default SolrEndpointBuilder solr(String path) {
@@ -620,67 +829,27 @@ public interface SolrEndpointBuilderFactory {
          * Solr (camel-solr)
          * Perform operations against Apache Lucene Solr.
          * 
-         * Category: monitoring,search
+         * Category: search,monitoring
          * Since: 4.8
          * Maven coordinates: org.apache.camel:camel-solr
          * 
-         * Syntax: <code>solr:url</code>
+         * Syntax: <code>solr:host:port</code>
+         * 
+         * Path parameter: host (required)
+         * The solr instance host name (set to 'default' to use the host name
+         * defined on component level)
          * 
-         * Path parameter: url (required)
-         * Hostname and port for the Solr server(s). Multiple hosts can be
-         * specified, separated with a comma. See the solrClient parameter for
-         * more information on the SolrClient used to connect to Solr.
+         * Path parameter: port
+         * The solr instance port number
          * 
          * @param componentName to use a custom component name for the endpoint
          * instead of the default name
-         * @param path url
+         * @param path host:port
          * @return the dsl builder
          */
         default SolrEndpointBuilder solr(String componentName, String path) {
             return SolrEndpointBuilderFactory.endpointBuilder(componentName, path);
         }
-        /**
-         * Solr (Secure) (camel-solr)
-         * Perform operations against Apache Lucene Solr.
-         * 
-         * Category: monitoring,search
-         * Since: 4.8
-         * Maven coordinates: org.apache.camel:camel-solr
-         * 
-         * Syntax: <code>solrs:url</code>
-         * 
-         * Path parameter: url (required)
-         * Hostname and port for the Solr server(s). Multiple hosts can be
-         * specified, separated with a comma. See the solrClient parameter for
-         * more information on the SolrClient used to connect to Solr.
-         * 
-         * @param path url
-         * @return the dsl builder
-         */
-        default SolrEndpointBuilder solrs(String path) {
-            return SolrEndpointBuilderFactory.endpointBuilder("solrs", path);
-        }
-        /**
-         * Solr (camel-solr)
-         * Perform operations against Apache Lucene Solr.
-         * 
-         * Category: monitoring,search
-         * Since: 4.8
-         * Maven coordinates: org.apache.camel:camel-solr
-         * 
-         * Syntax: <code>solrCloud:url</code>
-         * 
-         * Path parameter: url (required)
-         * Hostname and port for the Solr server(s). Multiple hosts can be
-         * specified, separated with a comma. See the solrClient parameter for
-         * more information on the SolrClient used to connect to Solr.
-         * 
-         * @param path url
-         * @return the dsl builder
-         */
-        default SolrEndpointBuilder solrCloud(String path) {
-            return SolrEndpointBuilderFactory.endpointBuilder("solrCloud", path);
-        }
 
     }
     /**
@@ -694,20 +863,46 @@ public interface SolrEndpointBuilderFactory {
         private static final SolrHeaderNameBuilder INSTANCE = new SolrHeaderNameBuilder();
 
         /**
-         * The client.
+         * The operation to perform.
          * 
-         * The option is a: {@code org.apache.solr.client.solrj.SolrClient}
-         * type.
+         * The option is a: {@code String} type.
          * 
          * Group: producer
          * 
-         * @return the name of the header {@code SolrClient}.
+         * @return the name of the header {@code operation}.
          */
-        public String solrClient() {
-            return "CamelSolrClient";
+        public String operation() {
+            return "operation";
         }
         /**
-         * The collection to execute the request again.
+         * The operation to perform. Deprecation note: Use header 'operation'
+         * instead.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code SolrOperation}.
+         */
+        @Deprecated
+        public String solrOperation() {
+            return "SolrOperation";
+        }
+        /**
+         * The collection to execute the request against.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code collection}.
+         */
+        public String collection() {
+            return "collection";
+        }
+        /**
+         * The collection to execute the request against. Deprecation note: Use
+         * header 'collection' instead.
          * 
          * The option is a: {@code String} type.
          * 
@@ -715,20 +910,21 @@ public interface SolrEndpointBuilderFactory {
          * 
          * @return the name of the header {@code SolrCollection}.
          */
+        @Deprecated
         public String solrCollection() {
             return "CamelSolrCollection";
         }
         /**
-         * The operation to perform.
+         * The request handler to execute the solr request against.
          * 
          * The option is a: {@code String} type.
          * 
          * Group: producer
          * 
-         * @return the name of the header {@code SolrOperation}.
+         * @return the name of the header {@code requestHandler}.
          */
-        public String solrOperation() {
-            return "SolrOperation";
+        public String requestHandler() {
+            return "requestHandler";
         }
         /**
          * The query to execute.
@@ -737,13 +933,89 @@ public interface SolrEndpointBuilderFactory {
          * 
          * Group: producer
          * 
+         * @return the name of the header {@code queryString}.
+         */
+        public String queryString() {
+            return "queryString";
+        }
+        /**
+         * The query to execute. Deprecation note: Use header 'queryString'
+         * instead.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
          * @return the name of the header {@code SolrQueryString}.
          */
+        @Deprecated
         public String solrQueryString() {
             return "CamelSolrQueryString";
         }
         /**
-         * The content type.
+         * The size of the response.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code size}.
+         */
+        public String size() {
+            return "size";
+        }
+        /**
+         * The starting index of the response.
+         * 
+         * The option is a: {@code Integer} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code from}.
+         */
+        public String from() {
+            return "from";
+        }
+        /**
+         * The solr client to use for the request.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code solrClient}.
+         */
+        public String solrClient() {
+            return "solrClient";
+        }
+        /**
+         * The solr parameters to use for the request.
+         * 
+         * The option is a: {@code SolrParams} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code solrParams}.
+         */
+        public String solrParams() {
+            return "solrParams";
+        }
+        /**
+         * For the delete instruction, interprete body as query/queries instead
+         * of id/ids.
+         * 
+         * The option is a: {@code boolean} type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @return the name of the header {@code deleteByQuery}.
+         */
+        public String deleteByQuery() {
+            return "deleteByQuery";
+        }
+        /**
+         * The content type is used to identify the type when inserting files.
          * 
          * The option is a: {@code String} type.
          * 
@@ -763,4 +1035,4 @@ public interface SolrEndpointBuilderFactory {
         }
         return new SolrEndpointBuilderImpl(path);
     }
-}
\ No newline at end of file
+}
diff --git a/test-infra/camel-test-infra-solr/pom.xml b/test-infra/camel-test-infra-solr/pom.xml
index 1a7373a482e..8b7e3a5a9b0 100644
--- a/test-infra/camel-test-infra-solr/pom.xml
+++ b/test-infra/camel-test-infra-solr/pom.xml
@@ -29,19 +29,26 @@
     
     <artifactId>camel-test-infra-solr</artifactId>
     <name>Camel :: Test Infra :: Solr</name>
-
+    
     <properties>
         <assembly.skipAssembly>false</assembly.skipAssembly>
     </properties>
-
+    
     <dependencies>
+
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-test-infra-common</artifactId>
             <version>${project.version}</version>
-            <type>test-jar</type>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-infra-common</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+        </dependency>
+        
         <dependency>
             <groupId>org.testcontainers</groupId>
             <artifactId>testcontainers</artifactId>
@@ -58,5 +65,4 @@
         </plugins>
     </build>
 
-
 </project>
diff --git a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/common/SolrProperties.java b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/common/SolrProperties.java
index c04ce000dd3..a2d6fb360a7 100644
--- a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/common/SolrProperties.java
+++ b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/common/SolrProperties.java
@@ -18,9 +18,9 @@
 package org.apache.camel.test.infra.solr.common;
 
 public final class SolrProperties {
-    public static final String SERVICE_ADDRESS = "solr.service.address";
+    public static final String SOLR_HOST = "solr.host";
+    public static final String SOLR_PORT = "solr.port";
     public static final String SOLR_CONTAINER = "solr.container";
-    public static final String SOLR_MODE = "SOLR_MODE";
     public static final int DEFAULT_PORT = 8983;
 
     private SolrProperties() {
diff --git a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
index 0cd2d9df0da..91fbf71319b 100644
--- a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
+++ b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrContainer.java
@@ -27,30 +27,37 @@ import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.utility.DockerImageName;
 
 public class SolrContainer extends GenericContainer<SolrContainer> {
+
     private static final Logger LOG = LoggerFactory.getLogger(SolrContainer.class);
 
     public static final String CONTAINER_NAME = "solr";
 
+    public static final String SOLR_DFT_COLLECTION = "collection1";
+    public static final String[] SOLR_CONTAINER_COMMANDS = new String[] { "solr-precreate", SOLR_DFT_COLLECTION };
+
     public SolrContainer() {
         super(LocalPropertyResolver.getProperty(SolrLocalContainerInfraService.class, SolrProperties.SOLR_CONTAINER));
 
         this.withNetworkAliases(CONTAINER_NAME)
+                .withEnv("SOLR_OPTS", "-Xss500k")
                 .withExposedPorts(SolrProperties.DEFAULT_PORT)
-                .waitingFor(Wait.forListeningPort())
-                .withEnv("SOLR_OPTS", "-Xss500k");
+                .waitingFor(Wait.forHttp("/solr/admin/info/health"));
     }
 
     public SolrContainer(String imageName) {
         super(DockerImageName.parse(imageName));
     }
 
-    public static SolrContainer initContainer(String networkAlias, boolean cloudMode) {
+    public static SolrContainer initContainer(String networkAlias) {
         return new SolrContainer()
                 .withNetworkAliases(networkAlias)
-                .withExposedPorts(SolrProperties.DEFAULT_PORT)
+                .withEnv("SOLR_OPTS", "-Dsolr.environment=test,label=camel-solr-test-infra,color=sandybrown")
+                .withEnv("GC_LOG_OPTS", "-verbose:")
+                .withAccessToHost(true)
                 .withLogConsumer(new Slf4jLogConsumer(LOG).withPrefix(CONTAINER_NAME))
-                .waitingFor(Wait.forLogMessage(".*Server.*Started.*", 1))
-                .withCommand(cloudMode ? "-c" : "");
+                .withExposedPorts(SolrProperties.DEFAULT_PORT)
+                .withCommand(SOLR_CONTAINER_COMMANDS)
+                .waitingFor(Wait.forHttp("/solr/" + SOLR_DFT_COLLECTION + "/admin/ping?docker-ping"));
     }
 
 }
diff --git a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrInfraService.java b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrInfraService.java
index d256fb0015f..6f8f4d7e69a 100644
--- a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrInfraService.java
+++ b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrInfraService.java
@@ -14,17 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.camel.test.infra.solr.services;
 
 import org.apache.camel.test.infra.common.services.InfrastructureService;
 
-/**
- * Test infra service for Solr
- */
 public interface SolrInfraService extends InfrastructureService {
 
-    String getSolrBaseUrl();
+    int getPort();
+
+    String getSolrHost();
 
-    boolean isCloudMode();
+    default String getHttpHostAddress() {
+        return String.format("%s:%d", getSolrHost(), getPort());
+    }
 
 }
diff --git a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
index 5784dc7d309..1f8281c05e5 100644
--- a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
+++ b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerInfraService.java
@@ -31,12 +31,13 @@ public class SolrLocalContainerInfraService implements SolrInfraService, Contain
     private final SolrContainer container;
 
     public SolrLocalContainerInfraService() {
-        container = SolrContainer.initContainer(SolrContainer.CONTAINER_NAME, isCloudMode());
+        container = SolrContainer.initContainer(SolrContainer.CONTAINER_NAME);
     }
 
     @Override
     public void registerProperties() {
-        System.setProperty(SolrProperties.SERVICE_ADDRESS, getSolrBaseUrl());
+        System.setProperty(SolrProperties.SOLR_HOST, getSolrHost());
+        System.setProperty(SolrProperties.SOLR_PORT, String.valueOf(getPort()));
     }
 
     @Override
@@ -49,6 +50,10 @@ public class SolrLocalContainerInfraService implements SolrInfraService, Contain
         LOG.info("Solr instance running at {}", getSolrBaseUrl());
     }
 
+    private String getSolrBaseUrl() {
+        return String.format("http://%s/solr", getHttpHostAddress());
+    }
+
     @Override
     public void shutdown() {
         LOG.info("Stopping the Solr container");
@@ -60,21 +65,12 @@ public class SolrLocalContainerInfraService implements SolrInfraService, Contain
         return container;
     }
 
-    protected String getHost() {
+    public String getSolrHost() {
         return container.getHost();
     }
 
-    protected int getPort() {
+    public int getPort() {
         return container.getMappedPort(SolrProperties.DEFAULT_PORT);
     }
 
-    @Override
-    public String getSolrBaseUrl() {
-        return String.format("http://%s:%d/solr", getHost(), getPort());
-    }
-
-    @Override
-    public boolean isCloudMode() {
-        return false;
-    }
 }
diff --git a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrRemoteInfraService.java b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrRemoteInfraService.java
index 34496c690ce..be73003337f 100644
--- a/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrRemoteInfraService.java
+++ b/test-infra/camel-test-infra-solr/src/main/java/org/apache/camel/test/infra/solr/services/SolrRemoteInfraService.java
@@ -21,13 +21,17 @@ import org.apache.camel.test.infra.solr.common.SolrProperties;
 public class SolrRemoteInfraService implements SolrInfraService {
 
     @Override
-    public String getSolrBaseUrl() {
-        return System.getProperty(SolrProperties.SERVICE_ADDRESS);
+    public String getSolrHost() {
+        return System.getProperty(SolrProperties.SOLR_HOST);
     }
 
     @Override
-    public boolean isCloudMode() {
-        return System.getProperty(SolrProperties.SOLR_MODE).equals("solrcloud");
+    public int getPort() {
+        String strPort = System.getProperty(SolrProperties.SOLR_PORT);
+        if (strPort != null) {
+            return Integer.parseInt(strPort);
+        }
+        return SolrProperties.DEFAULT_PORT;
     }
 
     @Override
diff --git a/test-infra/camel-test-infra-solr/src/main/resources/org/apache/camel/test/infra/solr/services/container.properties b/test-infra/camel-test-infra-solr/src/main/resources/org/apache/camel/test/infra/solr/services/container.properties
index 863c7fde0d8..93a8d7bb9dc 100644
--- a/test-infra/camel-test-infra-solr/src/main/resources/org/apache/camel/test/infra/solr/services/container.properties
+++ b/test-infra/camel-test-infra-solr/src/main/resources/org/apache/camel/test/infra/solr/services/container.properties
@@ -14,4 +14,4 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
-solr.container=mirror.gcr.io/solr:9.7.0-slim
+solr.container=mirror.gcr.io/solr:9.8.0-slim
diff --git a/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerCloudService.java b/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerCloudService.java
deleted file mode 100644
index fb8d30092e2..00000000000
--- a/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrLocalContainerCloudService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.test.infra.solr.services;
-
-public class SolrLocalContainerCloudService extends SolrLocalContainerService implements SolrService {
-    @Override
-    public boolean isCloudMode() {
-        return true;
-    }
-}
diff --git a/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrServiceFactory.java b/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrServiceFactory.java
index 007e694269f..d79388ea0c2 100644
--- a/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrServiceFactory.java
+++ b/test-infra/camel-test-infra-solr/src/test/java/org/apache/camel/test/infra/solr/services/SolrServiceFactory.java
@@ -36,4 +36,5 @@ public final class SolrServiceFactory {
 
     public static class SolrRemoteService extends SolrRemoteInfraService implements SolrService {
     }
+
 }