[maven-release-plugin]  copy for tag camel-2.10.0

git-svn-id: https://svn.apache.org/repos/asf/camel/tags/camel-2.10.0@1354763 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java
index e4e2065..52acdb2 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ThreadPoolBuilder.java
@@ -17,6 +17,7 @@
 package org.apache.camel.builder;
 
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.CamelContext;
@@ -103,4 +104,37 @@
         return context.getExecutorServiceManager().newThreadPool(source, name, profile);
     }
 
+    /**
+     * Builds the new scheduled thread pool
+     *
+     * @return the created scheduled thread pool
+     * @throws Exception is thrown if error building the scheduled thread pool
+     */
+    public ScheduledExecutorService buildScheduled() throws Exception {
+        return buildScheduled(null, null);
+    }
+
+    /**
+     * Builds the new scheduled thread pool
+     *
+     * @param name name which is appended to the thread name
+     * @return the created scheduled thread pool
+     * @throws Exception is thrown if error building the scheduled thread pool
+     */
+    public ScheduledExecutorService buildScheduled(String name) throws Exception {
+        return buildScheduled(null, name);
+    }
+
+    /**
+     * Builds the new scheduled thread pool
+     *
+     * @param source the source object, usually it should be <tt>this</tt> passed in as parameter
+     * @param name   name which is appended to the thread name
+     * @return the created scheduled thread pool
+     * @throws Exception is thrown if error building the scheduled thread pool
+     */
+    public ScheduledExecutorService buildScheduled(Object source, String name) throws Exception {
+        return context.getExecutorServiceManager().newScheduledThreadPool(source, name, profile);
+    }
+
 }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index ce83e10..c8b6a19 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -113,7 +113,6 @@
 import org.apache.camel.spi.RouteStartupOrder;
 import org.apache.camel.spi.ServicePool;
 import org.apache.camel.spi.ShutdownStrategy;
-import org.apache.camel.spi.ThreadPoolProfile;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.support.ServiceSupport;
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
index 9ccfd4b..670664b 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
@@ -41,7 +41,7 @@
 public abstract class ScheduledPollConsumer extends DefaultConsumer implements Runnable, SuspendableService, PollingConsumerPollingStrategy {
     private static final transient Logger LOG = LoggerFactory.getLogger(ScheduledPollConsumer.class);
 
-    private ScheduledExecutorService executor;
+    private ScheduledExecutorService scheduledExecutorService;
     private boolean shutdownExecutor;
     private ScheduledFuture<?> future;
 
@@ -60,12 +60,12 @@
         super(endpoint, processor);
     }
 
-    public ScheduledPollConsumer(Endpoint endpoint, Processor processor, ScheduledExecutorService executor) {
+    public ScheduledPollConsumer(Endpoint endpoint, Processor processor, ScheduledExecutorService scheduledExecutorService) {
         super(endpoint, processor);
         // we have been given an existing thread pool, so we should not manage its lifecycle
         // so we should keep shutdownExecutor as false
-        this.executor = executor;
-        ObjectHelper.notNull(executor, "executor");
+        this.scheduledExecutorService = scheduledExecutorService;
+        ObjectHelper.notNull(scheduledExecutorService, "scheduledExecutorService");
     }
 
     /**
@@ -283,6 +283,23 @@
         return sendEmptyMessageWhenIdle;
     }
 
+    public ScheduledExecutorService getScheduledExecutorService() {
+        return scheduledExecutorService;
+    }
+
+    /**
+     * Sets a custom shared {@link ScheduledExecutorService} to use as thread pool
+     * <p/>
+     * <b>Notice: </b> When using a custom thread pool, then the lifecycle of this thread
+     * pool is not controlled by this consumer (eg this consumer will not start/stop the thread pool
+     * when the consumer is started/stopped etc.)
+     *
+     * @param scheduledExecutorService the custom thread pool to use
+     */
+    public void setScheduledExecutorService(ScheduledExecutorService scheduledExecutorService) {
+        this.scheduledExecutorService = scheduledExecutorService;
+    }
+
     // Implementation methods
     // -------------------------------------------------------------------------
 
@@ -299,15 +316,15 @@
         super.doStart();
 
         // if no existing executor provided, then create a new thread pool ourselves
-        if (executor == null) {
+        if (scheduledExecutorService == null) {
             // we only need one thread in the pool to schedule this task
-            this.executor = getEndpoint().getCamelContext().getExecutorServiceManager()
+            this.scheduledExecutorService = getEndpoint().getCamelContext().getExecutorServiceManager()
                     .newScheduledThreadPool(this, getEndpoint().getEndpointUri(), 1);
             // and we should shutdown the thread pool when no longer needed
             this.shutdownExecutor = true;
         }
 
-        ObjectHelper.notNull(executor, "executor", this);
+        ObjectHelper.notNull(scheduledExecutorService, "scheduledExecutorService", this);
         ObjectHelper.notNull(pollStrategy, "pollStrategy", this);
 
         if (isStartScheduler()) {
@@ -321,13 +338,13 @@
                 LOG.debug("Scheduling poll (fixed delay) with initialDelay: {}, delay: {} ({}) for: {}",
                         new Object[]{getInitialDelay(), getDelay(), getTimeUnit().name().toLowerCase(Locale.ENGLISH), getEndpoint()});
             }
-            future = executor.scheduleWithFixedDelay(this, getInitialDelay(), getDelay(), getTimeUnit());
+            future = scheduledExecutorService.scheduleWithFixedDelay(this, getInitialDelay(), getDelay(), getTimeUnit());
         } else {
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Scheduling poll (fixed rate) with initialDelay: {}, delay: {} ({}) for: {}",
                         new Object[]{getInitialDelay(), getDelay(), getTimeUnit().name().toLowerCase(Locale.ENGLISH), getEndpoint()});
             }
-            future = executor.scheduleAtFixedRate(this, getInitialDelay(), getDelay(), getTimeUnit());
+            future = scheduledExecutorService.scheduleAtFixedRate(this, getInitialDelay(), getDelay(), getTimeUnit());
         }
     }
 
