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/06/02 07:16:50 UTC

[3/7] camel git commit: CAMEL-11373: Create a Camel Twilio component

CAMEL-11373: Create a Camel Twilio component


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

Branch: refs/heads/master
Commit: e23104309cc32f608dc28b0f34e764583dcb988b
Parents: f824fb0
Author: Tadayoshi Sato <sa...@gmail.com>
Authored: Thu Jun 1 19:53:33 2017 +0900
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Jun 2 09:05:13 2017 +0200

----------------------------------------------------------------------
 apache-camel/pom.xml                            |   4 +
 .../src/main/descriptors/common-bin.xml         |   1 +
 components/camel-twilio/pom.xml                 | 703 +++++++++++++++++++
 .../src/main/docs/twilio-component.adoc         | 194 +++++
 .../camel/component/twilio/TwilioComponent.java | 100 +++
 .../component/twilio/TwilioConfiguration.java   | 131 ++++
 .../camel/component/twilio/TwilioConsumer.java  |  42 ++
 .../camel/component/twilio/TwilioConverter.java | 298 ++++++++
 .../camel/component/twilio/TwilioEndpoint.java  | 135 ++++
 .../camel/component/twilio/TwilioProducer.java  |  44 ++
 .../twilio/internal/TwilioConstants.java        |  33 +
 .../twilio/internal/TwilioPropertiesHelper.java |  39 +
 .../src/main/resources/META-INF/LICENSE.txt     | 203 ++++++
 .../src/main/resources/META-INF/NOTICE.txt      |  11 +
 .../services/org/apache/camel/TypeConverter     |  18 +
 .../services/org/apache/camel/component/twilio  |  18 +
 .../twilio/AbstractTwilioTestSupport.java       |  82 +++
 .../twilio/AccountIntegrationTest.java          | 104 +++
 .../src/test/resources/log4j2.properties        |  32 +
 .../src/test/resources/test-options.properties  |  24 +
 components/pom.xml                              |   1 +
 docs/user-manual/en/SUMMARY.md                  |   1 +
 parent/pom.xml                                  |   6 +
 .../camel-twilio-starter/pom.xml                |  61 ++
 .../TwilioComponentAutoConfiguration.java       | 128 ++++
 .../TwilioComponentConfiguration.java           | 148 ++++
 .../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 |  17 +
 .../spring-boot/components-starter/pom.xml      |   1 +
 32 files changed, 2822 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/apache-camel/pom.xml
----------------------------------------------------------------------
diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml
index 2529409..3c8b259 100644
--- a/apache-camel/pom.xml
+++ b/apache-camel/pom.xml
@@ -1039,6 +1039,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-twilio</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-twitter</artifactId>
     </dependency>
     <dependency>

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/apache-camel/src/main/descriptors/common-bin.xml
----------------------------------------------------------------------
diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml
index 01a32d6..a3dd322 100644
--- a/apache-camel/src/main/descriptors/common-bin.xml
+++ b/apache-camel/src/main/descriptors/common-bin.xml
@@ -267,6 +267,7 @@
         <include>org.apache.camel:camel-test-spring</include>
         <include>org.apache.camel:camel-testng</include>
         <include>org.apache.camel:camel-tika</include>
