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 2017/03/19 09:43:24 UTC

[4/5] camel git commit: CAMEL-10160 create a zendesk endpoint for creating new issues

CAMEL-10160 create a zendesk endpoint for creating new issues


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a0a2c997
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a0a2c997
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a0a2c997

Branch: refs/heads/master
Commit: a0a2c9972c5240c8506fcfa7cf228e6defc2cfaf
Parents: d52bb56
Author: Tomohisa Igarashi <tm...@gmail.com>
Authored: Mon Nov 21 11:54:38 2016 +0900
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Mar 19 09:57:48 2017 +0100

----------------------------------------------------------------------
 apache-camel/pom.xml                            |   9 +
 components/camel-zendesk/pom.xml                | 252 +++++++++++++++++++
 .../src/main/docs/zendesk-component.adoc        | 107 ++++++++
 .../component/zendesk/ZendeskComponent.java     | 114 +++++++++
 .../component/zendesk/ZendeskConfiguration.java | 159 ++++++++++++
 .../component/zendesk/ZendeskConsumer.java      |  35 +++
 .../component/zendesk/ZendeskEndpoint.java      | 115 +++++++++
 .../component/zendesk/ZendeskProducer.java      |  33 +++
 .../zendesk/internal/ZendeskConstants.java      |  29 +++
 .../zendesk/internal/ZendeskHelper.java         |  58 +++++
 .../internal/ZendeskPropertiesHelper.java       |  39 +++
 .../src/main/resources/META-INF/LICENSE.txt     | 203 +++++++++++++++
 .../src/main/resources/META-INF/NOTICE.txt      |  11 +
 .../services/org/apache/camel/component/zendesk |  18 ++
 .../zendesk/AbstractZendeskTestSupport.java     |  82 ++++++
 .../zendesk/ZendeskTicketIntegrationTest.java   | 157 ++++++++++++
 .../src/test/resources/log4j2.properties        |  30 +++
 .../src/test/resources/test-options.properties  |  29 +++
 components/pom.xml                              |   1 +
 components/readme.adoc                          |   3 +
 docs/user-manual/en/SUMMARY.md                  |   1 +
 parent/pom.xml                                  |  24 ++
 .../camel-zendesk-starter/pom.xml               |  51 ++++
 .../ZendeskComponentAutoConfiguration.java      | 111 ++++++++
 .../ZendeskComponentConfiguration.java          | 151 +++++++++++
 .../src/main/resources/META-INF/LICENSE.txt     | 203 +++++++++++++++
 .../src/main/resources/META-INF/NOTICE.txt      |  11 +
 ...dditional-spring-configuration-metadata.json |  10 +
 .../main/resources/META-INF/spring.factories    |  19 ++
 .../src/main/resources/META-INF/spring.provides |  18 ++
 .../spring-boot/components-starter/pom.xml      |   1 +
 31 files changed, 2084 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/apache-camel/pom.xml
----------------------------------------------------------------------
diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml
index 7218b90..558cd9c 100644
--- a/apache-camel/pom.xml
+++ b/apache-camel/pom.xml
@@ -1062,6 +1062,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-zendesk</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-zipfile</artifactId>
     </dependency>
     <dependency>
@@ -2205,6 +2209,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-zendesk-starter</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-zipfile-starter</artifactId>
       <version>${project.version}</version>
     </dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/pom.xml b/components/camel-zendesk/pom.xml