@@ -342,9 +359,9 @@
 
     @Override
     protected void doShutdown() throws Exception {
-        if (shutdownExecutor && executor != null) {
-            getEndpoint().getCamelContext().getExecutorServiceManager().shutdownNow(executor);
-            executor = null;
+        if (shutdownExecutor && scheduledExecutorService != null) {
+            getEndpoint().getCamelContext().getExecutorServiceManager().shutdownNow(scheduledExecutorService);
+            scheduledExecutorService = null;
             future = null;
         }
         super.doShutdown();
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
index 4aa4337..1d4aa85 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollEndpoint.java
@@ -62,13 +62,14 @@
         Object pollStrategy = options.remove("pollStrategy");
         Object runLoggingLevel = options.remove("runLoggingLevel");
         Object sendEmptyMessageWhenIdle = options.remove("sendEmptyMessageWhenIdle");
+        Object scheduledExecutorService  = options.remove("scheduledExecutorService");
         boolean setConsumerProperties = false;
         
         // the following is split into two if statements to satisfy the checkstyle max complexity constraint
         if (initialDelay != null || delay != null || timeUnit != null || useFixedDelay != null || pollStrategy != null) {
             setConsumerProperties = true;
         }
-        if (runLoggingLevel != null || startScheduler != null || sendEmptyMessageWhenIdle != null) {
+        if (runLoggingLevel != null || startScheduler != null || sendEmptyMessageWhenIdle != null || scheduledExecutorService != null) {
             setConsumerProperties = true;
         }
         
@@ -101,6 +102,9 @@
             if (sendEmptyMessageWhenIdle != null) {
                 consumerProperties.put("sendEmptyMessageWhenIdle", sendEmptyMessageWhenIdle);
             }
+            if (scheduledExecutorService != null) {
+                consumerProperties.put("scheduledExecutorService", scheduledExecutorService);
+            }
         }
     }
     
diff --git a/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java b/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
index a3f1d71..0ce036e 100644
--- a/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/language/bean/BeanExpression.java
@@ -19,6 +19,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.Expression;
@@ -37,28 +38,41 @@
 
 /**
  * Evaluates an expression using a bean method invocation
- *
- * @version 
  */
 public class BeanExpression implements Expression, Predicate {
-    private Object bean;
-    private String beanName;
-    private Class<?> type;
-    private String method;
+    private final Object bean;
+    private final String beanName;
+    private final Class<?> type;
+    private final String method;
+    private volatile BeanHolder beanHolder;
 
     public BeanExpression(Object bean, String method) {
         this.bean = bean;
         this.method = method;
+        this.beanName = null;
+        this.type = null;
     }
 
     public BeanExpression(String beanName, String method) {
         this.beanName = beanName;
         this.method = method;
+        this.bean = null;
+        this.type = null;
     }
 
     public BeanExpression(Class<?> type, String method) {
         this.type = type;
         this.method = method;
+        this.bean = null;
+        this.beanName = null;
+    }
+
+    public BeanExpression(BeanHolder beanHolder, String method) {
+        this.beanHolder = beanHolder;
+        this.method = method;
+        this.bean = null;
+        this.beanName = null;
+        this.type = null;
     }
 
     @Override
@@ -79,16 +93,10 @@
     }
 
     public Object evaluate(Exchange exchange) {
-        // either use registry lookup or a constant bean
-        BeanHolder holder;
-        if (bean != null) {
-            holder = new ConstantBeanHolder(bean, exchange.getContext());
-        } else if (beanName != null) {
-            holder = new RegistryBean(exchange.getContext(), beanName);
-        } else if (type != null) {
-            holder = new ConstantTypeBeanHolder(type, exchange.getContext());
-        } else {
-            throw new IllegalArgumentException("Either bean, beanName or type should be set on " + this);
+
+        // if the bean holder doesn't exist then create it using the context from the exchange
+        if (beanHolder == null) {
+            beanHolder = createBeanHolder(exchange.getContext());
         }
 
         // invoking the bean can either be the easy way or using OGNL
@@ -101,7 +109,7 @@
 
         if (OgnlHelper.isValidOgnlExpression(method)) {
             // okay the method is an ognl expression
-            OgnlInvokeProcessor ognl = new OgnlInvokeProcessor(holder, method);
+            OgnlInvokeProcessor ognl = new OgnlInvokeProcessor(beanHolder, method);
             try {
                 ognl.process(exchange);
                 return ognl.getResult();
@@ -110,7 +118,7 @@
             }
         } else {
             // regular non ognl invocation
-            InvokeProcessor invoke = new InvokeProcessor(holder, method);
+            InvokeProcessor invoke = new InvokeProcessor(beanHolder, method);
             try {
                 invoke.process(exchange);
                 return invoke.getResult();
@@ -131,6 +139,25 @@
     }
 
     /**
+     * Optimize to create the bean holder once, so we can reuse it for further
+     * evaluation, which is faster.
+     */
+    private synchronized BeanHolder createBeanHolder(CamelContext context) {
+        // either use registry lookup or a constant bean
+        BeanHolder holder;
+        if (bean != null) {
+            holder = new ConstantBeanHolder(bean, context);
+        } else if (beanName != null) {
+            holder = new RegistryBean(context, beanName);
+        } else if (type != null) {
+            holder = new ConstantTypeBeanHolder(type, context);
+        } else {
+            throw new IllegalArgumentException("Either bean, beanName or type should be set on " + this);
+        }
+        return holder;
+    }
+
+    /**
      * Invokes a given bean holder. The method name is optional.
      */
     private final class InvokeProcessor implements Processor {
diff --git a/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java b/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
index eab5bc2..3fa3c9f 100644
--- a/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/WireTapDefinition.java
@@ -43,7 +43,7 @@
  */
 @XmlRootElement(name = "wireTap")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class WireTapDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputDefinition<Type> implements ExecutorServiceAwareDefinition<WireTapDefinition<Type>> {
+public class WireTapDefinition<Type extends ProcessorDefinition<Type>> extends NoOutputDefinition<WireTapDefinition<Type>> implements ExecutorServiceAwareDefinition<WireTapDefinition<Type>> {
     @XmlAttribute
     protected String uri;
     @XmlAttribute
diff --git a/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java b/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
index bfb2450..d888755 100644
--- a/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
+++ b/camel-core/src/main/java/org/apache/camel/model/language/MethodCallExpression.java
@@ -28,6 +28,8 @@
 import org.apache.camel.Predicate;
 import org.apache.camel.component.bean.BeanHolder;
 import org.apache.camel.component.bean.BeanInfo;
+import org.apache.camel.component.bean.ConstantBeanHolder;
+import org.apache.camel.component.bean.ConstantTypeBeanHolder;
 import org.apache.camel.component.bean.MethodNotFoundException;
 import org.apache.camel.component.bean.RegistryBean;
 import org.apache.camel.language.bean.BeanExpression;
@@ -38,7 +40,7 @@
  * For expressions and predicates using the
  * <a href="http://camel.apache.org/bean-language.html">bean language</a>
  *
- * @version 
+ * @version
  */
 @XmlRootElement(name = "method")
 @XmlAccessorType(XmlAccessType.FIELD)
@@ -68,11 +70,11 @@
         super(beanName);
         this.method = method;
     }
-    
+
     public MethodCallExpression(Object instance) {
         this(instance, null);
     }
-    
+
     public MethodCallExpression(Object instance, String method) {
         super(ObjectHelper.className(instance));
         // must use setter as they have special logic
@@ -83,7 +85,7 @@
     public MethodCallExpression(Class<?> type) {
         this(type, null);
     }
-    
+
     public MethodCallExpression(Class<?> type, String method) {
         super(type.getName());
         this.beanType = type;
@@ -162,25 +164,30 @@
             }
         }
 
+        BeanHolder holder;
         if (beanType != null) {
             // create a bean if there is a default public no-arg constructor
             if (ObjectHelper.hasDefaultPublicNoArgConstructor(beanType)) {
                 instance = camelContext.getInjector().newInstance(beanType);
-                answer = new BeanExpression(instance, getMethod());
+                holder = new ConstantBeanHolder(instance, camelContext);
             } else {
-                answer = new BeanExpression(beanType, getMethod());
+                holder = new ConstantTypeBeanHolder(beanType, camelContext);
             }
         } else if (instance != null) {
-            answer = new BeanExpression(instance, getMethod());
+            holder = new ConstantBeanHolder(instance, camelContext);
         } else {
             String ref = beanName();
             // if its a ref then check that the ref exists
-            BeanHolder holder = new RegistryBean(camelContext, ref);
+            BeanHolder regHolder = new RegistryBean(camelContext, ref);
             // get the bean which will check that it exists
-            instance = holder.getBean();
-            answer = new BeanExpression(instance, getMethod());
+            instance = regHolder.getBean();
+            holder = new ConstantBeanHolder(instance, camelContext);
         }
 
+        // create answer using the holder
+        answer = new BeanExpression(holder, getMethod());
+
+        // and do sanity check that if a method name was given, that it exists
         validateHasMethod(camelContext, instance, beanType, getMethod());
         return answer;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
index 1e1df1b..0b336bc 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/validation/ValidatingProcessor.java
@@ -112,7 +112,7 @@
     // Properties
     // -----------------------------------------------------------------------
 
-    public synchronized Schema getSchema() throws IOException, SAXException {
+    public Schema getSchema() throws IOException, SAXException {
         if (schema == null) {
             schema = createSchema();
         }
@@ -131,7 +131,7 @@
         this.schemaLanguage = schemaLanguage;
     }
 
-    public synchronized Source getSchemaSource() throws IOException {
+    public Source getSchemaSource() throws IOException {
         if (schemaSource == null) {
             schemaSource = createSchemaSource();
         }
@@ -158,7 +158,7 @@
         this.schemaFile = schemaFile;
     }
 
-    public synchronized SchemaFactory getSchemaFactory() {
+    public SchemaFactory getSchemaFactory() {
         if (schemaFactory == null) {
             schemaFactory = createSchemaFactory();
         }
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java
index 8484750..f92d815 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/BaseSSLContextParameters.java
@@ -68,6 +68,20 @@
     
     private static final Logger LOG = LoggerFactory.getLogger(BaseSSLContextParameters.class);
     
+    private static final String LS = System.getProperty("line.separator");
+    
+    private static final String SSL_ENGINE_CIPHER_SUITE_LOG_MSG = createCipherSuiteLogMessage("SSLEngine");
+    
+    private static final String SSL_SOCKET_CIPHER_SUITE_LOG_MSG = createCipherSuiteLogMessage("SSLSocket");
+    
+    private static final String SSL_SERVER_SOCKET_CIPHER_SUITE_LOG_MSG = createCipherSuiteLogMessage("SSLServerSocket");
+    
+    private static final String SSL_ENGINE_PROTOCOL_LOG_MSG = createProtocolLogMessage("SSLEngine");
+    
+    private static final String SSL_SOCKET_PROTOCOL_LOG_MSG = createProtocolLogMessage("SSLSocket");
+    
+    private static final String SSL_SERVER_SOCKET_PROTOCOL_LOG_MSG = createProtocolLogMessage("SSLServerSocket");
+    
     /**
      * The optional explicitly configured cipher suites for this configuration.
      */
@@ -242,15 +256,16 @@
      * @throws GeneralSecurityException if there is an error configuring the context
      */
     protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
-        LOG.trace("Configuring client and server side SSLContext parameters...");
+        LOG.trace("Configuring client and server side SSLContext parameters on SSLContext [{}]...", context);
 
         if (this.getSessionTimeout() != null) {
-            LOG.debug("Configuring client and server side SSLContext session timeout: {}", this.getSessionTimeout());
+            LOG.debug("Configuring client and server side SSLContext session timeout on SSLContext [{}] to [{}]",
+                      context, this.getSessionTimeout());
             this.configureSessionContext(context.getClientSessionContext(), this.getSessionTimeout());
             this.configureSessionContext(context.getServerSessionContext(), this.getSessionTimeout());
         }
         
-        LOG.trace("Configured client and server side SSLContext parameters.");
+        LOG.trace("Configured client and server side SSLContext parameters on SSLContext [{}].", context);
     }
     
     protected FilterParameters getDefaultCipherSuitesFilter() {
@@ -325,7 +340,17 @@
                             enabledCipherSuitePatterns, defaultEnabledCipherSuitePatterns,
                             !allowPassthrough);
 
-                LOG.trace("Enabled ChiperSuites: {}", filteredCipherSuites);
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(SSL_ENGINE_CIPHER_SUITE_LOG_MSG,
+                            new Object[] {engine,
+                                          enabledCipherSuites,
+                                          enabledCipherSuitePatterns, 
+                                          engine.getSSLParameters().getCipherSuites(),
+                                          engine.getEnabledCipherSuites(),
+                                          defaultEnabledCipherSuitePatterns,
+                                          filteredCipherSuites});
+                }
+                
                 engine.setEnabledCipherSuites(filteredCipherSuites.toArray(new String[filteredCipherSuites.size()]));
 
                 Collection<String> filteredSecureSocketProtocols = BaseSSLContextParameters.this
@@ -334,9 +359,19 @@
                             enabledSecureSocketProtocolsPatterns, defaultEnabledSecureSocketProtocolsPatterns,
                             !allowPassthrough);
                 
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(SSL_ENGINE_PROTOCOL_LOG_MSG,
+                            new Object[] {engine,
+                                          enabledSecureSocketProtocols,
+                                          enabledSecureSocketProtocolsPatterns, 
+                                          engine.getSSLParameters().getProtocols(),
+                                          engine.getEnabledProtocols(),
+                                          defaultEnabledSecureSocketProtocolsPatterns,
+                                          filteredSecureSocketProtocols});
+                }
+                
                 engine.setEnabledProtocols(filteredSecureSocketProtocols.toArray(new String[filteredSecureSocketProtocols.size()]));
-                LOG.trace("Enabled Protocols: {}", filteredSecureSocketProtocols);
-
+                
                 return engine;
             }
         };
@@ -482,6 +517,16 @@
                             Arrays.asList(socket.getEnabledCipherSuites()),
                             enabledCipherSuitePatterns, defaultEnabledCipherSuitePatterns,
                             !allowPassthrough);
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(SSL_SOCKET_CIPHER_SUITE_LOG_MSG,
+                            new Object[] {socket,
+                                          enabledCipherSuites,
+                                          enabledCipherSuitePatterns, 
+                                          socket.getSSLParameters().getCipherSuites(),
+                                          socket.getEnabledCipherSuites(),
+                                          defaultEnabledCipherSuitePatterns,
+                                          filteredCipherSuites});
+                }
                  
                 socket.setEnabledCipherSuites(filteredCipherSuites.toArray(new String[filteredCipherSuites.size()]));
         
@@ -491,6 +536,17 @@
                             enabledSecureSocketProtocolsPatterns, defaultEnabledSecureSocketProtocolsPatterns,
                             !allowPassthrough);
                 
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(SSL_SOCKET_PROTOCOL_LOG_MSG,
+                            new Object[] {socket,
+                                          enabledSecureSocketProtocols,
+                                          enabledSecureSocketProtocolsPatterns, 
+                                          socket.getSSLParameters().getProtocols(),
+                                          socket.getEnabledProtocols(),
+                                          defaultEnabledSecureSocketProtocolsPatterns,
+                                          filteredSecureSocketProtocols});
+                }
+                
                 socket.setEnabledProtocols(filteredSecureSocketProtocols.toArray(new String[filteredSecureSocketProtocols.size()]));
                 return socket;
             }
