diff --git a/camel-core/src/main/java/org/apache/camel/Message.java b/camel-core/src/main/java/org/apache/camel/Message.java
index b6f2a5a..792f896 100644
--- a/camel-core/src/main/java/org/apache/camel/Message.java
+++ b/camel-core/src/main/java/org/apache/camel/Message.java
@@ -140,7 +140,7 @@
      * See {@link org.apache.camel.impl.DefaultMessage DefaultMessage} for how headers
      * is represented in Camel using a {@link org.apache.camel.util.CaseInsensitiveMap CaseInsensitiveMap}.
      * <p/>
-     * If you want to walk the returned Map and fetch all the keys and values, you should use
+     * <b>Important:</b> If you want to walk the returned {@link Map} and fetch all the keys and values, you should use
      * the {@link java.util.Map#entrySet()} method, which ensure you get the keys in the original case.
      *
      * @return all the headers in a Map
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java b/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
index 53ad552..71d5b5e 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/FileOperations.java
@@ -31,6 +31,7 @@
 import org.apache.camel.InvalidPayloadException;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -255,8 +256,8 @@
                 position += in.transferTo(position, endpoint.getBufferSize(), out);
             }
         } finally {
-            ObjectHelper.close(in, source.getName(), LOG);
-            ObjectHelper.close(out, source.getName(), LOG);
+            IOHelper.close(in, source.getName(), LOG);
+            IOHelper.close(out, source.getName(), LOG);
         }
     }
 
@@ -280,8 +281,8 @@
                 byteBuffer.clear();
             }
         } finally {
-            ObjectHelper.close(in, target.getName(), LOG);
-            ObjectHelper.close(out, target.getName(), LOG);
+            IOHelper.close(in, target.getName(), LOG);
+            IOHelper.close(out, target.getName(), LOG);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
index c85b664..8e5493c 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/GenericFileProducer.java
@@ -25,6 +25,7 @@
 import org.apache.camel.spi.Language;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -214,7 +215,7 @@
             }
 
         } finally {
-            ObjectHelper.close(payload, "Closing payload", log);
+            IOHelper.close(payload, "Closing payload", log);
         }
 
     }
diff --git a/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java b/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java
index d0507d0..becbef8 100644
--- a/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/component/file/strategy/FileLockExclusiveReadLockStrategy.java
@@ -29,7 +29,7 @@
 import org.apache.camel.component.file.GenericFileExclusiveReadLockStrategy;
 import org.apache.camel.component.file.GenericFileOperations;
 import org.apache.camel.util.ExchangeHelper;
-import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.StopWatch;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -126,7 +126,7 @@
             lock.release();
         } finally {
             // must close channel first
-            ObjectHelper.close(channel, "while acquiring exclusive read lock for file: " + lockFileName, LOG);
+            IOHelper.close(channel, "while acquiring exclusive read lock for file: " + lockFileName, LOG);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java b/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
index db73284..5ffd8cf 100644
--- a/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java
@@ -35,6 +35,7 @@
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
+import org.apache.camel.Handler;
 import org.apache.camel.Message;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
@@ -221,6 +222,21 @@
     // -------------------------------------------------------------------------
 
     /**
+     * Handles the incoming exchange.
+     * <p/>
+     * This method turns this mock endpoint into a bean which you can use
+     * in the Camel routes, which allows you to inject MockEndpoint as beans
+     * in your routes and use the features of the mock to control the bean.
+     *
+     * @param exchange  the exchange
+     * @throws Exception can be thrown
+     */
+    @Handler
+    public void handle(Exchange exchange) throws Exception {
+        onExchange(exchange);
+    }
+
+    /**
      * Set the processor that will be invoked when the index
      * message is received.
      */
diff --git a/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java b/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
index 2bf8cb4..96af65b 100644
--- a/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
+++ b/camel-core/src/main/java/org/apache/camel/converter/IOConverter.java
@@ -40,7 +40,6 @@
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 import java.net.URL;
-import java.nio.charset.Charset;
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
@@ -177,7 +176,7 @@
         try {
             return toBytes(is);
         } finally {
-            ObjectHelper.close(is, "file", LOG);
+            IOHelper.close(is, "file", LOG);
         }
     }
     
@@ -206,7 +205,7 @@
         try {
             return toString(is, exchange);
         } finally {
-            ObjectHelper.close(is, "url", LOG);
+            IOHelper.close(is, "url", LOG);
         }
     }
 
@@ -237,7 +236,7 @@
                 }
             }
         } finally {
-            ObjectHelper.close(reader, "reader", LOG);
+            IOHelper.close(reader, "reader", LOG);
         }
 
         return sb.toString();
@@ -303,7 +302,7 @@
             IOHelper.copy(stream, bos);
             return bos.toByteArray();
         } finally {
-            ObjectHelper.close(bos, "stream", LOG);
+            IOHelper.close(bos, "stream", LOG);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java b/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
index 4e0fa6f..4c75fe9 100644
--- a/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
+++ b/camel-core/src/main/java/org/apache/camel/converter/NIOConverter.java
@@ -26,7 +26,7 @@
 
 import org.apache.camel.Converter;
 import org.apache.camel.Exchange;
-import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.IOHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -76,7 +76,7 @@
             }
             return ByteBuffer.wrap(buf);
         } finally {
-            ObjectHelper.close(in, "Failed to close file stream: " + file.getPath(), LOG);
+            IOHelper.close(in, "Failed to close file stream: " + file.getPath(), LOG);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultFactoryFinder.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultFactoryFinder.java
index ae1fe2a..44c9adb 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultFactoryFinder.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultFactoryFinder.java
@@ -30,7 +30,7 @@
 import org.apache.camel.spi.FactoryFinder;
 import org.apache.camel.spi.Injector;
 import org.apache.camel.util.CastUtils;
-import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.IOHelper;
 
 /**
  * Default factory finder.
@@ -143,8 +143,8 @@
             properties.load(reader);
             return properties;
         } finally {
-            ObjectHelper.close(reader, key, null);
-            ObjectHelper.close(in, key, null);
+            IOHelper.close(reader, key, null);
+            IOHelper.close(in, key, null);
         }
     }
 }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
index 4b91fbe..c4aba97 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultPackageScanClassResolver.java
@@ -41,7 +41,7 @@
 import org.apache.camel.impl.scan.CompositePackageScanFilter;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.PackageScanFilter;
-import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.IOHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -386,7 +386,7 @@
             log.warn("Cannot search jar file '" + urlPath + "' for classes matching criteria: " + test
                 + " due to an IOException: " + ioe.getMessage(), ioe);
         } finally {
-            ObjectHelper.close(jarStream, urlPath, log);
+            IOHelper.close(jarStream, urlPath, log);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/GzipDataFormat.java b/camel-core/src/main/java/org/apache/camel/impl/GzipDataFormat.java
index 1621485..9ab9fa7 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/GzipDataFormat.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/GzipDataFormat.java
@@ -36,9 +36,9 @@
         try {
             IOHelper.copy(is, zipOutput);
         } finally {
-            zipOutput.close();
+            IOHelper.close(is);
+            IOHelper.close(zipOutput);
         }
-        
     }
 
     public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
@@ -47,8 +47,12 @@
         
         // Create an expandable byte array to hold the inflated data
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        IOHelper.copy(unzipInput, bos);
-        return bos.toByteArray();
+        try {
+            IOHelper.copy(unzipInput, bos);
+            return bos.toByteArray();
+        } finally {
+            IOHelper.close(unzipInput);
+        }
     }
 
 }
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ZipDataFormat.java b/camel-core/src/main/java/org/apache/camel/impl/ZipDataFormat.java
index f447072..9808947 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ZipDataFormat.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ZipDataFormat.java
@@ -47,7 +47,8 @@
         try {
             IOHelper.copy(is, zipOutput);
         } finally {
-            zipOutput.close();
+            IOHelper.close(is);
+            IOHelper.close(zipOutput);
         }
     }
 
@@ -61,8 +62,7 @@
             IOHelper.copy(unzipInput, bos);
             return bos.toByteArray();
         } finally {
-            unzipInput.close();
-            bos.close();
+            IOHelper.close(unzipInput);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java b/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
index f8ee14b..3fd9ba7 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/converter/AnnotationTypeConverterLoader.java
@@ -37,6 +37,7 @@
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.util.CastUtils;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -117,7 +118,7 @@
                         tokenize(packages, line);
                     }
                 } finally {
-                    ObjectHelper.close(reader, null, LOG);
+                    IOHelper.close(reader, null, LOG);
                 }
             }
         }
diff --git a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
index 6942e08..415ddd7 100644
--- a/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
@@ -45,6 +45,7 @@
 import org.apache.camel.builder.ExpressionBuilder;
 import org.apache.camel.builder.ExpressionClause;
 import org.apache.camel.builder.ProcessorBuilder;
+import org.apache.camel.builder.ValueBuilder;
 import org.apache.camel.model.language.ConstantExpression;
 import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.language.LanguageExpression;
@@ -1108,8 +1109,50 @@
     public FilterDefinition filter(String language, String expression) {
         return filter(new LanguageExpression(language, expression));
     }
+    
+    /**
+     * Creates a validation expression which only if it is <tt>true</tt> then the
+     * exchange is forwarded to the destination.
+     * Otherwise a {@link org.apache.camel.processor.validation.PredicateValidationException} is thrown.
+     *
+     * @param expression  the expression
+     * @return the builder
+     */
+    public ValidateDefinition validate(Expression expression) {
+        ValidateDefinition answer = new ValidateDefinition();
+        answer.setExpression(new ExpressionDefinition(expression));
+        addOutput(answer);
+        return answer;
+    }
 
     /**
+     * Creates a validation expression which only if it is <tt>true</tt> then the
+     * exchange is forwarded to the destination.
+     * Otherwise a {@link org.apache.camel.processor.validation.PredicateValidationException} is thrown.
+     *
+     * @param predicate  the predicate
+     * @return the builder
+     */
+    public ValidateDefinition validate(Predicate predicate) {
+        ValidateDefinition answer = new ValidateDefinition();
+        answer.setExpression(new ExpressionDefinition(predicate));
+        addOutput(answer);
+        return answer;
+    }
+
+    /**
+     * Creates a validation expression which only if it is <tt>true</tt> then the
+     * exchange is forwarded to the destination.
+     * Otherwise a {@link org.apache.camel.processor.validation.PredicateValidationException} is thrown.
+     *
+     * @return the builder
+     */
+    public ExpressionClause<ValidateDefinition> validate() {
+        ValidateDefinition answer = new ValidateDefinition();
+        addOutput(answer);
+        return ExpressionClause.createAndSetExpression(answer);
+    }
+    /**
      * <a href="http://camel.apache.org/load-balancer.html">Load Balancer EIP:</a>
      * Creates a loadbalance
      *
diff --git a/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java b/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java
new file mode 100644
index 0000000..59efc8b
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/model/ValidateDefinition.java
@@ -0,0 +1,57 @@
+/**
+ * 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.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.Processor;
+import org.apache.camel.processor.validation.PredicateValidatingProcessor;
+import org.apache.camel.spi.RouteContext;
+
+/**
+ * Represents an XML &lt;validate/&gt; element
+ *
+ * @version $Revision$
+ */
+@XmlRootElement(name = "validate")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class ValidateDefinition extends ExpressionNode {
+
+    public ValidateDefinition() {
+        super();
+    }
+    
+    @Override
+    public String toString() {
+        return "Validate[" + getExpression() + " -> " + getOutputs() + "]";
+    }
+    
+    @Override
+    public String getShortName() {
+        return "validate";
+    }
+
+
+    @Override
+    public PredicateValidatingProcessor createProcessor(RouteContext routeContext) throws Exception {
+        Processor childProcessor = routeContext.createProcessor(this);
+        return new PredicateValidatingProcessor(getExpression().createPredicate(routeContext), childProcessor);
+    }
+
+}
\ No newline at end of file
diff --git a/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java b/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
index c8ab456..2710490 100644
--- a/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/language/ExpressionDefinition.java
@@ -92,15 +92,15 @@
         if (getLanguage() != null) {
             sb.append(getLanguage()).append("{");
         }
-        if (getExpression() != null) {
-            sb.append(getExpression());
-        }
         if (getPredicate() != null) {
             sb.append(getPredicate().toString());
         }
         if (getExpressionValue() != null) {
             sb.append(getExpressionValue().toString());
         }
+        if (getPredicate() == null && getExpressionValue() == null && getExpression() != null) {
+            sb.append(getExpression());
+        }
         if (getLanguage() != null) {
             sb.append("}");
         }
diff --git a/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java
index c866110..bf63210 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java
@@ -195,7 +195,7 @@
      * @param exchange the exchange
      * @return the aggregated exchange
      */
-    private Exchange doAggregation(String key, Exchange exchange) {
+    private Exchange doAggregation(String key, Exchange exchange) throws CamelExchangeException {
         if (LOG.isTraceEnabled()) {
             LOG.trace("onAggregation +++ start +++ with correlation key: " + key);
         }
@@ -223,6 +223,10 @@
         // prepare the exchanges for aggregation and aggregate it
         ExchangeHelper.prepareAggregation(oldExchange, newExchange);
         answer = onAggregation(oldExchange, exchange);
+        if (answer == null) {
+            throw new CamelExchangeException("AggregationStrategy " + aggregationStrategy + " returned null which is not allowed", exchange);
+        }
+
         // update the aggregated size
         answer.setProperty(Exchange.AGGREGATED_SIZE, size);
 
diff --git a/camel-core/src/main/java/org/apache/camel/processor/idempotent/FileIdempotentRepository.java b/camel-core/src/main/java/org/apache/camel/processor/idempotent/FileIdempotentRepository.java
index ae96baf..257b53e 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/idempotent/FileIdempotentRepository.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/idempotent/FileIdempotentRepository.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.camel.spi.IdempotentRepository;
+import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.LRUCache;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
@@ -218,7 +219,7 @@
         } catch (IOException e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         } finally {
-            ObjectHelper.close(fos, "Appending to file idempotent repository", LOG);
+            IOHelper.close(fos, "Appending to file idempotent repository", LOG);
         }
     }
 
@@ -240,7 +241,7 @@
         } catch (IOException e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         } finally {
-            ObjectHelper.close(fos, "Trunking file idempotent repository", LOG);
+            IOHelper.close(fos, "Trunking file idempotent repository", LOG);
         }
     }
 