new file mode 100644
index 0000000..9271d51
--- /dev/null
+++ b/components/camel-zendesk/pom.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
+  license agreements. See the NOTICE file distributed with this work for additional 
+  information regarding copyright ownership. The ASF licenses this file to 
+  You under the Apache License, Version 2.0 (the "License"); you may not use 
+  this file except in compliance with the License. You may obtain a copy of 
+  the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
+  by applicable law or agreed to in writing, software distributed under the 
+  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
+  OF ANY KIND, either express or implied. See the License for the specific 
+  language governing permissions and limitations under the License. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>components</artifactId>
+    <version>2.19.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>camel-zendesk</artifactId>
+  <packaging>jar</packaging>
+  <name>Camel :: Zendesk</name>
+  <description>Camel Zendesk Component</description>
+
+  <properties>
+    <schemeName>zendesk</schemeName>
+    <componentName>Zendesk</componentName>
+    <componentPackage>org.apache.camel.component.zendesk</componentPackage>
+    <outPackage>org.apache.camel.component.zendesk.internal</outPackage>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.cloudbees.thirdparty</groupId>
+      <artifactId>zendesk-java-client</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.cloudbees.thirdparty</groupId>
+      <artifactId>zendesk-java-client</artifactId>
+      <classifier>javadoc</classifier>
+      <scope>provided</scope>
+    </dependency>
+
+    <!-- testing -->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <!-- logging -->
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-slf4j-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-api-component-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>generate-test-component-classes</id>
+            <goals>
+              <goal>fromApis</goal>
+            </goals>
+            <configuration>
+              <apis>
+                <api>
+                  <apiName/>
+                  <proxyClass>org.zendesk.client.v2.Zendesk</proxyClass>
+                  <fromJavadoc>
+                    <excludeMethods>isClosed|close|getTicketsByStatus|createGroups</excludeMethods>
+                  </fromJavadoc>
+                  <substitutions>
+                    <substitution>
+                        <method>deleteSuspendedTicket|checkHasId</method>
+                        <argType>SuspendedTicket</argType>
+                        <argName>ticket</argName>
+                        <replacement>suspendedTicket</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>deleteAutomation</method>
+                        <argType>long</argType>
+                        <argName>automationId</argName>
+                        <replacement>automationId0</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>createUsers|createUsersAsync</method>
+                        <argType>java.util.List</argType>
+                        <argName>users</argName>
+                        <replacement>userList</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>getTicketAudits</method>
+                        <argType>java.lang.Long</argType>
+                        <argName>id</argName>
+                        <replacement>ticketId0</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>updateMacro</method>
+                        <argType>java.lang.Long</argType>
+                        <argName>macroId</argName>
+                        <replacement>macroId0</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>deleteArticleAttachment</method>
+                        <argType>ArticleAttachments</argType>
+                        <argName>attachment</argName>
+                        <replacement>articleAttachments</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>createTickets|createTicketsAsync</method>
+                        <argType>java.util.List</argType>
+                        <argName>tickets</argName>
+                        <replacement>ticketList</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>updateInstallation</method>
+                        <argType>int</argType>
+                        <argName>id</argName>
+                        <replacement>installationId</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>getUserSubscriptions</method>
+                        <argType>java.lang.Long</argType>
+                        <argName>userId</argName>
+                        <replacement>userId0</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>createOrganizations|createOrganizationsAsync</method>
+                        <argType>java.util.List</argType>
+                        <argName>organizations</argName>
+                        <replacement>organizationList</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>updateTrigger</method>
+                        <argType>java.lang.Long</argType>
+                        <argName>triggerId</argName>
+                        <replacement>triggerId0</replacement>
+                    </substitution>
+                    <substitution>
+                        <method>createUploadArticle</method>
+                        <argType>long</argType>
+                        <argName>articleId</argName>
+                        <replacement>articleId0</replacement>
+                    </substitution>
+                  </substitutions>
+                </api>
+              </apis>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+      <!-- add generated source and test source to build -->
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>add-generated-sources</id>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <configuration>
+              <sources>
+                <source>${project.build.directory}/generated-sources/camel-component</source>
+              </sources>
+            </configuration>
+          </execution>
+          <execution>
+            <id>add-generated-test-sources</id>
+            <goals>
+              <goal>add-test-source</goal>
+            </goals>
+            <configuration>
+              <sources>
+                <source>${project.build.directory}/generated-test-sources/camel-component</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.camel</groupId>
+          <artifactId>camel-api-component-maven-plugin</artifactId>
+          <version>${project.version}</version>
+          <configuration>
+            <scheme>${schemeName}</scheme>
+            <componentName>${componentName}</componentName>
+            <componentPackage>${componentPackage}</componentPackage>
+            <outPackage>${outPackage}</outPackage>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-api-component-maven-plugin</artifactId>
+        <version>${project.version}</version>
+        <configuration>
+          <scheme>${schemeName}</scheme>
+          <componentName>${componentName}</componentName>
+          <componentPackage>${componentPackage}</componentPackage>
+          <outPackage>${outPackage}</outPackage>
+        </configuration>
+      </plugin>
+    </plugins>
+  </reporting>
+
+</project>

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/docs/zendesk-component.adoc
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/docs/zendesk-component.adoc b/components/camel-zendesk/src/main/docs/zendesk-component.adoc
new file mode 100644
index 0000000..8161b10
--- /dev/null
+++ b/components/camel-zendesk/src/main/docs/zendesk-component.adoc
@@ -0,0 +1,107 @@
+## Zendesk Component
+
+*Available as of Camel version 2.19*
+
+The Zendesk component provides access to all of the zendesk.com APIs accessible
+using https://github.com/cloudbees/zendesk-java-client[zendesk-java-client]. It
+allows producing messages to manage Zendesk ticket, user, organization and etc.
+
+Maven users will need to add the following dependency to their pom.xml
+for this component:
+
+[source,java]
+-------------------------------------------
+    <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-zendesk</artifactId>
+        <version>${camel-version}</version>
+    </dependency>
+-------------------------------------------
+
+### Zendesk Options
+
+// component options: START
+The Zendesk component supports 2 options which are listed below.
+
+
+
+[width="100%",cols="2,1,1m,1m,5",options="header"]
+|=======================================================================
+| Name | Group | Default | Java Type | Description
+| configuration | common |  | ZendeskConfiguration | To use the shared configuration
+| resolvePropertyPlaceholders | advanced | true | boolean | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders.
+|=======================================================================
+// component options: END
+
+// endpoint options: START
+The Zendesk endpoint is configured using URI syntax:
+
+    zendesk:methodName
+
+with the following path and query parameters:
+
+#### Path Parameters (1 parameters):
+
+[width="100%",cols="2,1,1m,6",options="header"]
+|=======================================================================
+| Name | Default | Java Type | Description
+| methodName |  | String | *Required* What operation to use
+|=======================================================================
+
+#### Query Parameters (10 parameters):
+
+[width="100%",cols="2,1,1m,1m,5",options="header"]
+|=======================================================================
+| Name | Group | Default | Java Type | Description
+| inBody | common |  | String | Sets the name of a parameter to be passed in the exchange In Body
+| serverUrl | common |  | String | The server URL to connect.
+| bridgeErrorHandler | consumer | false | boolean | Allows for bridging the consumer to the Camel routing Error Handler which mean any exceptions occurred while the consumer is trying to pickup incoming messages or the likes will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions that will be logged at WARN or ERROR level and ignored.
+| exceptionHandler | consumer (advanced) |  | ExceptionHandler | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this options is not in use. By default the consumer will deal with exceptions that will be logged at WARN or ERROR level and ignored.
+| exchangePattern | consumer (advanced) |  | ExchangePattern | Sets the exchange pattern when the consumer creates an exchange.
+| synchronous | advanced | false | boolean | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported).
+| oauthToken | security |  | String | The OAuth token.
+| password | security |  | String | The password.
+| token | security |  | String | The security token.
+| username | security |  | String | The user name.
+|=======================================================================
+// endpoint options: END
+
+### URI format
+
+[source,java]
+--------------------------------------------
+    zendesk://endpoint?[options]
+--------------------------------------------
+
+
+### Producer Endpoints:
+
+Producer endpoints can use endpoint names and associated options described next. 
+
+
+### Consumer Endpoints:
+
+Any of the producer endpoints can be used as a consumer endpoint.
+Consumer endpoints can use
+http://camel.apache.org/polling-consumer.html#PollingConsumer-ScheduledPollConsumerOptions[Scheduled
+Poll Consumer Options] with a `consumer.` prefix to schedule endpoint
+invocation. Consumer endpoints that return an array or collection will
+generate one exchange per element, and their routes will be executed
+once for each exchange.
+
+
+### Message header
+
+Any of the options�can be provided in a message header for producer
+endpoints with *CamelZendesk.* prefix. In principal, parameter names are same as
+the arugument name of each API methods on the original `org.zendesk.client.v2.Zendesk`
+ class. However some of them are renamed to the other name to avoid confliction in the
+ camel API component framework. To see actual parameter name, please check `org.apache.camel.component.zendesk.internal.ZendeskApiMethod`.
+ 
+
+### Message body
+
+All result message bodies utilize objects provided by the Zendesk Java Client.
+Producer endpoints can specify the option name for incoming message body
+in the *inBody* endpoint parameter.
+

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskComponent.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskComponent.java
new file mode 100644
index 0000000..f1bc681
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskComponent.java
@@ -0,0 +1,114 @@
+/**
+ * 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.zendesk;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.zendesk.internal.ZendeskApiCollection;
+import org.apache.camel.component.zendesk.internal.ZendeskApiName;
+import org.apache.camel.component.zendesk.internal.ZendeskHelper;
+import org.apache.camel.impl.DefaultComponent;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.component.AbstractApiComponent;
+import org.zendesk.client.v2.Zendesk;
+
+/**
+ * The Zendesk Component.
+ */
+public class ZendeskComponent extends AbstractApiComponent<ZendeskApiName, ZendeskConfiguration, ZendeskApiCollection> {
+
+    @Metadata(label = "advanced")
+    Zendesk zendesk;
+
+    public ZendeskComponent() {
+        super(ZendeskEndpoint.class, ZendeskApiName.class, ZendeskApiCollection.getCollection());
+    }
+
+    public ZendeskComponent(CamelContext context) {
+        super(context, ZendeskEndpoint.class, ZendeskApiName.class, ZendeskApiCollection.getCollection());
+    }
+
+    @Override
+    protected ZendeskApiName getApiName(String apiNameStr) throws IllegalArgumentException {
+        return ZendeskApiName.fromValue(apiNameStr);
+    }
+
+    /**
+     * To use the shared configuration
+     */
+    @Override
+    public void setConfiguration(ZendeskConfiguration configuration) {
+        super.setConfiguration(configuration);
+    }
+
+    /**
+     * To use the shared configuration
+     */
+    @Override
+    public ZendeskConfiguration getConfiguration() {
+        return super.getConfiguration();
+    }
+
+    /**
+     * To use a shared {@link Zendesk} instance.
+     * 
+     * @return the shared Zendesk instance
+     */
+    public Zendesk getZendesk() {
+        return zendesk;
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String methodName, ZendeskApiName apiName,
+            ZendeskConfiguration endpointConfiguration) {
+        endpointConfiguration.setMethodName(methodName);
+        return new ZendeskEndpoint(uri, this, apiName, methodName, endpointConfiguration);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        if (zendesk == null) {
+            if (configuration != null) {
+                zendesk = ZendeskHelper.create(configuration);
+            } else {
+                throw new IllegalArgumentException("Unable to connect, Zendesk component configuration is missing");
+            }
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (zendesk != null) {
+            zendesk.close();
+            zendesk = null;
+        }
+    }
+
+    @Override
+    public void doShutdown() throws Exception {
+        if (zendesk != null) {
+            zendesk.close();
+            zendesk = null;
+        }
+        super.doShutdown();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConfiguration.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConfiguration.java
new file mode 100644
index 0000000..6c3a588
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConfiguration.java
@@ -0,0 +1,159 @@
+/**
+ * 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.zendesk;
+
+import java.util.Map;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.zendesk.internal.ZendeskApiName;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+/**
+ * Component configuration for Zendesk component.
+ */
+@UriParams
+public class ZendeskConfiguration {
+
+    @UriPath
+    @Metadata(required = "true")
+    private String methodName;
+
+    @UriParam
+    private String serverUrl;
+
+    @UriParam(label = "security", secret = true)
+    private String username;
+
+    @UriParam(label = "security", secret = true)
+    private String oauthToken;
+
+    @UriParam(label = "security", secret = true)
+    private String token;
+
+    @UriParam(label = "security", secret = true)
+    private String password;
+
+    /**
+     * What operation to use
+     * 
+     * @return the methodName
+     */
+    public String getMethodName() {
+        return methodName;
+    }
+
+    /**
+     * What operation to use
+     * 
+     * @param methodName
+     *            the methodName to set
+     */
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    /**
+     * The server URL to connect.
+     * 
+     * @return server URL
+     */
+    public String getServerUrl() {
+        return serverUrl;
+    }
+
+    /**
+     * The server URL to connect.
+     * 
+     * @param url server URL
+     */
+    public void setServerUrl(String url) {
+        this.serverUrl = url;
+    }
+
+    /**
+     * The user name.
+     * 
+     * @return user name
+     */
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * The user name.
+     * 
+     * @param user user name
+     */
+    public void setUsername(String user) {
+        this.username = user;
+    }
+
+    /**
+     * The security token.
+     * 
+     * @return security token
+     */
+    public String getToken() {
+        return token;
+    }
+
+    /**
+     * The security token.
+     * 
+     * @param token security token
+     */
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    /**
+     * The OAuth token.
+     * @return OAuth token
+     */
+    public String getOauthToken() {
+        return oauthToken;
+    }
+
+    /**
+     * The OAuth token.
+     * 
+     * @param token OAuth token
+     */
+    public void setOauthToken(String token) {
+        this.oauthToken = token;
+    }
+
+    /**
+     * The password.
+     * 
+     * @return password
+     */
+    public String getPassword() {
+        return password;
+    }
+
+    /**
+     * The password.
+     * @param password password
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConsumer.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConsumer.java
new file mode 100644
index 0000000..944f059
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskConsumer.java
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.zendesk;
+
+import java.util.List;
+import java.util.Stack;
+
+import org.apache.camel.Processor;
+import org.apache.camel.component.zendesk.internal.ZendeskApiName;
+import org.apache.camel.util.component.AbstractApiConsumer;
+
+/**
+ * The Zendesk consumer.
+ */
+public class ZendeskConsumer extends AbstractApiConsumer<ZendeskApiName, ZendeskConfiguration> {
+
+    public ZendeskConsumer(ZendeskEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java
new file mode 100644
index 0000000..3058020
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskEndpoint.java
@@ -0,0 +1,115 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.zendesk;
+
+import java.lang.reflect.Proxy;
+import java.util.Map;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.component.zendesk.internal.ZendeskApiCollection;
+import org.apache.camel.component.zendesk.internal.ZendeskApiName;
+import org.apache.camel.component.zendesk.internal.ZendeskConstants;
+import org.apache.camel.component.zendesk.internal.ZendeskHelper;
+import org.apache.camel.component.zendesk.internal.ZendeskPropertiesHelper;
+import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.component.AbstractApiEndpoint;
+import org.apache.camel.util.component.ApiMethod;
+import org.apache.camel.util.component.ApiMethodPropertiesHelper;
+import org.zendesk.client.v2.Zendesk;
+
+/**
+ * The zendesk endpoint interacts with the Zendesk server.
+ */
+@UriEndpoint(firstVersion = "2.19.0", scheme = "zendesk", title = "Zendesk", syntax = "zendesk:methodName",
+    consumerClass = ZendeskConsumer.class, consumerPrefix = "consumer", label = "api,support,cloud", lenientProperties = true)
+public class ZendeskEndpoint extends AbstractApiEndpoint<ZendeskApiName, ZendeskConfiguration> {
+
+    @UriParam
+    private ZendeskConfiguration configuration;
+
+    private Zendesk apiProxy;
+
+    public ZendeskEndpoint(String uri, ZendeskComponent component, ZendeskApiName apiName, String methodName,
+                       ZendeskConfiguration endpointConfiguration) {
+        super(uri, component, apiName, methodName, ZendeskApiCollection.getCollection().getHelper(apiName),
+                endpointConfiguration);
+        this.configuration = endpointConfiguration;
+    }
+
+    @Override
+    public ZendeskComponent getComponent() {
+        return (ZendeskComponent) super.getComponent();
+    }
+
+    public Producer createProducer() throws Exception {
+        return new ZendeskProducer(this);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        // make sure inBody is not set for consumers
+        if (inBody != null) {
+            throw new IllegalArgumentException("Option inBody is not supported for consumer endpoint");
+        }
+        final ZendeskConsumer consumer = new ZendeskConsumer(this, processor);
+        // also set consumer.* properties
+        configureConsumer(consumer);
+        return consumer;
+    }
+
+    @Override
+    public void doStop() throws Exception {
+        if (apiProxy != null && !apiProxy.isClosed()) {
+            apiProxy.close();
+        }
+        super.doStop();
+    }
+
+    @Override
+    protected ApiMethodPropertiesHelper<ZendeskConfiguration> getPropertiesHelper() {
+        return ZendeskPropertiesHelper.getHelper();
+    }
+
+    protected String getThreadProfileName() {
+        return ZendeskConstants.THREAD_PROFILE_NAME;
+    }
+
+    @Override
+    protected void afterConfigureProperties() {
+        // create connection eagerly, a good way to validate configuration
+        getZendesk();
+
+    }
+
+    @Override
+    public Object getApiProxy(ApiMethod method, Map<String, Object> args) {
+        return getZendesk();
+    }
+
+    private Zendesk getZendesk() {
+        if (apiProxy == null) {
+            apiProxy = ZendeskHelper.create(configuration);
+        }
+        return apiProxy;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskProducer.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskProducer.java
new file mode 100644
index 0000000..eacd70f
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/ZendeskProducer.java
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.zendesk;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.zendesk.internal.ZendeskApiName;
+import org.apache.camel.component.zendesk.internal.ZendeskPropertiesHelper;
+import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.component.AbstractApiProducer;
+
+/**
+ * The Zendesk producer.
+ */
+public class ZendeskProducer extends AbstractApiProducer<ZendeskApiName, ZendeskConfiguration> {
+
+    public ZendeskProducer(ZendeskEndpoint endpoint) {
+        super(endpoint, ZendeskPropertiesHelper.getHelper());
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskConstants.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskConstants.java
new file mode 100644
index 0000000..15584c8
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskConstants.java
@@ -0,0 +1,29 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.zendesk.internal;
+
+/**
+ * Constants for Zendesk component.
+ */
+public interface ZendeskConstants {
+
+    // suffix for parameters when passed as exchange header properties
+    String PROPERTY_PREFIX = "CamelZendesk.";
+
+    // thread profile name for this component
+    String THREAD_PROFILE_NAME = "CamelZendesk";
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskHelper.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskHelper.java
new file mode 100644
index 0000000..f9cf690
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskHelper.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.zendesk.internal;
+
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.zendesk.ZendeskConfiguration;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.jsse.SSLContextParameters;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zendesk.client.v2.Zendesk;
+
+/**
+ * ZendeskHelper.
+ * 
+ * <p>
+ * Utility class for creating Zendesk API Connections
+ */
+public final class ZendeskHelper {
+
+    private ZendeskHelper() {
+        // hide utility class constructor
+    }
+
+    public static Zendesk create(ZendeskConfiguration configuration) {
+        return new Zendesk.Builder(configuration.getServerUrl())
+            .setUsername(configuration.getUsername())
+            .setToken(configuration.getToken())
+            .setOauthToken(configuration.getOauthToken())
+            .setPassword(configuration.getPassword())
+            .build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskPropertiesHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskPropertiesHelper.java b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskPropertiesHelper.java
new file mode 100644
index 0000000..f2f2792
--- /dev/null
+++ b/components/camel-zendesk/src/main/java/org/apache/camel/component/zendesk/internal/ZendeskPropertiesHelper.java
@@ -0,0 +1,39 @@
+/**
+ * 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.zendesk.internal;
+
+import org.apache.camel.component.zendesk.ZendeskConfiguration;
+import org.apache.camel.util.component.ApiMethodPropertiesHelper;
+
+/**
+ * Singleton {@link ApiMethodPropertiesHelper} for Zendesk component.
+ */
+public final class ZendeskPropertiesHelper extends ApiMethodPropertiesHelper<ZendeskConfiguration> {
+
+    private static ZendeskPropertiesHelper helper;
+
+    private ZendeskPropertiesHelper() {
+        super(ZendeskConfiguration.class, ZendeskConstants.PROPERTY_PREFIX);
+    }
+
+    public static synchronized ZendeskPropertiesHelper getHelper() {
+        if (helper == null) {
+            helper = new ZendeskPropertiesHelper();
+        }
+        return helper;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/resources/META-INF/LICENSE.txt
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/resources/META-INF/LICENSE.txt b/components/camel-zendesk/src/main/resources/META-INF/LICENSE.txt
new file mode 100755
index 0000000..6b0b127
--- /dev/null
+++ b/components/camel-zendesk/src/main/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/resources/META-INF/NOTICE.txt
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/resources/META-INF/NOTICE.txt b/components/camel-zendesk/src/main/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/components/camel-zendesk/src/main/resources/META-INF/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/main/resources/META-INF/services/org/apache/camel/component/zendesk
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/main/resources/META-INF/services/org/apache/camel/component/zendesk b/components/camel-zendesk/src/main/resources/META-INF/services/org/apache/camel/component/zendesk
new file mode 100644
index 0000000..fd14427
--- /dev/null
+++ b/components/camel-zendesk/src/main/resources/META-INF/services/org/apache/camel/component/zendesk
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+class=org.apache.camel.component.zendesk.ZendeskComponent

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/AbstractZendeskTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/AbstractZendeskTestSupport.java b/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/AbstractZendeskTestSupport.java
new file mode 100644
index 0000000..9110a71
--- /dev/null
+++ b/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/AbstractZendeskTestSupport.java
@@ -0,0 +1,82 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.zendesk;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.IntrospectionSupport;
+
+/**
+ * A base class for Zendesk integration tests.
+ * <p>
+ * The camel-api-component-maven-plugin automatically generates a skeleton code of
+ * API integration tests in target/generated-test-sources/camel-component.
+ * To cover more API methods in integration tests, you can copy the test methods and
+ * routes from the skeleton code into one of the subclass of this class.
+ * </p>
+ */
+public class AbstractZendeskTestSupport extends CamelTestSupport {
+    private static final String TEST_OPTIONS_PROPERTIES = "/test-options.properties";
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        final CamelContext context = super.createCamelContext();
+        final Properties properties = new Properties();
+        try {
+            properties.load(getClass().getResourceAsStream(TEST_OPTIONS_PROPERTIES));
+        } catch (Exception e) {
+            throw new IOException(String.format("%s could not be loaded: %s", TEST_OPTIONS_PROPERTIES, e.getMessage()),
+                e);
+        }
+        Map<String, Object> options = new HashMap<String, Object>();
+        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+            options.put(entry.getKey().toString(), entry.getValue());
+        }
+
+        final ZendeskConfiguration configuration = new ZendeskConfiguration();
+        IntrospectionSupport.setProperties(configuration, options);
+
+        // add ZendeskComponent to Camel context
+        final ZendeskComponent component = new ZendeskComponent(context);
+        component.setConfiguration(configuration);
+        context.addComponent("zendesk", component);
+
+        return context;
+    }
+
+    @Override
+    public boolean isCreateCamelContextPerClass() {
+        // only create the context once for this class
+        return true;
+    }
+
+    @SuppressWarnings("unchecked")
+    protected <T> T requestBodyAndHeaders(String endpointUri, Object body, Map<String, Object> headers) {
+        return (T) template.requestBodyAndHeaders(endpointUri, body, headers);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected <T> T requestBody(String endpointUri, Object body) {
+        return (T) template.requestBody(endpointUri, body);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/ZendeskTicketIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/ZendeskTicketIntegrationTest.java b/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/ZendeskTicketIntegrationTest.java
new file mode 100644
index 0000000..de17730
--- /dev/null
+++ b/components/camel-zendesk/src/test/java/org/apache/camel/component/zendesk/ZendeskTicketIntegrationTest.java
@@ -0,0 +1,157 @@
+/**
+ * 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.zendesk;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.zendesk.internal.ZendeskApiMethod;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zendesk.client.v2.model.Comment;
+import org.zendesk.client.v2.model.Ticket;
+
+/**
+ * The integration tests for ticket related Zendesk API.
+ */
+public class ZendeskTicketIntegrationTest extends AbstractZendeskTestSupport {
+    private static final Logger LOG = LoggerFactory.getLogger(ZendeskTicketIntegrationTest.class);
+
+    @Test
+    public void testGetTickets() throws Exception {
+        final Iterable<?> result = requestBody("direct://GETTICKETS", null);
+
+        assertNotNull("getTickets result", result);
+        int count = 0;
+        for (Object ticket : result) {
+            LOG.info(ticket.toString());
+            count++;
+        }
+        LOG.info(count + " ticket(s) in total.");
+    }
+
+    @Test
+    public void testCreateUpdateCommentDeleteTicket() throws Exception {
+        // create new ticket
+        String ticketSubject = "Test Ticket";
+        String ticketDescription = "This is a test ticket from camel-zendesk.";
+        Ticket input = new Ticket();
+        input.setSubject(ticketSubject);
+        input.setDescription(ticketDescription);
+        Assert.assertNull(input.getId());
+        Assert.assertNull(input.getCreatedAt());
+        Ticket answer = requestBody("direct://CREATETICKET", input);
+        Assert.assertNotNull(answer.getId());
+        Assert.assertNotNull(answer.getCreatedAt());
+        Assert.assertEquals(answer.getCreatedAt(), answer.getUpdatedAt());
+        Assert.assertEquals(ticketSubject, answer.getSubject());
+        Assert.assertEquals(ticketDescription, answer.getDescription());
+
+        // update ticket description
+        Thread.sleep(3000);
+        String ticketSubjectUpdated = ticketSubject + " And updated.";
+        input = new Ticket();
+        input.setId(answer.getId());
+        input.setSubject(ticketSubjectUpdated);
+        answer = requestBody("direct://UPDATETICKET", input);
+        Assert.assertNotEquals(answer.getCreatedAt(), answer.getUpdatedAt());
+        Assert.assertEquals(ticketSubjectUpdated, answer.getSubject());
+        Assert.assertEquals(ticketDescription, answer.getDescription());
+
+        // get ticket and compare
+        Ticket answer2 = requestBody("direct://GETTICKET", answer.getId());
+        Assert.assertEquals(answer.getSubject(), answer2.getSubject());
+        Assert.assertEquals(answer.getDescription(), answer2.getDescription());
+        Assert.assertEquals(answer.getId(), answer2.getId());
+        Assert.assertEquals(answer.getCreatedAt(), answer2.getCreatedAt());
+        Assert.assertEquals(answer.getUpdatedAt(), answer2.getUpdatedAt());
+
+        // add a comment to the ticket
+        String commentBody = "This is a comment from camel-zendesk.";
+        final Map<String, Object> headers = new HashMap<String, Object>();
+        Assert.assertEquals("ticketId", ZendeskApiMethod.CREATECOMMENT.getArgNames().get(0));
+        Assert.assertEquals(long.class, ZendeskApiMethod.CREATECOMMENT.getArgTypes().get(0));
+        headers.put("CamelZendesk.ticketId", answer.getId());
+        Comment comment = new Comment();
+        comment.setBody(commentBody);
+        Assert.assertNull(comment.getId());
+        Assert.assertNull(comment.getCreatedAt());
+        Assert.assertEquals("comment", ZendeskApiMethod.CREATECOMMENT.getArgNames().get(1));
+        Assert.assertEquals(Comment.class, ZendeskApiMethod.CREATECOMMENT.getArgTypes().get(1));
+        headers.put("CamelZendesk.comment", comment);
+        requestBodyAndHeaders("direct://CREATECOMMENT", null, headers);
+        Iterable iterable = requestBody("direct://GETTICKETCOMMENTS", answer.getId());
+        Iterator iterator = iterable.iterator();
+        Comment comment1 = (Comment)iterator.next();
+        Assert.assertEquals(ticketDescription, comment1.getBody());
+        Assert.assertNotNull(comment1.getId());
+        Assert.assertNotNull(comment1.getCreatedAt());
+        Comment comment2 = (Comment)iterator.next();
+        Assert.assertEquals(commentBody, comment2.getBody());
+        Assert.assertNotNull(comment2.getId());
+        Assert.assertNotNull(comment2.getCreatedAt());
+
+        // delete ticket
+        requestBody("direct://DELETETICKET", answer.getId());
+        Ticket mustBeDeleted = requestBody("direct://GETTICKET", answer.getId());
+        Assert.assertNull(mustBeDeleted);
+    }
+
+    @Test
+    public void testInBodyParams() {
+        Assert.assertEquals("ticket", ZendeskApiMethod.CREATETICKET.getArgNames().get(0));
+        Assert.assertEquals(Ticket.class, ZendeskApiMethod.CREATETICKET.getArgTypes().get(0));
+        Assert.assertEquals("ticket", ZendeskApiMethod.UPDATETICKET.getArgNames().get(0));
+        Assert.assertEquals(Ticket.class, ZendeskApiMethod.UPDATETICKET.getArgTypes().get(0));
+        Assert.assertEquals("id", ZendeskApiMethod.GETTICKET.getArgNames().get(0));
+        Assert.assertEquals(long.class, ZendeskApiMethod.GETTICKET.getArgTypes().get(0));
+        Assert.assertEquals("id", ZendeskApiMethod.GETTICKETCOMMENTS.getArgNames().get(0));
+        Assert.assertEquals(long.class, ZendeskApiMethod.GETTICKETCOMMENTS.getArgTypes().get(0));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct://GETTICKETS")
+                    .to("zendesk://getTickets");
+
+                from("direct://CREATETICKET")
+                    .to("zendesk://createTicket?inBody=ticket");
+
+                from("direct://UPDATETICKET")
+                    .to("zendesk://updateTicket?inBody=ticket");
+
+                from("direct://GETTICKET")
+                    .to("zendesk://getTicket?inBody=id");
+
+                from("direct://CREATECOMMENT")
+                    .to("zendesk://createComment");
+
+                from("direct://GETTICKETCOMMENTS")
+                    .to("zendesk://getTicketComments?inBody=id");
+
+                from("direct://DELETETICKET")
+                    .to("zendesk://deleteTicket?inBody=id");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/test/resources/log4j2.properties
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/test/resources/log4j2.properties b/components/camel-zendesk/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..7dba828
--- /dev/null
+++ b/components/camel-zendesk/src/test/resources/log4j2.properties
@@ -0,0 +1,30 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-zendesk-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = [%30.30t] %-30.30c{1} %-5p %m%n
+logger.springframework.name = org.springframework
+logger.springframework.level = WARN
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/camel-zendesk/src/test/resources/test-options.properties
----------------------------------------------------------------------
diff --git a/components/camel-zendesk/src/test/resources/test-options.properties b/components/camel-zendesk/src/test/resources/test-options.properties
new file mode 100644
index 0000000..88423ae
--- /dev/null
+++ b/components/camel-zendesk/src/test/resources/test-options.properties
@@ -0,0 +1,29 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+###############################################
+## Authentication properties for Zendesk Component
+###############################################
+
+#############################################################################
+## Authentication properties for Zendesk Component
+#############################################################################
+## User name and password
+## Create a 30 days trial account on http://www.zendesk.com/ and provide server URL, user name and password
+serverUrl=https://${yoururlprefix}.zendesk.com
+username=
+password=

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/pom.xml
----------------------------------------------------------------------
diff --git a/components/pom.xml b/components/pom.xml
index be5e3af..1d8a1cd 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -288,6 +288,7 @@
     <module>camel-xmpp</module>
     <module>camel-xstream</module>
     <module>camel-yammer</module>
+    <module>camel-zendesk</module>
     <module>camel-zipfile</module>
     <module>camel-zipkin</module>
     <module>camel-zookeeper</module>

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/components/readme.adoc
----------------------------------------------------------------------
diff --git a/components/readme.adoc b/components/readme.adoc
index 2c9e388..11ab028 100644
--- a/components/readme.adoc
+++ b/components/readme.adoc
@@ -674,6 +674,9 @@ Number of Components: 224 in 178 JAR artifacts (13 deprecated)
 | link:camel-yammer/src/main/docs/yammer-component.adoc[Yammer] (camel-yammer) +
 `yammer:function` | 2.12 | The yammer component allows you to interact with the Yammer enterprise social network.
 
+| link:camel-zendesk/src/main/docs/zendesk-component.adoc[Zendesk] (camel-zendesk) +
+`zendesk:methodName` | 2.19 | The zendesk endpoint interacts with the Zendesk server.
+
 | link:camel-zookeeper/src/main/docs/zookeeper-component.adoc[ZooKeeper] (camel-zookeeper) +
 `zookeeper:serverUrls/path` | 2.9 | The zookeeper component allows interaction with a ZooKeeper cluster.
 

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/docs/user-manual/en/SUMMARY.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md
index 327413e..4f3bd3b 100644
--- a/docs/user-manual/en/SUMMARY.md
+++ b/docs/user-manual/en/SUMMARY.md
@@ -321,6 +321,7 @@
 	* [XMPP](xmpp-component.adoc)
 	* [XQuery](xquery-component.adoc)
 	* [Yammer](yammer-component.adoc)
+	* [Zendesk](zendesk-component.adoc)
 	* [ZooKeeper](zookeeper-component.adoc)
 	* [ZooKeeper Master](zookeeper-master-component.adoc)
 <!-- components: END -->

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 0a6c4dd..fc09d30 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -684,6 +684,7 @@
     <xstream-version>1.4.9</xstream-version>
     <xom-version>1.2.5</xom-version>
     <yammer-metrics-version>2.2.0</yammer-metrics-version>
+    <zendesk-client-version>0.5.3</zendesk-client-version>
     <zipkin-version>1.19.4</zipkin-version>
     <zipkin-reporter-version>0.6.12</zipkin-reporter-version>
     <zjsonpatch-version>0.3.0</zjsonpatch-version>
@@ -2035,6 +2036,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-zendesk</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-zipfile</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -3269,6 +3275,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-zendesk-starter</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-zipfile-starter</artifactId>
         <version>${project.version}</version>
       </dependency>
@@ -4150,6 +4161,19 @@
         <version>${exec-maven-plugin-version}</version>
       </dependency>
 
+      <!-- Optional Zendesk -->
+      <dependency>
+        <groupId>com.cloudbees.thirdparty</groupId>
+        <artifactId>zendesk-java-client</artifactId>
+        <version>${zendesk-client-version}</version>
+      </dependency>
+      <dependency>
+        <groupId>com.cloudbees.thirdparty</groupId>
+        <artifactId>zendesk-java-client</artifactId>
+        <classifier>javadoc</classifier>
+        <version>${zendesk-client-version}</version>
+      </dependency>
+
       <!-- Optional Jira -->
       <dependency>
         <groupId>com.atlassian.jira</groupId>

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/platforms/spring-boot/components-starter/camel-zendesk-starter/pom.xml
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-zendesk-starter/pom.xml b/platforms/spring-boot/components-starter/camel-zendesk-starter/pom.xml
new file mode 100644
index 0000000..cacb830
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-zendesk-starter/pom.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>components-starter</artifactId>
+    <version>2.19.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>camel-zendesk-starter</artifactId>
+  <packaging>jar</packaging>
+  <name>Spring-Boot Starter :: Camel :: Zendesk</name>
+  <description>Spring-Boot Starter for Camel Zendesk Component</description>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+      <version>${spring-boot-version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-zendesk</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <!--START OF GENERATED CODE-->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-spring-boot-starter</artifactId>
+    </dependency>
+    <!--END OF GENERATED CODE-->
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/camel/blob/a0a2c997/platforms/spring-boot/components-starter/camel-zendesk-starter/src/main/java/org/apache/camel/component/zendesk/springboot/ZendeskComponentAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-zendesk-starter/src/main/java/org/apache/camel/component/zendesk/springboot/ZendeskComponentAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-zendesk-starter/src/main/java/org/apache/camel/component/zendesk/springboot/ZendeskComponentAutoConfiguration.java
new file mode 100644
index 0000000..d181838
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-zendesk-starter/src/main/java/org/apache/camel/component/zendesk/springboot/ZendeskComponentAutoConfiguration.java
@@ -0,0 +1,111 @@
+/**
+ * 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.zendesk.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.zendesk.ZendeskComponent;
+import org.apache.camel.util.IntrospectionSupport;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionMessage;
+import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
+import org.springframework.boot.bind.RelaxedPropertyResolver;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+/**
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Configuration
+@ConditionalOnBean(type = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+@Conditional(ZendeskComponentAutoConfiguration.Condition.class)
+@AutoConfigureAfter(name = "org.apache.camel.spring.boot.CamelAutoConfiguration")
+@EnableConfigurationProperties(ZendeskComponentConfiguration.class)
+public class ZendeskComponentAutoConfiguration {
+
+    @Lazy
+    @Bean(name = "zendesk-component")
+    @ConditionalOnClass(CamelContext.class)
+    @ConditionalOnMissingBean(ZendeskComponent.class)
+    public ZendeskComponent configureZendeskComponent(
+            CamelContext camelContext,
+            ZendeskComponentConfiguration configuration) throws Exception {
+        ZendeskComponent component = new ZendeskComponent();
+        component.setCamelContext(camelContext);
+        Map<String, Object> parameters = new HashMap<>();
+        IntrospectionSupport.getProperties(configuration, parameters, null,
+                false);
+        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
+            Object value = entry.getValue();
+            Class<?> paramClass = value.getClass();
+            if (paramClass.getName().endsWith("NestedConfiguration")) {
+                Class nestedClass = null;
+                try {
+                    nestedClass = (Class) paramClass.getDeclaredField(
+                            "CAMEL_NESTED_CLASS").get(null);
+                    HashMap<String, Object> nestedParameters = new HashMap<>();
+                    IntrospectionSupport.getProperties(value, nestedParameters,
+                            null, false);
+                    Object nestedProperty = nestedClass.newInstance();
+                    IntrospectionSupport.setProperties(camelContext,
+                            camelContext.getTypeConverter(), nestedProperty,
+                            nestedParameters);
+                    entry.setValue(nestedProperty);
+                } catch (NoSuchFieldException e) {
+                }
+            }
+        }
+        IntrospectionSupport.setProperties(camelContext,
+                camelContext.getTypeConverter(), component, parameters);
+        return component;
+    }
+
+    public static class Condition extends SpringBootCondition {
+        @Override
+        public ConditionOutcome getMatchOutcome(
+                ConditionContext conditionContext,
+                AnnotatedTypeMetadata annotatedTypeMetadata) {
+            boolean groupEnabled = isEnabled(conditionContext,
+                    "camel.component.", true);
+            ConditionMessage.Builder message = ConditionMessage
+                    .forCondition("camel.component.zendesk");
+            if (isEnabled(conditionContext, "camel.component.zendesk.",
+                    groupEnabled)) {
+                return ConditionOutcome.match(message.because("enabled"));
+            }
+            return ConditionOutcome.noMatch(message.because("not enabled"));
+        }
+
+        private boolean isEnabled(
+                org.springframework.context.annotation.ConditionContext context,
+                java.lang.String prefix, boolean defaultValue) {
+            RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(
+                    context.getEnvironment(), prefix);
+            return resolver.getProperty("enabled", Boolean.class, defaultValue);
+        }
+    }
+}
\ No newline at end of file