@@ -561,6 +617,17 @@
                             enabledCipherSuitePatterns, defaultEnabledCipherSuitePatterns,
                             !allowPassthrough);
                  
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(SSL_SERVER_SOCKET_CIPHER_SUITE_LOG_MSG,
+                            new Object[] {socket,
+                                          enabledCipherSuites,
+                                          enabledCipherSuitePatterns, 
+                                          socket.getSupportedCipherSuites(),
+                                          socket.getEnabledCipherSuites(),
+                                          defaultEnabledCipherSuitePatterns,
+                                          filteredCipherSuites});
+                }
+                
                 socket.setEnabledCipherSuites(filteredCipherSuites.toArray(new String[filteredCipherSuites.size()]));
         
                 Collection<String> filteredSecureSocketProtocols = BaseSSLContextParameters.this
@@ -568,6 +635,17 @@
                             Arrays.asList(socket.getEnabledProtocols()),
                             enabledSecureSocketProtocolsPatterns, defaultEnabledSecureSocketProtocolsPatterns,
                             !allowPassthrough);
+
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug(SSL_SERVER_SOCKET_PROTOCOL_LOG_MSG,
+                            new Object[] {socket,
+                                          enabledSecureSocketProtocols,
+                                          enabledSecureSocketProtocolsPatterns, 
+                                          socket.getSupportedProtocols(),
+                                          socket.getEnabledProtocols(),
+                                          defaultEnabledSecureSocketProtocolsPatterns,
+                                          filteredSecureSocketProtocols});
+                }
                 
                 socket.setEnabledProtocols(filteredSecureSocketProtocols.toArray(new String[filteredSecureSocketProtocols.size()]));
                 return socket;