diff --git a/camel-core/src/main/java/org/apache/camel/processor/validation/PredicateValidatingProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/validation/PredicateValidatingProcessor.java
new file mode 100644
index 0000000..f5eaa95
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/processor/validation/PredicateValidatingProcessor.java
@@ -0,0 +1,70 @@
+/**
+ * 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.validation;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.Processor;
+import org.apache.camel.processor.DelegateProcessor;
+import org.apache.camel.processor.Traceable;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A processor which validates the content of the inbound message body
+ * against a regular expression.
+ * 
+ * @version $Revision$
+ */
+public class PredicateValidatingProcessor extends DelegateProcessor implements Traceable {
+    
+    private static final Log LOG = LogFactory.getLog(PredicateValidatingProcessor.class);
+
+    private final Predicate predicate;
+    
+    public PredicateValidatingProcessor(Predicate predicate, Processor processor) {
+        super(processor);
+        this.predicate = predicate;
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        boolean matches = predicate.matches(exchange);
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Validation " + (matches ? "succeed " : "failed ") + "for " + exchange + " with Predicate[" + predicate + "]");
+        }
+
+        if (matches) {
+            super.process(exchange);
+        } else {
+            throw new PredicateValidationException(exchange, predicate);
+        }
+    }
+    
+    @Override
+    public String toString() {
+        return "validate[" + predicate + "]";
+    }
+
+    public String getTraceLabel() {
+        return "validate";
+    }
+    
+    public Predicate getPredicate() {
+        return predicate;
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/main/java/org/apache/camel/processor/validation/PredicateValidationException.java b/camel-core/src/main/java/org/apache/camel/processor/validation/PredicateValidationException.java
new file mode 100644
index 0000000..a5d0914
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/processor/validation/PredicateValidationException.java
@@ -0,0 +1,49 @@
+/**
+ * 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.validation;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.ValidationException;
+
+/**
+ * A predicate validation exception occurred
+ * 
+ * @version $Revision$
+ */
+public class PredicateValidationException extends ValidationException {
+
+    private static final long serialVersionUID = 5767438583860347105L;
+
+    private final Predicate predicate;
+
+    public PredicateValidationException(Exchange exchange, Predicate predicate) {
+        super(exchange, buildMessage(predicate, exchange));
+        this.predicate = predicate;
+    }
+
+    protected static String buildMessage(Predicate predicate, Exchange exchange) {
+        StringBuilder builder = new StringBuilder("Validation failed for Predicate[");
+        builder.append(predicate.toString());
+        builder.append("]");
+        return builder.toString();
+    }
+
+    public Predicate getPredicate() {
+        return predicate;
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java b/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
index 38e7e52..9f4395c 100644
--- a/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
+++ b/camel-core/src/main/java/org/apache/camel/util/CaseInsensitiveMap.java
@@ -24,7 +24,7 @@
 /**
  * A map that uses case insensitive keys, but preserves the original keys in the keySet.
  * <p/>
- * This map allows you to do lookup using case insenstive keys so you can retrieve the value without worring about
+ * This map allows you to do lookup using case insensitive keys so you can retrieve the value without worrying about
  * whether some transport protocol affects the keys such as Http and Mail protocols can do.
  * <p/>
  * When copying from this map to a regular Map such as {@link java.util.HashMap} then the original keys are
diff --git a/camel-core/src/main/java/org/apache/camel/util/IOHelper.java b/camel-core/src/main/java/org/apache/camel/util/IOHelper.java
index 17a2c2d..a638cae 100644
--- a/camel-core/src/main/java/org/apache/camel/util/IOHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/IOHelper.java
@@ -16,12 +16,16 @@
  */
 package org.apache.camel.util;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 /**
  * IO helper class.
  *
@@ -29,6 +33,7 @@
  */
 public final class IOHelper {
     
+    private static final transient Log LOG = LogFactory.getLog(IOHelper.class);
     private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
     private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
 
@@ -104,11 +109,55 @@
     
     public static void copyAndCloseInput(InputStream input, OutputStream output) throws IOException {
         copy(input, output);
-        input.close();
+        close(input, null, LOG);
     }
     
     public static void copyAndCloseInput(InputStream input, OutputStream output, int bufferSize) throws IOException {
         copy(input, output, bufferSize);
-        input.close();
+        close(input, null, LOG);
     }
+
+    /**
+     * Closes the given resource if it is available, logging any closing
+     * exceptions to the given log
+     *
+     * @param closeable the object to close
+     * @param name the name of the resource
+     * @param log the log to use when reporting closure warnings
+     */
+    public static void close(Closeable closeable, String name, Log log) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                if (log != null) {
+                    if (name != null) {
+                        log.warn("Cannot close: " + name + ". Reason: " + e.getMessage(), e);
+                    } else {
+                        log.warn("Cannot close. Reason: " + e.getMessage(), e);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Closes the given resource if it is available.
+     *
+     * @param closeable the object to close
+     * @param name the name of the resource
+     */
+    public static void close(Closeable closeable, String name) {
+        close(closeable, name, LOG);
+    }
+
+    /**
+     * Closes the given resource if it is available.
+     *
+     * @param closeable the object to close
+     */
+    public static void close(Closeable closeable) {
+        close(closeable, null, LOG);
+    }
+
 }
diff --git a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
index e5fa303..6aafeaf 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
@@ -581,9 +581,8 @@
     /**
      * A helper method to access a camel context properties with a prefix
      *
-     * @param name         the name of the system property required
-     * @param defaultValue the default value to use if the property is not
-     *                     available or a security exception prevents access
+     * @param prefix       the prefix
+     * @param camelContext the camel context
      * @return the properties which holds the camel context properties with the prefix,
      *         and the key omit the prefix part
      */
@@ -993,19 +992,14 @@
      * @param closeable the object to close
      * @param name the name of the resource
      * @param log the log to use when reporting closure warnings
+     * @deprecated use {@link org.apache.camel.util.IOHelper#close(java.io.Closeable, String, org.apache.commons.logging.Log)}
      */
+    @Deprecated
     public static void close(Closeable closeable, String name, Log log) {
-        if (closeable != null) {
-            try {
-                closeable.close();
-            } catch (IOException e) {
-                if (log != null) {
-                    log.warn("Cannot close: " + name + ". Reason: " + e, e);
-                }
-            }
-        }
+        IOHelper.close(closeable, name, log);
     }
 
+
     /**
      * Converts the given value to the required type or throw a meaningful exception
      */
diff --git a/camel-core/src/main/resources/org/apache/camel/model/jaxb.index b/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
index 7bc0914..07bf86d 100644
--- a/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
+++ b/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
@@ -79,5 +79,6 @@
 TransformDefinition
 TryDefinition
 UnmarshalDefinition
+ValidateDefinition
 WhenDefinition
 WireTapDefinition
diff --git a/camel-core/src/test/java/org/apache/camel/component/mock/MockAsBeanTest.java b/camel-core/src/test/java/org/apache/camel/component/mock/MockAsBeanTest.java
new file mode 100644
index 0000000..05ec8a6
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/mock/MockAsBeanTest.java
@@ -0,0 +1,76 @@
+/**
+ * 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.mock;
+
+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.impl.JndiRegistry;
+
+/**
+ * @version $Revision$
+ */
+public class MockAsBeanTest extends ContextTestSupport {
+
+    // create foo bean as a mock endpoint
+    private MockEndpoint foo = new MockEndpoint();
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("foo", foo);
+        return jndi;
+    }
+
+    // START SNIPPET: e1
+    public void testMockAsBean() throws Exception {
+        // we should expect to receive the transformed message
+        getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+        // the foo bean is a MockEndpoint which we use in this test to transform
+        // the message
+        foo.whenAnyExchangeReceived(new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                String in = exchange.getIn().getBody(String.class);
+                exchange.getIn().setBody("Bye " + in);
+            }
+        });
+
+        template.sendBody("direct:start", "World");
+
+        assertMockEndpointsSatisfied();
+    }
+    // END SNIPPET: e1
+
+    @Override
+    // START SNIPPET: e2
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    // send to foo bean
+                    .beanRef("foo")
+                    // and then to result mock
+                    .to("mock:result");
+            }
+        };
+    }
+    // END SNIPPET: e2
+
+}
diff --git a/camel-core/src/test/java/org/apache/camel/impl/GzipDataFormatFileDeleteTest.java b/camel-core/src/test/java/org/apache/camel/impl/GzipDataFormatFileDeleteTest.java
new file mode 100644
index 0000000..99ff713
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/impl/GzipDataFormatFileDeleteTest.java
@@ -0,0 +1,65 @@
+/**
+ * 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.impl;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class GzipDataFormatFileDeleteTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/gzip");
+        super.setUp();
+    }
+
+    public void testGzipFileDelete() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("file:target/gzip", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+
+        //give a bit time
+        Thread.sleep(1000);
+
+        File in = new File("target/gzip/hello.txt").getAbsoluteFile();
+        assertFalse("Should have been deleted " + in, in.exists());
+
+        File out = new File("target/gzip/out/hello.txt.gz").getAbsoluteFile();
+        assertTrue("Should have been created " + out, out.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/gzip?delete=true")
+                    .marshal().gzip()
+                    .to("file:target/gzip/out?fileName=${file:name}.gz")
+                    .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/camel-core/src/test/java/org/apache/camel/impl/GzipDataFormatFileUnmarshalDeleteTest.java b/camel-core/src/test/java/org/apache/camel/impl/GzipDataFormatFileUnmarshalDeleteTest.java
new file mode 100644
index 0000000..1634d63
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/impl/GzipDataFormatFileUnmarshalDeleteTest.java
@@ -0,0 +1,68 @@
+/**
+ * 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.impl;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class GzipDataFormatFileUnmarshalDeleteTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/gzip");
+        super.setUp();
+    }
+
+    public void testGzipFileUnmarshalDelete() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("file:target/gzip", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+
+        //give a bit time
+        Thread.sleep(1000);
+
+        File in = new File("target/gzip/hello.txt").getAbsoluteFile();
+        assertFalse("Should have been deleted " + in, in.exists());
+
+        File out = new File("target/gzip/out/hello.txt.gz").getAbsoluteFile();
+        assertFalse("Should have been deleted " + out, out.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/gzip?delete=true")
+                    .marshal().gzip()
+                    .to("file:target/gzip/out?fileName=${file:name}.gz");
+
+                from("file:target/gzip/out?delete=true")
+                    .unmarshal().gzip()
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/java/org/apache/camel/impl/ZipDataFormatFileDeleteTest.java b/camel-core/src/test/java/org/apache/camel/impl/ZipDataFormatFileDeleteTest.java
new file mode 100644
index 0000000..4bf55ef
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/impl/ZipDataFormatFileDeleteTest.java
@@ -0,0 +1,65 @@
+/**
+ * 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.impl;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class ZipDataFormatFileDeleteTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/zip");
+        super.setUp();
+    }
+
+    public void testZipFileDelete() throws Exception {
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBodyAndHeader("file:target/zip", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+
+        //give a bit time
+        Thread.sleep(1000);
+
+        File in = new File("target/zip/hello.txt").getAbsoluteFile();
+        assertFalse("Should have been deleted " + in, in.exists());
+
+        File out = new File("target/zip/out/hello.txt.zip").getAbsoluteFile();
+        assertTrue("Should have been created " + out, out.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/zip?delete=true")
+                    .marshal().zip()
+                    .to("file:target/zip/out?fileName=${file:name}.zip")
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/java/org/apache/camel/impl/ZipDataFormatFileUnmarshalDeleteTest.java b/camel-core/src/test/java/org/apache/camel/impl/ZipDataFormatFileUnmarshalDeleteTest.java
new file mode 100644
index 0000000..b4015d6
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/impl/ZipDataFormatFileUnmarshalDeleteTest.java
@@ -0,0 +1,68 @@
+/**
+ * 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.impl;
+
+import java.io.File;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * @version $Revision$
+ */
+public class ZipDataFormatFileUnmarshalDeleteTest extends ContextTestSupport {
+
+    @Override
+    protected void setUp() throws Exception {
+        deleteDirectory("target/zip");
+        super.setUp();
+    }
+
+    public void testZipFileUnmarshalDelete() throws Exception {
+        getMockEndpoint("mock:result").expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("file:target/zip", "Hello World", Exchange.FILE_NAME, "hello.txt");
+
+        assertMockEndpointsSatisfied();
+
+        //give a bit time
+        Thread.sleep(1000);
+
+        File in = new File("target/zip/hello.txt").getAbsoluteFile();
+        assertFalse("Should have been deleted " + in, in.exists());
+
+        File out = new File("target/zip/out/hello.txt.zip").getAbsoluteFile();
+        assertFalse("Should have been deleted " + out, out.exists());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("file:target/zip?delete=true")
+                    .marshal().zip()
+                    .to("file:target/zip/out?fileName=${file:name}.zip");
+
+                from("file:target/zip/out?delete=true")
+                    .unmarshal().zip()
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ValidateRegExpTest.java b/camel-core/src/test/java/org/apache/camel/processor/ValidateRegExpTest.java
new file mode 100644
index 0000000..708f615
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ValidateRegExpTest.java
@@ -0,0 +1,77 @@
+/**
+ * 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.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Endpoint;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.processor.validation.PredicateValidationException;
+
+/**
+ * @version $Revision$
+ */
+public class ValidateRegExpTest extends ContextTestSupport {
+    
+    private Endpoint startEndpoint;
+    private MockEndpoint resultEndpoint;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        
+        startEndpoint = resolveMandatoryEndpoint("direct:start", Endpoint.class);
+        resultEndpoint = resolveMandatoryEndpoint("mock:result", MockEndpoint.class);
+    }
+
+    public void testSendMatchingMessage() throws Exception {
+        resultEndpoint.expectedMessageCount(1);
+
+        template.sendBody(startEndpoint, "01.01.2010");
+        
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testSendNotMatchingMessage() throws Exception {
+        resultEndpoint.expectedMessageCount(0);
+
+        try {
+            template.sendBody(startEndpoint, "1.1.2010");
+            fail("CamelExecutionException expected");
+        } catch (CamelExecutionException e) {
+            // expected
+            assertIsInstanceOf(PredicateValidationException.class, e.getCause());
+            // as the Expression could be different between the DSL and simple language, here we just check part of the message 
+            assertTrue("Get a wrong exception message", e.getCause().getMessage().startsWith("Validation failed for Predicate[bodyAs[java.lang.String]"));
+            assertTrue("Get a wrong exception message", e.getCause().getMessage().endsWith("Exchange[Message: 1.1.2010]"));           
+        }
+
+        assertMockEndpointsSatisfied();
+    }
+
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                    .validate(body(String.class).regex("^\\d{2}\\.\\d{2}\\.\\d{4}$"))
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/java/org/apache/camel/processor/ValidateSimpleTest.java b/camel-core/src/test/java/org/apache/camel/processor/ValidateSimpleTest.java
new file mode 100644
index 0000000..71a4c45
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/ValidateSimpleTest.java
@@ -0,0 +1,76 @@
+/**
+ * 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.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Endpoint;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.processor.validation.PredicateValidationException;
+
+/**
+ * @version $Revision$
+ */
+public class ValidateSimpleTest extends ContextTestSupport {
+
+    private Endpoint startEndpoint;
+    private MockEndpoint resultEndpoint;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        startEndpoint = resolveMandatoryEndpoint("direct:start", Endpoint.class);
+        resultEndpoint = resolveMandatoryEndpoint("mock:result", MockEndpoint.class);
+    }
+
+    public void testSendMatchingMessage() throws Exception {
+        resultEndpoint.expectedMessageCount(1);
+
+        template.sendBody(startEndpoint, "Hello Camel");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testSendNotMatchingMessage() throws Exception {
+        resultEndpoint.expectedMessageCount(0);
+
+        try {
+            template.sendBody(startEndpoint, "Bye World");
+            fail("CamelExecutionException expected");
+        } catch (CamelExecutionException e) {
+            // expected
+            assertIsInstanceOf(PredicateValidationException.class, e.getCause());
+            assertEquals("Validation failed for Predicate[body contains Camel]."
+                + " Exchange[Message: Bye World]", e.getCause().getMessage());
+        }
+
+        assertMockEndpointsSatisfied();
+    }
+
+
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                    .validate().simple("${body} contains 'Camel'")
+                    .to("mock:result");
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateRepositoryReturnNullTest.java b/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateRepositoryReturnNullTest.java
new file mode 100644
index 0000000..84447f3
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/aggregator/AggregateRepositoryReturnNullTest.java
@@ -0,0 +1,61 @@
+/**
+ * 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.aggregator;
+
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.processor.aggregate.AggregationStrategy;
+
+/**
+ * @version $Revision$
+ */
+public class AggregateRepositoryReturnNullTest extends ContextTestSupport {
+
+    public void testAggregateRepositoryReturnNull() throws Exception {
+        try {
+            template.sendBodyAndHeader("direct:start", "Hello World", "id", 123);
+            fail("Should throw exception");
+        } catch (CamelExecutionException e) {
+            assertIsInstanceOf(CamelExchangeException.class, e.getCause());
+            assertTrue(e.getCause().getMessage().startsWith("AggregationStrategy"));
+            assertTrue(e.getCause().getMessage().contains("returned null which is not allowed"));
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .aggregate(header("id"), new MyNullAggregationStrategy()).completionSize(3)
+                        .to("mock:result");
+            }
+        };
+    }
+
+    private class MyNullAggregationStrategy implements AggregationStrategy {
+        public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+            // on purpose
+            return null;
+        }
+    }
+
+}
diff --git a/components/camel-bean-validator/pom.xml b/components/camel-bean-validator/pom.xml
index 641bd57..77b2906 100644
--- a/components/camel-bean-validator/pom.xml
+++ b/components/camel-bean-validator/pom.xml
@@ -84,4 +84,4 @@
 
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/components/camel-castor/pom.xml b/components/camel-castor/pom.xml
index 646a1e8..cec8610 100644
--- a/components/camel-castor/pom.xml
+++ b/components/camel-castor/pom.xml
@@ -103,4 +103,4 @@
     </dependency>
   </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java b/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java
index a3a12387..19d1871 100644
--- a/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java
+++ b/components/camel-http/src/main/java/org/apache/camel/component/http/DefaultHttpBinding.java
@@ -90,10 +90,10 @@
 
         popluateRequestParameters(request, message);        
         
-        // reset the stream cache
-        StreamCache cache = message.getBody(StreamCache.class);
-        if (cache != null) {
-            cache.reset();
+        Object body = message.getBody();
+        // reset the stream cache if the body is the instance of StreamCache
+        if (body instanceof StreamCache) {
+            ((StreamCache)body).reset();
         }
         
         // store the method and query and other info in headers
diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
index 670c519..5bb84e2 100644
--- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
+++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java
@@ -65,10 +65,10 @@
         HeaderFilterStrategy strategy = getEndpoint().getHeaderFilterStrategy();
 
         // propagate headers as HTTP headers
-        for (String headerName : in.getHeaders().keySet()) {
-            String headerValue = in.getHeader(headerName, String.class);
-            if (strategy != null && !strategy.applyFilterToCamelHeaders(headerName, headerValue, exchange)) {
-                method.addRequestHeader(headerName, headerValue);
+        for (Map.Entry<String, Object> entry : in.getHeaders().entrySet()) {
+            String headerValue = in.getHeader(entry.getKey(), String.class);
+            if (strategy != null && !strategy.applyFilterToCamelHeaders(entry.getKey(), headerValue, exchange)) {
+                method.addRequestHeader(entry.getKey(), headerValue);
             }
         }
 
diff --git a/components/camel-http4/pom.xml b/components/camel-http4/pom.xml
index d2f1f95..88f19a6 100644
--- a/components/camel-http4/pom.xml
+++ b/components/camel-http4/pom.xml
@@ -100,4 +100,4 @@
         </plugins>
     </build>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
index 939b0b5..4a8fa79 100644
--- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
+++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java
@@ -70,13 +70,13 @@
         HeaderFilterStrategy strategy = getEndpoint().getHeaderFilterStrategy();
 
         // propagate headers as HTTP headers
-        for (String headerName : in.getHeaders().keySet()) {
-            String headerValue = in.getHeader(headerName, String.class);
-            if (strategy != null && !strategy.applyFilterToCamelHeaders(headerName, headerValue, exchange)) {
-                httpRequest.addHeader(headerName, headerValue);
+        for (Map.Entry<String, Object> entry : in.getHeaders().entrySet()) {
+            String headerValue = in.getHeader(entry.getKey(), String.class);
+            if (strategy != null && !strategy.applyFilterToCamelHeaders(entry.getKey(), headerValue, exchange)) {
+                httpRequest.addHeader(entry.getKey(), headerValue);
             }
         }
-
+        
         // lets store the result in the output message.
         HttpResponse httpResponse = null;
         try {
diff --git a/components/camel-jetty/pom.xml b/components/camel-jetty/pom.xml
index f503114..a07bd4a 100644
--- a/components/camel-jetty/pom.xml
+++ b/components/camel-jetty/pom.xml
@@ -125,4 +125,4 @@
         </plugins>
     </build>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java
new file mode 100644
index 0000000..51d8d8f
--- /dev/null
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpHeaderTest.java
@@ -0,0 +1,67 @@
+/**
+ * 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.jetty;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.JettyContentTypeTest.MyBookService;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.ExchangeHelper;
+import org.apache.camel.util.MessageHelper;
+import org.junit.Test;
+
+public class HttpHeaderTest extends CamelTestSupport {
+
+    @Test
+    public void testHttpHeaders() throws Exception {
+        String result = template.requestBody("direct:start", "hello", String.class);
+        assertEquals("Should send a right http header to the server.", "Find the key!", result);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("direct:start").setHeader("SOAPAction", constant("http://xxx.com/interfaces/ticket"))
+                    .setHeader("Content-Type", constant("text/xml; charset=utf-8"))
+                    .to("http://localhost:9080/myapp/mytest");
+
+                from("jetty:http://localhost:9080/myapp/mytest").process(new Processor() {
+
+                    public void process(Exchange exchange) throws Exception {
+                        Map<String, Object> headers = exchange.getIn().getHeaders();
+                        for (Entry<String, Object> entry : headers.entrySet()) {
+                            if ("SOAPAction".equals(entry.getKey()) && "http://xxx.com/interfaces/ticket".equals(entry.getValue())) {
+                                exchange.getOut().setBody("Find the key!");
+                                return;
+                            }
+                        }
+                        exchange.getOut().setBody("Cannot find the key!");
+                    }
+
+                });
+
+            }
+        };
+    }
+
+}
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRouteTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRouteTest.java
index e0c4d78..3ccbd8b 100644
--- a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRouteTest.java
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/HttpRouteTest.java
@@ -220,9 +220,10 @@
                 from("jetty:http://localhost:9083/noStreamCache?disableStreamCache=true").noStreamCaching().process(new Processor() {
 
                     public void process(Exchange exchange) throws Exception {
-                        InputStream is = (InputStream)exchange.getIn().getBody();
-                        System.out.println(is.getClass());
+                        InputStream is = (InputStream)exchange.getIn().getBody();                        
                         assertTrue("It should be a raw inputstream", is instanceof org.eclipse.jetty.server.HttpInput);
+                        String request = exchange.getIn().getBody(String.class);
+                        assertEquals("Get a wrong request", "This is a test", request);
                         exchange.getOut().setBody("OK");
                     }
                     
diff --git a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyContentTypeTest.java b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyContentTypeTest.java
index 72b2b62..22a5b56 100644
--- a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyContentTypeTest.java
+++ b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/JettyContentTypeTest.java
@@ -34,7 +34,8 @@
         Endpoint endpoint = context.getEndpoint("http://localhost:9080/myapp/myservice");
         Exchange exchange = endpoint.createExchange();
         exchange.getIn().setBody("<order>123</order>");
-        exchange.getIn().setHeader("user", "Claus");
+        exchange.getIn().setHeader("User", "Claus");
+        exchange.getIn().setHeader("SOAPAction", "test");
         exchange.getIn().setHeader("Content-Type", "text/xml");
         if (usingGZip) {
             exchange.getIn().setHeader("Content-Encoding", "gzip");
@@ -81,9 +82,10 @@
 
     public class MyBookService implements Processor {
         public void process(Exchange exchange) throws Exception {
-            if (exchange.getIn().getHeader("user") != null 
+            if ("Claus".equals(exchange.getIn().getHeader("User", String.class))
                 && exchange.getIn().getBody(String.class).equals("<order>123</order>")
                 && "text/xml".equals(ExchangeHelper.getContentType(exchange))) {
+                assertEquals("test", exchange.getIn().getHeader("SOAPAction", String.class));
                 exchange.getOut().setBody("<order>OK</order>");
                 exchange.getOut().setHeader("Content-Type", "text/xml");
             } else {
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
index b27b2e7..eca6ccd 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
@@ -333,7 +333,8 @@
             if (value != null) {
                 // must encode to safe JMS header name before setting property on jmsMessage
                 String key = jmsKeyFormatStrategy.encodeKey(headerName);
-                jmsMessage.setObjectProperty(key, value);
+                // set the property
+                JmsMessageHelper.setProperty(jmsMessage, key, value);
             } else if (LOG.isDebugEnabled()) {
                 // okay the value is not a primitive or string so we cannot sent it over the wire
                 LOG.debug("Ignoring non primitive header: " + headerName + " of class: "
@@ -397,7 +398,7 @@
         } else if (headerValue instanceof CharSequence) {
             return headerValue.toString();
         } else if (headerValue instanceof Boolean) {
-            return headerValue.toString();
+            return headerValue;
         } else if (headerValue instanceof Date) {
             return headerValue.toString();
         }
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
index 99b8086..438c62d 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
@@ -91,4 +91,38 @@
         return false;
     }
 
+    /**
+     * Sets the property on the given JMS message.
+     *
+     * @param jmsMessage  the JMS message
+     * @param name        name of the property to set
+     * @param value       the value
+     * @throws JMSException can be thrown
+     */
+    public static void setProperty(Message jmsMessage, String name, Object value) throws JMSException {
+        if (value == null) {
+            return;
+        }
+        if (value instanceof Byte) {
+            jmsMessage.setByteProperty(name, (Byte) value);
+        } else if (value instanceof Boolean) {
+            jmsMessage.setBooleanProperty(name, (Boolean) value);
+        } else if (value instanceof Double) {
+            jmsMessage.setDoubleProperty(name, (Double) value);
+        } else if (value instanceof Float) {
+            jmsMessage.setFloatProperty(name, (Float) value);
+        } else if (value instanceof Integer) {
+            jmsMessage.setIntProperty(name, (Integer) value);
+        } else if (value instanceof Long) {
+            jmsMessage.setLongProperty(name, (Long) value);
+        } else if (value instanceof Short) {
+            jmsMessage.setShortProperty(name, (Short) value);
+        } else if (value instanceof String) {
+            jmsMessage.setStringProperty(name, (String) value);
+        } else {
+            // fallback to Object
+            jmsMessage.setObjectProperty(name, value);
+        }
+    }
+
 }
diff --git a/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteUsingDifferentHeadersTest.java b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteUsingDifferentHeadersTest.java
new file mode 100644
index 0000000..608b4a9
--- /dev/null
+++ b/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteUsingDifferentHeadersTest.java
@@ -0,0 +1,81 @@
+/**
+ * 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 java.util.LinkedHashMap;
+import java.util.Map;
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge;
+
+/**
+ * @version $Revision$
+ */
+public class JmsRouteUsingDifferentHeadersTest extends ContextTestSupport {
+
+    public void testUsingDifferentHeaderTypes() throws Exception {
+        Map<String, Object> headers = new LinkedHashMap<String, Object>();
+        headers.put("a", new Byte("65"));
+        headers.put("b", Boolean.TRUE);
+        headers.put("c", new Double("44444"));
+        headers.put("d", new Float("55555"));
+        headers.put("e", new Integer("222"));
+        headers.put("f", new Long("7777777"));
+        headers.put("g", new Short("333"));
+        headers.put("h", "Hello");
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).header("a").isInstanceOf(Byte.class);
+        mock.message(0).header("b").isInstanceOf(Boolean.class);
+        mock.message(0).header("c").isInstanceOf(Double.class);
+        mock.message(0).header("d").isInstanceOf(Float.class);
+        mock.message(0).header("e").isInstanceOf(Integer.class);
+        mock.message(0).header("f").isInstanceOf(Long.class);
+        mock.message(0).header("g").isInstanceOf(Short.class);
+        mock.message(0).header("h").isInstanceOf(String.class);
+
+        template.sendBodyAndHeaders("activemq:queue:foo", "Hello World", headers);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
+        camelContext.addComponent("activemq", jmsComponentClientAcknowledge(connectionFactory));
+
+        return camelContext;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("activemq:queue:foo").to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-jmxconnect/pom.xml b/components/camel-jmxconnect/pom.xml
deleted file mode 100644
index 436e43b..0000000
--- a/components/camel-jmxconnect/pom.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.camel</groupId>
-    <artifactId>camel-parent</artifactId>
-    <version>2.1-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>camel-jmxconnect</artifactId>
-  <packaging>bundle</packaging>
-  <name>Camel :: JMX Connector</name>
-  <description>Camel JMX Connector</description>
-
-  <properties>
-	<camel.osgi.export.pkg>org.apache.camel.jmxconnect.*</camel.osgi.export.pkg>
-  </properties>
-
-  <dependencies>
-
-    <dependency>
-      <groupId>org.apache.camel</groupId>
-      <artifactId>camel-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.camel</groupId>
-      <artifactId>camel-spring</artifactId>
-    </dependency>
-
-    <!-- TODO only used for the activemq provider - move to ActiveMQ trunk ASAP! -->
-    <dependency>
-      <groupId>org.apache.activemq</groupId>
-      <artifactId>activemq-camel</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.camel</groupId>
-      <artifactId>camel-jms</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-
-    <!-- testing -->
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.activemq</groupId>
-      <artifactId>activemq-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.xbean</groupId>
-      <artifactId>xbean-spring</artifactId>
-      <exclusions>
-      	<exclusion>
-      	  <groupId>org.springframework</groupId>
-      	  <artifactId>spring</artifactId>
-      	</exclusion>
-      </exclusions>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-
-  <build>
-    <plugins>
-
-      <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <childDelegation>false</childDelegation>
-          <useFile>true</useFile>
-          <forkMode>pertest</forkMode>
-          <excludes>
-            <!--<exclude>**/SendMessageWithForeignReplyToRouteTest.*</exclude>-->
-          </excludes>
-        </configuration>
-      </plugin>
-
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-clean-plugin</artifactId>
-        <configuration>
-          <filesets>
-            <fileset>
-              <directory>${basedir}/activemq-data</directory>
-            </fileset>
-          </filesets>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnector.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnector.java
deleted file mode 100644
index dd66ffa..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnector.java
+++ /dev/null
@@ -1,342 +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.jmxconnect;
-
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-import javax.management.ListenerNotFoundException;
-import javax.management.MBeanServerConnection;
-import javax.management.NotificationBroadcaster;
-import javax.management.NotificationBroadcasterSupport;
-import javax.management.NotificationEmitter;
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-import javax.management.remote.JMXConnectionNotification;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServerErrorException;
-import javax.management.remote.JMXServiceURL;
-import javax.security.auth.Subject;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.spring.remoting.CamelProxyFactoryBean;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * <p>
- * The client end of a JMX API connector. An object of this type can be used to establish a connection to a connector
- * server.
- * </p>
- * <p/>
- * <p>
- * A newly-created object of this type is unconnected. Its {@link #connect()} method must be called before it can
- * be used. However, objects created by {@link JMXConnectorFactory#connect(JMXServiceURL, Map)
- * JMXConnectorFactory.connect} are already connected.
- * </p>
- *
- * @version $Revision$
- */
-public class CamelJmxConnector implements JMXConnector, CamelContextAware {
-    private static final Log LOG = LogFactory.getLog(JMXConnector.class);
-    private NotificationBroadcasterSupport connectionNotifier = new NotificationBroadcasterSupport();
-    private AtomicLong notificationNumber = new AtomicLong();
-    private Map env;
-    private String endpointUri;
-    private CamelProxyFactoryBean proxy;
-    private MBeanCamelServerConnectionClient client;
-    private boolean connected;
-    private CamelContext camelContext;
-    private String connectionId;
-
-    public CamelJmxConnector(Map env, String endpointUri) {
-        this.env = env;
-        this.endpointUri = endpointUri;
-    }
-
-    public CamelJmxConnector(Map env, JMXServiceURL url) throws IOException {
-        this(env, CamelJmxConnectorSupport.getEndpointUri(url, "camel"));
-        // set any props in the url
-        // TODO
-        // populateProperties(this, endpointUri);
-    }
-
-    /**
-     * <p>
-     * Establishes the connection to the connector server. This method is equivalent to {@link #connect(Map)
-     * connect(null)}.
-     * </p>
-     *
-     * @throws IOException       if the connection could not be made because of a communication problem.
-     * @throws SecurityException if the connection could not be made for security reasons.
-     */
-    public void connect() throws IOException {
-        connect(this.env);
-    }
-
-    /**
-     * <p>
-     * Establishes the connection to the connector server.
-     * </p>
-     * <p/>
-     * <p>
-     * If <code>connect</code> has already been called successfully on this object, calling it again has no effect.
-     * If, however, {@link #close} was called after <code>connect</code>, the new <code>connect</code> will throw
-     * an <code>IOException</code>.
-     * <p>
-     * <p/>
-     * <p>
-     * Otherwise, either <code>connect</code> has never been called on this object, or it has been called but produced
-     * an exception. Then calling <code>connect</code> will attempt to establish a connection to the connector server.
-     * </p>
-     *
-     * @param env the properties of the connection. Properties in this map override properties in the map specified when
-     *            the <code>JMXConnector</code> was created, if any. This parameter can be null, which is equivalent
-     *            to an empty map.
-     * @throws IOException       if the connection could not be made because of a communication problem.
-     * @throws SecurityException if the connection could not be made for security reasons.
-     */
-    public void connect(Map env) throws IOException {
-        if (!connected) {
-            try {
-                proxy = new CamelProxyFactoryBean();
-                proxy.setCamelContext(getCamelContext());
-                proxy.setServiceInterface(javax.management.MBeanServerConnection.class);
-                proxy.setServiceInterface(MBeanCamelServerConnection.class);
-                proxy.setServiceUrl(endpointUri);
-                proxy.afterPropertiesSet();
-
-                client = new MBeanCamelServerConnectionClient((MBeanCamelServerConnection) proxy.getObject() /* TODO */);
-                connectionId = client.generateId();
-
-                // TODO we need to establish a replyToEndpoint and inform the server!
-
-                sendConnectionNotificationOpened();
-            } catch (Exception e) {
-                LOG.error("Failed to connect: " + e, e);
-                IOException ioe = new IOException(e.getMessage());
-                throw ioe;
-            }
-            connected = true;
-        }
-    }
-
-    /**
-     * <p>
-     * Returns an <code>MBeanServerConnection</code> object representing a remote MBean server. For a given
-     * <code>JMXConnector</code>, two successful calls to this method will usually return the same
-     * <code>MBeanServerConnection</code> object, though this is not required.
-     * </p>
-     * <p/>
-     * <p>
-     * For each method in the returned <code>MBeanServerConnection</code>, calling the method causes the
-     * corresponding method to be called in the remote MBean server. The value returned by the MBean server method is
-     * the value returned to the client. If the MBean server method produces an <code>Exception</code>, the same
-     * <code>Exception</code> is seen by the client. If the MBean server method, or the attempt to call it, produces
-     * an <code>Error</code>, the <code>Error</code> is wrapped in a {@link JMXServerErrorException}, which is
-     * seen by the client.
-     * </p>
-     * <p/>
-     * <p>
-     * Calling this method is equivalent to calling
-     * {@link #getMBeanServerConnection(Subject) getMBeanServerConnection(null)} meaning that no delegation subject is
-     * specified and that all the operations called on the <code>MBeanServerConnection</code> must use the
-     * authenticated subject, if any.
-     * </p>
-     *
-     * @return an object that implements the <code>MBeanServerConnection</code> interface by forwarding its methods to
-     *         the remote MBean server.
-     */
-    public MBeanServerConnection getMBeanServerConnection() {
-        return client;
-    }
-
-    /**
-     * <p>
-     * Returns an <code>MBeanServerConnection</code> object representing a remote MBean server on which operations are
-     * performed on behalf of the supplied delegation subject. For a given <code>JMXConnector</code> and
-     * <code>Subject</code>, two successful calls to this method will usually return the same
-     * <code>MBeanServerConnection</code> object, though this is not required.
-     * </p>
-     * <p/>
-     * <p>
-     * For each method in the returned <code>MBeanServerConnection</code>, calling the method causes the
-     * corresponding method to be called in the remote MBean server on behalf of the given delegation subject instead of
-     * the authenticated subject. The value returned by the MBean server method is the value returned to the client. If
-     * the MBean server method produces an <code>Exception</code>, the same <code>Exception</code> is seen by the
-     * client. If the MBean server method, or the attempt to call it, produces an <code>Error</code>, the
-     * <code>Error</code> is wrapped in a {@link JMXServerErrorException}, which is seen by the client.
-     * </p>
-     *
-     * @param delegationSubject the <code>Subject</code> on behalf of which requests will be performed. Can be null, in which case
-     *                          requests will be performed on behalf of the authenticated Subject, if any.
-     * @return an object that implements the <code>MBeanServerConnection</code> interface by forwarding its methods to
-     *         the remote MBean server on behalf of a given delegation subject.
-     */
-    public MBeanServerConnection getMBeanServerConnection(Subject delegationSubject) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * <p>
-     * Closes the client connection to its server. Any ongoing or new request using the MBeanServerConnection returned
-     * by {@link #getMBeanServerConnection()} will get an <code>IOException</code>.
-     * </p>
-     * <p/>
-     * <p>
-     * If <code>close</code> has already been called successfully on this object, calling it again has no effect. If
-     * <code>close</code> has never been called, or if it was called but produced an exception, an attempt will be
-     * made to close the connection. This attempt can succeed, in which case <code>close</code> will return normally,
-     * or it can generate an exception.
-     * </p>
-     * <p/>
-     * <p>
-     * Closing a connection is a potentially slow operation. For example, if the server has crashed, the close operation
-     * might have to wait for a network protocol timeout. Callers that do not want to block in a close operation should
-     * do it in a separate thread.
-     * </p>
-     *
-     * @throws IOException if the connection cannot be closed cleanly. If this exception is thrown, it is not known whether
-     *                     the server end of the connection has been cleanly closed.
-     */
-    public void close() throws IOException {
-        if (connected) {
-            connected = false;
-            try {
-                sendConnectionNotificationClosed();
-                proxy.destroy();
-            } catch (Exception e) {
-                LOG.error("Failed to destroy proxy: " + e, e);
-                throw new IOException(e.getMessage());
-            }
-        }
-    }
-
-    /**
-     * <p>
-     * Adds a listener to be informed of changes in connection status. The listener will receive notifications of type
-     * {@link JMXConnectionNotification}. An implementation can send other types of notifications too.
-     * </p>
-     * <p/>
-     * <p>
-     * Any number of listeners can be added with this method. The same listener can be added more than once with the
-     * same or different values for the filter and handback. There is no special treatment of a duplicate entry. For
-     * example, if a listener is registered twice with no filter, then its <code>handleNotification</code> method will
-     * be called twice for each notification.
-     * </p>
-     *
-     * @param listener a listener to receive connection status notifications.
-     * @param filter   a filter to select which notifications are to be delivered to the listener, or null if all
-     *                 notifications are to be delivered.
-     * @param handback an object to be given to the listener along with each notification. Can be null.
-     * @throws NullPointerException if <code>listener</code> is null.
-     * @see #removeConnectionNotificationListener
-     * @see NotificationBroadcaster#addNotificationListener
-     */
-    public void addConnectionNotificationListener(NotificationListener listener, NotificationFilter filter,
-                                                  Object handback) {
-        connectionNotifier.addNotificationListener(listener, filter, handback);
-    }
-
-    /**
-     * <p>
-     * Removes a listener from the list to be informed of changes in status. The listener must previously have been
-     * added. If there is more than one matching listener, all are removed.
-     * </p>
-     *
-     * @param listener a listener to receive connection status notifications.
-     * @throws NullPointerException      if <code>listener</code> is null.
-     * @throws ListenerNotFoundException if the listener is not registered with this <code>JMXConnector</code>.
-     * @see #removeConnectionNotificationListener(NotificationListener, NotificationFilter, Object)
-     * @see #addConnectionNotificationListener
-     * @see NotificationEmitter#removeNotificationListener
-     */
-    public void removeConnectionNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
-        connectionNotifier.removeNotificationListener(listener);
-    }
-
-    /**
-     * <p>
-     * Removes a listener from the list to be informed of changes in status. The listener must previously have been
-     * added with the same three parameters. If there is more than one matching listener, only one is removed.
-     * </p>
-     *
-     * @param l        a listener to receive connection status notifications.
-     * @param f        a filter to select which notifications are to be delivered to the listener. Can be null.
-     * @param handback an object to be given to the listener along with each notification. Can be null.
-     * @throws ListenerNotFoundException if the listener is not registered with this <code>JMXConnector</code>, or is not registered
-     *                                   with the given filter and handback.
-     * @see #removeConnectionNotificationListener(NotificationListener)
-     * @see #addConnectionNotificationListener
-     * @see NotificationEmitter#removeNotificationListener
-     */
-    public void removeConnectionNotificationListener(NotificationListener l, NotificationFilter f, Object handback)
-        throws ListenerNotFoundException {
-        connectionNotifier.removeNotificationListener(l, f, handback);
-    }
-
-
-    /**
-     * <p>
-     * Gets this connection's ID from the connector server. For a given connector server, every connection will have a
-     * unique id which does not change during the lifetime of the connection.
-     * </p>
-     *
-     * @return the unique ID of this connection. This is the same as the ID that the connector server includes in its
-     *         {@link JMXConnectionNotification}s. The {@link javax.management.remote package description} describes the
-     *         conventions for connection IDs.
-     */
-    public String getConnectionId() {
-        return connectionId;
-    }
-
-    public CamelContext getCamelContext() {
-        if (camelContext == null) {
-            LOG.warn("No CamelContext injected so creating a default implementation");
-            // TODO should we barf or create a default one?
-            camelContext = new DefaultCamelContext();
-        }
-        return camelContext;
-    }
-
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
-
-    private void sendConnectionNotificationOpened() {
-        JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.OPENED, this,
-                getConnectionId(), notificationNumber.incrementAndGet(), "Connection opened", null);
-        connectionNotifier.sendNotification(notification);
-    }
-
-    private void sendConnectionNotificationClosed() {
-        JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.CLOSED, this,
-                getConnectionId(), notificationNumber.incrementAndGet(), "Connection closed", null);
-        connectionNotifier.sendNotification(notification);
-    }
-
-    private void sendConnectionNotificationFailed(String message) {
-        JMXConnectionNotification notification = new JMXConnectionNotification(JMXConnectionNotification.FAILED, this,
-                getConnectionId(), notificationNumber.incrementAndGet(), message, null);
-        connectionNotifier.sendNotification(notification);
-    }
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnectorServer.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnectorServer.java
deleted file mode 100644
index 5883eb8..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnectorServer.java
+++ /dev/null
@@ -1,140 +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.jmxconnect;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Map;
-
-import javax.management.MBeanServer;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXConnectorServer;
-import javax.management.remote.JMXServiceURL;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.CamelContextAware;
-import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.spring.remoting.CamelServiceExporter;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * <p>The client end of a JMX API connector.  An object of this type can
- * be used to establish a connection to a connector server.</p>
- * <p/>
- * <p>A newly-created object of this type is unconnected.  Its {@link#connect}
- * method must be called before it can be used.
- * However, objects created by {@link
- * JMXConnectorFactory#connect(JMXServiceURL, Map)
- * JMXConnectorFactory.connect} are already connected.</p>
- *
- * @version $Revision$
- */
-public class CamelJmxConnectorServer extends JMXConnectorServer implements CamelContextAware {
-
-    private static final Log LOG = LogFactory.getLog(CamelJmxConnectorServer.class);
-    private JMXServiceURL url;
-    private final Map env;
-    private volatile boolean stopped = true;
-    private CamelServiceExporter service;
-    private MBeanCamelServerConnectionImpl serverConnection;
-    private String endpointUri;
-    private CamelContext camelContext;
-
-
-    public CamelJmxConnectorServer(JMXServiceURL url, String endpointUri, Map environment, MBeanServer server) throws IOException {
-        super(server);
-        this.url = url;
-        this.env = environment;
-        this.endpointUri = endpointUri;
-    }
-
-    public CamelJmxConnectorServer(JMXServiceURL url, Map environment, MBeanServer server) throws IOException {
-        this(url, CamelJmxConnectorSupport.getEndpointUri(url, "camel"), environment, server);
-        //set any props in the url
-        // TODO
-        // populateProperties(this, endpointUri);
-    }
-
-    /**
-     * start the connector
-     *
-     * @throws IOException
-     */
-    public void start() throws IOException {
-        try {
-            service = new CamelServiceExporter();
-            service.setCamelContext(getCamelContext());
-            service.setServiceInterface(MBeanCamelServerConnection.class);
-            service.setUri(endpointUri);
-
-            this.serverConnection = new MBeanCamelServerConnectionImpl(getMBeanServer(), /* TODO */ null);
-            service.setService(serverConnection);
-
-            service.afterPropertiesSet();
-            stopped = false;
-        } catch (Exception e) {
-            LOG.error("Failed to start ", e);
-            throw new IOException(e.toString());
-        }
-
-    }
-
-    /**
-     * stop the connector
-     *
-     * @throws IOException
-     */
-    public void stop() throws IOException {
-        try {
-            if (!stopped) {
-                stopped = true;
-                service.destroy();
-            }
-        } catch (Exception e) {
-            LOG.error("Failed to stop ", e);
-            throw new IOException(e.toString());
-        }
-
-    }
-
-    public boolean isActive() {
-        return !stopped;
-    }
-
-    public JMXServiceURL getAddress() {
-        return url;
-    }
-
-    public Map getAttributes() {
-        return Collections.unmodifiableMap(env);
-    }
-
-
-    public CamelContext getCamelContext() {
-        if (camelContext == null) {
-            LOG.warn("No CamelContext injected so creating a default implementation");
-            // TODO should we barf or create a default one?
-            camelContext = new DefaultCamelContext();
-        }
-        return camelContext;
-    }
-
-    public void setCamelContext(CamelContext camelContext) {
-        this.camelContext = camelContext;
-    }
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnectorSupport.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnectorSupport.java
deleted file mode 100644
index 02f2eb8..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/CamelJmxConnectorSupport.java
+++ /dev/null
@@ -1,49 +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.jmxconnect;
-
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import javax.management.remote.JMXServiceURL;
-
-/**
- * @version $Revision$
- */
-public final class CamelJmxConnectorSupport {
-    public static final String DEFAULT_DESTINATION_PREFIX = "org.apache.camel.jmxconnect.";
-    public static final String MBEAN_SERVER_NAME = "*";
-    public static final String MBEAN_GROUP_NAME = "*";
-    
-    private CamelJmxConnectorSupport() {
-        // helper class
-    }
-
-    public static String getEndpointUri(JMXServiceURL serviceURL, String expectedProtocol) throws IOException {
-        String protocol = serviceURL.getProtocol();
-        if (!expectedProtocol.equals(protocol)) {
-            throw new MalformedURLException("Wrong protocol " + protocol + " expecting " + expectedProtocol);
-        }
-        String path = serviceURL.getURLPath();
-        while (path.startsWith("/")) {
-            path = path.substring(1);
-        }
-        return path;
-    }
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/ListenerInfo.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/ListenerInfo.java
deleted file mode 100644
index aa0d313..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/ListenerInfo.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.jmxconnect;
-
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-
-/**
- * @version $Revision$
- */
-class ListenerInfo {
-    private String id;
-    private NotificationListener listener;
-    private NotificationFilter filter;
-    private Object handback;
-
-
-    public ListenerInfo(String id, NotificationListener listener, NotificationFilter filter, Object handback) {
-        this.id = id;
-        this.listener = listener;
-        this.filter = filter;
-        this.handback = handback;
-    }
-
-    /**
-     * Is this info a match ?
-     *
-     * @param l
-     * @param f
-     * @param handback
-     * @return true if a match
-     */
-    public boolean isMatch(NotificationListener l, NotificationFilter f, Object handback) {
-        return listener == listener && filter == filter && handback == handback;
-    }
-
-    /**
-     * @return Returns the filter.
-     */
-    public NotificationFilter getFilter() {
-        return filter;
-    }
-
-    /**
-     * @param filter The filter to set.
-     */
-    public void setFilter(NotificationFilter filter) {
-        this.filter = filter;
-    }
-
-    /**
-     * @return Returns the handback.
-     */
-    public Object getHandback() {
-        return handback;
-    }
-
-    /**
-     * @param handback The handback to set.
-     */
-    public void setHandback(Object handback) {
-        this.handback = handback;
-    }
-
-    /**
-     * @return Returns the id.
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * @param id The id to set.
-     */
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    /**
-     * @return Returns the listener.
-     */
-    public NotificationListener getListener() {
-        return listener;
-    }
-
-    /**
-     * @param listener The listener to set.
-     */
-    public void setListener(NotificationListener listener) {
-        this.listener = listener;
-    }
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnection.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnection.java
deleted file mode 100644
index 113fe24..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnection.java
+++ /dev/null
@@ -1,45 +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.jmxconnect;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-
-import org.apache.camel.Endpoint;
-
-/**
- * @version $Revision$
- */
-public interface MBeanCamelServerConnection extends MBeanServerConnection {
-
-    /**
-     * Add a Notification listener
-     *
-     * @param listenerId
-     * @param name
-     * @param replyToEndpoint
-     */
-    void addNotificationListener(String listenerId, ObjectName name, Endpoint replyToEndpoint);
-
-    /**
-     * Remove a Notification listener
-     *
-     * @param listenerId
-     */
-    void removeNotificationListener(String listenerId);
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnectionClient.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnectionClient.java
deleted file mode 100644
index 60ea8e8..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnectionClient.java
+++ /dev/null
@@ -1,114 +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.jmxconnect;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import javax.management.ListenerNotFoundException;
-import javax.management.Notification;
-import javax.management.NotificationBroadcasterSupport;
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-import org.apache.camel.Processor;
-import org.apache.camel.util.UuidGenerator;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @version $Revision$
- */
-public class MBeanCamelServerConnectionClient extends MBeanServerConnectionDelegate implements Processor {
-    private static final Log LOG = LogFactory.getLog(MBeanCamelServerConnectionClient.class);
-    private MBeanCamelServerConnection serverConnection;
-    private Endpoint replyToEndpoint;
-    private List listeners = new CopyOnWriteArrayList();
-    private UuidGenerator idGenerator = new UuidGenerator();
-    private NotificationBroadcasterSupport localNotifier = new NotificationBroadcasterSupport();
-
-    public MBeanCamelServerConnectionClient(MBeanCamelServerConnection serverConnection) {
-        super(serverConnection);
-        this.serverConnection = serverConnection;
-    }
-
-    /**
-     * Add a notification listener
-     */
-    public void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter,
-                                        Object handback) {
-        String id = generateId();
-        ListenerInfo info = new ListenerInfo(id, listener, filter, handback);
-        listeners.add(info);
-        localNotifier.addNotificationListener(listener, filter, handback);
-
-        // TODO need to create an endpoint for replies!!!
-        if (replyToEndpoint == null) {
-            LOG.error("no replyToDestination for replies to be received!");
-        }
-        serverConnection.addNotificationListener(id, name, replyToEndpoint);
-    }
-
-    public String generateId() {
-        return idGenerator.generateId();
-    }
-
-    /**
-     * Remove a Notification Listener
-     */
-    public void removeNotificationListener(ObjectName name, NotificationListener listener)
-        throws ListenerNotFoundException {
-        for (Iterator i = listeners.iterator(); i.hasNext();) {
-            ListenerInfo li = (ListenerInfo) i.next();
-            if (li.getListener() == listener) {
-                listeners.remove(i);
-                serverConnection.removeNotificationListener(li.getId());
-                break;
-            }
-        }
-        localNotifier.removeNotificationListener(listener);
-    }
-
-    /**
-     * Remove a Notification Listener
-     */
-    public void removeNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter,
-                                           Object handback) throws ListenerNotFoundException {
-        for (Iterator i = listeners.iterator(); i.hasNext();) {
-            ListenerInfo li = (ListenerInfo) i.next();
-            if (li.getListener() == listener && li.getFilter() == filter && li.getHandback() == handback) {
-                listeners.remove(i);
-                serverConnection.removeNotificationListener(li.getId());
-            }
-        }
-        localNotifier.removeNotificationListener(listener, filter, handback);
-    }
-
-
-    public void process(Exchange exchange) throws Exception {
-        Notification notification = exchange.getIn().getBody(Notification.class);
-        if (notification != null) {
-            localNotifier.sendNotification(notification);
-        } else {
-            LOG.warn("Received message which is not a Notification: " + exchange);
-        }
-    }
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnectionImpl.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnectionImpl.java
deleted file mode 100644
index 7b31359..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanCamelServerConnectionImpl.java
+++ /dev/null
@@ -1,73 +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.jmxconnect;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.ProducerTemplate;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @version $Revision$
- */
-public class MBeanCamelServerConnectionImpl extends MBeanServerConnectionDelegate implements MBeanCamelServerConnection {
-    private static final Log LOG = LogFactory.getLog(MBeanCamelServerConnectionImpl.class);
-    private Map notificationListeners = new ConcurrentHashMap();
-    private final ProducerTemplate template;
-
-    public MBeanCamelServerConnectionImpl(MBeanServerConnection connection, ProducerTemplate template) {
-        super(connection);
-        this.template = template;
-    }
-
-    /**
-     * Add a Notification listener
-     *
-     * @param listenerId
-     * @param name
-     * @param replyToEndpoint
-     */
-    public void addNotificationListener(String listenerId, ObjectName name, Endpoint replyToEndpoint) {
-        try {
-            ServerListenerInfo info = new ServerListenerInfo(listenerId, notificationListeners, template, replyToEndpoint);
-            notificationListeners.put(listenerId, info);
-            connection.addNotificationListener(name, info, null, null);
-        } catch (Exception e) {
-            LOG.error("Failed to addNotificationListener ", e);
-        }
-
-    }
-
-    /**
-     * Remove a Notification listener
-     *
-     * @param listenerId
-     */
-    public void removeNotificationListener(String listenerId) {
-        ServerListenerInfo info = (ServerListenerInfo) notificationListeners.remove(listenerId);
-        if (info != null) {
-            info.close();
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanServerConnectionDelegate.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanServerConnectionDelegate.java
deleted file mode 100644
index bbf77fe..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/MBeanServerConnectionDelegate.java
+++ /dev/null
@@ -1,182 +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.jmxconnect;
-
-import java.io.IOException;
-import java.util.Set;
-
-import javax.management.Attribute;
-import javax.management.AttributeList;
-import javax.management.AttributeNotFoundException;
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.IntrospectionException;
-import javax.management.InvalidAttributeValueException;
-import javax.management.ListenerNotFoundException;
-import javax.management.MBeanException;
-import javax.management.MBeanInfo;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServerConnection;
-import javax.management.NotCompliantMBeanException;
-import javax.management.NotificationFilter;
-import javax.management.NotificationListener;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-import javax.management.QueryExp;
-import javax.management.ReflectionException;
-
-/**
- * Acts as a delegate for the MBeanServerConnection
- *
- * @version $Revision$
- */
-public class MBeanServerConnectionDelegate implements MBeanServerConnection {
-
-    protected MBeanServerConnection connection;
-
-    public MBeanServerConnectionDelegate(MBeanServerConnection connection) {
-        this.connection = connection;
-
-    }
-
-    public ObjectInstance createMBean(String className, ObjectName name)
-        throws ReflectionException, InstanceAlreadyExistsException,
-        MBeanRegistrationException, MBeanException, NotCompliantMBeanException,
-        IOException {
-        return connection.createMBean(className, name);
-    }
-
-    public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName)
-        throws ReflectionException, InstanceAlreadyExistsException,
-        MBeanRegistrationException, MBeanException, NotCompliantMBeanException,
-        InstanceNotFoundException, IOException {
-        
-        return connection.createMBean(className, name, loaderName);
-    }
-
-    public ObjectInstance createMBean(String className, ObjectName name, Object[] params, String[] signature)
-        throws ReflectionException, InstanceAlreadyExistsException,
-        MBeanRegistrationException, MBeanException, NotCompliantMBeanException,
-        IOException {
-        return connection.createMBean(className, name, params, signature);
-    }
-
-
-    public ObjectInstance createMBean(String className, ObjectName name, ObjectName loaderName, Object[] params, String[] signature)
-        throws ReflectionException, InstanceAlreadyExistsException,
-        MBeanRegistrationException, MBeanException, NotCompliantMBeanException,
-        InstanceNotFoundException, IOException {
-        return connection.createMBean(className, name, loaderName, params, signature);
-    }
-
-    public void unregisterMBean(ObjectName name) throws InstanceNotFoundException, MBeanRegistrationException, IOException {
-        connection.unregisterMBean(name);
-
-    }
-
-    public ObjectInstance getObjectInstance(ObjectName name) throws InstanceNotFoundException, IOException {
-        return connection.getObjectInstance(name);
-    }
-
-    public Set queryMBeans(ObjectName name, QueryExp query) throws IOException {
-        return connection.queryMBeans(name, query);
-    }
-
-    public Set queryNames(ObjectName name, QueryExp query) throws IOException {
-        return connection.queryNames(name, query);
-    }
-
-    public boolean isRegistered(ObjectName name) throws IOException {
-        return connection.isRegistered(name);
-    }
-
-    public Integer getMBeanCount() throws IOException {
-        return connection.getMBeanCount();
-    }
-
-    public Object getAttribute(ObjectName name, String attribute) throws MBeanException, AttributeNotFoundException, InstanceNotFoundException, ReflectionException, IOException {
-        return connection.getAttribute(name, attribute);
-    }
-
-    public AttributeList getAttributes(ObjectName name, String[] attributes) throws InstanceNotFoundException, ReflectionException, IOException {
-        return connection.getAttributes(name, attributes);
-    }
-
-    public void setAttribute(ObjectName name, Attribute attribute) 
-        throws InstanceNotFoundException, AttributeNotFoundException,
-        InvalidAttributeValueException, MBeanException, ReflectionException,
-        IOException {
-        connection.setAttribute(name, attribute);
-
-    }
-
-    public AttributeList setAttributes(ObjectName name, AttributeList attributes) throws InstanceNotFoundException, ReflectionException, IOException {
-        return connection.setAttributes(name, attributes);
-    }
-
-    public Object invoke(ObjectName name, String operationName, Object[] params, String[] signature) throws InstanceNotFoundException, MBeanException, ReflectionException, IOException {
-        return connection.invoke(name, operationName, params, signature);
-    }
-
-    public String getDefaultDomain() throws IOException {
-        return connection.getDefaultDomain();
-    }
-
-    public String[] getDomains() throws IOException {
-        return connection.getDomains();
-    }
-
-    public void addNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, IOException {
-        connection.addNotificationListener(name, listener, filter, handback);
-
-    }
-
-    public void addNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, IOException {
-        connection.addNotificationListener(name, listener, filter, handback);
-
-    }
-
-    public void removeNotificationListener(ObjectName name, ObjectName listener) throws InstanceNotFoundException, ListenerNotFoundException, IOException {
-        connection.removeNotificationListener(name, listener);
-
-    }
-
-    public void removeNotificationListener(ObjectName name, ObjectName listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, ListenerNotFoundException, IOException {
-        connection.removeNotificationListener(name, listener, filter, handback);
-
-    }
-
-    public void removeNotificationListener(ObjectName name, NotificationListener listener) throws InstanceNotFoundException, ListenerNotFoundException, IOException {
-        connection.removeNotificationListener(name, listener);
-
-    }
-
-    public void removeNotificationListener(ObjectName name, NotificationListener listener, NotificationFilter filter, Object handback) throws InstanceNotFoundException, ListenerNotFoundException, IOException {
-        connection.removeNotificationListener(name, listener, filter, handback);
-
-    }
-
-    public MBeanInfo getMBeanInfo(ObjectName name) throws InstanceNotFoundException, IntrospectionException, ReflectionException, IOException {
-        return connection.getMBeanInfo(name);
-    }
-
-    public boolean isInstanceOf(ObjectName name, String className) throws InstanceNotFoundException, IOException {
-        return connection.isInstanceOf(name, className);
-    }
-
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/ServerListenerInfo.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/ServerListenerInfo.java
deleted file mode 100644
index cb20515..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/ServerListenerInfo.java
+++ /dev/null
@@ -1,86 +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.jmxconnect;
-
-
-import java.util.Map;
-
-import javax.management.Notification;
-import javax.management.NotificationListener;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.ProducerTemplate;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @version $Revision$
- */
-class ServerListenerInfo implements NotificationListener {
-    private static final Log LOG = LogFactory.getLog(ServerListenerInfo.class);
-    private final String id;
-    private final Map holder;
-    private final ProducerTemplate template;
-    private final Endpoint replyToEndpoint;
-
-    ServerListenerInfo(String id, Map holder, ProducerTemplate template, Endpoint replyToEndpoint) {
-        this.id = id;
-        this.holder = holder;
-        this.template = template;
-        this.replyToEndpoint = replyToEndpoint;
-    }
-
-    /**
-     * NotificationListener implementation
-     *
-     * @param notification
-     * @param handback
-     */
-    public void handleNotification(Notification notification, Object handback) {
-        System.out.println("Should be sending notification: " + notification);
-        if (replyToEndpoint == null) {
-            LOG.warn("No replyToDestination for replies to be received so cannot send notification: " + notification);
-        } else {
-            template.sendBody(replyToEndpoint, notification);
-        }
-    }
-
-    /**
-     * close the info if the connection times out
-     * <p/>
-     * TODO we should auto-detect that id has timed out and then remove this subscription
-     */
-    public void close() {
-        holder.remove(id);
-    }
-
-    /**
-     * @return Returns the holder.
-     */
-    public Map getHolder() {
-        return holder;
-    }
-
-
-    /**
-     * @return Returns the id.
-     */
-    public String getId() {
-        return id;
-    }
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ActiveMQHelper.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ActiveMQHelper.java
deleted file mode 100644
index af9be02..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ActiveMQHelper.java
+++ /dev/null
@@ -1,38 +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.jmxconnect.provider.activemq;
-
-import org.apache.activemq.camel.component.ActiveMQComponent;
-import org.apache.camel.CamelContext;
-import org.apache.camel.jmxconnect.CamelJmxConnectorSupport;
-
-/**
- * @version $Revision$
- */
-public final class ActiveMQHelper {
-    private ActiveMQHelper() {
-        // helper class
-    }
-    public static String getDefaultEndpointUri() {
-        return "activemq:" + CamelJmxConnectorSupport.DEFAULT_DESTINATION_PREFIX;
-    }
-
-    public static void configureActiveMQComponent(CamelContext camelContext, String brokerUrl) {
-        ActiveMQComponent activemqComponent = camelContext.getComponent("activemq", ActiveMQComponent.class);
-        activemqComponent.setBrokerURL(brokerUrl);
-    }
-}
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ClientProvider.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ClientProvider.java
deleted file mode 100644
index 7bcace0..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ClientProvider.java
+++ /dev/null
@@ -1,45 +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.jmxconnect.provider.activemq;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorProvider;
-import javax.management.remote.JMXServiceURL;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.jmxconnect.CamelJmxConnector;
-import org.apache.camel.jmxconnect.CamelJmxConnectorSupport;
-
-/**
- * @version $Revision$
- */
-public class ClientProvider implements JMXConnectorProvider {
-    public JMXConnector newJMXConnector(JMXServiceURL url, Map environment) throws IOException {
-        // use the remaining url as the ActiveMQ broker URI
-        String brokerUrl = CamelJmxConnectorSupport.getEndpointUri(url, "activemq");
-        CamelJmxConnector answer = new CamelJmxConnector(environment, ActiveMQHelper.getDefaultEndpointUri());
-
-        // now lets configure the ActiveMQ component
-        CamelContext camelContext = answer.getCamelContext();
-        ActiveMQHelper.configureActiveMQComponent(camelContext, brokerUrl);
-        return answer;
-    }
-
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ServerProvider.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ServerProvider.java
deleted file mode 100644
index aa54e0e..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/activemq/ServerProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.jmxconnect.provider.activemq;
-
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.management.MBeanServer;
-import javax.management.remote.JMXConnectorServer;
-import javax.management.remote.JMXConnectorServerProvider;
-import javax.management.remote.JMXServiceURL;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.jmxconnect.CamelJmxConnectorServer;
-import org.apache.camel.jmxconnect.CamelJmxConnectorSupport;
-
-/**
- * @version $Revision$
- */
-public class ServerProvider implements JMXConnectorServerProvider {
-
-    public JMXConnectorServer newJMXConnectorServer(JMXServiceURL url, Map environment, MBeanServer server) throws IOException {
-        String brokerUrl = CamelJmxConnectorSupport.getEndpointUri(url, "activemq");
-        CamelJmxConnectorServer answer = new CamelJmxConnectorServer(url, ActiveMQHelper.getDefaultEndpointUri(), environment, server);
-
-        // now lets configure the ActiveMQ component
-        CamelContext camelContext = answer.getCamelContext();
-        ActiveMQHelper.configureActiveMQComponent(camelContext, brokerUrl);
-        return answer;
-    }
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/camel/ClientProvider.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/camel/ClientProvider.java
deleted file mode 100644
index d8fe6d8..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/camel/ClientProvider.java
+++ /dev/null
@@ -1,35 +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.jmxconnect.provider.camel;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorProvider;
-import javax.management.remote.JMXServiceURL;
-
-import org.apache.camel.jmxconnect.CamelJmxConnector;
-
-/**
- * @version $Revision$
- */
-public class ClientProvider implements JMXConnectorProvider {
-    public JMXConnector newJMXConnector(JMXServiceURL url, Map environment) throws IOException {
-        return new CamelJmxConnector(environment, url);
-    }
-}
diff --git a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/camel/ServerProvider.java b/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/camel/ServerProvider.java
deleted file mode 100644
index 8cba35f..0000000
--- a/components/camel-jmxconnect/src/main/java/org/apache/camel/jmxconnect/provider/camel/ServerProvider.java
+++ /dev/null
@@ -1,38 +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.jmxconnect.provider.camel;
-
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.management.MBeanServer;
-import javax.management.remote.JMXConnectorServer;
-import javax.management.remote.JMXConnectorServerProvider;
-import javax.management.remote.JMXServiceURL;
-
-import org.apache.camel.jmxconnect.CamelJmxConnectorServer;
-
-/**
- * @version $Revision$
- */
-public class ServerProvider implements JMXConnectorServerProvider {
-
-    public JMXConnectorServer newJMXConnectorServer(JMXServiceURL url, Map environment, MBeanServer server) throws IOException {
-        return new CamelJmxConnectorServer(url, environment, server);
-    }
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxRemoteTest.java b/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxRemoteTest.java
deleted file mode 100644
index 745556a..0000000
--- a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxRemoteTest.java
+++ /dev/null
@@ -1,170 +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.jmxconnect;
-
-
-import java.net.URI;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.management.Attribute;
-import javax.management.MBeanInfo;
-import javax.management.MBeanServer;
-import javax.management.MBeanServerConnection;
-import javax.management.MBeanServerFactory;
-import javax.management.Notification;
-import javax.management.NotificationListener;
-import javax.management.ObjectName;
-import javax.management.monitor.GaugeMonitor;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXConnectorServer;
-import javax.management.remote.JMXConnectorServerFactory;
-import javax.management.remote.JMXServiceURL;
-
-import junit.framework.TestCase;
-import org.apache.activemq.broker.BrokerFactory;
-import org.apache.activemq.broker.BrokerService;
-
-/**
- * @version $Revision$
- */
-public class JmxRemoteTest extends TestCase {
-    protected String serverServiceUrl = "service:jmx:camel:///activemq:foo";
-    protected String clientServiceUrl = "service:jmx:camel:///activemq:foo";
-    protected String brokerUrl = "broker:(tcp://localhost:61616)/localhost?persistent=false";
-    private MBeanServer server;
-    private BrokerService broker;
-    private JMXConnectorServer connectorServer;
-    private JMXConnector connector;
-    private ObjectName serviceName;
-    private SimpleService service;
-    
-
-    protected void setUp() throws Exception {
-        broker = BrokerFactory.createBroker(new URI(brokerUrl));
-        broker.start();
-
-        server = MBeanServerFactory.createMBeanServer();
-        //register a service
-        service = new SimpleService();
-
-        serviceName = new ObjectName("examples", "mbean", "simple");
-        server.registerMBean(service, serviceName);
-        // start the connector server
-
-        //START SNIPPET: serverJMX
-        //The url to the JMS service
-        JMXServiceURL serverURL = new JMXServiceURL(serverServiceUrl);
-        Map serverEnv = new HashMap();
-        serverEnv.put("jmx.remote.protocol.provider.pkgs", "org.apache.camel.jmxconnect.provider");
-        connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(serverURL, serverEnv, server);
-        connectorServer.start();
-        //END SNIPPET: serverJMX
-
-        //START SNIPPET: clientJMX
-        //Now connect the client-side
-        //The URL to the JMS service
-        JMXServiceURL clientURL = new JMXServiceURL(clientServiceUrl);
-        Map clientEnv = new HashMap();
-        clientEnv.put("jmx.remote.protocol.provider.pkgs", "org.apache.camel.jmxconnect.provider");
-        JMXConnector clientConnector = JMXConnectorFactory.connect(clientURL, clientEnv);
-        // Connect a JSR 160 JMXConnector to the server side
-        connector = JMXConnectorFactory.connect(clientURL, clientEnv);
-        //now test the Connection
-        MBeanServerConnection connection = connector.getMBeanServerConnection();
-        //END SNIPPET: clientJMX
-
-    }
-
-    protected void tearDown() throws Exception {
-        connector.close();
-        connectorServer.stop();
-        broker.stop();
-    }
-
-
-    public void testSimpleRemoteJmx() throws Exception {
-        // Retrieve an MBeanServerConnection that represent the MBeanServer the remote
-        // connector server is bound to
-        MBeanServerConnection connection = connector.getMBeanServerConnection();
-        ObjectName queryName = new ObjectName("*:*");
-        java.util.Set names = connection.queryNames(queryName, null);
-        for (Iterator iter = names.iterator(); iter.hasNext();) {
-            ObjectName name = (ObjectName) iter.next();
-            MBeanInfo beanInfo = connection.getMBeanInfo(name);
-            System.out.println("bean info = " + beanInfo.getDescription());
-            System.out.println("attrs = " + Arrays.asList(beanInfo.getAttributes()));
-        }
-        Object value = connection.getAttribute(serviceName, "SimpleValue");
-        System.out.println("SimpleValue = " + value);
-        Attribute attr = new Attribute("SimpleValue", new Integer(10));
-        connection.setAttribute(serviceName, attr);
-        value = connection.getAttribute(serviceName, "SimpleValue");
-        assertEquals("SimpleValue", value, 10);
-        System.out.println("now SimpleValue = " + value);
-    }
-
-    // TODO not implemented yet!
-    // need server side push, the client needs to register with a replyToEndpoint
-    public void xtestNotificationsJmx() throws Exception {
-
-        // Now let's register a Monitor
-        // We would like to know if we have peaks in activity, so we can use JMX's
-        // GaugeMonitor
-        GaugeMonitor monitorMBean = new GaugeMonitor();
-        ObjectName monitorName = new ObjectName("examples", "monitor", "gauge");
-        server.registerMBean(monitorMBean, monitorName);
-        // Setup the monitor: we want to be notified if we have too many clients or too less
-        monitorMBean.setThresholds(new Integer(8), new Integer(4));
-        // Setup the monitor: we want to know if a threshold is exceeded
-        monitorMBean.setNotifyHigh(true);
-        monitorMBean.setNotifyLow(true);
-
-        monitorMBean.setDifferenceMode(false);
-        // Setup the monitor: link to the service MBean
-        monitorMBean.addObservedObject(serviceName);
-        monitorMBean.setObservedAttribute("SimpleCounter");
-        // Setup the monitor: a short granularity period
-        monitorMBean.setGranularityPeriod(50L);
-        // Setup the monitor: register a listener
-        MBeanServerConnection connection = connector.getMBeanServerConnection();
-        final AtomicBoolean notificationSet = new AtomicBoolean(false);
-        //Add a notification listener to the connection - to
-        //test for notifications across camel
-        connection.addNotificationListener(monitorName, new NotificationListener() {
-            public void handleNotification(Notification notification, Object handback) {
-                System.out.println("Notification = " + notification);
-                synchronized (notificationSet) {
-                    notificationSet.set(true);
-                    notificationSet.notify();
-                }
-            }
-        }, null, null);
-        service.start();
-        monitorMBean.start();
-        synchronized (notificationSet) {
-            if (!notificationSet.get()) {
-                notificationSet.wait(5000);
-            }
-        }
-        assertTrue(notificationSet.get());
-    }
-}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/SimpleService.java b/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/SimpleService.java
deleted file mode 100644
index f2a04bd..0000000
--- a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/SimpleService.java
+++ /dev/null
@@ -1,84 +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.jmxconnect;
-
-/**
- * This is based heavily on the DynamicService example from the mx4j project
- *
- * @version $Revision$
- */
-public class SimpleService implements Runnable, SimpleServiceMBean {
-    private boolean running;
-    private int simpleCounter;
-    private int simpleValue;
-
-    public void start() {
-        if (!running) {
-            running = true;
-            Thread thread = new Thread(this);
-            thread.start();
-        }
-    }
-
-    public void stop() {
-        running = false;
-    }
-
-    public void run() {
-        while (running) {
-            simpleCounter++;
-            try {
-                Thread.sleep(250);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    public void setSimpleCounter(int simpleCounter) {
-        this.simpleCounter = simpleCounter;
-    }
-
-    public int getSimpleCounter() {
-        return simpleCounter;
-    }
-
-    public int getSimpleValue() {
-        return simpleValue;
-    }
-
-    public void setSimpleValue(int simpleValue) {
-        this.simpleValue = simpleValue;
-    }
-/*
-
-    protected MBeanAttributeInfo[] createMBeanAttributeInfo(){
-        return new MBeanAttributeInfo[] {
-                new MBeanAttributeInfo("SimpleCounter","int","test simpleCounter",true,false,false),
-                new MBeanAttributeInfo("SimpleValue","int","test simpleValue",true,true,false) };
-    }
-
-    protected MBeanOperationInfo[] createMBeanOperationInfo(){
-        return new MBeanOperationInfo[] {
-                new MBeanOperationInfo("start","Starts the SimpleService",new MBeanParameterInfo[0],"void",
-                                MBeanOperationInfo.ACTION),
-                new MBeanOperationInfo("stop","Stops the SimpleService",new MBeanParameterInfo[0],"void",
-                                MBeanOperationInfo.ACTION) };
-    }*/
-
-
-}
diff --git a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/SimpleServiceMBean.java b/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/SimpleServiceMBean.java
deleted file mode 100644
index 2841a17..0000000
--- a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/SimpleServiceMBean.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.jmxconnect;
-
-/**
- * @version $Revision$
- */
-public interface SimpleServiceMBean {
-    void start();
-
-    void stop();
-
-    /**
-     * @param simpleCounter
-     *            The simpleCounter to set.
-     */
-    void setSimpleCounter(int simpleCounter);
-
-    /**
-     * @return Returns the simpleCounter.
-     */
-    int getSimpleCounter();
-
-    /**
-     * @return Returns the simpleValue.
-     */
-    int getSimpleValue();
-
-    /**
-     * @param simpleValue The simpleValue to set.
-     */
-    void setSimpleValue(int simpleValue);
-}
diff --git a/components/camel-jmxconnect/src/test/resources/log4j.properties b/components/camel-jmxconnect/src/test/resources/log4j.properties
deleted file mode 100644
index c94e0d4..0000000
--- a/components/camel-jmxconnect/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,35 +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.
-## ------------------------------------------------------------------------
-
-#
-# The logging properties used during tests..
-#
-log4j.rootLogger=INFO, out
-
-log4j.logger.org.apache.camel=DEBUG
-
-# CONSOLE appender not used by default
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
-
-# File appender
-log4j.appender.out=org.apache.log4j.FileAppender
-log4j.appender.out.layout=org.apache.log4j.PatternLayout
-log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
-log4j.appender.out.file=target/camel-jmxconnect-test.log
-log4j.appender.out.append=true
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
index d1748cf..ce4d19b 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
@@ -50,6 +50,7 @@
 import org.apache.camel.view.ModelFileGenerator;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.BeanDefinitionStoreException;
 import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.beans.factory.config.RuntimeBeanReference;
@@ -404,38 +405,56 @@
             }
         }
 
-        // either we have not used template before or we have auto registered it already and therefore we
-        // need it to allow to do it so it can remove the existing auto registered as there is now a clash id
-        // since we have multiple camel contexts
-        boolean canDoTemplate = autoRegisterMap.get("template") != null
-                || !parserContext.getRegistry().isBeanNameInUse("template");
-        if (!template && canDoTemplate) {
-            String id = "template";
-            // auto create a template
-            Element templateElement = element.getOwnerDocument().createElement("template");
-            templateElement.setAttribute("id", id);
-            BeanDefinitionParser parser = parserMap.get("template");
-            BeanDefinition definition = parser.parse(templateElement, parserContext);
+        if (!template) {
+            // either we have not used template before or we have auto registered it already and therefore we
+            // need it to allow to do it so it can remove the existing auto registered as there is now a clash id
+            // since we have multiple camel contexts
+            boolean existing = autoRegisterMap.get("template") != null;
+            boolean inUse = false;
+            try {
+                inUse = parserContext.getRegistry().isBeanNameInUse("template");
+            } catch (BeanCreationException e) {
+                // Spring Eclipse Tooling may throw an exception when you edit the Spring XML online in Eclipse
+                // when the isBeanNameInUse method is invoked, so ignore this and continue (CAMEL-2739)
+                LOG.debug("Error checking isBeanNameInUse(template). This exception will be ignored", e);
+            }
+            if (!inUse || existing) {
+                String id = "template";
+                // auto create a template
+                Element templateElement = element.getOwnerDocument().createElement("template");
+                templateElement.setAttribute("id", id);
+                BeanDefinitionParser parser = parserMap.get("template");
+                BeanDefinition definition = parser.parse(templateElement, parserContext);
 
-            // auto register it
-            autoRegisterBeanDefinition(id, definition, parserContext, contextId);
+                // auto register it
+                autoRegisterBeanDefinition(id, definition, parserContext, contextId);
+            }
         }
 
-        // either we have not used template before or we have auto registered it already and therefore we
-        // need it to allow to do it so it can remove the existing auto registered as there is now a clash id
-        // since we have multiple camel contexts
-        boolean canDoConsumerTemplate = autoRegisterMap.get("consumerTemplate") != null
-                || !parserContext.getRegistry().isBeanNameInUse("consumerTemplate");
-        if (!consumerTemplate && canDoConsumerTemplate) {
-            String id = "consumerTemplate";
-            // auto create a template
-            Element templateElement = element.getOwnerDocument().createElement("consumerTemplate");
-            templateElement.setAttribute("id", id);
-            BeanDefinitionParser parser = parserMap.get("consumerTemplate");
-            BeanDefinition definition = parser.parse(templateElement, parserContext);
+        if (!consumerTemplate) {
+            // either we have not used template before or we have auto registered it already and therefore we
+            // need it to allow to do it so it can remove the existing auto registered as there is now a clash id
+            // since we have multiple camel contexts
+            boolean existing = autoRegisterMap.get("consumerTemplate") != null;
+            boolean inUse = false;
+            try {
+                inUse = parserContext.getRegistry().isBeanNameInUse("consumerTemplate");
+            } catch (BeanCreationException e) {
+                // Spring Eclipse Tooling may throw an exception when you edit the Spring XML online in Eclipse
+                // when the isBeanNameInUse method is invoked, so ignore this and continue (CAMEL-2739)
+                LOG.debug("Error checking isBeanNameInUse(consumerTemplate). This exception will be ignored", e);
+            }
+            if (!inUse || existing) {
+                String id = "consumerTemplate";
+                // auto create a template
+                Element templateElement = element.getOwnerDocument().createElement("consumerTemplate");
+                templateElement.setAttribute("id", id);
+                BeanDefinitionParser parser = parserMap.get("consumerTemplate");
+                BeanDefinition definition = parser.parse(templateElement, parserContext);
 
-            // auto register it
-            autoRegisterBeanDefinition(id, definition, parserContext, contextId);
+                // auto register it
+                autoRegisterBeanDefinition(id, definition, parserContext, contextId);
+            }
         }
 
     }
diff --git a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxActiveMQRemoteTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringValidateRegExpTest.java
similarity index 64%
rename from components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxActiveMQRemoteTest.java
rename to components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringValidateRegExpTest.java
index 6e5faac..b68873c 100644
--- a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxActiveMQRemoteTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringValidateRegExpTest.java
@@ -14,20 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.jmxconnect;
+package org.apache.camel.spring.processor;
 
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ValidateRegExpTest;
+
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
 /**
  * @version $Revision$
  */
-public class JmxActiveMQRemoteTest extends JmxRemoteTest {
-
-    @Override
-    protected void setUp() throws Exception {
-        brokerUrl = "broker:(tcp://localhost:6000)/localhost?persistent=false";
-
-        clientServiceUrl = "service:jmx:activemq:///tcp://localhost:6000";
-        serverServiceUrl = clientServiceUrl;
-
-        super.setUp();
+public class SpringValidateRegExpTest extends ValidateRegExpTest {
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/validate.xml");
     }
-}
+}
\ No newline at end of file
diff --git a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxActiveMQRemoteTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringValidateSimpleTest.java
similarity index 63%
copy from components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxActiveMQRemoteTest.java
copy to components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringValidateSimpleTest.java
index 6e5faac..79546e5 100644
--- a/components/camel-jmxconnect/src/test/java/org/apache/camel/jmxconnect/JmxActiveMQRemoteTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringValidateSimpleTest.java
@@ -14,20 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.jmxconnect;
+package org.apache.camel.spring.processor;
 
-/**
- * @version $Revision$
- */
-public class JmxActiveMQRemoteTest extends JmxRemoteTest {
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.ValidateSimpleTest;
 
-    @Override
-    protected void setUp() throws Exception {
-        brokerUrl = "broker:(tcp://localhost:6000)/localhost?persistent=false";
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
 
-        clientServiceUrl = "service:jmx:activemq:///tcp://localhost:6000";
-        serverServiceUrl = clientServiceUrl;
+public class SpringValidateSimpleTest extends ValidateSimpleTest {
 
-        super.setUp();
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/ValidateSimpleTest.xml");
     }
-}
+}
\ No newline at end of file
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ValidateSimpleTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ValidateSimpleTest.xml
new file mode 100644
index 0000000..e41301b
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/ValidateSimpleTest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+
+        <route>
+            <from uri="direct:start"/>
+            <validate>
+                <simple>${body} contains 'Camel'</simple>
+            </validate>
+            <to uri="mock:result"/>
+        </route>
+
+    </camelContext>
+
+</beans>
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/validate.xml b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/validate.xml
new file mode 100644
index 0000000..f8473da
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/validate.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+    ">
+
+    <!-- START SNIPPET: example -->
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start"/>
+            <validate>
+                <simple>${bodyAs(java.lang.String)} regex '^\d{2}\.\d{2}\.\d{4}$'</simple>            	
+            </validate>
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
+    <!-- END SNIPPET: example -->
+
+</beans>
diff --git a/components/pom.xml b/components/pom.xml
index 0e03514..71f4d4a 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -30,7 +30,6 @@
   <packaging>pom</packaging>
 
   <modules>
-    <!--<module>camel-jmxconnect</module>-->
     <module>camel-amqp</module>
     <module>camel-atom</module>
     <module>camel-bam</module>
@@ -81,6 +80,9 @@
     <module>camel-mvel</module>
     <module>camel-netty</module>
     <module>camel-nagios</module>
+<!-- ode is under active development
+    <module>camel-ode</module>
+-->
     <module>camel-ognl</module>
     <module>camel-osgi</module>
     <module>camel-printer</module>
diff --git a/examples/camel-example-axis/pom.xml b/examples/camel-example-axis/pom.xml
index 1dbb487..cba2f79 100644
--- a/examples/camel-example-axis/pom.xml
+++ b/examples/camel-example-axis/pom.xml
@@ -141,4 +141,4 @@
 	      </plugin>
 	  </plugins>
 	</build>
-</project>
\ No newline at end of file
+</project>
diff --git a/examples/camel-example-loadbalancing-mina/pom.xml b/examples/camel-example-loadbalancing-mina/pom.xml
index 279e15b..bbb42b2 100644
--- a/examples/camel-example-loadbalancing-mina/pom.xml
+++ b/examples/camel-example-loadbalancing-mina/pom.xml
@@ -24,7 +24,7 @@
 	<parent>
 	    <groupId>org.apache.camel</groupId>
 	    <artifactId>examples</artifactId>
-	    <version>2.3-SNAPSHOT</version>
+	    <version>2.3.0</version>
 	</parent>
 	
 	<groupId>org.apache.camel.example</groupId>
diff --git a/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/model/Report.java b/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/model/Report.java
index 070e9d0..aa98d97 100644
--- a/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/model/Report.java
+++ b/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/model/Report.java
@@ -18,76 +18,79 @@
 
 import java.io.Serializable;
 
-import sun.tools.tree.ThisExpression;
-
 public class Report implements Serializable {
 
-	private static final long serialVersionUID = 1L;
-	
-	private Integer id;
-	private String title;
-	private String content;
-	private String reply;
-	
-	/**
-	 * @return the id
-	 */
-	public Integer getId() {
-		return id;
-	}
-	/**
-	 * @param id the id to set
-	 */
-	public void setId(Integer id) {
-		this.id = id;
-	}
-	/**
-	 * @return the title
-	 */
-	public String getTitle() {
-		return title;
-	}
-	/**
-	 * @param title the title to set
-	 */
-	public void setTitle(String title) {
-		this.title = title;
-	}
-	/**
-	 * @return the content
-	 */
-	public String getContent() {
-		return content;
-	}
-	/**
-	 * @param content the content to set
-	 */
-	public void setContent(String content) {
-		this.content = content;
-	}
-	/**
-	 * @return the reply
-	 */
-	public String getReply() {
-		return reply;
-	}
-	/**
-	 * @param reply the reply to set
-	 */
-	public void setReply(String reply) {
-		this.reply = reply;
-	}
-	
-	public String toString() {
-		StringBuilder result = new StringBuilder();
-		result.append(">> ***********************************************" + "\n");
-		result.append(">> Report id : " + this.id + "\n");
-		result.append(">> Report title : " + this.title+ "\n");
-		result.append(">> Report content : " + this.content+ "\n");
-		result.append(">> Report reply : " + this.reply+ "\n");
-		result.append(">> ***********************************************" + "\n");
-		return result.toString();
-		
-	}
+    private static final long serialVersionUID = 1L;
 
+    private Integer id;
+    private String title;
+    private String content;
+    private String reply;
+
+    /**
+    * @return the id
+    */
+    public Integer getId() {
+        return id;
+    }
+
+    /**
+    * @param id the id to set
+    */
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    /**
+    * @return the title
+    */
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+    * @param title the title to set
+    */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    /**
+    * @return the content
+    */
+    public String getContent() {
+        return content;
+    }
+
+    /**
+    * @param content the content to set
+    */
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    /**
+    * @return the reply
+    */
+    public String getReply() {
+        return reply;
+    }
+
+    /**
+    * @param reply the reply to set
+    */
+    public void setReply(String reply) {
+        this.reply = reply;
+    }
+
+    public String toString() {
+        StringBuilder result = new StringBuilder();
+        result.append(">> ***********************************************" + "\n");
+        result.append(">> Report id : " + this.id + "\n");
+        result.append(">> Report title : " + this.title + "\n");
+        result.append(">> Report content : " + this.content + "\n");
+        result.append(">> Report reply : " + this.reply + "\n");
+        result.append(">> ***********************************************" + "\n");
+        return result.toString();
+    }
 }
diff --git a/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Generator.java b/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Generator.java
index 80be5dd..6d90624 100644
--- a/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Generator.java
+++ b/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Generator.java
@@ -19,23 +19,20 @@
 import org.apache.camel.example.model.Report;
 
 public class Generator  {
-	
-	private static int count = 0;
 
-	public Report createReport() throws Exception {
-		
-		int counter = ++count;
-		
-		// Create a Report object
-		Report report = new Report();
-		report.setId(counter);
-		report.setTitle("Report Title : " + counter);
-		report.setContent("This is a dummy report");
-		
-		// Add the report to the Body
-		return report;		
-	}
-	
-	
+    private static int count;
 
+    public Report createReport() throws Exception {
+
+        int counter = ++count;
+
+        // Create a Report object
+        Report report = new Report();
+        report.setId(counter);
+        report.setTitle("Report Title : " + counter);
+        report.setContent("This is a dummy report");
+
+        // Add the report to the Body
+        return report;
+    }
 }
diff --git a/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Reporting.java b/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Reporting.java
index 3de57ab..fcf1891 100644
--- a/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Reporting.java
+++ b/examples/camel-example-loadbalancing-mina/src/main/java/org/apache/camel/example/service/Reporting.java
@@ -23,20 +23,16 @@
 import org.apache.camel.example.model.Report;
 
 public class Reporting implements Processor {
-	
-	private static Integer count;
 
-	public void process(Exchange exchange) throws Exception {
-	}
+    private static Integer count;
 
-	public Report updateReport(@Body Report report, @Header("minaServer") String name) throws Exception {
-		
-		report.setReply("Report updated from MINA server running on : " + name);
-		
-		// send the report updated
-		return report;		
-	}
-	
-	
+    public void process(Exchange exchange) throws Exception {
+    }
 
+    public Report updateReport(@Body Report report, @Header("minaServer") String name) throws Exception {
+        report.setReply("Report updated from MINA server running on : " + name);
+
+        // send the report updated
+        return report;
+    }
 }
diff --git a/components/camel-jmxconnect/src/main/resources/META-INF/LICENSE.txt b/examples/camel-example-loadbalancing-mina/src/main/resources/META-INF/LICENSE.txt
old mode 100644
new mode 100755
similarity index 100%
rename from components/camel-jmxconnect/src/main/resources/META-INF/LICENSE.txt
rename to examples/camel-example-loadbalancing-mina/src/main/resources/META-INF/LICENSE.txt
diff --git a/components/camel-jmxconnect/src/main/resources/META-INF/NOTICE.txt b/examples/camel-example-loadbalancing-mina/src/main/resources/META-INF/NOTICE.txt
similarity index 100%
rename from components/camel-jmxconnect/src/main/resources/META-INF/NOTICE.txt
rename to examples/camel-example-loadbalancing-mina/src/main/resources/META-INF/NOTICE.txt
diff --git a/examples/camel-example-reportincident/README.txt b/examples/camel-example-reportincident/README.txt
index 4b49fde..30c36c2 100644
--- a/examples/camel-example-reportincident/README.txt
+++ b/examples/camel-example-reportincident/README.txt
@@ -13,8 +13,8 @@
 To run the example type
   mvn jetty:run
 
-The webservice is exposed at:
-  http://localhost:9080/camel-example-reportincident/webservices/incident
+The webservice will be listed in this overview:
+  http://localhost:9080/webservices/
 
 
 To run the example with Ant
@@ -41,8 +41,8 @@
   c. To Run using Ant, type
     ant run
 
-The webservice is exposed at:
-  http://localhost:9080/camel-example-reportincident/webservices/incident
+The webservice WSDL is exposed at:
+  http://localhost:9080/webservices/incident?wsdl
 
 
 To stop the example hit ctrl + c
diff --git a/examples/camel-example-reportincident/pom.xml b/examples/camel-example-reportincident/pom.xml
index 976bc25..871c0cd 100755
--- a/examples/camel-example-reportincident/pom.xml
+++ b/examples/camel-example-reportincident/pom.xml
@@ -170,4 +170,4 @@
 
         </plugins>
     </build>
-</project>
\ No newline at end of file
+</project>
diff --git a/examples/camel-example-spring-javaconfig/pom.xml b/examples/camel-example-spring-javaconfig/pom.xml
index 5807e0e..cf707fe 100644
--- a/examples/camel-example-spring-javaconfig/pom.xml
+++ b/examples/camel-example-spring-javaconfig/pom.xml
@@ -23,7 +23,7 @@
 	<parent>
 		<groupId>org.apache.camel</groupId>
 		<artifactId>examples</artifactId>
-		<version>2.3-SNAPSHOT</version>
+		<version>2.3.0</version>
 	</parent>
 
 	<artifactId>camel-example-spring-javaconfig</artifactId>
diff --git a/examples/camel-example-spring-security/pom.xml b/examples/camel-example-spring-security/pom.xml
index f3498dd..0e2c9fc 100755
--- a/examples/camel-example-spring-security/pom.xml
+++ b/examples/camel-example-spring-security/pom.xml
@@ -23,7 +23,7 @@
 	<parent>
 		<groupId>org.apache.camel</groupId>
 		<artifactId>examples</artifactId>
-		<version>2.3-SNAPSHOT</version>
+		<version>2.3.0</version>
 	</parent>
 
 	<artifactId>camel-example-spring-security</artifactId>
diff --git a/examples/pom.xml b/examples/pom.xml
index a340f0c..116b5ee 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -59,6 +59,7 @@
     <module>camel-example-gauth</module>
     <module>camel-example-guice-jms</module>
     <module>camel-example-jms-file</module>
+    <module>camel-example-loadbalancing-mina</module>
     <module>camel-example-loan-broker</module>
     <module>camel-example-management</module>
     <module>camel-example-osgi</module>
@@ -66,8 +67,10 @@
     <module>camel-example-reportincident</module>
     <module>camel-example-route-throttling</module>
     <module>camel-example-spring</module>
+    <module>camel-example-spring-javaconfig</module>
     <module>camel-example-spring-jms</module>
     <module>camel-example-spring-xquery</module>
+    <module>camel-example-spring-security</module>
     <module>camel-example-tracer</module>
   </modules>
 
diff --git a/parent/pom.xml b/parent/pom.xml
index 055e860..a64f5a1 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -76,7 +76,7 @@
     <httpcore4-version>4.0.1</httpcore4-version>
     <httpclient4-version>4.0.1</httpclient4-version>
     <httpclient-version>3.1</httpclient-version>
-    <jackson-version>1.4.3</jackson-version>
+    <jackson-version>1.5.2</jackson-version>
     <javassist-version>3.9.0.GA</javassist-version>
     <javax-mail-version>1.4.3</javax-mail-version>
     <jaxb-version>2.1.12</jaxb-version>
diff --git a/pom.xml b/pom.xml
index 10ea9be..172cd94 100755
--- a/pom.xml
+++ b/pom.xml
@@ -354,7 +354,15 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
-          <version>2.0.4</version>
+          <version>2.1.1</version>
+          <configuration>
+	   <archive>
+               <manifestEntries>
+                 <Bundle-SymbolicName>${project.groupId}.${project.artifactId}.source</Bundle-SymbolicName>
+                 <Eclipse-SourceBundle>${project.groupId}.${project.artifactId};version="${camel.osgi.version.clean}"</Eclipse-SourceBundle>
+               </manifestEntries>
+             </archive>
+          </configuration>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