+        <include>org.apache.camel:camel-twilio</include>
         <include>org.apache.camel:camel-twitter</include>
         <include>org.apache.camel:camel-undertow</include>
         <include>org.apache.camel:camel-univocity-parsers</include>

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-twilio/pom.xml b/components/camel-twilio/pom.xml
new file mode 100644
index 0000000..a3e8dcd
--- /dev/null
+++ b/components/camel-twilio/pom.xml
@@ -0,0 +1,703 @@
+<?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.20.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>camel-twilio</artifactId>
+  <packaging>jar</packaging>
+  <name>Camel :: Twilio</name>
+  <description>Camel Component for Twilio</description>
+
+  <properties>
+    <schemeName>twilio</schemeName>
+    <componentName>Twilio</componentName>
+    <componentPackage>org.apache.camel.component.twilio</componentPackage>
+    <outPackage>org.apache.camel.component.twilio.internal</outPackage>
+
+    <camel.osgi.export.pkg>${componentPackage}</camel.osgi.export.pkg>
+    <camel.osgi.private.pkg>${outPackage}</camel.osgi.private.pkg>
+    <camel.osgi.export.service>org.apache.camel.spi.ComponentResolver;component=twilio</camel.osgi.export.service>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core</artifactId>
+    </dependency>
+
+    <!-- Twilio Java SDK -->
+    <dependency>
+      <groupId>com.twilio.sdk</groupId>
+      <artifactId>twilio</artifactId>
+      <version>${twilio-version}</version>
+    </dependency>
+
+    <!-- Camel annotations in provided scope to avoid compile errors in IDEs -->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>spi-annotations</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <!-- Component API javadoc in provided scope to read API signatures -->
+    <dependency>
+      <groupId>com.twilio.sdk</groupId>
+      <artifactId>twilio</artifactId>
+      <version>${twilio-version}</version>
+      <classifier>javadoc</classifier>
+      <scope>provided</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>
+
+    <!-- testing -->
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <defaultGoal>install</defaultGoal>
+
+    <plugins>
+
+      <!-- generate Component source and test source -->
+      <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>account</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.Account</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account -->
+                <api>
+                  <apiName>address</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Address</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>application</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Application</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>available-phone-number-country</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.AvailablePhoneNumberCountry</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>call</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Call</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>conference</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Conference</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>connect-app</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.ConnectApp</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>incoming-phone-number</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.IncomingPhoneNumber</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>key</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Key</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>message</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Message</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>new-key</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.NewKey</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>new-signing-key</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.NewSigningKey</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>notification</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Notification</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>outgoing-caller-id</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.OutgoingCallerId</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>queue</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Queue</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>recording</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Recording</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>short-code</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.ShortCode</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>signing-key</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.SigningKey</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>token</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Token</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>transcription</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.Transcription</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>validation-request</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.ValidationRequest</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.address -->
+                <api>
+                  <apiName>address-dependent-phone-number</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.address.DependentPhoneNumber</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.availablephonenumbercountry -->
+                <api>
+                  <apiName>available-phone-number-country-local</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.availablephonenumbercountry.Local</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>available-phone-number-country-mobile</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.availablephonenumbercountry.Mobile</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>available-phone-number-country-toll-free</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.availablephonenumbercountry.TollFree</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.call -->
+                <api>
+                  <apiName>call-feedback</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.call.Feedback</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>call-feedback-summary</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.call.FeedbackSummary</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>call-notification</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.call.Notification</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>call-recording</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.call.Recording</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.conference -->
+                <api>
+                  <apiName>conference-participant</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.conference.Participant</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.incomingphonenumber -->
+                <api>
+                  <apiName>incoming-phone-number-local</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.incomingphonenumber.Local</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>incoming-phone-number-mobile</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.incomingphonenumber.Mobile</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>incoming-phone-number-toll-free</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.incomingphonenumber.TollFree</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.message -->
+                <api>
+                  <apiName>message-feedback</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.message.Feedback</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>message-media</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.message.Media</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.queue -->
+                <api>
+                  <apiName>queue-member</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.queue.Member</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.recording -->
+                <api>
+                  <apiName>recording-add-on-result</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.recording.AddOnResult</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>recording-transcription</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.recording.Transcription</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.recording.addonresult -->
+                <api>
+                  <apiName>recording-add-on-result-payload</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.recording.addonresult.Payload</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.sip -->
+                <api>
+                  <apiName>sip-credential-list</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.CredentialList</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>sip-domain</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.Domain</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>sip-ip-access-control-list</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.IpAccessControlList</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.sip.credentiallist -->
+                <api>
+                  <apiName>sip-credential-list-credential</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.credentiallist.Credential</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.sip.domain -->
+                <api>
+                  <apiName>sip-domain-credential-list-mapping</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.domain.CredentialListMapping</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>sip-domain-ip-access-control-list-mapping</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.domain.IpAccessControlListMapping</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.sip.ipaccesscontrollist -->
+                <api>
+                  <apiName>sip-ip-access-control-list-ip-address</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.sip.ipaccesscontrollist.IpAddress</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.usage -->
+                <api>
+                  <apiName>usage-record</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.Record</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-trigger</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.Trigger</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <!-- Package: com.twilio.rest.api.v2010.account.usage.record -->
+                <api>
+                  <apiName>usage-record-all-time</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.AllTime</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-daily</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.Daily</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-last-month</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.LastMonth</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-monthly</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.Monthly</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-this-month</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.ThisMonth</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-today</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.Today</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-yearly</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.Yearly</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+                <api>
+                  <apiName>usage-record-yesterday</apiName>
+                  <proxyClass>com.twilio.rest.api.v2010.account.usage.record.Yesterday</proxyClass>
+                  <fromJavadoc>
+                    <includeMethods>creator|deleter|fetcher|reader|updater</includeMethods>
+                    <includeStaticMethods>true</includeStaticMethods>
+                  </fromJavadoc>
+                </api>
+              </apis>
+              <aliases>
+                <alias>
+                  <methodPattern>^creator$</methodPattern>
+                  <methodAlias>create</methodAlias>
+                </alias>
+                <alias>
+                  <methodPattern>^deleter$</methodPattern>
+                  <methodAlias>delete</methodAlias>
+                </alias>
+                <alias>
+                  <methodPattern>^fetcher$</methodPattern>
+                  <methodAlias>fetch</methodAlias>
+                </alias>
+                <alias>
+                  <methodPattern>^reader$</methodPattern>
+                  <methodAlias>read</methodAlias>
+                </alias>
+                <alias>
+                  <methodPattern>^updater$</methodPattern>
+                  <methodAlias>update</methodAlias>
+                </alias>
+              </aliases>
+            </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>
+
+  <profiles>
+    <profile>
+      <id>twilio-test</id>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <version>${maven-surefire-plugin-version}</version>
+            <configuration>
+              <childDelegation>false</childDelegation>
+              <useFile>true</useFile>
+              <forkCount>1</forkCount>
+              <reuseForks>true</reuseForks>
+              <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>
+              <excludes>
+                <exclude>**/*XXXTest.java</exclude>
+              </excludes>
+              <includes>
+                <include>**/*Test.java</include>
+              </includes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/docs/twilio-component.adoc
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/docs/twilio-component.adoc b/components/camel-twilio/src/main/docs/twilio-component.adoc
new file mode 100644
index 0000000..16c0d8e
--- /dev/null
+++ b/components/camel-twilio/src/main/docs/twilio-component.adoc
@@ -0,0 +1,194 @@
+## Twilio Component
+
+*Available as of Camel version 2.20*
+
+The Twilio component provides access to Version 2010-04-01 of Twilio REST APIs accessible
+using https://github.com/twilio/twilio-java[Twilio Java SDK].
+
+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-twilio</artifactId>
+        <version>${camel-version}</version>
+    </dependency>
+-------------------------------------------------
+
+
+### Twilio Options
+
+// component options: START
+The Twilio component supports 3 options which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|=======================================================================
+| Name | Description | Default | Type
+| **configuration** (advanced) | To use the shared configuration |  | TwilioConfiguration
+| **restClient** (advanced) | To use the shared REST client |  | TwilioRestClient
+| **resolveProperty Placeholders** (advanced) | Whether the component should resolve property placeholders on itself when starting. Only properties which are of String type can use property placeholders. | true | boolean
+|=======================================================================
+// component options: END
+
+// endpoint options: START
+The Twilio endpoint is configured using URI syntax:
+
+    twilio:apiName/methodName
+
+with the following path and query parameters:
+
+#### Path Parameters (2 parameters):
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|=======================================================================
+| Name | Description | Default | Type
+| **apiName** | *Required* What kind of operation to perform |  | TwilioApiName
+| **methodName** | *Required* What sub operation to use for the selected operation |  | String
+|=======================================================================
+
+#### Query Parameters (8 parameters):
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|=======================================================================
+| Name | Description | Default | Type
+| **inBody** (common) | Sets the name of a parameter to be passed in the exchange In Body |  | String
+| **bridgeErrorHandler** (consumer) | Allows for bridging the consumer to the Camel routing Error Handler which mean any exceptions occurred while the consumer is trying to pickup incoming messages or the likes will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions that will be logged at WARN or ERROR level and ignored. | false | boolean
+| **exceptionHandler** (consumer) | 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. |  | ExceptionHandler
+| **exchangePattern** (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
+| **synchronous** (advanced) | Sets whether synchronous processing should be strictly used or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+| **accountSid** (security) | The account SID to use. |  | String
+| **password** (security) | Auth token for the account. |  | String
+| **username** (security) | The account to use. |  | String
+|=======================================================================
+// endpoint options: END
+
+
+### URI format
+
+[source,java]
+-------------------------------------------------
+    twilio://endpoint-prefix/endpoint?[options]
+-------------------------------------------------
+
+Endpoint prefix can be one of:
+
+* account
+* address
+* address-dependent-phone-number
+* application
+* available-phone-number-country
+* available-phone-number-country-local
+* available-phone-number-country-mobile
+* available-phone-number-country-toll-free
+* call
+* call-feedback
+* call-feedback-summary
+* call-notification
+* call-recording
+* conference
+* conference-participant
+* connect-app
+* incoming-phone-number
+* incoming-phone-number-local
+* incoming-phone-number-mobile
+* incoming-phone-number-toll-free
+* key
+* message
+* message-feedback
+* message-media
+* new-key
+* new-signing-key
+* notification
+* outgoing-caller-id
+* queue
+* queue-member
+* recording
+* recording-add-on-result
+* recording-add-on-result-payload
+* recording-transcription
+* short-code
+* signing-key
+* sip-credential-list
+* sip-credential-list-credential
+* sip-domain
+* sip-domain-credential-list-mapping
+* sip-domain-ip-access-control-list-mapping
+* sip-ip-access-control-list
+* sip-ip-access-control-list-ip-address
+* token
+* transcription
+* usage-record
+* usage-record-all-time
+* usage-record-daily
+* usage-record-last-month
+* usage-record-monthly
+* usage-record-this-month
+* usage-record-today
+* usage-record-yearly
+* usage-record-yesterday
+* usage-trigger
+* validation-request
+
+
+### Producer Endpoints:
+
+Producer endpoints can use endpoint prefixes followed by endpoint names
+and associated options described next. A shorthand alias can be used for
+all of the endpoints. The endpoint URI MUST contain a prefix.
+
+Any of the endpoint options can be provided in either the endpoint URI,
+or dynamically in a message header. The message header name must be of
+the format *`CamelTwilio.<option>`*. Note that the *`inBody`* option
+overrides message header, i.e. the endpoint option *`inBody=option`*
+would override a *`CamelTwilio.option`* header.
+
+Endpoint can be one of:
+
+[width="100%",cols="50%,50%",options="header"]
+|=======================================================================
+| Endpoint  | Shorthand Alias
+| *creator* | create
+| *deleter* | delete
+| *fetcher* | fetch
+| *reader*  | read
+| *updater* | update
+|=======================================================================
+
+Available endpoints differ depending on the endpoint prefixes.
+
+For more information on the endpoints and options see API documentation at:
+https://twilio.github.io/twilio-java/7.9.1/index.html
+
+
+### 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.
+
+If you want to receive calls or messages from Twilio and respond to them
+using a Camel consumer endpoint, you can use other HTTP-based components
+such as *camel-servlet*, *camel-undertow*, *camel-jetty*, and *camel-netty-http*
+to respond with https://www.twilio.com/docs/api/twiml[TwiML].
+
+
+### Message header
+
+Any of the options can be provided in a message header for producer
+endpoints with *CamelTwilio.* prefix.
+
+
+### Message body
+
+All result message bodies utilize objects provided by the Twilio Java SDK.
+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/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioComponent.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioComponent.java
new file mode 100644
index 0000000..58031df
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioComponent.java
@@ -0,0 +1,100 @@
+/**
+ * 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.twilio;
+
+import com.twilio.http.TwilioRestClient;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.twilio.internal.TwilioApiCollection;
+import org.apache.camel.component.twilio.internal.TwilioApiName;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.util.component.AbstractApiComponent;
+
+/**
+ * Represents the component that manages {@link TwilioEndpoint}.
+ */
+public class TwilioComponent extends AbstractApiComponent<TwilioApiName, TwilioConfiguration, TwilioApiCollection> {
+
+    @Metadata(label = "advanced")
+    private TwilioConfiguration configuration = new TwilioConfiguration();
+
+    @Metadata(label = "advanced")
+    private TwilioRestClient restClient;
+
+    public TwilioComponent() {
+        super(TwilioEndpoint.class, TwilioApiName.class, TwilioApiCollection.getCollection());
+    }
+
+    public TwilioComponent(CamelContext context) {
+        super(context, TwilioEndpoint.class, TwilioApiName.class, TwilioApiCollection.getCollection());
+    }
+
+    @Override
+    protected TwilioApiName getApiName(String apiNameStr) throws IllegalArgumentException {
+        return TwilioApiName.fromValue(apiNameStr);
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String methodName, TwilioApiName apiName,
+                                      TwilioConfiguration endpointConfiguration) {
+        endpointConfiguration.setApiName(apiName);
+        endpointConfiguration.setMethodName(methodName);
+        return new TwilioEndpoint(uri, this, apiName, methodName, endpointConfiguration);
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        if (restClient == null) {
+            if (configuration == null) {
+                throw new IllegalStateException("Unable to initialise Twilio, Twilio component configuration is missing");
+            }
+            restClient = new TwilioRestClient.Builder(configuration.getUsername(), configuration.getPassword())
+                .accountSid(configuration.getAccountSid())
+                .build();
+        }
+    }
+
+    @Override
+    public void doShutdown() throws Exception {
+        restClient = null;
+        super.doShutdown();
+    }
+
+    public TwilioConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * To use the shared configuration
+     */
+    public void setConfiguration(TwilioConfiguration configuration) {
+        this.configuration = configuration;
+    }
+
+    public TwilioRestClient getRestClient() {
+        return restClient;
+    }
+
+    /**
+     * To use the shared REST client
+     */
+    public void setRestClient(TwilioRestClient restClient) {
+        this.restClient = restClient;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConfiguration.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConfiguration.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConfiguration.java
new file mode 100644
index 0000000..cef2b3a
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConfiguration.java
@@ -0,0 +1,131 @@
+/**
+ * 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.twilio;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.twilio.internal.TwilioApiName;
+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 Twilio component.
+ */
+@UriParams
+public class TwilioConfiguration implements Cloneable {
+
+    @UriPath
+    @Metadata(required = "true")
+    private TwilioApiName apiName;
+
+    @UriPath(enums = "create,delete,fetch,read,update")
+    @Metadata(required = "true")
+    private String methodName;
+
+    @UriParam(label = "common,security", secret = true)
+    private String username;
+
+    @UriParam(label = "common,security", secret = true)
+    private String password;
+
+    @UriParam(label = "common,security", secret = true)
+    private String accountSid;
+
+    /**
+     * Returns a copy of this configuration
+     */
+    public TwilioConfiguration copy() {
+        try {
+            return (TwilioConfiguration) clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+    /**
+     * What kind of operation to perform
+     *
+     * @return the API Name
+     */
+    public TwilioApiName getApiName() {
+
+        return apiName;
+    }
+
+    /**
+     * What kind of operation to perform
+     *
+     * @param apiName
+     *            the API Name to set
+     */
+    public void setApiName(TwilioApiName apiName) {
+        this.apiName = apiName;
+    }
+
+    /**
+     * What sub operation to use for the selected operation
+     *
+     * @return the methodName
+     */
+    public String getMethodName() {
+        return methodName;
+    }
+
+    /**
+     * What sub operation to use for the selected operation
+     *
+     * @param methodName
+     *            the methodName to set
+     */
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    /**
+     * The account to use.
+     */
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    /**
+     * Auth token for the account.
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getAccountSid() {
+        return accountSid == null ? username : accountSid;
+    }
+
+    /**
+     * The account SID to use.
+     */
+    public void setAccountSid(String accountSid) {
+        this.accountSid = accountSid;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConsumer.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConsumer.java
new file mode 100644
index 0000000..b0ebae5
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConsumer.java
@@ -0,0 +1,42 @@
+/**
+ * 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.twilio;
+
+import java.util.Map;
+
+import org.apache.camel.Processor;
+import org.apache.camel.component.twilio.internal.TwilioApiName;
+import org.apache.camel.util.component.AbstractApiConsumer;
+
+/**
+ * The Twilio consumer.
+ */
+public class TwilioConsumer extends AbstractApiConsumer<TwilioApiName, TwilioConfiguration> {
+
+    protected final TwilioEndpoint endpoint;
+
+    public TwilioConsumer(TwilioEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected Object doInvokeMethod(Map<String, Object> args) {
+        Object executor = super.doInvokeMethod(args);
+        return endpoint.execute(executor, method, args);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConverter.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConverter.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConverter.java
new file mode 100644
index 0000000..c9313bb
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioConverter.java
@@ -0,0 +1,298 @@
+/**
+ * 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.twilio;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import com.twilio.rest.api.v2010.Account;
+import com.twilio.rest.api.v2010.account.AuthorizedConnectApp;
+import com.twilio.rest.api.v2010.account.Call;
+import com.twilio.rest.api.v2010.account.Conference;
+import com.twilio.rest.api.v2010.account.ConnectApp;
+import com.twilio.rest.api.v2010.account.IncomingPhoneNumber;
+import com.twilio.rest.api.v2010.account.Message;
+import com.twilio.rest.api.v2010.account.Recording;
+import com.twilio.rest.api.v2010.account.Transcription;
+import com.twilio.rest.api.v2010.account.call.Feedback;
+import com.twilio.rest.api.v2010.account.call.FeedbackSummary;
+import com.twilio.rest.api.v2010.account.conference.Participant;
+import com.twilio.rest.api.v2010.account.incomingphonenumber.Local;
+import com.twilio.rest.api.v2010.account.incomingphonenumber.Mobile;
+import com.twilio.rest.api.v2010.account.incomingphonenumber.TollFree;
+import com.twilio.rest.api.v2010.account.recording.AddOnResult;
+import com.twilio.rest.api.v2010.account.usage.Record;
+import com.twilio.rest.api.v2010.account.usage.Trigger;
+import com.twilio.rest.api.v2010.account.usage.record.AllTime;
+import com.twilio.rest.api.v2010.account.usage.record.Daily;
+import com.twilio.rest.api.v2010.account.usage.record.LastMonth;
+import com.twilio.rest.api.v2010.account.usage.record.Monthly;
+import com.twilio.rest.api.v2010.account.usage.record.ThisMonth;
+import com.twilio.rest.api.v2010.account.usage.record.Today;
+import com.twilio.rest.api.v2010.account.usage.record.Yearly;
+import com.twilio.rest.api.v2010.account.usage.record.Yesterday;
+import com.twilio.type.PhoneNumber;
+import com.twilio.type.Sip;
+import org.apache.camel.Converter;
+
+@Converter
+public final class TwilioConverter {
+
+    private TwilioConverter() {
+        //Utility Class
+    }
+
+    @Converter
+    public static URI toURI(String value) throws URISyntaxException {
+        return new URI(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.type
+    // -----------------------------------------------------
+
+    @Converter
+    public static PhoneNumber toPhoneNumber(String value) {
+        return new PhoneNumber(value);
+    }
+
+    @Converter
+    public static Sip toSip(String value) {
+        return new Sip(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010
+    // -----------------------------------------------------
+
+    @Converter
+    public static Account.Status toAccountStatus(String value) {
+        return Account.Status.forValue(value);
+    }
+
+    @Converter
+    public static Account.Type toAccountType(String value) {
+        return Account.Type.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account
+    // -----------------------------------------------------
+
+    @Converter
+    public static AuthorizedConnectApp.Permission toAuthorizedConnectAppPermission(String value) {
+        return AuthorizedConnectApp.Permission.forValue(value);
+    }
+
+    @Converter
+    public static Call.Event toCallEvent(String value) {
+        return Call.Event.forValue(value);
+    }
+
+    @Converter
+    public static Call.Status toCallStatus(String value) {
+        return Call.Status.forValue(value);
+    }
+
+    @Converter
+    public static Call.UpdateStatus toCallUpdateStatus(String value) {
+        return Call.UpdateStatus.forValue(value);
+    }
+
+    @Converter
+    public static Conference.Status toConferenceStatus(String value) {
+        return Conference.Status.forValue(value);
+    }
+
+    @Converter
+    public static Conference.UpdateStatus toConferenceUpdateStatus(String value) {
+        return Conference.UpdateStatus.forValue(value);
+    }
+
+    @Converter
+    public static ConnectApp.Permission toConnectAppPermission(String value) {
+        return ConnectApp.Permission.forValue(value);
+    }
+
+    @Converter
+    public static IncomingPhoneNumber.AddressRequirement toIncomingPhoneNumberAddressRequirement(String value) {
+        return IncomingPhoneNumber.AddressRequirement.forValue(value);
+    }
+
+    @Converter
+    public static IncomingPhoneNumber.EmergencyStatus toIncomingPhoneNumberEmergencyStatus(String value) {
+        return IncomingPhoneNumber.EmergencyStatus.forValue(value);
+    }
+
+    @Converter
+    public static Message.Direction toMessageDirection(String value) {
+        return Message.Direction.forValue(value);
+    }
+
+    @Converter
+    public static Message.Status toMessageStatus(String value) {
+        return Message.Status.forValue(value);
+    }
+
+    @Converter
+    public static Recording.Source toRecordingSource(String value) {
+        return Recording.Source.forValue(value);
+    }
+
+    @Converter
+    public static Recording.Status toRecordingStatus(String value) {
+        return Recording.Status.forValue(value);
+    }
+
+    @Converter
+    public static Transcription.Status toTranscriptionStatus(String value) {
+        return Transcription.Status.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.call
+    // -----------------------------------------------------
+
+    @Converter
+    public static Feedback.Issues toFeedbackIssues(String value) {
+        return Feedback.Issues.forValue(value);
+    }
+
+    @Converter
+    public static FeedbackSummary.Status toFeedbackSummaryStatus(String value) {
+        return FeedbackSummary.Status.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.conference
+    // -----------------------------------------------------
+
+    @Converter
+    public static Participant.Status toParticipantStatus(String value) {
+        return Participant.Status.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.incomingphonenumber
+    // -----------------------------------------------------
+
+    @Converter
+    public static Local.AddressRequirement toLocalAddressRequirement(String value) {
+        return Local.AddressRequirement.forValue(value);
+    }
+
+    @Converter
+    public static Mobile.AddressRequirement toMobileAddressRequirement(String value) {
+        return Mobile.AddressRequirement.forValue(value);
+    }
+
+    @Converter
+    public static TollFree.AddressRequirement toTollFreeAddressRequirement(String value) {
+        return TollFree.AddressRequirement.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.message
+    // -----------------------------------------------------
+
+    @Converter
+    public static com.twilio.rest.api.v2010.account.message.Feedback.Outcome toFeedbackOutcome(String value) {
+        return com.twilio.rest.api.v2010.account.message.Feedback.Outcome.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.recording
+    // -----------------------------------------------------
+
+    @Converter
+    public static AddOnResult.Status toAddOnResultStatus(String value) {
+        return AddOnResult.Status.forValue(value);
+    }
+
+    @Converter
+    public static com.twilio.rest.api.v2010.account.recording.Transcription.Status toRecordingTranscriptionStatus(String value) {
+        return com.twilio.rest.api.v2010.account.recording.Transcription.Status.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.usage
+    // -----------------------------------------------------
+
+    @Converter
+    public static Record.Category toRecordCategory(String value) {
+        return Record.Category.forValue(value);
+    }
+
+    @Converter
+    public static Trigger.Recurring toTriggerRecurring(String value) {
+        return Trigger.Recurring.forValue(value);
+    }
+
+    @Converter
+    public static Trigger.TriggerField toTriggerTriggerField(String value) {
+        return Trigger.TriggerField.forValue(value);
+    }
+
+    @Converter
+    public static Trigger.UsageCategory toTriggerUsageCategory(String value) {
+        return Trigger.UsageCategory.forValue(value);
+    }
+
+    // -----------------------------------------------------
+    // com.twilio.rest.api.v2010.account.usage.record
+    // -----------------------------------------------------
+
+    @Converter
+    public static AllTime.Category toAllTimeCategory(String value) {
+        return AllTime.Category.forValue(value);
+    }
+
+    @Converter
+    public static Daily.Category toDailyCategory(String value) {
+        return Daily.Category.forValue(value);
+    }
+
+    @Converter
+    public static LastMonth.Category toLastMonthCategory(String value) {
+        return LastMonth.Category.forValue(value);
+    }
+
+    @Converter
+    public static Monthly.Category toMonthlyCategory(String value) {
+        return Monthly.Category.forValue(value);
+    }
+
+    @Converter
+    public static ThisMonth.Category toThisMonthCategory(String value) {
+        return ThisMonth.Category.forValue(value);
+    }
+
+    @Converter
+    public static Today.Category toTodayCategory(String value) {
+        return Today.Category.forValue(value);
+    }
+
+    @Converter
+    public static Yearly.Category toYearlyCategory(String value) {
+        return Yearly.Category.forValue(value);
+    }
+
+    @Converter
+    public static Yesterday.Category toYesterdayCategory(String value) {
+        return Yesterday.Category.forValue(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioEndpoint.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioEndpoint.java
new file mode 100644
index 0000000..83c4d28
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioEndpoint.java
@@ -0,0 +1,135 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.twilio;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.twilio.http.TwilioRestClient;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.component.twilio.internal.TwilioApiCollection;
+import org.apache.camel.component.twilio.internal.TwilioApiName;
+import org.apache.camel.component.twilio.internal.TwilioConstants;
+import org.apache.camel.component.twilio.internal.TwilioPropertiesHelper;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.util.component.AbstractApiEndpoint;
+import org.apache.camel.util.component.ApiMethod;
+import org.apache.camel.util.component.ApiMethodPropertiesHelper;
+
+/**
+ * Represents a Twilio endpoint.
+ */
+@UriEndpoint(firstVersion = "2.20.0", scheme = "twilio", title = "Twilio", syntax = "twilio:apiName/methodName",
+    consumerClass = TwilioConsumer.class, label = "api,messaging,cloud")
+public class TwilioEndpoint extends AbstractApiEndpoint<TwilioApiName, TwilioConfiguration> {
+
+    protected static final Map<String, String> EXECUTOR_METHOD_MAP;
+
+    static {
+        Map<String, String> map = new HashMap<>();
+        map.put("creator", "create");
+        map.put("deleter", "delete");
+        map.put("fetcher", "fetch");
+        map.put("reader", "read");
+        map.put("updater", "update");
+        EXECUTOR_METHOD_MAP = Collections.unmodifiableMap(map);
+    }
+
+    protected final TwilioComponent component;
+
+    @UriParam
+    private TwilioConfiguration configuration;
+
+    public TwilioEndpoint(String uri, TwilioComponent component, TwilioApiName apiName, String methodName,
+                          TwilioConfiguration endpointConfiguration) {
+        super(uri, component, apiName, methodName, TwilioApiCollection.getCollection().getHelper(apiName), endpointConfiguration);
+        this.component = component;
+        this.configuration = endpointConfiguration;
+
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new TwilioProducer(this);
+    }
+
+    @Override
+    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 TwilioConsumer consumer = new TwilioConsumer(this, processor);
+        // also set consumer.* properties
+        configureConsumer(consumer);
+        return consumer;
+    }
+
+    @Override
+    protected void afterConfigureProperties() {
+        // Do nothing
+    }
+
+    @Override
+    public Object getApiProxy(ApiMethod method, Map<String, Object> args) {
+        // Since the proxy methods are static
+        return null;
+    }
+
+    public Object execute(Object executor, ApiMethod method, Map<String, Object> properties) {
+        if (!EXECUTOR_METHOD_MAP.containsKey(method.getName())) {
+            throw new IllegalArgumentException("Invalid method name " + method.getName());
+        }
+        String methodName = EXECUTOR_METHOD_MAP.get(method.getName());
+        try {
+            TypeConverter typeConverter = getCamelContext().getTypeConverter();
+            for (Map.Entry<String, Object> p : properties.entrySet()) {
+                IntrospectionSupport.setProperty(typeConverter, executor, p.getKey(), p.getValue());
+            }
+            return doExecute(executor, methodName, properties);
+        } catch (Exception e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+
+    protected Object doExecute(Object executor, String methodName, Map<String, Object> properties) throws Exception {
+        Method method = executor.getClass().getDeclaredMethod(methodName, TwilioRestClient.class);
+        return method.invoke(executor, properties.getOrDefault("client", getRestClient()));
+    }
+
+    @Override
+    protected ApiMethodPropertiesHelper<TwilioConfiguration> getPropertiesHelper() {
+        return TwilioPropertiesHelper.getHelper();
+    }
+
+    @Override
+    protected String getThreadProfileName() {
+        return TwilioConstants.THREAD_PROFILE_NAME;
+    }
+
+    public TwilioRestClient getRestClient() {
+        return component.getRestClient();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioProducer.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioProducer.java
new file mode 100644
index 0000000..141c918
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/TwilioProducer.java
@@ -0,0 +1,44 @@
+/**
+ * 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.twilio;
+
+import java.util.Map;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.twilio.internal.TwilioApiName;
+import org.apache.camel.component.twilio.internal.TwilioPropertiesHelper;
+import org.apache.camel.util.component.AbstractApiProducer;
+import org.apache.camel.util.component.ApiMethod;
+
+/**
+ * The Twilio producer.
+ */
+public class TwilioProducer extends AbstractApiProducer<TwilioApiName, TwilioConfiguration> {
+
+    protected final TwilioEndpoint endpoint;
+
+    public TwilioProducer(TwilioEndpoint endpoint) {
+        super(endpoint, TwilioPropertiesHelper.getHelper());
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    protected Object doInvokeMethod(ApiMethod method, Map<String, Object> properties) throws RuntimeCamelException {
+        Object executor = super.doInvokeMethod(method, properties);
+        return endpoint.execute(executor, method, properties);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioConstants.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioConstants.java
new file mode 100644
index 0000000..469a9cb
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioConstants.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.twilio.internal;
+
+/**
+ * Constants for Twilio component.
+ */
+public interface TwilioConstants {
+
+    /**
+     * Suffix for parameters when passed as exchange header properties
+     */
+    String PROPERTY_PREFIX = "CamelTwilio.";
+
+    /**
+     * Thread profile name for this component
+     */
+    String THREAD_PROFILE_NAME = "CamelTwilio";
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/e2310430/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioPropertiesHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioPropertiesHelper.java b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioPropertiesHelper.java
new file mode 100644
index 0000000..4083eff
--- /dev/null
+++ b/components/camel-twilio/src/main/java/org/apache/camel/component/twilio/internal/TwilioPropertiesHelper.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.twilio.internal;
+
+import org.apache.camel.component.twilio.TwilioConfiguration;
+import org.apache.camel.util.component.ApiMethodPropertiesHelper;
+
+/**
+ * Singleton {@link ApiMethodPropertiesHelper} for Twilio component.
+ */
+public final class TwilioPropertiesHelper extends ApiMethodPropertiesHelper<TwilioConfiguration> {
+
+    private static TwilioPropertiesHelper helper;
+
+    private TwilioPropertiesHelper() {
+        super(TwilioConfiguration.class, TwilioConstants.PROPERTY_PREFIX);
+    }
+
+    public static synchronized TwilioPropertiesHelper getHelper() {
+        if (helper == null) {
+            helper = new TwilioPropertiesHelper();
+        }
+        return helper;
+    }
+}