@@ -732,13 +810,14 @@
 
         public SSLContextDecorator(SSLContextSpiDecorator decorator) {
             super(decorator, decorator.getDelegate().getProvider(), decorator.getDelegate().getProtocol());
+            LOG.debug("SSLContextDecorator [{}] decorating SSLContext [{}].", this, decorator.getDelegate());
         }
 
         @Override
         public String toString() {
-            return String.format("SSLContext[provider=%s, protocol=%s, needClientAuth=%s, " 
+            return String.format("SSLContext[hash=%h, provider=%s, protocol=%s, needClientAuth=%s, " 
                 + "wantClientAuth=%s\n\tdefaultProtocols=%s\n\tdefaultChiperSuites=%s\n\tsupportedProtocols=%s\n\tsupportedChiperSuites=%s\n]",
-                getProvider(), getProtocol(), getDefaultSSLParameters().getNeedClientAuth(), getDefaultSSLParameters().getWantClientAuth(),
+                hashCode(), getProvider(), getProtocol(), getDefaultSSLParameters().getNeedClientAuth(), getDefaultSSLParameters().getWantClientAuth(),
                 collectionAsCommaDelimitedString(getDefaultSSLParameters().getProtocols()),
                 collectionAsCommaDelimitedString(getDefaultSSLParameters().getCipherSuites()),
                 collectionAsCommaDelimitedString(getSupportedSSLParameters().getProtocols()),
@@ -776,6 +855,7 @@
         @Override
         protected SSLEngine engineCreateSSLEngine() {
             SSLEngine engine = this.context.createSSLEngine();
+            LOG.debug("SSLEngine [{}] created from SSLContext [{}].", engine, context);
             this.configureSSLEngine(engine);
             return engine;
         }
@@ -783,6 +863,7 @@
         @Override
         protected SSLEngine engineCreateSSLEngine(String peerHost, int peerPort) {
             SSLEngine engine = this.context.createSSLEngine(peerHost, peerPort);
+            LOG.debug("SSLEngine [{}] created from SSLContext [{}].", engine, context);
             return this.configureSSLEngine(engine);
         }
 
@@ -799,12 +880,14 @@
         @Override
         protected SSLServerSocketFactory engineGetServerSocketFactory() {
             SSLServerSocketFactory factory = this.context.getServerSocketFactory();
+            LOG.debug("SSLServerSocketFactoryEngine [{}] created from SSLContext [{}].", factory, context);
             return this.configureSSLServerSocketFactory(factory);
         }
 
         @Override
         protected SSLSocketFactory engineGetSocketFactory() {
-            SSLSocketFactory factory = this.context.getSocketFactory(); 
+            SSLSocketFactory factory = this.context.getSocketFactory();
+            LOG.debug("SSLSocketFactory [{}] created from SSLContext [{}].", factory, context);
             return this.configureSSLSocketFactory(factory);
         }
 
@@ -932,6 +1015,8 @@
         
         private ServerSocket configureSocket(ServerSocket s) {
             SSLServerSocket workingSocket = (SSLServerSocket) s;
+            
+            LOG.debug("Created ServerSocket [{}] from SslServerSocketFactory [{}].", s, sslServerSocketFactory);
 
             for (Configurer<SSLServerSocket> configurer : this.sslServerSocketConfigurers) {
                 workingSocket = configurer.configure(workingSocket);
@@ -1006,6 +1091,8 @@
 
         private Socket configureSocket(Socket s) {
             SSLSocket workingSocket = (SSLSocket) s;
+            
+            LOG.debug("Created Socket [{}] from SocketFactory [{}].", s, sslSocketFactory);
 
             for (Configurer<SSLSocket> configurer : this.sslSocketConfigurers) {
                 workingSocket = configurer.configure(workingSocket);
@@ -1015,4 +1102,23 @@
         }
     }
 
+    private static String createCipherSuiteLogMessage(String entityName) {
+        return "Configuring " + entityName + " [{}] with " + LS
+                + "\t explicitly set cipher suites [{}]," + LS
+                + "\t cipher suite patterns [{}]," + LS
+                + "\t available cipher suites [{}]," + LS
+                + "\t currently enabled cipher suites [{}]," + LS
+                + "\t and default cipher suite patterns [{}]." + LS
+                + "\t Resulting enabled cipher suites are [{}].";
+    }
+    
+    private static String createProtocolLogMessage(String entityName) {
+        return "Configuring " + entityName + " [{}] with " + LS
+                + "\t explicitly set protocols [{}]," + LS
+                + "\t protocol patterns [{}]," + LS
+                + "\t available protocols [{}]," + LS
+                + "\t currently enabled protocols [{}]," + LS
+                + "\t and default protocol patterns [{}]." + LS
+                + "\t Resulting enabled protocols are [{}].";
+    }
 }
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java
index 74974fd..409fb78 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/FilterParameters.java
@@ -126,7 +126,18 @@
 
         public List<Pattern> getExcludes() {
             return excludes;
-        }  
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder builder = new StringBuilder();
+            builder.append("Patterns [includes=");
+            builder.append(includes);
+            builder.append(", excludes=");
+            builder.append(excludes);
+            builder.append("]");
+            return builder.toString();
+        }
     }
 
     @Override
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java
index a8ebba2..4b08b18 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/JsseParameters.java
@@ -121,54 +121,60 @@
         InputStream is = null;
 
         try {
-            LOG.trace("Trying to open resource as a file.");
+            LOG.trace("Trying to open resource [{}] as a file.", resource);
             is = new FileInputStream(resource);
-            LOG.debug("Loaded resource as file {}", resource);
+            LOG.debug("Opened resource [{}] as a file.", resource);
         } catch (FileNotFoundException e) {
-            LOG.trace("Could not open resource as a file.", e);
+            LOG.trace("Could not open resource [" + resource + "] as a file.", e);
         }
         
         if (is == null && Thread.currentThread().getContextClassLoader() != null) {
-            LOG.trace("Trying to open resource as a class path resource with the TCCL {}.",
-                      Thread.currentThread().getContextClassLoader());
+            LOG.trace("Trying to open resource [{}] as a class path resource with the TCCL [{}].",
+                      resource, Thread.currentThread().getContextClassLoader());
             is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resource);
+            
             if (is == null) {
-                LOG.trace("Could not open resource as a class path resource using the TCCL {}.",
-                          Thread.currentThread().getContextClassLoader());
+                LOG.trace("Could not open resource [{}] as a class path resource using the TCCL [{}].",
+                          resource, Thread.currentThread().getContextClassLoader());
             } else {
-                LOG.debug("Loaded resource from TCCL ClassLoader {}", resource);
+                LOG.debug("Opened resource [{}] as a class path resource with the TCCL [{}].",
+                          resource, Thread.currentThread().getContextClassLoader());
             }
         }
 
         if (is == null) {
-            LOG.trace("Trying to open resource as a class path resource using the classloader {}.",
+            LOG.trace("Trying to open resource [{}] as a class path resource using the classloader [{}].",
                       this.getClass().getClassLoader());
             is = this.getClass().getResourceAsStream(resource);
+            
             if (is == null) {
-                LOG.trace("Could not open resource as a class path resource using the classloader {}.",
-                          this.getClass().getClassLoader());
+                LOG.trace("Could not open resource [{}] as a class path resource using the classloader [{}].",
+                          resource, this.getClass().getClassLoader());
             } else {
-                LOG.debug("Loaded resource from JsseParameter ClassLoader {}", resource);
+                LOG.debug("Opened resource [{}] as a class path resource with the classloader [{}].",
+                          resource, this.getClass().getClassLoader());
             }
         }
 
         if (is == null) {
             try {
-                LOG.trace("Trying to open resource as a URL.");
+                LOG.trace("Trying to open resource [{}] as a URL.", resource);
                 is = new URL(resource).openStream();
-                LOG.debug("Loaded resource as URL {}", resource);
+                LOG.debug("Opened resource [{}] as a URL.", resource);
             } catch (IOException e) {
-                LOG.trace("Could not open resource as a URL", e);
+                LOG.trace("Could not open resource [" + resource + "] as a URL.", e);
             }
         }
         
         if (is == null && this.context != null) {
-            LOG.trace("Trying to open resource using the CamelContext ClassResolver {}", context.getClassResolver());
+            LOG.trace("Trying to open resource using the CamelContext ClassResolver [{}].", context.getClassResolver());
             is = context.getClassResolver().loadResourceAsStream(resource);
             if (is == null) {
-                LOG.trace("Could not to open resource using the CamelContext ClassResolver {}.", context.getClassResolver());
+                LOG.trace("Could not to open resource [{}] using the CamelContext ClassResolver [{}].", 
+                          resource, context.getClassResolver());
             } else {
-                LOG.debug("Loaded resource using the CamelContext ClassResolver {}", resource);
+                LOG.debug("Opened resource [{}] using the CamelContext ClassResolver [{}].",
+                          resource, this.getClass().getClassLoader());
             }
         }
 
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java
index 8474b0d..6db4d1f 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyManagersParameters.java
@@ -81,10 +81,10 @@
      */
     public KeyManager[] createKeyManagers() throws GeneralSecurityException, IOException {
         
-        LOG.debug("Creating KeyManager[] from KeyManagersParameters: {}", this);
+        LOG.trace("Creating KeyManager[] from KeyManagersParameters [{}].", this);
 
         KeyManager[] keyManagers;
-
+        
         String kmfAlgorithm = this.parsePropertyValue(this.getAlgorithm());
         if (kmfAlgorithm == null) {
             kmfAlgorithm = KeyManagerFactory.getDefaultAlgorithm();
@@ -96,7 +96,9 @@
         } else {
             kmf = KeyManagerFactory.getInstance(kmfAlgorithm, this.parsePropertyValue(this.getProvider()));
         }
-
+        
+        LOG.debug("KeyManagerFactory [{}], initialized from [{}], is using provider [{}] and algorithm [{}].",
+                  new Object[] {kmf, this, kmf.getProvider(), kmf.getAlgorithm()});
         
         char[] kmfPassword = null;
         if (this.getKeyPassword() != null) {
@@ -108,6 +110,8 @@
         kmf.init(ks, kmfPassword);
         keyManagers = kmf.getKeyManagers();
         
+        LOG.debug("KeyManager[] [{}], initialized from KeyManagerFactory [{}].", keyManagers, kmf);
+        
         return keyManagers;
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java
index 16d8107..380f190 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/KeyStoreParameters.java
@@ -21,6 +21,9 @@
 import java.security.GeneralSecurityException;
 import java.security.KeyStore;
 import java.security.Security;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -146,7 +149,7 @@
      *             resource to an input stream
      */
     public KeyStore createKeyStore() throws GeneralSecurityException, IOException {
-        LOG.debug("Creating KeyStore instance from KeyStoreParameters: {}", this);
+        LOG.trace("Creating KeyStore instance from KeyStoreParameters [{}].", this);
 
         String ksType = this.parsePropertyValue(this.type);
         if (ksType == null) {
@@ -164,14 +167,26 @@
         } else {
             ks = KeyStore.getInstance(ksType, this.parsePropertyValue(this.provider));
         }
-
+        
         if (this.resource == null) {
             ks.load(null, ksPassword);
         } else {
             InputStream is = this.resolveResource(this.parsePropertyValue(this.resource));
             ks.load(is, ksPassword);
         }
-
+        
+        if (LOG.isDebugEnabled()) {
+            List<String> aliases = new LinkedList<String>();
+            
+            Enumeration<String> aliasEnum = ks.aliases();
+            while (aliasEnum.hasMoreElements()) {
+                aliases.add(aliasEnum.nextElement());
+            }
+            
+            LOG.debug("KeyStore [{}], initialized from [{}], is using provider [{}], has type [{}], and contains aliases {}.",
+                      new Object[] {ks, this, ks.getProvider(), ks.getType(), aliases});
+        }
+        
         return ks;
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java
index 2e807b5..a05c3da 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextClientParameters.java
@@ -41,12 +41,12 @@
 
     @Override
     protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
-        LOG.trace("Configuring client-side SSLContext parameters...");
+        LOG.trace("Configuring client-side SSLContext parameters on SSLContext [{}]...", context);
         if (this.getSessionTimeout() != null) {
-            LOG.debug("Configuring client-side SSLContext session timeout: " + this.getSessionTimeout());
+            LOG.info("Configuring client-side SSLContext session timeout on SSLContext [{}] to [{}].", context, this.getSessionTimeout());
             this.configureSessionContext(context.getClientSessionContext(), this.getSessionTimeout());
         }
-        LOG.trace("Configured client-side SSLContext parameters.");
+        LOG.trace("Configured client-side SSLContext parameters on SSLContext [{}].", context);
     }
 
     /**
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java
index 5cb7519..aa8b49b 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextParameters.java
@@ -229,7 +229,9 @@
      */
     public SSLContext createSSLContext() throws GeneralSecurityException, IOException {
         
-        LOG.trace("Creating SSLContext from SSLContextParameters: {}", this);
+        LOG.trace("Creating SSLContext from SSLContextParameters [{}].", this);
+        
+        LOG.info("Available providers: {}.", Security.getProviders());
 
         KeyManager[] keyManagers = this.keyManagers == null ? null : this.keyManagers.createKeyManagers();
         TrustManager[] trustManagers = this.trustManagers == null ? null : this.trustManagers.createTrustManagers();
@@ -243,6 +245,9 @@
                                              this.parsePropertyValue(this.getProvider()));
         }
         
+        LOG.debug("SSLContext [{}], initialized from [{}], is using provider [{}], protocol [{}], key managers {}, trust managers {}, and secure random [{}].",
+                 new Object[] {context, this, context.getProvider(), context.getProtocol(), keyManagers, trustManagers, secureRandom});
+        
         context.init(keyManagers, trustManagers, secureRandom);
         
         this.configureSSLContext(context);
@@ -254,74 +259,80 @@
                         this.getSSLEngineConfigurers(context),
                         this.getSSLSocketFactoryConfigurers(context),
                         this.getSSLServerSocketFactoryConfigurers(context)));
-        LOG.debug("Created {}", context);
+
         return context;
     }
     
     @Override
     protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
-        LOG.trace("Configuring client and server side SSLContext parameters...");
+        LOG.trace("Configuring client and server side SSLContext parameters on SSLContext [{}]...", context);
         super.configureSSLContext(context);
         
         if (this.getClientParameters() != null) {
-            LOG.trace("Overriding client-side SSLContext parameters with configured client parameters.");
+            LOG.trace("Overriding client-side SSLContext parameters on SSLContext [{}] with configured client parameters.",
+                      context);
             this.getClientParameters().configureSSLContext(context);
         }
 
         if (this.getServerParameters() != null) {
-            LOG.trace("Overriding server-side SSLContext parameters with configured server parameters.");
+            LOG.trace("Overriding server-side SSLContext parameters on SSLContext [{}] with configured server parameters.",
+                      context);
             this.getServerParameters().configureSSLContext(context);
         }        
         
-        LOG.trace("Configured client and server side SSLContext parameters.");
+        LOG.trace("Configured client and server side SSLContext parameters on SSLContext [{}].", context);
     }
     
     @Override
     protected List<Configurer<SSLEngine>> getSSLEngineConfigurers(SSLContext context) {
-        LOG.trace("Collecting client and server side SSLEngine configurers...");
+        LOG.trace("Collecting client and server side SSLEngine configurers on SSLContext [{}]...", context);
         List<Configurer<SSLEngine>> configurers = super.getSSLEngineConfigurers(context);
         
         if (this.getClientParameters() != null) {
-            LOG.trace("Augmenting SSLEngine configurers with configurers from client parameters.");
+            LOG.trace("Augmenting SSLEngine configurers with configurers from client parameters on SSLContext [{}].",
+                      context);
             configurers.addAll(this.getClientParameters().getSSLEngineConfigurers(context));
         }
         
         if (this.getServerParameters() != null) {
-            LOG.trace("Augmenting SSLEngine configurers with configurers from server parameters.");
+            LOG.trace("Augmenting SSLEngine configurers with configurers from server parameters on SSLContext [{}].",
+                      context);
             configurers.addAll(this.getServerParameters().getSSLEngineConfigurers(context));
         }
         
-        LOG.trace("Collected client and server side SSLEngine configurers.");
+        LOG.trace("Collected client and server side SSLEngine configurers on SSLContext [{}].", context);
         
         return configurers;
     }
     
     @Override
     protected List<Configurer<SSLSocketFactory>> getSSLSocketFactoryConfigurers(SSLContext context) {
-        LOG.trace("Collecting SSLSocketFactory configurers...");
+        LOG.trace("Collecting SSLSocketFactory configurers on SSLContext [{}]...", context);
         List<Configurer<SSLSocketFactory>> configurers = super.getSSLSocketFactoryConfigurers(context);
         
         if (this.getClientParameters() != null) {
-            LOG.trace("Augmenting SSLSocketFactory configurers with configurers from client parameters.");
+            LOG.trace("Augmenting SSLSocketFactory configurers with configurers from client parameters on SSLContext [{}].",
+                      context);
             configurers.addAll(this.getClientParameters().getSSLSocketFactoryConfigurers(context));
         }
         
-        LOG.trace("Collected SSLSocketFactory configurers.");
+        LOG.trace("Collected SSLSocketFactory configurers on SSLContext [{}].", context);
         
         return configurers;
     }
 
     @Override
     protected List<Configurer<SSLServerSocketFactory>> getSSLServerSocketFactoryConfigurers(SSLContext context) {
-        LOG.trace("Collecting SSLServerSocketFactory configurers...");
+        LOG.trace("Collecting SSLServerSocketFactory configurers for SSLContext [{}]...", context);
         List<Configurer<SSLServerSocketFactory>> configurers = super.getSSLServerSocketFactoryConfigurers(context);
         
         if (this.getServerParameters() != null) {
-            LOG.trace("Augmenting SSLServerSocketFactory configurers with configurers from server parameters.");
+            LOG.trace("Augmenting SSLServerSocketFactory configurers with configurers from server parameters for SSLContext [{}].",
+                      context);
             configurers.addAll(this.getServerParameters().getSSLServerSocketFactoryConfigurers(context));
         }
         
-        LOG.trace("Collected client and server side SSLServerSocketFactory configurers.");
+        LOG.trace("Collected client and server side SSLServerSocketFactory configurers for SSLContext [{}].", context);
         
         return configurers;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java
index a966cf9..8087a62 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SSLContextServerParameters.java
@@ -63,12 +63,12 @@
     
     @Override
     protected void configureSSLContext(SSLContext context) throws GeneralSecurityException {
-        LOG.trace("Configuring server-side SSLContext parameters...");
+        LOG.trace("Configuring server-side SSLContext parameters on SSLContext [{}]...", context);
         if (this.getSessionTimeout() != null) {
-            LOG.debug("Configuring server-side SSLContext session timeout: " + this.getSessionTimeout());
+            LOG.debug("Configuring server-side SSLContext session timeout on SSLContext [{}] to [{}].", context, this.getSessionTimeout());
             this.configureSessionContext(context.getServerSessionContext(), this.getSessionTimeout());
         }
-        LOG.trace("Configured server-side SSLContext parameters.");
+        LOG.trace("Configured server-side SSLContext parameters on SSLContext [{}].", context);   
     }
 
     /**
@@ -97,6 +97,7 @@
             Configurer<SSLEngine> sslEngineConfigurer = new Configurer<SSLEngine>() {
                 @Override
                 public SSLEngine configure(SSLEngine engine) {
+                    LOG.info("Configuring client-auth on SSLEngine [{}] to [{}].", engine, clientAuthValue);
                     switch (clientAuthValue) {
                     case NONE:
                         engine.setWantClientAuth(false);
@@ -135,6 +136,7 @@
             Configurer<SSLServerSocket> sslServerSocketConfigurer = new Configurer<SSLServerSocket>() {
                 @Override
                 public SSLServerSocket configure(SSLServerSocket socket) {
+                    LOG.info("Configuring client-auth on SSLServerSocket [{}] to [{}].", socket, clientAuthValue);
                     switch (clientAuthValue) {
                     case NONE:
                         socket.setWantClientAuth(false);
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java
index ebb9c2a..1e5d15e 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/SecureRandomParameters.java
@@ -65,6 +65,9 @@
         } else {
             secureRandom = SecureRandom.getInstance(this.parsePropertyValue(this.getAlgorithm()));
         }
+        
+        LOG.debug("SecureRandom [{}] is using provider [{}] and algorithm [{}].",
+                  new Object[] {secureRandom, secureRandom.getProvider(), secureRandom.getAlgorithm()});
 
         return secureRandom;
     }
diff --git a/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java b/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java
index 74daffa..f71db16 100644
--- a/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java
+++ b/camel-core/src/main/java/org/apache/camel/util/jsse/TrustManagersParameters.java
@@ -71,7 +71,7 @@
      */
     public TrustManager[] createTrustManagers() throws GeneralSecurityException, IOException {
         
-        LOG.trace("Creating TrustManager[] from TrustManagersParameters: {}", this);
+        LOG.trace("Creating TrustManager[] from TrustManagersParameters [{}]", this);
 
         TrustManager[] trustManagers = null;
 
@@ -88,9 +88,14 @@
                 tmf = TrustManagerFactory.getInstance(tmfAlgorithm, this.parsePropertyValue(this.getProvider()));
             }
             
+            LOG.debug("TrustManagerFactory [{}] is using provider [{}] and algorithm [{}].",
+                      new Object[] {tmf, tmf.getProvider(), tmf.getAlgorithm()});
+            
             KeyStore ks = this.getKeyStore() == null ? null : this.getKeyStore().createKeyStore();
             tmf.init(ks);
             trustManagers = tmf.getTrustManagers();
+            
+            LOG.debug("TrustManager[] [{}], initialized from TrustManagerFactory [{}].", trustManagers, tmf);
         }
         
         return trustManagers;
diff --git a/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java b/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java
index 46dddca..112ac11 100644
--- a/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java
+++ b/camel-core/src/test/java/org/apache/camel/builder/ThreadPoolBuilderTest.java
@@ -18,6 +18,7 @@
 
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.ContextTestSupport;
@@ -125,4 +126,39 @@
         assertEquals(true, executor2.isShutdown());
     }
 
+    public void testThreadPoolBuilderScheduled() throws Exception {
+        ThreadPoolBuilder builder = new ThreadPoolBuilder(context);
+        ScheduledExecutorService executor = builder.poolSize(5).maxQueueSize(2000)
+                .buildScheduled();
+        assertNotNull(executor);
+
+        assertEquals(false, executor.isShutdown());
+        context.stop();
+        assertEquals(true, executor.isShutdown());
+    }
+
+    public void testThreadPoolBuilderScheduledName() throws Exception {
+        ThreadPoolBuilder builder = new ThreadPoolBuilder(context);
+        ScheduledExecutorService executor = builder.poolSize(5).maxQueueSize(2000)
+                .buildScheduled("myScheduledPool");
+        assertNotNull(executor);
+
+        assertEquals(false, executor.isShutdown());
+        context.stop();
+        assertEquals(true, executor.isShutdown());
+    }
+
+
+    public void testThreadPoolBuilderScheduledSourceName() throws Exception {
+        ThreadPoolBuilder builder = new ThreadPoolBuilder(context);
+        ScheduledExecutorService executor = builder.poolSize(5).maxQueueSize(2000)
+                .buildScheduled(this, "myScheduledPool");
+        assertNotNull(executor);
+
+        assertEquals(false, executor.isShutdown());
+        context.stop();
+        assertEquals(true, executor.isShutdown());
+    }
+
+
 }
diff --git a/camel-core/src/test/java/org/apache/camel/component/bean/BeanExpressionConcurrentTest.java b/camel-core/src/test/java/org/apache/camel/component/bean/BeanExpressionConcurrentTest.java
new file mode 100644
index 0000000..6b7674f
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/bean/BeanExpressionConcurrentTest.java
@@ -0,0 +1,128 @@
+/**
+ * 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.bean;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ * @version 
+ */
+public class BeanExpressionConcurrentTest extends ContextTestSupport {
+
+    public void testBeanConcurrent() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1000);
+        mock.expectsNoDuplicates(body());
+
+        // start from 1000 to be 4 digit always (easier to string compare)
+        for (int i = 1000; i < 2000; i++) {
+            template.sendBody("seda:foo", "" + i);
+        }
+
+        context.startRoute("foo");
+
+        assertMockEndpointsSatisfied();
+
+        // should be 1000 messages
+        List<String> list = new ArrayList<String>();
+        for (int i = 0; i < 1000; i++) {
+            String body = mock.getReceivedExchanges().get(i).getIn().getBody(String.class);
+            list.add(body);
+        }
+        Collections.sort(list);
+
+        // and they should be unique and no lost messages
+        assertEquals(1000, list.size());
+        for (int i = 1; i < 1000; i++) {
+            int num = 1000 + i;
+            String s = "" + num + " " + num;
+            assertEquals(s, list.get(i));
+        }
+    }
+
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("myBean", new MyBean());
+        return jndi;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:foo?concurrentConsumers=10").routeId("foo").noAutoStartup()
+                    .transform(method("myBean"))
+                    .to("mock:result");
+            }
+        };
+    }
+
+    @SuppressWarnings("unused")
+    private static class MyBean {
+
+        private String foo;
+        private String bar;
+        private int baz;
+
+        public String getFoo() {
+            return foo;
+        }
+
+        public void setFoo(String foo) {
+            this.foo = foo;
+        }
+
+        public String getBar() {
+            return bar;
+        }
+
+        public void setBar(String bar) {
+            this.bar = bar;
+        }
+
+        public int getBaz() {
+            return baz;
+        }
+
+        public void setBaz(int baz) {
+            this.baz = baz;
+        }
+
+        public void doSomething() {
+            // noop
+        }
+
+        public String echo(String s) {
+            return s + " " + s;
+        }
+
+        @Override
+        public String toString() {
+            return "MyBean";
+        }
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollStopRouteTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollStopRouteTest.java
new file mode 100644
index 0000000..46c502e
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollStopRouteTest.java
@@ -0,0 +1,59 @@
+/**
+ * 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.file;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.mock.MockEndpoint;
+
+/**
+ *
+ */
+public class FileConsumerSharedThreadPollStopRouteTest extends FileConsumerSharedThreadPollTest {
+
+    public void testSharedThreadPool() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(2);
+        // thread thread name should be the same
+        mock.message(0).header("threadName").isEqualTo(mock.message(1).header("threadName"));
+
+        template.sendBodyAndHeader("file:target/a", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:target/b", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        assertMockEndpointsSatisfied();
+
+        // now stop a
+        context.stopRoute("a");
+
+        resetMocks();
+        mock.expectedBodiesReceived("Bye World 2");
+        // a should not be polled
+        mock.expectedFileExists("target/a/hello2.txt");
+
+        template.sendBodyAndHeader("file:target/a", "Hello World 2", Exchange.FILE_NAME, "hello2.txt");
+        template.sendBodyAndHeader("file:target/b", "Bye World 2", Exchange.FILE_NAME, "bye2.txt");
+
+        assertMockEndpointsSatisfied();
+
+        // now start a, which should pickup the file
+        resetMocks();
+        mock.expectedBodiesReceived("Hello World 2");
+        context.startRoute("a");
+
+        assertMockEndpointsSatisfied();
+    }
+
+}
diff --git a/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollTest.java b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollTest.java
new file mode 100644
index 0000000..fb0e582
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerSharedThreadPollTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.file;
+
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.builder.ThreadPoolBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.SimpleRegistry;
+
+/**
+ *
+ */
+public class FileConsumerSharedThreadPollTest extends ContextTestSupport {
+
+    private ScheduledExecutorService pool;
+    private SimpleRegistry registry = new SimpleRegistry();
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/a");
+        deleteDirectory("target/b");
+        super.setUp();
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        return new DefaultCamelContext(registry);
+    }
+
+    public void testSharedThreadPool() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(2);
+        // thread thread name should be the same
+        mock.message(0).header("threadName").isEqualTo(mock.message(1).header("threadName"));
+
+        template.sendBodyAndHeader("file:target/a", "Hello World", Exchange.FILE_NAME, "hello.txt");
+        template.sendBodyAndHeader("file:target/b", "Bye World", Exchange.FILE_NAME, "bye.txt");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // create shared pool and enlist in registry
+                pool = new ThreadPoolBuilder(context).poolSize(1).buildScheduled(this, "MySharedPool");
+                registry.put("myPool", pool);
+
+                from("file:target/a?scheduledExecutorService=#myPool").routeId("a")
+                    .to("direct:shared");
+
+                from("file:target/b?scheduledExecutorService=#myPool").routeId("b")
+                    .to("direct:shared");
+
+                from("direct:shared").routeId("shared")
+                    .convertBodyTo(String.class)
+                    .log("Get ${file:name} using ${threadName}")
+                    .process(new Processor() {
+                        @Override
+                        public void process(Exchange exchange) throws Exception {
+                            exchange.getIn().setHeader("threadName", Thread.currentThread().getName());
+                        }
+                    })
+                    .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRestartFromBeginningTest.java b/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRestartFromBeginningTest.java
new file mode 100644
index 0000000..e1aab51
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRestartFromBeginningTest.java
@@ -0,0 +1,101 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.RecipientList;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+/**
+ *
+ */
+public class DeadLetterChannelRestartFromBeginningTest extends ContextTestSupport {
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("retryBean", new RetryBean());
+        return jndi;
+    }
+
+    public void testRestartFromBeginning() throws Exception {
+        // 1 original + 4 redeliveries
+        getMockEndpoint("mock:start").expectedBodiesReceived("Camel", "Camel", "Camel", "Camel", "Camel");
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello Camel");
+
+        // use fire and forget
+        template.sendBody("seda:start", "Camel");
+
+        setAssertPeriod(200);
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // use the DLQ and let the retryBean handle this
+                errorHandler(deadLetterChannel("bean:retryBean").useOriginalMessage());
+
+                // use seda:retry as a way of retrying from the input route
+                // the seda:start could be any other kind of fire and forget endpoint
+                from("seda:start", "seda:retry")
+                    .to("log:start", "mock:start")
+                    .transform(body().prepend("Hello "))
+                    .process(new Processor() {
+                        private int counter;
+                        @Override
+                        public void process(Exchange exchange) throws Exception {
+                            // fail the first 3 times
+                            if (counter++ <= 3) {
+                                throw new IllegalArgumentException("Damn");
+                            }
+                        }
+                    })
+                    .to("mock:result");
+            }
+        };
+    }
+
+    /**
+     * Bean used as dead letter queue, that decides what to do with the message
+     */
+    public static class RetryBean {
+
+        // use recipient list to decide what to do with the message
+        @RecipientList
+        public String handleError(Exchange exchange) {
+            // store a property on the exchange with the number of total attempts
+            int attempts = exchange.getProperty("attempts", 0, int.class);
+            attempts++;
+            exchange.setProperty("attempts", attempts);
+
+            // we want to retry at most 4 times
+            if (attempts <= 4) {
+                return "seda:retry";
+            } else {
+                // okay we give up its a poison message
+                return "log:giveup";
+            }
+        }
+    }
+
+}
diff --git a/camel-core/src/test/java/org/apache/camel/processor/WireTapBeanTest.java b/camel-core/src/test/java/org/apache/camel/processor/WireTapBeanTest.java
new file mode 100644
index 0000000..c4c69bd
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/WireTapBeanTest.java
@@ -0,0 +1,69 @@
+/**
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+/**
+ * Wire tap unit test
+ *
+ * @version 
+ */
+public class WireTapBeanTest extends ContextTestSupport {
+    protected MockEndpoint tap;
+    protected MockEndpoint result;
+
+    public void testSend() throws Exception {
+        result.expectedBodiesReceived("Bye World");
+        tap.expectedBodiesReceived("World");
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        tap = getMockEndpoint("mock:tap");
+        result = getMockEndpoint("mock:result");
+    }
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                    .to("log:foo")
+                    .wireTap("seda:tap")
+                    .bean(MyBean.class)
+                    .to("mock:result");
+
+                from("seda:tap")
+                    .to("mock:tap");
+            }
+        };
+    }
+
+    public static class MyBean {
+
+        public String transform(String body) {
+            return "Bye " + body;
+        }
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/resources/log4j.properties b/camel-core/src/test/resources/log4j.properties
index 55fba64..b11d347 100644
--- a/camel-core/src/test/resources/log4j.properties
+++ b/camel-core/src/test/resources/log4j.properties
@@ -50,6 +50,7 @@
 #log4j.logger.org.apache.camel.util.FileUtil=TRACE
 #log4j.logger.org.apache.camel.util.AsyncProcessorHelper=TRACE
 #log4j.logger.org.apache.camel.util.ServiceHelper=TRACE
+#log4j.logger.org.apache.camel.util.jsse=TRACE
 
 # CONSOLE appender not used by default
 log4j.appender.out=org.apache.log4j.ConsoleAppender
diff --git a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java
index 1754511..dc39bac 100644
--- a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java
+++ b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelThreadPoolFactoryBean.java
@@ -52,6 +52,8 @@
     private ThreadPoolRejectedPolicy rejectedPolicy = ThreadPoolRejectedPolicy.CallerRuns;
     @XmlAttribute(required = true)
     private String threadName;
+    @XmlAttribute
+    private Boolean scheduled;
 
     public ExecutorService getObject() throws Exception {
         int size = CamelContextHelper.parseInteger(getCamelContext(), poolSize);
@@ -81,7 +83,13 @@
                 .maxQueueSize(queueSize)
                 .rejectedPolicy(rejectedPolicy)
                 .build();
-        ExecutorService answer = getCamelContext().getExecutorServiceManager().newThreadPool(getId(), getThreadName(), profile);
+
+        ExecutorService answer;
+        if (scheduled != null && scheduled) {
+            answer = getCamelContext().getExecutorServiceManager().newScheduledThreadPool(getId(), getThreadName(), profile);
+        } else {
+            answer = getCamelContext().getExecutorServiceManager().newThreadPool(getId(), getThreadName(), profile);
+        }
         return answer;
     }
 
@@ -145,4 +153,11 @@
         this.threadName = threadName;
     }
 
+    public Boolean getScheduled() {
+        return scheduled;
+    }
+
+    public void setScheduled(Boolean scheduled) {
+        this.scheduled = scheduled;
+    }
 }
\ No newline at end of file
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
index 801dde9..f0b8282 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/converter/CxfConverter.java
@@ -35,8 +35,6 @@
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.IOHelper;
 import org.apache.cxf.message.MessageContentsList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * The <a href="http://camel.apache.org/type-converter.html">Type Converters</a>
@@ -46,7 +44,6 @@
  */
 @Converter
 public final class CxfConverter {
-    private static final Logger LOG = LoggerFactory.getLogger(CxfConverter.class);
 
     private CxfConverter() {
         // Helper class
diff --git a/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java b/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java
index 9bdaeb7..89318cd 100644
--- a/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java
+++ b/components/camel-guice/src/main/java/org/apache/camel/guice/Main.java
@@ -73,6 +73,7 @@
     public static void main(String... args) throws Exception {
         Main main = new Main();
         instance = main;
+        main.enableHangupSupport();
         main.run(args);
     }
 
diff --git a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java
index 41b75e5..7e2dd44 100644
--- a/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java
+++ b/components/camel-jcr/src/main/java/org/apache/camel/component/jcr/JcrMessage.java
@@ -50,6 +50,11 @@
 
     @Override
     public void copyFrom(org.apache.camel.Message that) {
+        if (that == this) {
+            // the same instance so do not need to copy
+            return;
+        }
+
         // must initialize headers before we set the JmsMessage to avoid Camel
         // populating it before we do the copy
         getHeaders().clear();
diff --git a/components/camel-jibx/pom.xml b/components/camel-jibx/pom.xml
index 513f78b..542fc1e 100644
--- a/components/camel-jibx/pom.xml
+++ b/components/camel-jibx/pom.xml
@@ -81,14 +81,13 @@
                         <artifactId>maven-jibx-plugin</artifactId>
                         <version>${jibx-version}</version>
                         <configuration>
-                            <bindingDirectory>src/test/resources</bindingDirectory>
-                            <includeSchemaBindings>
-                                <includeSchemaBinding>**/*-jibx.xml</includeSchemaBinding>
-                            </includeSchemaBindings>
+                            <directory>${basedir}/src/test/resources/org/apache/camel/dataformat/jibx/</directory>
+                            <includes>
+                                <include>purchaseOrder-jibx.xml</include>
+                            </includes>
                         </configuration>
                         <executions>
                             <execution>
-                                <phase>process-test-classes</phase>
                                 <goals>
                                     <goal>test-bind</goal>
                                 </goals>
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
index 9950109..d200a9a 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
@@ -61,6 +61,11 @@
 
     @Override
     public void copyFrom(org.apache.camel.Message that) {
+        if (that == this) {
+            // the same instance so do not need to copy
+            return;
+        }
+
         // must initialize headers before we set the JmsMessage to avoid Camel
         // populating it before we do the copy
         getHeaders().clear();
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelChainedTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelChainedTest.java
new file mode 100644
index 0000000..6fad877
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelChainedTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.jms;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge;
+
+/**
+ * Test that chained request/reply over JMS works in parallel mode with the splitter EIP.
+ *
+ * @version 
+ */
+public class JmsSplitterParallelChainedTest extends CamelTestSupport {
+
+    protected String getUri() {
+        return "activemq:queue:foo";
+    }
+
+    protected String getUri2() {
+        return "activemq:queue:bar";
+    }
+
+    @Test
+    public void testSplitParallel() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("A,B,C,D,E");
+        getMockEndpoint("mock:reply").expectedBodiesReceivedInAnyOrder("Hi A", "Hi B", "Hi C", "Hi D", "Hi E");
+        getMockEndpoint("mock:reply2").expectedBodiesReceivedInAnyOrder("Bye Hi A", "Bye Hi B", "Bye Hi C", "Bye Hi D", "Bye Hi E");
+        getMockEndpoint("mock:split").expectedBodiesReceivedInAnyOrder("Bye Hi A", "Bye Hi B", "Bye Hi C", "Bye Hi D", "Bye Hi E");
+
+        template.sendBody("direct:start", "A,B,C,D,E");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory();
+        camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory));
+
+        return camelContext;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .split(body().tokenize(",")).parallelProcessing()
+                        .to("log:before")
+                        .to(ExchangePattern.InOut, getUri())
+                        .to("log:after")
+                        .to("mock:split")
+                    .end()
+                    .to("mock:result");
+
+                from(getUri())
+                    .transform(body().prepend("Hi "))
+                    .to("mock:reply")
+                    .to(ExchangePattern.InOut, getUri2());
+
+                from(getUri2())
+                    .transform(body().prepend("Bye "))
+                    .to("mock:reply2");
+            }
+        };
+    }
+
+}
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelTest.java
new file mode 100644
index 0000000..344736a
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsSplitterParallelTest.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jms;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge;
+
+/**
+ * @version 
+ */
+public class JmsSplitterParallelTest extends CamelTestSupport {
+
+    protected String getUri() {
+        return "activemq:queue:foo?useMessageIDAsCorrelationID=true";
+    }
+
+    @Test
+    public void testSplitParallel() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("A,B,C,D,E");
+        getMockEndpoint("mock:reply").expectedBodiesReceivedInAnyOrder("Bye A", "Bye B", "Bye C", "Bye D", "Bye E");
+        getMockEndpoint("mock:split").expectedBodiesReceivedInAnyOrder("Bye A", "Bye B", "Bye C", "Bye D", "Bye E");
+
+        template.sendBody("direct:start", "A,B,C,D,E");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory();
+        camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory));
+
+        return camelContext;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .split(body().tokenize(",")).parallelProcessing()
+                        .to("log:before")
+                        .to(ExchangePattern.InOut, getUri())
+                        .to("log:after")
+                        .to("mock:split")
+                    .end()
+                    .to("mock:result");
+
+                from(getUri())
+                    .transform(body().prepend("Bye "))
+                    .to("mock:reply");
+            }
+        };
+    }
+
+}
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/DynamicRoutersWithJMSMessageLostHeadersIssueTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/DynamicRoutersWithJMSMessageLostHeadersIssueTest.java
new file mode 100644
index 0000000..71827ff
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/DynamicRoutersWithJMSMessageLostHeadersIssueTest.java
@@ -0,0 +1,103 @@
+/**
+ * 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.jms.issues;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Header;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jms.CamelJmsTestHelper;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentAutoAcknowledge;
+
+/**
+ *
+ */
+public class DynamicRoutersWithJMSMessageLostHeadersIssueTest extends CamelTestSupport {
+
+    @Override
+    public void setUp() throws Exception {
+        deleteDirectory("target/inbox");
+        deleteDirectory("target/outbox");
+        super.setUp();
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        ConnectionFactory connectionFactory = CamelJmsTestHelper.createConnectionFactory();
+        camelContext.addComponent("activemq", jmsComponentAutoAcknowledge(connectionFactory));
+
+        return camelContext;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("activemq:queue1")
+                        .setHeader("HEADER1", constant("header1"))
+                        .dynamicRouter(method(DynamicRouter.class, "dynamicRoute"))
+                        .to("mock:checkHeader");
+
+                from("direct:foo")
+                        .setHeader("HEADER1", constant("header1"))
+                        .dynamicRouter(method(DynamicRouter.class, "dynamicRoute"))
+                        .to("mock:checkHeader");
+            }
+        };
+    }
+
+    @Test
+    public void testHeaderShouldExisted() throws InterruptedException {
+        // direct
+        getMockEndpoint("mock:checkHeader").expectedMessageCount(1);
+        getMockEndpoint("mock:checkHeader").expectedHeaderReceived("HEADER1", "header1");
+
+        template.sendBody("direct:foo", "A");
+
+        assertMockEndpointsSatisfied();
+        resetMocks();
+
+        // actvivemq
+        getMockEndpoint("mock:checkHeader").expectedMessageCount(1);
+        getMockEndpoint("mock:checkHeader").expectedHeaderReceived("HEADER1", "header1");
+
+        template.sendBody("activemq:queue1", "A");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public static class DynamicRouter {
+
+        public String dynamicRoute(Exchange exchange, @Header(Exchange.SLIP_ENDPOINT) String previous) {
+            if (previous == null) {
+                return "file://target/outbox";
+            } else {
+                //end slip
+                return null;
+            }
+        }
+
+    }
+}
diff --git a/components/camel-leveldb/pom.xml b/components/camel-leveldb/pom.xml
index 890185c..140ade8 100644
--- a/components/camel-leveldb/pom.xml
+++ b/components/camel-leveldb/pom.xml
@@ -31,6 +31,7 @@
     <name>Camel :: LevelDB</name>
     <description>Camel LevelDB Support</description>
 
+
     <properties>
         <camel.osgi.export.pkg>org.apache.camel.component.leveldb.*</camel.osgi.export.pkg>
     </properties>
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
index c466888..9217c08 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
@@ -18,7 +18,6 @@
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
diff --git a/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java b/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java
index 218a757..d0418de 100644
--- a/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java
+++ b/components/camel-rmi/src/test/java/org/apache/camel/component/rmi/RmiRouteEndpointTest.java
@@ -20,7 +20,6 @@
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.AvailablePortFinder;
 
 /**
  * @version 
diff --git a/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java b/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java
index ec9dc16..ee03d56 100644
--- a/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java
+++ b/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/SpringIntegrationMessage.java
@@ -46,6 +46,11 @@
 
     @Override
     public void copyFrom(org.apache.camel.Message that) {
+        if (that == this) {
+            // the same instance so do not need to copy
+            return;
+        }
+
         setMessageId(that.getMessageId());
         setBody(that.getBody());
         getHeaders().putAll(that.getHeaders());
diff --git a/components/camel-spring-ws/pom.xml b/components/camel-spring-ws/pom.xml
index cd7ad50..70421c8 100644
--- a/components/camel-spring-ws/pom.xml
+++ b/components/camel-spring-ws/pom.xml
@@ -53,11 +53,14 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-spring</artifactId>
         </dependency>
+
+<!-- spring-oxm is needed when upgrading to Spring WS 2.1 that uses Spring 3.1 onwards 
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-oxm</artifactId>
             <version>${spring-version}</version>
         </dependency>
+-->
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-webmvc</artifactId>
@@ -86,14 +89,17 @@
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-server</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-security</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-servlet</artifactId>
+            <scope>test</scope>
             <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
diff --git a/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java
index 922a06d..b7e015c 100644
--- a/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java
+++ b/components/camel-spring-ws/src/test/java/org/apache/camel/component/spring/ws/SSLContextParametersLocalRouteTest.java
@@ -24,12 +24,15 @@
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.StringSource;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+// TODO: enable after upgrading to Spring-WS 2.0.5
+@Ignore("Under JDK 7 requires minimum Spring-WS 2.0.5 to pass. Should be enabled again as soon as the upgrade to Spring-WS 2.0.5 has been done!")
 @ContextConfiguration
 public class SSLContextParametersLocalRouteTest extends AbstractJUnit4SpringContextTests {
 
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/test/SpringTestEndpointTest.java b/components/camel-spring/src/test/java/org/apache/camel/component/test/SpringTestEndpointTest.java
deleted file mode 100644
index 6193a85..0000000
--- a/components/camel-spring/src/test/java/org/apache/camel/component/test/SpringTestEndpointTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.test;
-
-import org.apache.camel.CamelContext;
-
-import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
-
-/**
- * @version
- */
-public class SpringTestEndpointTest extends TestEndpointTest {
-
-    protected CamelContext createCamelContext() throws Exception {
-        return createSpringCamelContext(this, "org/apache/camel/component/test/SpringTestEndpointTest.xml");
-    }
-
-}
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.java
new file mode 100644
index 0000000..2100756
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.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.spring.processor;
+
+import org.apache.camel.spring.SpringTestSupport;
+import org.apache.camel.util.concurrent.SizedScheduledExecutorService;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class SpringScheduledThreadPoolTest extends SpringTestSupport {
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml");
+    }
+
+    public void testScheduledThreadPool() throws Exception {
+        SizedScheduledExecutorService pool = context.getRegistry().lookup("myPool", SizedScheduledExecutorService.class);
+        assertNotNull(pool);
+
+        assertFalse("Should be started", pool.isShutdown());
+        assertEquals(5, pool.getCorePoolSize());
+    }
+
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/component/test/SpringTestEndpointTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml
similarity index 83%
rename from components/camel-spring/src/test/resources/org/apache/camel/component/test/SpringTestEndpointTest.xml
rename to components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml
index d143934..c8c0621 100644
--- a/components/camel-spring/src/test/resources/org/apache/camel/component/test/SpringTestEndpointTest.xml
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringScheduledThreadPoolTest.xml
@@ -22,13 +22,11 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-  <!-- START SNIPPET: example -->
-  <camelContext xmlns="http://camel.apache.org/schema/spring">
-    <route>
-      <from uri="seda:foo"/>
-      <to uri="test:seda:foo"/>
-    </route>
-  </camelContext>
-  <!-- END SNIPPET: example -->
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+
+        <!-- define a custom scheduled thread pool -->
+        <threadPool id="myPool" poolSize="5" threadName="myPool" scheduled="true"/>
+
+    </camelContext>
 
 </beans>
diff --git a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
index 14b682b..f8ccc10 100644
--- a/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
+++ b/components/camel-stream/src/main/java/org/apache/camel/component/stream/StreamProducer.java
@@ -115,6 +115,11 @@
     private synchronized void writeToStream(OutputStream outputStream, Exchange exchange) throws IOException, CamelExchangeException {
         Object body = exchange.getIn().getBody();
 
+        if (body == null) {
+            log.debug("Body is null, cannot write it to the stream.");
+            return;
+        }
+
         // if not a string then try as byte array first
         if (!(body instanceof String)) {
             byte[] bytes = exchange.getIn().getBody(byte[].class);
diff --git a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
index d2e1969..4130fff 100644
--- a/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
+++ b/components/camel-stream/src/test/java/org/apache/camel/component/stream/StreamSystemOutTest.java
@@ -67,6 +67,22 @@
         }
     }
 
+    @Test
+    public void shouldSkipNullBody() {
+        try {
+            // Given
+            System.setOut(new PrintStream(mockOut));
+
+            // When
+            template.sendBody("direct:in", null);
+
+            // Then
+            assertEquals(0, mockOut.toByteArray().length);
+        } finally {
+            System.setOut(stdOut);
+        }
+    }
+
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
diff --git a/parent/pom.xml b/parent/pom.xml
index 092844a..415bdde 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -117,7 +117,7 @@
     <jetty-version>7.5.4.v20111024</jetty-version>
     <jettison-version>1.3.1</jettison-version>
     <jexcelapi-version>2.4.2</jexcelapi-version>
-    <jibx-version>1.2.3</jibx-version>
+    <jibx-version>1.2.4.5</jibx-version>
     <jruby-version>1.6.7</jruby-version>
     <jsmpp-version>2.1.0_4</jsmpp-version>
     <jsch-version>0.1.48</jsch-version>
@@ -126,7 +126,7 @@
     <junit-version>4.10</junit-version>
     <jt400-version>6.0</jt400-version>
     <jaxb2-plugin-version>0.8.1</jaxb2-plugin-version>
-    <karaf-version>2.2.7</karaf-version>
+    <karaf-version>2.2.8</karaf-version>
     <krati-version>0.4.5</krati-version>
     <leveldbjni-version>1.2</leveldbjni-version>
     <log4j-version>1.2.16</log4j-version>
@@ -140,7 +140,7 @@
     <mybatis-version>3.1.1</mybatis-version>
     <!-- transitive dependency from avro, to use older netty bundle -->
     <netty-bundle-version>3.2.7.Final_1</netty-bundle-version>
-    <netty-version>3.5.0.Final</netty-version>
+    <netty-version>3.5.1.Final</netty-version>
     <ode-version>1.3.4</ode-version>
     <openwebbeans-version>1.1.3</openwebbeans-version>
     <ognl-version>3.0.4_1</ognl-version>
@@ -176,7 +176,8 @@
     <spring-version>3.0.7.RELEASE</spring-version>
     <spring-osgi-version>1.2.1</spring-osgi-version>
     <spring-security-version>3.1.0.RELEASE</spring-security-version>
-    <spring-ws-version>2.0.5.RELEASE</spring-ws-version>
+    <!-- spring WS 2.0.3 is the last release to support Spring 3.0.x -->
+    <spring-ws-version>2.0.3.RELEASE</spring-ws-version>
     <spymemcached-version>2.8.0</spymemcached-version>
     <sshd-version>0.6.0</sshd-version>
     <stax-api-version>1.0.1</stax-api-version>
diff --git a/platforms/karaf/features/pom.xml b/platforms/karaf/features/pom.xml
index 773760c..9299eec 100644
--- a/platforms/karaf/features/pom.xml
+++ b/platforms/karaf/features/pom.xml
@@ -85,6 +85,7 @@
       <jdom-bundle-version>1.1_4</jdom-bundle-version>
       <jing-bundle-version>20030619_5</jing-bundle-version>
       <jodatime-bundle-version>1.6.2</jodatime-bundle-version>
+      <jodatime2-bundle-version>2.1</jodatime2-bundle-version>
       <josql-bundle-version>1.5_5</josql-bundle-version>
       <jsch-bundle-version>0.1.48_1</jsch-bundle-version>
       <jsendnsca-bundle-version>1.3.1_3</jsendnsca-bundle-version>
diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml
index d6229b3..3e7b043 100644
--- a/platforms/karaf/features/src/main/resources/features.xml
+++ b/platforms/karaf/features/src/main/resources/features.xml
@@ -476,7 +476,7 @@
     <bundle dependency='true'>mvn:org.jibx/jibx-run/${jibx-version}</bundle>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.bcel/${bcel-bundle-version}</bundle>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xpp3/${xpp3-bundle-version}</bundle>
-    <bundle dependency="true">mvn:joda-time/joda-time/${jodatime-bundle-version}</bundle>
+    <bundle dependency="true">mvn:joda-time/joda-time/${jodatime2-bundle-version}</bundle>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jdom/${jdom-bundle-version}</bundle>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/${dom4j-bundle-version}</bundle>
   </feature>
@@ -548,7 +548,7 @@
   </feature>
   <feature name='camel-leveldb' version='${project.version}' resolver='(obr)' start-level='50'>
     <feature version='${project.version}'>camel-core</feature>
-    <bundle dependency='true'>wrap:mvn:org.fusesource.leveldbjni/leveldbjni-all/${leveldbjni-version}</bundle>
+    <bundle dependency='true'>wrap:mvn:org.fusesource.leveldbjni/leveldbjni-all/${leveldbjni-version}$Bundle-Version=${leveldbjni-version}&amp;Export-Package=*;-noimport:=true;version="${leveldbjni-version}"</bundle>
     <bundle dependency='true'>mvn:org.fusesource.hawtbuf/hawtbuf/${hawtbuf-version}</bundle>
     <bundle>mvn:org.apache.camel/camel-leveldb/${project.version}</bundle>
   </feature>
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java
index ede7d98..4609d3a 100644
--- a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSpringWebServiceTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.itest.karaf;
 
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Option;
@@ -24,7 +23,6 @@
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 
 @RunWith(JUnit4TestRunner.class)
-@Ignore("Requires Spring 3.1")
 public class CamelSpringWebServiceTest extends AbstractFeatureTest {
 
     public static final String COMPONENT = "spring-ws";
diff --git a/tooling/camel-manual/pom.xml b/tooling/camel-manual/pom.xml
index 8d9bf15..ec3ccd5 100644
--- a/tooling/camel-manual/pom.xml
+++ b/tooling/camel-manual/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.camel</groupId>
     <artifactId>camel-parent</artifactId>
-    <version>2.10-SNAPSHOT</version>
+    <version>2.10.0</version>
     <relativePath>../../parent</relativePath>
   </parent>
 
diff --git a/tooling/pom.xml b/tooling/pom.xml
index 7ccd62d..dd896e1 100644
--- a/tooling/pom.xml
+++ b/tooling/pom.xml
@@ -34,33 +34,34 @@
   <modules>
     <module>maven</module>
     <module>archetypes</module>
+    <module>camel-manual</module>
   </modules>
 
-  <profiles>
-      <profile>
-          <id>build.manual</id>
-          <modules>
-              <module>camel-manual</module>
-          </modules>
-      </profile>
-      <profile>
-          <id>assembly</id>
-          <modules>
-              <module>camel-manual</module>
-          </modules>
-      </profile>
-      <profile>
-          <id>deploy</id>
-          <modules>
-              <module>camel-manual</module>
-          </modules>
-      </profile>
-      <profile>
-          <id>apache-release</id>
-          <modules>
-              <module>camel-manual</module>
-          </modules>
-      </profile>
-  </profiles>
+  <!-- profiles>
+    <profile>
+      <id>build.manual</id>
+      <modules>
+        <module>camel-manual</module>
+      </modules>
+    </profile>
+    <profile>
+      <id>assembly</id>
+      <modules>
+        <module>camel-manual</module>
+      </modules>
+    </profile>
+    <profile>
+      <id>deploy</id>
+      <modules>
+        <module>camel-manual</module>
+      </modules>
+    </profile>
+    <profile>
+      <id>apache-release</id>
+      <modules>
+        <module>camel-manual</module>
+      </modules>
+    </profile>
+  </profiles -->
 
 </project>