You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/03/23 08:30:02 UTC

[camel-karaf] branch master created (now 4327aba)

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git.


      at 4327aba  Added camel-paxloggin component and more

This branch includes the following new commits:

     new 271a283  Camel-Karaf: First commit
     new 74991e0  Camel-Karaf: Added KEYS, LICENSE and NOTICE
     new b6959d5  Added Maven Wrapper
     new d8ee18c  Added .gitattributes
     new 4327aba  Added camel-paxloggin component and more

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[camel-karaf] 03/05: Added Maven Wrapper

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git

commit b6959d567ef6014a1950be828466184fb4316953
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Mar 23 08:54:57 2020 +0100

    Added Maven Wrapper
---
 .mvn/wrapper/MavenWrapperDownloader.java | 117 ++++++++++++
 .mvn/wrapper/maven-wrapper.jar           | Bin 0 -> 50709 bytes
 .mvn/wrapper/maven-wrapper.properties    |   2 +
 mvnw                                     | 305 +++++++++++++++++++++++++++++++
 mvnw.cmd                                 | 172 +++++++++++++++++
 5 files changed, 596 insertions(+)

diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100755
index 0000000..fc5ad5e
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.2";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + " .jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100755
index 0000000..968b23b
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100755
index 0000000..0722d8e
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.2/maven-wrapper-0.5.2.tar.gz
diff --git a/mvnw b/mvnw
new file mode 100755
index 0000000..eb65ff2
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,305 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ "$MVNW_REPOURL" = true]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.2/maven-wrapper-0.5.2.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.2/maven-wrapper-0.5.2.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+        
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100755
index 0000000..4f5150a
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,172 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.2/maven-wrapper-0.5.2.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    echo Found %WRAPPER_JAR%
+) else (
+	if not "%MVNW_REPOURL%" == "" (
+	  SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.2/maven-wrapper-0.5.2.jar"
+	)
+    echo Couldn't find %WRAPPER_JAR%, downloading it ...
+	echo Downloading from: %DOWNLOAD_URL%
+	
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%


[camel-karaf] 01/05: Camel-Karaf: First commit

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git

commit 271a283d594f15f51a5ae32a6ae470b8b770265c
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Mar 23 08:47:44 2020 +0100

    Camel-Karaf: First commit
---
 .gitignore                                         |  27 +
 core/camel-core-osgi/pom.xml                       | 107 +++
 .../apache/camel/core/osgi/OsgiBeanRepository.java | 183 ++++
 .../camel/core/osgi/OsgiCamelContextHelper.java    |  53 ++
 .../core/osgi/OsgiCamelContextNameStrategy.java    |  63 ++
 .../camel/core/osgi/OsgiCamelContextPublisher.java | 153 ++++
 .../apache/camel/core/osgi/OsgiClassResolver.java  | 186 +++++
 .../camel/core/osgi/OsgiComponentResolver.java     |  69 ++
 .../camel/core/osgi/OsgiDataFormatResolver.java    |  91 ++
 .../camel/core/osgi/OsgiDefaultCamelContext.java   |  60 ++
 .../camel/core/osgi/OsgiEventAdminNotifier.java    | 144 ++++
 .../apache/camel/core/osgi/OsgiFactoryFinder.java  | 126 +++
 .../camel/core/osgi/OsgiFactoryFinderResolver.java |  37 +
 .../camel/core/osgi/OsgiLanguageResolver.java      |  98 +++
 .../core/osgi/OsgiManagementNameStrategy.java      |  73 ++
 .../apache/camel/core/osgi/OsgiNamingHelper.java   |  91 ++
 .../core/osgi/OsgiPackageScanClassResolver.java    | 115 +++
 .../apache/camel/core/osgi/OsgiTypeConverter.java  | 336 ++++++++
 .../org/apache/camel/core/osgi/impl/Activator.java | 728 ++++++++++++++++
 .../org/apache/camel/core/osgi/impl/package.html   |  27 +
 .../camel/core/osgi/utils/BundleContextUtils.java  |  67 ++
 .../osgi/utils/BundleDelegatingClassLoader.java    |  99 +++
 .../apache/camel/core/osgi/CamelMockBundle.java    | 132 +++
 .../camel/core/osgi/CamelMockBundleContext.java    | 139 ++++
 .../camel/core/osgi/CamelMockLanguageResolver.java |  33 +
 .../camel/core/osgi/CamelOsgiTestSupport.java      |  53 ++
 .../camel/core/osgi/OsgiClassResolverTest.java     |  40 +
 .../camel/core/osgi/OsgiComponentResolverTest.java | 122 +++
 .../core/osgi/OsgiDataFormatResolverTest.java      |  88 ++
 .../camel/core/osgi/OsgiFactoryFinderTest.java     |  42 +
 .../camel/core/osgi/OsgiLanguageResolverTest.java  |  94 +++
 .../osgi/OsgiPackageScanClassResolverTest.java     |  79 ++
 .../camel/core/osgi/ServiceRegistryTest.java       |  58 ++
 .../camel/core/osgi/other/MyOtherRouteBuilder.java |  28 +
 .../core/osgi/other/MyOtherTypeConverter.java      |  77 ++
 .../core/osgi/test/MockTypeConverterRegistry.java  | 141 ++++
 .../camel/core/osgi/test/MyRouteBuilder.java       |  28 +
 .../org/apache/camel/core/osgi/test/MyService.java |  25 +
 .../camel/core/osgi/test/MyTypeConverter.java      |  77 ++
 .../src/test/resources/META-INF/LICENSE.txt        | 203 +++++
 .../src/test/resources/META-INF/NOTICE.txt         |  11 +
 .../services/org/apache/camel/component/file_test  |  19 +
 .../services/org/apache/camel/component/timer_test |  18 +
 .../services/org/apache/camel/language/bean_test   |  18 +
 .../services/org/apache/camel/language/file_test   |  18 +
 .../org/apache/camel/language/resolver/default     |  18 +
 .../resources/META-INF/spring/camel-context.xml    |  66 ++
 .../src/test/resources/log4j2.properties           |  28 +
 core/pom.xml                                       |  37 +
 pom.xml                                            | 921 +++++++++++++++++++++
 50 files changed, 5546 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5d69a55
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+target
+*.iml
+*.ipr
+*.iws
+.idea
+.DS_Store
+.classpath
+.ekstazi
+.project
+.settings
+.checkstyle
+*.log
+test-salesforce-login.properties
+dependency-reduced-pom.xml
+id_file
+components/camel-solr/data
+*.epoch
+.factorypath
+.pmd
+.sts4-cache
+log-camel-lsp.out
+.vscode
+*.code-workspace
+components/camel-cxf/activemq-data
+*.swp
+.flattened-pom.xml
+.java-version
diff --git a/core/camel-core-osgi/pom.xml b/core/camel-core-osgi/pom.xml
new file mode 100644
index 0000000..205ef0e
--- /dev/null
+++ b/core/camel-core-osgi/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.karaf</groupId>
+        <artifactId>core-modules</artifactId>
+        <version>3.2.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-core-osgi</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel Karaf :: Core OSGi</name>
+    <description>Camel Karaf Core OSGi support</description>
+
+    <properties>
+        <camel.osgi.import>
+            org.osgi.service.event;resolution:=optional,
+            *
+        </camel.osgi.import>
+        <camel.osgi.provide.capability>
+            osgi.extender; osgi.extender="org.apache.camel"; uses:="org.apache.camel.core.osgi.impl";
+            version:Version="$(version;==;${camel.osgi.version.clean})"
+        </camel.osgi.provide.capability>
+        <camel.osgi.activator>
+            org.apache.camel.core.osgi.impl.Activator
+        </camel.osgi.activator>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-engine</artifactId>
+        </dependency>
+
+        <!-- osgi -->
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- for testing -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core-languages</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-file</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-mock</artifactId>
+            <version>1.2.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+</project>
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiBeanRepository.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiBeanRepository.java
new file mode 100644
index 0000000..dcec057
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiBeanRepository.java
@@ -0,0 +1,183 @@
+/*
+ * 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.core.osgi;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.Service;
+import org.apache.camel.spi.BeanRepository;
+import org.apache.camel.support.LifecycleStrategySupport;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The OSGi {@link BeanRepository} support to lookup beans from the OSGi service registry from its bundle context.
+ */
+public class OsgiBeanRepository extends LifecycleStrategySupport implements BeanRepository, Service, ServiceListener {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiBeanRepository.class);
+    private final BundleContext bundleContext;
+    private final Map<ServiceReference<?>, AtomicLong> serviceReferenceUsageMap = new ConcurrentHashMap<>();
+    
+    public OsgiBeanRepository(BundleContext bc) {
+        bundleContext = bc;
+        bundleContext.addServiceListener(this);
+    }
+
+    /**
+     * Support to lookup the Object with filter with the (name=NAME) and class type
+     */
+    @Override
+    public <T> T lookupByNameAndType(String name, Class<T> type) {
+        Object service = null;
+        ServiceReference<?> sr;
+        try {
+            ServiceReference<?>[] refs = bundleContext.getServiceReferences(type.getName(), "(name=" + name + ")");            
+            if (refs != null && refs.length > 0) {
+                // just return the first one
+                sr = refs[0];
+                incrementServiceUsage(sr);
+                service = bundleContext.getService(sr);
+            }
+        } catch (Exception ex) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(ex);
+        }
+        service = unwrap(service);
+        return type.cast(service);
+    }
+
+    /**
+     * It's only support to look up the ServiceReference with Class name or service PID
+     */
+    @Override
+    public Object lookupByName(String name) {
+        Object service = null;
+        ServiceReference<?> sr = bundleContext.getServiceReference(name);
+        if (sr == null) {
+            // trying to lookup service by PID if not found by name
+            String filterExpression = "(" + Constants.SERVICE_PID + "=" + name + ")";
+            try {
+                ServiceReference<?>[] refs = bundleContext.getServiceReferences((String)null, filterExpression);
+                if (refs != null && refs.length > 0) {
+                    // just return the first one
+                    sr = refs[0];
+                }
+            } catch (InvalidSyntaxException ex) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Invalid OSGi service reference filter, skipped lookup by service.pid. Filter expression: {}", filterExpression, ex);
+                }
+            }
+        }
+        if (sr != null) {
+            incrementServiceUsage(sr);
+            service = bundleContext.getService(sr);
+        }
+        service = unwrap(service);
+        return service;
+    }
+
+    @Override
+    public <T> Map<String, T> findByTypeWithName(Class<T> type) {
+        Map<String, T> result = new HashMap<>();
+        int count = 0;
+        try {
+            ServiceReference<?>[] refs = bundleContext.getAllServiceReferences(type.getName(), null);
+            if (refs != null) {
+                for (ServiceReference<?> sr : refs) {
+                    if (sr != null) {
+                        Object service = bundleContext.getService(sr);
+                        incrementServiceUsage(sr);
+                        if (service != null) {
+                            String name = (String)sr.getProperty("name");
+                            service = unwrap(service);
+                            if (name != null) {
+                                result.put(name, type.cast(service));
+                            } else {
+                                // generate a unique name for it
+                                result.put(type.getSimpleName() + count, type.cast(service));
+                                count++;
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception ex) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(ex);
+        }
+        return result;
+    }
+
+    @Override
+    public <T> Set<T> findByType(Class<T> type) {
+        Map<String, T> map = findByTypeWithName(type);
+        return new HashSet<>(map.values());
+    }
+
+    @Override
+    public void start() {
+        // noop
+    }
+
+    @Override
+    public void stop() {
+        // Unget the OSGi service as OSGi uses reference counting
+        // and we should do this as one of the last actions when stopping Camel
+        this.serviceReferenceUsageMap.forEach(this::drainServiceUsage);
+        this.serviceReferenceUsageMap.clear();
+    }
+
+    private void drainServiceUsage(ServiceReference<?> serviceReference, AtomicLong serviceUsageCount) {
+        if (serviceUsageCount != null && serviceReference != null) {
+            while (serviceUsageCount.decrementAndGet() >= 0) {
+                this.bundleContext.ungetService(serviceReference);
+            }
+        }
+    }
+
+    private void incrementServiceUsage(ServiceReference<?> sr) {
+        AtomicLong serviceUsageCount = this.serviceReferenceUsageMap.get(sr);
+        if (serviceUsageCount != null) {
+            serviceUsageCount.incrementAndGet();
+        } else {
+            this.serviceReferenceUsageMap.merge(sr, new AtomicLong(1),
+                (existingServiceUsageCount, newServiceUsageCount) -> {
+                    existingServiceUsageCount.getAndAdd(newServiceUsageCount.get());
+                    return existingServiceUsageCount;
+                });
+        }
+    }
+
+    @Override
+    public void serviceChanged(ServiceEvent event) {
+        if (event.getType() == ServiceEvent.UNREGISTERING) {
+            ServiceReference<?> serviceReference = event.getServiceReference();
+            AtomicLong serviceUsageCount = this.serviceReferenceUsageMap.remove(serviceReference);
+            drainServiceUsage(serviceReference, serviceUsageCount);
+        }
+    }
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java
new file mode 100644
index 0000000..aeda372
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextHelper.java
@@ -0,0 +1,53 @@
+/*
+ * 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.core.osgi;
+
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.util.ObjectHelper;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class OsgiCamelContextHelper {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiCamelContextHelper.class);
+
+    private OsgiCamelContextHelper() {
+        // helper class
+    }
+    
+    public static void osgiUpdate(DefaultCamelContext camelContext, BundleContext bundleContext) {
+        ObjectHelper.notNull(bundleContext, "BundleContext");
+
+        LOG.debug("Using OsgiCamelContextNameStrategy");
+        camelContext.setNameStrategy(new OsgiCamelContextNameStrategy(bundleContext));
+        LOG.debug("Using OsgiManagementNameStrategy");
+        camelContext.setManagementNameStrategy(new OsgiManagementNameStrategy(camelContext, bundleContext));
+        LOG.debug("Using OsgiClassResolver");
+        camelContext.setClassResolver(new OsgiClassResolver(camelContext, bundleContext));
+        LOG.debug("Using OsgiFactoryFinderResolver");
+        camelContext.setFactoryFinderResolver(new OsgiFactoryFinderResolver(bundleContext));
+        LOG.debug("Using OsgiPackageScanClassResolver");
+        camelContext.setPackageScanClassResolver(new OsgiPackageScanClassResolver(bundleContext));
+        LOG.debug("Using OsgiComponentResolver");
+        camelContext.setComponentResolver(new OsgiComponentResolver(bundleContext));
+        LOG.debug("Using OsgiLanguageResolver");
+        camelContext.setLanguageResolver(new OsgiLanguageResolver(bundleContext));
+        LOG.debug("Using OsgiDataFormatResolver");
+        camelContext.setDataFormatResolver(new OsgiDataFormatResolver(bundleContext));
+    }
+    
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java
new file mode 100644
index 0000000..965d11c
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextNameStrategy.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.spi.CamelContextNameStrategy;
+import org.osgi.framework.BundleContext;
+
+import static org.apache.camel.core.osgi.OsgiCamelContextPublisher.CONTEXT_NAME_PROPERTY;
+
+/**
+ * In OSGi we want to use a {@link CamelContextNameStrategy} that finds a free name in the
+ * OSGi Service Registry to be used for auto assigned names.
+ * <p/>
+ * If there is a name clash in the OSGi registry, then a new candidate name is used by appending
+ * a unique counter.
+ */
+public class OsgiCamelContextNameStrategy implements CamelContextNameStrategy {
+
+    private static final AtomicInteger CONTEXT_COUNTER = new AtomicInteger(0);
+    private final BundleContext context;
+    private final String prefix = "camel";
+    private volatile String name;
+
+    public OsgiCamelContextNameStrategy(BundleContext context) {
+        this.context = context;
+    }
+
+    @Override
+    public String getName() {
+        if (name == null) {
+            name = getNextName();
+        }
+        return name;
+    }
+
+    @Override
+    public synchronized String getNextName() {
+        // false = do no check fist, but add the counter asap, so we have camel-1
+        return OsgiNamingHelper.findFreeCamelContextName(context, prefix, CONTEXT_NAME_PROPERTY, CONTEXT_COUNTER, false);
+    }
+
+    @Override
+    public boolean isFixedName() {
+        return false;
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java
new file mode 100644
index 0000000..ab0976d
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiCamelContextPublisher.java
@@ -0,0 +1,153 @@
+/*
+ * 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.core.osgi;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.CamelEvent;
+import org.apache.camel.spi.CamelEvent.CamelContextEvent;
+import org.apache.camel.spi.CamelEvent.Type;
+import org.apache.camel.support.EventNotifierSupport;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This {@link org.apache.camel.spi.EventNotifier} is in charge of registering
+ * {@link CamelContext} in the OSGi registry
+ */
+public class OsgiCamelContextPublisher extends EventNotifierSupport {
+
+    public static final String CONTEXT_SYMBOLIC_NAME_PROPERTY = "camel.context.symbolicname";
+    public static final String CONTEXT_VERSION_PROPERTY = "camel.context.version";
+    public static final String CONTEXT_NAME_PROPERTY = "camel.context.name";
+    public static final String CONTEXT_MANAGEMENT_NAME_PROPERTY = "camel.context.managementname";
+
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiCamelContextPublisher.class);
+
+    private final BundleContext bundleContext;
+    private final Map<CamelContext, ServiceRegistration<?>> registrations 
+        = new ConcurrentHashMap<>();
+
+    public OsgiCamelContextPublisher(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    public void notify(CamelEvent event) throws Exception {
+        if (event.getType() == Type.CamelContextStarted) {
+            CamelContext context = ((CamelContextEvent) event).getContext();
+            registerCamelContext(context);
+        } else if (event.getType() == Type.CamelContextStopping) {
+            CamelContext context = ((CamelContextEvent) event).getContext();
+            ServiceRegistration<?> reg = registrations.remove(context);
+            if (reg != null) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Unregistering CamelContext [{}] from OSGi registry", context.getName());
+                }
+                try {
+                    reg.unregister();
+                } catch (Exception e) {
+                    LOG.warn("Error unregistering CamelContext [" + context.getName() + "] from OSGi registry. This exception will be ignored.", e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean isEnabled(CamelEvent event) {
+        return event.getType() == Type.CamelContextStarted || event.getType() == Type.CamelContextStopping;
+    }
+
+    @Override
+    protected void doShutdown() throws Exception {
+        // clear and unregister any left-over registration (which should not happen)
+        if (!registrations.isEmpty()) {
+            LOG.warn("On shutdown there are {} registrations which was supposed to have been unregistered already. Will unregister these now.", registrations.size());
+            for (ServiceRegistration<?> reg : registrations.values()) {
+                try {
+                    reg.unregister();
+                } catch (Exception e) {
+                    LOG.warn("Error unregistering from OSGi registry. This exception will be ignored.", e);
+                }
+            }
+        }
+        registrations.clear();
+    }
+
+    public ServiceRegistration<?> registerCamelContext(CamelContext camelContext) throws InvalidSyntaxException {
+        // avoid registering the same service again
+        // we must include unique camel management name so the symbolic name becomes unique,
+        // in case the bundle has more than one CamelContext
+        String name = camelContext.getName();
+        String managementName = camelContext.getManagementName();
+        String symbolicName = bundleContext.getBundle().getSymbolicName();
+
+        if (!lookupCamelContext(bundleContext, symbolicName, name)) {
+            Version bundleVersion = getBundleVersion(bundleContext.getBundle());
+
+            Dictionary<String, Object > props = new Hashtable<>();
+            props.put(CONTEXT_SYMBOLIC_NAME_PROPERTY, symbolicName);
+            props.put(CONTEXT_VERSION_PROPERTY, bundleVersion);
+            props.put(CONTEXT_NAME_PROPERTY, name);
+            if (managementName != null) {
+                props.put(CONTEXT_MANAGEMENT_NAME_PROPERTY, managementName);
+            }
+
+            LOG.debug("Registering CamelContext [{}] in OSGi registry", name);
+
+            ServiceRegistration<?> reg = bundleContext.registerService(CamelContext.class.getName(), camelContext, props);
+            if (reg != null) {
+                registrations.put(camelContext, reg);
+            }
+            return reg;
+        } else {
+            return null;
+        }
+    }
+
+    public static Version getBundleVersion(Bundle bundle) {
+        Dictionary<?, ?> headers = bundle.getHeaders();
+        String version = (String) headers.get(Constants.BUNDLE_VERSION);
+        return (version != null) ? Version.parseVersion(version) : Version.emptyVersion;
+    }
+
+    /**
+     * Lookup in the OSGi Service Registry whether a {@link org.apache.camel.CamelContext} is already registered with the given symbolic name.
+     *
+     * @return <tt>true</tt> if exists, <tt>false</tt> otherwise
+     */
+    public static boolean lookupCamelContext(BundleContext bundleContext, String symbolicName, String contextName) throws InvalidSyntaxException {
+        Version bundleVersion = getBundleVersion(bundleContext.getBundle());
+        ServiceReference<?>[] refs = bundleContext.getServiceReferences(CamelContext.class.getName(),
+                "(&(" + CONTEXT_SYMBOLIC_NAME_PROPERTY + "=" + symbolicName + ")"
+                + "(" + CONTEXT_NAME_PROPERTY + "=" + contextName + ")"
+                + "(" + CONTEXT_VERSION_PROPERTY + "=" + bundleVersion + "))");
+        return refs != null && refs.length > 0;
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java
new file mode 100644
index 0000000..0d9e059
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiClassResolver.java
@@ -0,0 +1,186 @@
+/*
+ * 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.core.osgi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.engine.DefaultClassResolver;
+import org.apache.camel.util.CastUtils;
+import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/* Using the bundle of CamelContext to load the class */
+public class OsgiClassResolver extends DefaultClassResolver {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiClassResolver.class);
+
+    private final CamelContext camelContext;
+    private final BundleContext bundleContext;
+
+    public OsgiClassResolver(CamelContext camelContext, BundleContext context) {
+        super(camelContext);
+        this.camelContext = camelContext;
+        this.bundleContext = context;
+    }
+
+    @Override
+    public Class<?> resolveClass(String name) {
+        LOG.trace("Resolve class {}", name);
+        name = StringHelper.normalizeClassName(name);
+        if (ObjectHelper.isEmpty(name)) {
+            return null;
+        }
+        // we need to avoid the NPE issue of loading the class
+        Class<?> clazz = ObjectHelper.loadSimpleType(name);
+        if (clazz == null) {
+            clazz = doLoadClass(name, bundleContext.getBundle());
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Loading class {} using BundleContext {} -> {}", name, bundleContext.getBundle(), clazz);
+            }
+        }
+        if (clazz == null && camelContext != null) {
+            // fallback and load class using the application context classloader
+            clazz = super.loadClass(name, camelContext.getApplicationContextClassLoader());
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Loading class {} using CamelContext {} -> {}", name, camelContext, clazz);
+            }
+        }
+        return clazz;
+    }
+
+    @Override
+    public <T> Class<T> resolveClass(String name, Class<T> type) {
+        return CastUtils.cast(resolveClass(name));
+    }
+
+    @Override
+    public InputStream loadResourceAsStream(String uri) {
+        StringHelper.notEmpty(uri, "uri");
+
+        String resolvedName = resolveUriPath(uri);
+        URL url = loadResourceAsURL(resolvedName);
+        InputStream answer = null;
+        if (url != null) {
+            try {
+                answer = url.openStream();
+            } catch (IOException ex) {
+                throw new RuntimeException("Cannot load resource: " + uri, ex);
+            }
+        }
+
+        // fallback to default as OSGi may have issues loading resources
+        if (answer == null) {
+            answer = super.loadResourceAsStream(uri);
+        }
+        return answer;
+    }
+
+    @Override
+    public URL loadResourceAsURL(String uri) {
+        StringHelper.notEmpty(uri, "uri");
+        String resolvedName = resolveUriPath(uri);
+        URL answer = bundleContext.getBundle().getResource(resolvedName);
+
+        // fallback to default as OSGi may have issues loading resources
+        if (answer == null) {
+            answer = super.loadResourceAsURL(uri);
+        }
+        return answer;
+    }
+
+    @Override
+    public Enumeration<URL> loadResourcesAsURL(String uri) {
+        StringHelper.notEmpty(uri, "uri");
+        try {
+            String resolvedName = resolveUriPath(uri);
+            return bundleContext.getBundle().getResources(resolvedName);
+        } catch (IOException e) {
+            throw new RuntimeException("Cannot load resource: " + uri, e);
+        }
+    }
+
+    @Override
+    public Enumeration<URL> loadAllResourcesAsURL(String uri) {
+        StringHelper.notEmpty(uri, "uri");
+        Vector<URL> answer = new Vector<>();
+
+        try {
+            String resolvedName = resolveUriPath(uri);
+
+            Enumeration<URL> e = bundleContext.getBundle().getResources(resolvedName);
+            while (e != null && e.hasMoreElements()) {
+                answer.add(e.nextElement());
+            }
+
+            String path = FileUtil.onlyPath(uri);
+            String name = FileUtil.stripPath(uri);
+            if (path != null && name != null) {
+                for (Bundle bundle : bundleContext.getBundles()) {
+                    LOG.trace("Finding all entries in path: {} with pattern: {}", path, name);
+                    e = bundle.findEntries(path, name, false);
+                    while (e != null && e.hasMoreElements()) {
+                        answer.add(e.nextElement());
+                    }
+                }
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("Cannot load resource: " + uri, e);
+        }
+
+        return answer.elements();
+    }
+
+    protected Class<?> doLoadClass(String name, Bundle loader) {
+        StringHelper.notEmpty(name, "name");
+        Class<?> answer = null;
+        // Try to use the camel context's bundle's classloader to load the class
+        if (loader != null) {
+            try {
+                answer = loader.loadClass(name);
+            } catch (ClassNotFoundException e) {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Cannot load class: " + name + " using classloader: " + loader + ". This exception will be ignored.", e);
+                }
+            }
+        }
+        return answer;
+    }
+
+    /**
+     * Helper operation used to remove relative path notation from
+     * resources.  Most critical for resources on the Classpath
+     * as resource loaders will not resolve the relative paths correctly.
+     *
+     * @param name the name of the resource to load
+     * @return the modified or unmodified string if there were no changes
+     */
+    private static String resolveUriPath(String name) {
+        // compact the path and use / as separator as that's used for loading resources on the classpath
+        return FileUtil.compactPath(name, '/');
+    }
+
+    
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java
new file mode 100644
index 0000000..f87ad7a
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiComponentResolver.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.support.ResolverHelper;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OsgiComponentResolver implements ComponentResolver {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiComponentResolver.class);
+
+    private final BundleContext bundleContext;
+
+    public OsgiComponentResolver(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    public Component resolveComponent(String name, CamelContext context) throws Exception {
+        Component componentReg = ResolverHelper.lookupComponentInRegistryWithFallback(context, name);
+        if (componentReg != null) {
+            return componentReg;
+        }
+
+        // Check in OSGi bundles
+        return getComponent(name, context);
+    }
+
+    protected Component getComponent(String name, CamelContext context) throws Exception {
+        LOG.trace("Finding Component: {}", name);
+        try {
+            ServiceReference<?>[] refs = bundleContext.getServiceReferences(ComponentResolver.class.getName(), "(component=" + name + ")");
+            if (refs != null) {
+                for (ServiceReference<?> ref : refs) {
+                    Object service = bundleContext.getService(ref);
+                    if (ComponentResolver.class.isAssignableFrom(service.getClass())) {
+                        ComponentResolver resolver = (ComponentResolver) service;
+                        return resolver.resolveComponent(name, context);
+                    }
+                }
+            }
+            return null;
+        } catch (InvalidSyntaxException e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDataFormatResolver.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDataFormatResolver.java
new file mode 100644
index 0000000..417fba0
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDataFormatResolver.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.util.Collection;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.DataFormatFactory;
+import org.apache.camel.spi.DataFormatResolver;
+import org.apache.camel.support.ResolverHelper;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OsgiDataFormatResolver implements DataFormatResolver {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiDataFormatResolver.class);
+
+    private final BundleContext bundleContext;
+
+    public OsgiDataFormatResolver(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    public DataFormat resolveDataFormat(String name, CamelContext context) {
+        // lookup in registry first
+        DataFormat dataFormat = ResolverHelper.lookupDataFormatInRegistryWithFallback(context, name);
+        if (dataFormat == null) {
+            dataFormat = getDataFormat(name, context, false);
+        }
+
+        if (dataFormat == null) {
+            dataFormat = createDataFormat(name, context);
+        }
+
+        return dataFormat;
+    }
+
+    @Override
+    public DataFormat createDataFormat(String name, CamelContext context) {
+        DataFormat dataFormat = null;
+
+        // lookup in registry first
+        DataFormatFactory dataFormatFactory = ResolverHelper.lookupDataFormatFactoryInRegistryWithFallback(context, name);
+        if (dataFormatFactory != null) {
+            dataFormat = dataFormatFactory.newInstance();
+        }
+
+        if (dataFormat == null) {
+            dataFormat = getDataFormat(name, context, true);
+        }
+
+        return dataFormat;
+    }
+
+    private DataFormat getDataFormat(String name, CamelContext context, boolean create) {
+        LOG.trace("Finding DataFormat: {}", name);
+        try {
+            Collection<ServiceReference<DataFormatResolver>> refs = bundleContext.getServiceReferences(DataFormatResolver.class, "(dataformat=" + name + ")");
+            if (refs != null) {
+                for (ServiceReference<DataFormatResolver> ref : refs) {
+                    return create
+                        ? bundleContext.getService(ref).createDataFormat(name, context)
+                        : bundleContext.getService(ref).resolveDataFormat(name, context);
+                }
+            }
+            return null;
+        } catch (InvalidSyntaxException e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java
new file mode 100644
index 0000000..9f85f73
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiDefaultCamelContext.java
@@ -0,0 +1,60 @@
+/*
+ * 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.core.osgi;
+
+import org.apache.camel.TypeConverter;
+import org.apache.camel.core.osgi.utils.BundleContextUtils;
+import org.apache.camel.core.osgi.utils.BundleDelegatingClassLoader;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.support.DefaultRegistry;
+import org.osgi.framework.BundleContext;
+
+public class OsgiDefaultCamelContext extends DefaultCamelContext {
+
+    private final BundleContext bundleContext;
+
+    public OsgiDefaultCamelContext(BundleContext bundleContext) {
+        super(false);
+        this.bundleContext = bundleContext;
+
+        // inject common osgi
+        OsgiCamelContextHelper.osgiUpdate(this, bundleContext);
+
+        // and these are blueprint specific
+        OsgiBeanRepository repo1 = new OsgiBeanRepository(bundleContext);
+        setRegistry(new DefaultRegistry(repo1));
+        // Need to clean up the OSGi service when camel context is closed.
+        addLifecycleStrategy(repo1);
+        // setup the application context classloader with the bundle classloader
+        setApplicationContextClassLoader(new BundleDelegatingClassLoader(bundleContext.getBundle()));
+
+        init();
+    }
+
+    @Override
+    protected TypeConverter createTypeConverter() {
+        // CAMEL-3614: make sure we use a bundle context which imports org.apache.camel.impl.converter package
+        BundleContext ctx = BundleContextUtils.getBundleContext(getClass());
+        if (ctx == null) {
+            ctx = bundleContext;
+        }
+        FactoryFinder finder = new OsgiFactoryFinderResolver(bundleContext).resolveDefaultFactoryFinder(getClassResolver());
+        return new OsgiTypeConverter(ctx, this, getInjector(), finder);
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiEventAdminNotifier.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiEventAdminNotifier.java
new file mode 100644
index 0000000..2f12900
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiEventAdminNotifier.java
@@ -0,0 +1,144 @@
+/*
+ * 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.core.osgi;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.camel.spi.CamelEvent;
+import org.apache.camel.support.EventNotifierSupport;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * This {@link org.apache.camel.spi.EventNotifier} is in charge of propagating events
+ * to OSGi {@link EventAdmin} if present.
+ */
+public class OsgiEventAdminNotifier extends EventNotifierSupport {
+
+    public static final String TYPE = "type";
+    public static final String EVENT = "event";
+    public static final String TIMESTAMP = "timestamp";
+    public static final String BUNDLE = "bundle";
+    public static final String BUNDLE_ID = "bundle.id";
+    public static final String BUNDLE_SYMBOLICNAME = "bundle.symbolicName";
+    public static final String BUNDLE_VERSION = "bundle.version";
+    public static final String CAUSE = "cause";
+
+    public static final String TOPIC_CAMEL_EVENTS = "org/apache/camel/";
+    public static final String TOPIC_CAMEL_CONTEXT_EVENTS = TOPIC_CAMEL_EVENTS + "context/";
+    public static final String TOPIC_CAMEL_EXCHANGE_EVENTS = TOPIC_CAMEL_EVENTS + "exchange/";
+    public static final String TOPIC_CAMEL_SERVICE_EVENTS = TOPIC_CAMEL_EVENTS + "service/";
+    public static final String TOPIC_CAMEL_ROUTE_EVENTS = TOPIC_CAMEL_EVENTS + "route/";
+
+    private final BundleContext bundleContext;
+    private final ServiceTracker<EventAdmin, EventAdmin> tracker;
+
+    public OsgiEventAdminNotifier(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+        this.tracker = new ServiceTracker<>(bundleContext, EventAdmin.class.getName(), null);
+        setIgnoreExchangeEvents(true);
+    }
+
+    @Override
+    public void notify(CamelEvent event) throws Exception {
+        EventAdmin eventAdmin = tracker.getService();
+        if (eventAdmin == null) {
+            return;
+        }
+
+        Dictionary<String, Object> props = new Hashtable<>();
+        props.put(TYPE, getType(event));
+        props.put(EVENT, event);
+        props.put(TIMESTAMP, System.currentTimeMillis());
+        props.put(BUNDLE, bundleContext.getBundle());
+        props.put(BUNDLE_SYMBOLICNAME, bundleContext.getBundle().getSymbolicName());
+        props.put(BUNDLE_ID, bundleContext.getBundle().getBundleId());
+        props.put(BUNDLE_VERSION, getBundleVersion(bundleContext.getBundle()));
+        try {
+            props.put(CAUSE, event.getClass().getMethod("getCause").invoke(event));
+        } catch (Throwable t) {
+            // ignore
+        }
+        eventAdmin.postEvent(new Event(getTopic(event), props));
+    }
+
+    @Override
+    public boolean isEnabled(CamelEvent event) {
+        return true;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        tracker.open();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        tracker.close();
+    }
+
+    public static String toUpper(String text) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < text.length(); i++) {
+            char c = text.charAt(i);
+            if (Character.isUpperCase(c) && sb.length() > 0) {
+                sb.append('_');
+            }
+            sb.append(Character.toUpperCase(c));
+        }
+        return sb.toString();
+    }
+
+    public static String getType(CamelEvent event) {
+        return event.getType().name();
+    }
+
+    public static String getTopic(CamelEvent event) {
+        String topic;
+        String type = getType(event);
+        if (type.startsWith("CamelContext")) {
+            topic = TOPIC_CAMEL_CONTEXT_EVENTS;
+            type = type.substring("CamelContext".length());
+        } else if (type.startsWith("Exchange")) {
+            topic = TOPIC_CAMEL_EXCHANGE_EVENTS;
+            type = type.substring("Exchange".length());
+        } else if (type.startsWith("Route")) {
+            topic = TOPIC_CAMEL_ROUTE_EVENTS;
+            type = type.substring("Route".length());
+        } else if (type.startsWith("Service")) {
+            topic = TOPIC_CAMEL_SERVICE_EVENTS;
+            type = type.substring("Service".length());
+        } else {
+            topic = TOPIC_CAMEL_EVENTS + "unknown/";
+        }
+        topic += toUpper(type);
+        return topic;
+    }
+
+    public static Version getBundleVersion(Bundle bundle) {
+        Dictionary<?, ?> headers = bundle.getHeaders();
+        String version = (String)headers.get(Constants.BUNDLE_VERSION);
+        return (version != null) ? Version.parseVersion(version) : Version.emptyVersion;
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinder.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinder.java
new file mode 100644
index 0000000..ca6adb7
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinder.java
@@ -0,0 +1,126 @@
+/*
+ * 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.core.osgi;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Optional;
+import java.util.Properties;
+
+import org.apache.camel.impl.engine.DefaultFactoryFinder;
+import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.util.IOHelper;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+public class OsgiFactoryFinder extends DefaultFactoryFinder {
+    private BundleContext bundleContext;
+
+    public OsgiFactoryFinder(BundleContext bundleContext, ClassResolver classResolver, String resourcePath) {
+        super(classResolver, resourcePath);
+        this.bundleContext = bundleContext;
+    }
+
+    private static class BundleEntry {
+        URL url;
+        Bundle bundle;
+    }
+
+    @Override
+    public Optional<Class<?>> findClass(String key, String propertyPrefix, Class<?> checkClass) {
+        final String prefix = propertyPrefix != null ? propertyPrefix : "";
+        final String classKey = propertyPrefix + key;
+
+        Class<?> answer = addToClassMap(classKey, () -> {
+            BundleEntry entry = getResource(key, checkClass);
+            if (entry != null) {
+                URL url = entry.url;
+                InputStream in = url.openStream();
+                // lets load the file
+                BufferedInputStream reader = null;
+                try {
+                    reader = IOHelper.buffered(in);
+                    Properties properties = new Properties();
+                    properties.load(reader);
+                    String className = properties.getProperty(prefix + "class");
+                    if (className == null) {
+                        throw new IOException("Expected property is missing: " + prefix + "class");
+                    }
+                    return entry.bundle.loadClass(className);
+                } finally {
+                    IOHelper.close(reader, key, null);
+                    IOHelper.close(in, key, null);
+                }
+            } else {
+                return null;
+            }
+        });
+
+        return Optional.ofNullable(answer);
+    }
+
+    @Override
+    public Optional<Class<?>> findClass(String key, String propertyPrefix) {
+        return findClass(key, propertyPrefix, null);
+    }
+
+    // As the META-INF of the Factory could not be export,
+    // we need to go through the bundles to look for it
+    // NOTE, the first found factory will be return
+    public BundleEntry getResource(String name) {
+        return getResource(name, null);
+    }
+
+    // The clazz can make sure we get right version of class that we need
+    public BundleEntry getResource(String name, Class<?> clazz) {
+        BundleEntry entry = null;
+        Bundle[] bundles;
+        
+        bundles = bundleContext.getBundles();
+        
+        URL url;
+        for (Bundle bundle : bundles) {
+            url = bundle.getEntry(getResourcePath() + name);
+            if (url != null && checkCompatibility(bundle, clazz)) {
+                entry = new BundleEntry();
+                entry.url = url;
+                entry.bundle = bundle;
+                break;
+            }
+        }
+
+        return entry;
+    }
+
+    private boolean checkCompatibility(Bundle bundle, Class<?> clazz) {
+        if (clazz == null) {
+            return true;
+        }
+        // Check bundle compatibility
+        try {
+            if (bundle.loadClass(clazz.getName()) != clazz) {
+                return false;
+            }
+        } catch (Throwable t) {
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinderResolver.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinderResolver.java
new file mode 100644
index 0000000..631c190
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiFactoryFinderResolver.java
@@ -0,0 +1,37 @@
+/*
+ * 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.core.osgi;
+
+import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.spi.FactoryFinderResolver;
+import org.osgi.framework.BundleContext;
+
+public class OsgiFactoryFinderResolver implements FactoryFinderResolver {
+
+    private final BundleContext bundleContext;
+
+    public OsgiFactoryFinderResolver(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    public FactoryFinder resolveFactoryFinder(ClassResolver classResolver, String resourcePath) {
+        return new OsgiFactoryFinder(bundleContext, classResolver, resourcePath);
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiLanguageResolver.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiLanguageResolver.java
new file mode 100644
index 0000000..c2197dc
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiLanguageResolver.java
@@ -0,0 +1,98 @@
+/*
+ * 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.core.osgi;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.NoSuchLanguageException;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+import org.apache.camel.support.ResolverHelper;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OsgiLanguageResolver implements LanguageResolver {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiLanguageResolver.class);
+
+    private final BundleContext bundleContext;
+
+    public OsgiLanguageResolver(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    public Language resolveLanguage(String name, CamelContext context) {
+        // lookup in registry first
+        Language lang = ResolverHelper.lookupLanguageInRegistryWithFallback(context, name);
+        if (lang != null) {
+            return lang;
+        }
+
+        lang = getLanguage(name, context);
+        if (lang != null) {
+            return lang;
+        }
+        LanguageResolver resolver = getLanguageResolver("default", context);
+        if (resolver != null) {
+            return resolver.resolveLanguage(name, context);
+        }
+        throw new NoSuchLanguageException(name);
+    }
+
+    protected Language getLanguage(String name, CamelContext context) {
+        LOG.trace("Finding Language: {}", name);
+        try {
+            ServiceReference<?>[] refs = bundleContext.getServiceReferences(LanguageResolver.class.getName(), "(language=" + name + ")");
+            if (refs != null) {
+                for (ServiceReference<?> ref : refs) {
+                    Object service = bundleContext.getService(ref);
+                    if (LanguageResolver.class.isAssignableFrom(service.getClass())) {
+                        LanguageResolver resolver = (LanguageResolver) service;
+                        return resolver.resolveLanguage(name, context);
+                    }
+                }
+            }
+
+            return null;
+        } catch (InvalidSyntaxException e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+    protected LanguageResolver getLanguageResolver(String name, CamelContext context) {
+        LOG.trace("Finding LanguageResolver: {}", name);
+        try {
+            ServiceReference<?>[] refs = bundleContext.getServiceReferences(LanguageResolver.class.getName(), "(resolver=" + name + ")");
+            if (refs != null) {
+                for (ServiceReference<?> ref : refs) {
+                    Object service = bundleContext.getService(ref);
+                    if (LanguageResolver.class.isAssignableFrom(service.getClass())) {
+                        LanguageResolver resolver = (LanguageResolver) service;
+                        return resolver;
+                    }
+                }
+            }
+            return null;
+        } catch (InvalidSyntaxException e) {
+            throw RuntimeCamelException.wrapRuntimeCamelException(e);
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
new file mode 100644
index 0000000..ed16568
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiManagementNameStrategy.java
@@ -0,0 +1,73 @@
+/*
+ * 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.core.osgi;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.engine.DefaultManagementNameStrategy;
+import org.apache.camel.util.StringHelper;
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGi enhanced {@link org.apache.camel.spi.ManagementNameStrategy}.
+ * <p/>
+ * This {@link org.apache.camel.spi.ManagementNameStrategy} supports the default
+ * tokens (see {@link DefaultManagementNameStrategy}) and the following additional OSGi specific tokens
+ * <ul>
+ *     <li>#bundleId# - The bundle id</li>
+ *     <li>#version# - The bundle version</li>
+ *     <li>#symbolicName# - The bundle symbolic name</li>
+ * </ul>
+ * <p/>
+ * This implementation will by default use a name pattern as <tt>#symbolicName#</tt> and in case
+ * of a clash (such as multiple versions of the same symbolicName),
+ * then the pattern will fallback to append an unique counter <tt>#symbolicName#-#counter#</tt>.
+ *
+ * @see DefaultManagementNameStrategy
+ */
+public class OsgiManagementNameStrategy extends DefaultManagementNameStrategy {
+
+    private static final AtomicInteger CONTEXT_COUNTER = new AtomicInteger(0);
+    private final BundleContext bundleContext;
+
+    public OsgiManagementNameStrategy(CamelContext camelContext, BundleContext bundleContext) {
+        super(camelContext, "#symbolicName#-#name#", "#symbolicName#-#name#-#counter#");
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    protected String customResolveManagementName(String pattern, String answer) {
+        String bundleId = "" + bundleContext.getBundle().getBundleId();
+        String symbolicName = bundleContext.getBundle().getSymbolicName();
+        if (symbolicName == null) {
+            symbolicName = "";
+        }
+        String version = bundleContext.getBundle().getVersion().toString();
+
+        answer = StringHelper.replaceAll(answer, "#bundleId#", bundleId);
+        answer = StringHelper.replaceAll(answer, "#symbolicName#", symbolicName);
+        answer = StringHelper.replaceAll(answer, "#version#", version);
+
+        // we got a candidate then find a free name
+        // true = check fist if the candidate as-is is free, if not then use the counter
+        answer = OsgiNamingHelper.findFreeCamelContextName(bundleContext, answer, OsgiCamelContextPublisher.CONTEXT_MANAGEMENT_NAME_PROPERTY, CONTEXT_COUNTER, true);
+
+        return answer;
+    }
+    
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiNamingHelper.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiNamingHelper.java
new file mode 100644
index 0000000..5391887
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiNamingHelper.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.CamelContext;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A helper to find free names in the OSGi service registry.
+ */
+public final class OsgiNamingHelper {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiNamingHelper.class);
+
+    private OsgiNamingHelper() {
+    }
+
+    /**
+     * Checks the OSGi service registry for a free name (uses the counter if there is a clash to find next free name)
+     *
+     * @param context the bundle context
+     * @param prefix  the prefix for the name
+     * @param key     the key to use in the OSGi filter; either {@link OsgiCamelContextPublisher#CONTEXT_NAME_PROPERTY}
+     *                or {@link OsgiCamelContextPublisher#CONTEXT_MANAGEMENT_NAME_PROPERTY}.
+     * @param counter the counter
+     * @param checkFirst <tt>true</tt> to check the prefix name as-is before using the counter, <tt>false</tt> the counter is used immediately
+     * @return the free name, is never <tt>null</tt>
+     */
+    public static String findFreeCamelContextName(BundleContext context, String prefix, String key, AtomicInteger counter, boolean checkFirst) {
+        String candidate = null;
+        boolean clash = false;
+
+        do {
+            try {
+                clash = false;
+
+                if (candidate == null && checkFirst) {
+                    // try candidate as-is
+                    candidate = prefix;
+                } else {
+                    // generate new candidate
+                    candidate = prefix + "-" + getNextCounter(counter);
+                }
+                LOG.trace("Checking OSGi Service Registry for existence of existing CamelContext with name: {}", candidate);
+
+                ServiceReference<?>[] refs = context.getServiceReferences(CamelContext.class.getName(), "(" + key + "=" + candidate + ")");
+                if (refs != null && refs.length > 0) {
+                    for (ServiceReference<?> ref : refs) {
+                        Object id = ref.getProperty(key);
+                        if (id != null && candidate.equals(id)) {
+                            clash = true;
+                            break;
+                        }
+                    }
+                }
+            } catch (InvalidSyntaxException e) {
+                LOG.debug("Error finding free Camel name in OSGi Service Registry due " + e.getMessage() + ". This exception is ignored.", e);
+                break;
+            }
+        } while (clash);
+
+        LOG.debug("Generated free name for bundle id: {}, clash: {} -> {}", context.getBundle().getBundleId(), clash, candidate);
+        return candidate;
+    }
+
+    public static int getNextCounter(AtomicInteger counter) {
+        // we want to start counting from 1, so increment first
+        return counter.incrementAndGet();
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolver.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolver.java
new file mode 100644
index 0000000..a973b54
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolver.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.apache.camel.core.osgi.utils.BundleDelegatingClassLoader;
+import org.apache.camel.impl.engine.DefaultPackageScanClassResolver;
+import org.apache.camel.spi.PackageScanFilter;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+public class OsgiPackageScanClassResolver extends DefaultPackageScanClassResolver {
+
+    private final Bundle bundle;
+
+    public OsgiPackageScanClassResolver(BundleContext context) {
+        this(context.getBundle());
+    }
+
+    public OsgiPackageScanClassResolver(Bundle bundle) {
+        this.bundle = bundle;
+        // add the BundleDelegatingClassLoader to the class loaders
+        addClassLoader(new BundleDelegatingClassLoader(bundle));
+    }
+
+    @Override
+    public void find(PackageScanFilter test, String packageName, Set<Class<?>> classes) {
+        packageName = packageName.replace('.', '/');
+        // remember the number of classes found so far
+        int classesSize = classes.size();
+        // look in osgi bundles
+        loadImplementationsInBundle(test, packageName, classes);
+        // if we did not find any new, then fallback to use regular non bundle class loading
+        if (classes.size() == classesSize) {
+            // Using the non-OSGi classloaders as a fallback
+            // this is necessary when use JBI packaging for servicemix-camel SU
+            // so that we get chance to use SU classloader to scan packages in the SU
+            log.trace("Cannot find any classes in bundles, not trying regular classloaders scanning: {}", packageName);
+            for (ClassLoader classLoader : super.getClassLoaders()) {
+                if (!isOsgiClassloader(classLoader)) {
+                    find(test, packageName, classLoader, classes);
+                }
+            }  
+        }
+    }
+    
+    private static boolean isOsgiClassloader(ClassLoader loader) {
+        try {
+            Method mth = loader.getClass().getMethod("getBundle", new Class[] {});
+            if (mth != null) {
+                return true;
+            }
+        } catch (NoSuchMethodException e) {
+            // ignore its not an osgi loader
+        }
+        return false;
+    }
+    
+    private void loadImplementationsInBundle(PackageScanFilter test, String packageName, Set<Class<?>> classes) {       
+        Set<String> urls = getImplementationsInBundle(test, packageName);
+        if (urls != null) {
+            for (String url : urls) {
+                // substring to avoid leading slashes
+                addIfMatching(test, url, classes);
+            }
+        }
+    }
+
+    private Set<String> getImplementationsInBundle(PackageScanFilter test, String packageName) {
+        Bundle[] bundles;
+        if (bundle.getBundleContext() != null) {
+            bundles = bundle.getBundleContext().getBundles();
+        } else {
+            bundles = new Bundle[]{bundle};
+        }
+        Set<String> urls = new LinkedHashSet<>();
+        for (Bundle bd : bundles) {
+            log.trace("Searching in bundle: {}", bd);
+            try {
+                Enumeration<URL> paths = bd.findEntries("/" + packageName, "*.class", true);
+                while (paths != null && paths.hasMoreElements()) {
+                    URL path = paths.nextElement();
+                    String pathString = path.getPath();
+                    String urlString = pathString.substring(pathString.indexOf(packageName));
+                    urls.add(urlString);
+                    log.trace("Added url: {}", urlString);
+                }
+            } catch (Throwable t) {
+                log.warn("Cannot search in bundle: " + bundle + " for classes matching criteria: " + test + " due: "
+                        + t.getMessage() + ". This exception will be ignored.", t);
+            }
+        }
+        return urls;
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
new file mode 100644
index 0000000..6354cf7
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
@@ -0,0 +1,336 @@
+/*
+ * 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.core.osgi;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.TypeConverterExists;
+import org.apache.camel.TypeConverters;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.converter.DefaultTypeConverter;
+import org.apache.camel.impl.engine.DefaultPackageScanClassResolver;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.PackageScanClassResolver;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.support.service.ServiceSupport;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OsgiTypeConverter extends ServiceSupport implements TypeConverter, TypeConverterRegistry,
+    ServiceTrackerCustomizer<TypeConverterLoader, Object> {
+    private static final Logger LOG = LoggerFactory.getLogger(OsgiTypeConverter.class);
+
+    private final BundleContext bundleContext;
+    private CamelContext camelContext;
+    private final Injector injector;
+    private final FactoryFinder factoryFinder;
+    private final ServiceTracker<TypeConverterLoader, Object> tracker;
+    private volatile DefaultTypeConverter delegate;
+
+    public OsgiTypeConverter(BundleContext bundleContext, CamelContext camelContext, Injector injector, FactoryFinder factoryFinder) {
+        this.bundleContext = bundleContext;
+        this.camelContext = camelContext;
+        this.injector = injector;
+        this.factoryFinder = factoryFinder;
+        this.tracker = new ServiceTracker<>(bundleContext, TypeConverterLoader.class.getName(), this);
+    }
+
+    @Override
+    public Object addingService(ServiceReference<TypeConverterLoader> serviceReference) {
+        LOG.trace("AddingService: {}, Bundle: {}", serviceReference, serviceReference.getBundle());        
+        TypeConverterLoader loader = bundleContext.getService(serviceReference);
+        try {
+            LOG.debug("loading type converter from bundle: {}", serviceReference.getBundle().getSymbolicName());
+            if (delegate != null) {
+                ServiceHelper.startService(this.delegate);
+                loader.load(delegate);
+            }
+        } catch (Throwable t) {
+            throw new RuntimeCamelException("Error loading type converters from service: " + serviceReference + " due: " + t.getMessage(), t);
+        }
+       
+        return loader;
+    }
+
+    @Override
+    public void modifiedService(ServiceReference<TypeConverterLoader> serviceReference, Object o) {
+    }
+
+    @Override
+    public void removedService(ServiceReference<TypeConverterLoader> serviceReference, Object o) {
+        LOG.trace("RemovedService: {}, Bundle: {}", serviceReference, serviceReference.getBundle());  
+        try {
+            ServiceHelper.stopService(this.delegate);
+        } catch (Exception e) {
+            // ignore
+            LOG.debug("Error stopping service due: " + e.getMessage() + ". This exception will be ignored.", e);
+        }
+        // It can force camel to reload the type converter again
+        this.delegate = null;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        this.tracker.open();
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        this.tracker.close();
+        ServiceHelper.stopService(this.delegate);
+        this.delegate = null;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public boolean allowNull() {
+        return getDelegate().allowNull();
+    }
+
+    @Override
+    public <T> T convertTo(Class<T> type, Object value) {
+        return getDelegate().convertTo(type, value);
+    }
+
+    @Override
+    public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
+        return getDelegate().convertTo(type, exchange, value);
+    }
+
+    @Override
+    public <T> T mandatoryConvertTo(Class<T> type, Object value) throws NoTypeConversionAvailableException {
+        return getDelegate().mandatoryConvertTo(type, value);
+    }
+
+    @Override
+    public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, Object value) throws NoTypeConversionAvailableException {
+        return getDelegate().mandatoryConvertTo(type, exchange, value);
+    }
+
+    @Override
+    public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object value) {
+        return getDelegate().tryConvertTo(type, exchange, value);
+    }
+
+    @Override
+    public <T> T tryConvertTo(Class<T> type, Object value) {
+        return getDelegate().tryConvertTo(type, value);
+    }
+
+    @Override
+    public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
+        getDelegate().addTypeConverter(toType, fromType, typeConverter);
+    }
+
+    @Override
+    public void addTypeConverters(TypeConverters typeConverters) {
+        getDelegate().addTypeConverters(typeConverters);
+    }
+
+    @Override
+    public boolean removeTypeConverter(Class<?> toType, Class<?> fromType) {
+        return getDelegate().removeTypeConverter(toType, fromType);
+    }
+
+    @Override
+    public void addFallbackTypeConverter(TypeConverter typeConverter, boolean canPromote) {
+        getDelegate().addFallbackTypeConverter(typeConverter, canPromote);
+    }
+
+    @Override
+    public TypeConverter lookup(Class<?> toType, Class<?> fromType) {
+        return getDelegate().lookup(toType, fromType);
+    }
+
+    @Override
+    public List<Class<?>[]> listAllTypeConvertersFromTo() {
+        return getDelegate().listAllTypeConvertersFromTo();
+    }
+
+    @Override
+    public void setInjector(Injector injector) {
+        getDelegate().setInjector(injector);
+    }
+
+    @Override
+    public Injector getInjector() {
+        return getDelegate().getInjector();
+    }
+
+    @Override
+    public Statistics getStatistics() {
+        return getDelegate().getStatistics();
+    }
+
+    @Override
+    public int size() {
+        return getDelegate().size();
+    }
+
+    @Override
+    public LoggingLevel getTypeConverterExistsLoggingLevel() {
+        return getDelegate().getTypeConverterExistsLoggingLevel();
+    }
+
+    @Override
+    public void setTypeConverterExistsLoggingLevel(LoggingLevel loggingLevel) {
+        getDelegate().setTypeConverterExistsLoggingLevel(loggingLevel);
+    }
+
+    @Override
+    public TypeConverterExists getTypeConverterExists() {
+        return getDelegate().getTypeConverterExists();
+    }
+
+    @Override
+    public void setTypeConverterExists(TypeConverterExists typeConverterExists) {
+        getDelegate().setTypeConverterExists(typeConverterExists);
+    }
+
+    public synchronized DefaultTypeConverter getDelegate() {
+        if (delegate == null) {
+            delegate = createRegistry();
+        }
+        return delegate;
+    }
+
+    protected DefaultTypeConverter createRegistry() {
+        // base the osgi type converter on the default type converter
+        DefaultTypeConverter answer = new OsgiDefaultTypeConverter(new DefaultPackageScanClassResolver() {
+            @Override
+            public Set<ClassLoader> getClassLoaders() {
+                // we only need classloaders for loading core TypeConverterLoaders
+                return new HashSet<>(Arrays.asList(
+                        DefaultTypeConverter.class.getClassLoader(),
+                        DefaultCamelContext.class.getClassLoader()));
+            }
+        }, injector, factoryFinder, false);
+
+        // inject CamelContext
+        answer.setCamelContext(camelContext);
+
+
+        try {
+            // init before loading core converters
+            answer.init();
+            // only load the core type converters, as OSGi activator will keep track on bundles
+            // being installed/uninstalled and load type converters as part of that process
+            answer.loadCoreAndFastTypeConverters();
+        } catch (Exception e) {
+            throw new RuntimeCamelException("Error loading CoreTypeConverter due: " + e.getMessage(), e);
+        }
+
+        // Load the type converters the tracker has been tracking
+        // Here we need to use the ServiceReference to check the ranking
+        ServiceReference<TypeConverterLoader>[] serviceReferences = this.tracker.getServiceReferences();
+        if (serviceReferences != null) {
+            ArrayList<ServiceReference<TypeConverterLoader>> servicesList = 
+                new ArrayList<>(Arrays.asList(serviceReferences));
+            // Just make sure we install the high ranking fallback converter at last
+            Collections.sort(servicesList);
+            for (ServiceReference<TypeConverterLoader> sr : servicesList) {
+                try {
+                    LOG.debug("loading type converter from bundle: {}", sr.getBundle().getSymbolicName());
+                    ((TypeConverterLoader)this.tracker.getService(sr)).load(answer);
+                } catch (Throwable t) {
+                    throw new RuntimeCamelException("Error loading type converters from service: " + sr + " due: " + t.getMessage(), t);
+                }
+            }
+        }
+
+        LOG.trace("Created TypeConverter: {}", answer);
+        return answer;
+    }
+
+    public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
+        return StreamSupport.stream(
+                Spliterators.spliteratorUnknownSize(
+                        new Iterator<T>() {
+                            public T next() {
+                                return e.nextElement();
+                            }
+                            public boolean hasNext() {
+                                return e.hasMoreElements();
+                            }
+                            public void forEachRemaining(Consumer<? super T> action) {
+                                while (e.hasMoreElements()) {
+                                    action.accept(e.nextElement());
+                                }
+                            }
+                        },
+                        Spliterator.ORDERED), false);
+    }
+
+    private class OsgiDefaultTypeConverter extends DefaultTypeConverter {
+
+        public OsgiDefaultTypeConverter(PackageScanClassResolver resolver, Injector injector, FactoryFinder factoryFinder, boolean loadTypeConverters) {
+            super(resolver, injector, factoryFinder, loadTypeConverters);
+        }
+
+        @Override
+        public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
+            // favour keeping the converter that was loaded via TypeConverterLoader META-INF file
+            // as OSGi loads these first and then gets triggered again later when there is both a META-INF/TypeConverter and META-INF/TypeConverterLoaded file
+            // for the same set of type converters and we get duplicates (so this is a way of filtering out duplicates)
+            TypeConverter converter = typeMappings.get(toType, fromType);
+            if (converter != null && converter != typeConverter) {
+                // the converter is already there which we want to keep (optimized via SimpleTypeConverter)
+                if (converter instanceof SimpleTypeConverter) {
+                    // okay keep this one
+                    return;
+                }
+            }
+            super.addTypeConverter(toType, fromType, typeConverter);
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java
new file mode 100644
index 0000000..6443411
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/Activator.java
@@ -0,0 +1,728 @@
+/*
+ * 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.core.osgi.impl;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.Converter;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.impl.converter.AnnotationTypeConverterLoader;
+import org.apache.camel.impl.scan.AnnotatedWithPackageScanFilter;
+import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.spi.ConfigurerResolver;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.DataFormatResolver;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+import org.apache.camel.spi.PackageScanFilter;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.wiring.BundleCapability;
+import org.osgi.framework.wiring.BundleWire;
+import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.util.tracker.BundleTracker;
+import org.osgi.util.tracker.BundleTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.osgi.framework.wiring.BundleRevision.PACKAGE_NAMESPACE;
+
+public class Activator implements BundleActivator, BundleTrackerCustomizer<Object> {
+
+    public static final String META_INF_CONFIGURER = "META-INF/services/org/apache/camel/configurer/";
+    public static final String META_INF_COMPONENT = "META-INF/services/org/apache/camel/component/";
+    public static final String META_INF_LANGUAGE = "META-INF/services/org/apache/camel/language/";
+    public static final String META_INF_LANGUAGE_RESOLVER = "META-INF/services/org/apache/camel/language/resolver/";
+    public static final String META_INF_DATAFORMAT = "META-INF/services/org/apache/camel/dataformat/";
+    public static final String META_INF_TYPE_CONVERTER = "META-INF/services/org/apache/camel/TypeConverter";
+    public static final String META_INF_TYPE_CONVERTER_LOADER = "META-INF/services/org/apache/camel/TypeConverterLoader";
+    public static final String META_INF_FALLBACK_TYPE_CONVERTER = "META-INF/services/org/apache/camel/FallbackTypeConverter";
+    public static final String EXTENDER_NAMESPACE = "osgi.extender";
+    public static final String CAMEL_EXTENDER = "org.apache.camel";
+
+    private static final Logger LOG = LoggerFactory.getLogger(Activator.class);
+
+    private BundleTracker<?> tracker;
+    private final Map<Long, List<BaseService>> resolvers = new ConcurrentHashMap<>();
+    private long bundleId;
+    
+    // Map from package name to the capability we export for this package
+    private final Map<String, BundleCapability> packageCapabilities = new HashMap<>();
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        LOG.info("Camel activator starting");
+        cachePackageCapabilities(context);
+        bundleId = context.getBundle().getBundleId();
+        BundleContext systemBundleContext = context.getBundle(0).getBundleContext();
+        tracker = new BundleTracker<>(systemBundleContext, Bundle.ACTIVE, this);
+        tracker.open();
+        LOG.info("Camel activator started");
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        LOG.info("Camel activator stopping");
+        tracker.close();
+        packageCapabilities.clear();
+        LOG.info("Camel activator stopped");
+    }
+    
+    /**
+     * Caches the package capabilities that are needed for a set of interface classes
+     */
+    private void cachePackageCapabilities(BundleContext context) {
+        BundleWiring ourWiring = context.getBundle().adapt(BundleWiring.class);
+        List<BundleCapability> ourExports = ourWiring.getCapabilities(PACKAGE_NAMESPACE);
+        for (BundleCapability ourExport : ourExports) {
+            String ourPkgName = (String) ourExport.getAttributes().get(PACKAGE_NAMESPACE);
+            packageCapabilities.put(ourPkgName, ourExport);
+        }
+        for (BundleWire w : ourWiring.getRequiredWires(PACKAGE_NAMESPACE)) {
+            BundleCapability cap = w.getCapability();
+            String ourPkgName = (String) cap.getAttributes().get(PACKAGE_NAMESPACE);
+            packageCapabilities.put(ourPkgName, cap);
+        }
+    }
+
+    @Override
+    public Object addingBundle(Bundle bundle, BundleEvent event) {
+        LOG.debug("Bundle started: {}", bundle.getSymbolicName());
+        if (extenderCapabilityWired(bundle)) {
+            List<BaseService> r = new ArrayList<>();
+            registerConfigurers(bundle, r);
+            registerComponents(bundle, r);
+            registerLanguages(bundle, r);
+            registerDataFormats(bundle, r);
+            registerTypeConverterLoader(bundle, r);
+            for (BaseService service : r) {
+                service.register();
+            }
+            resolvers.put(bundle.getBundleId(), r);
+        }
+
+        return bundle;
+    }
+
+    private boolean extenderCapabilityWired(Bundle bundle) {
+        BundleWiring wiring = bundle.adapt(BundleWiring.class);
+        if (wiring == null) {
+            return true;
+        }
+        List<BundleWire> requiredWires = wiring.getRequiredWires(EXTENDER_NAMESPACE);
+        for (BundleWire requiredWire : requiredWires) {
+            if (CAMEL_EXTENDER.equals(requiredWire.getCapability().getAttributes().get(EXTENDER_NAMESPACE))) {
+                if (this.bundleId == requiredWire.getProviderWiring().getBundle().getBundleId()) {
+                    LOG.debug("Camel extender requirement of bundle {} correctly wired to this implementation", bundle.getBundleId());
+                    return true;
+                } else {
+                    LOG.info("Not processing bundle {} as it requires a camel extender but is not wired to the this implementation", bundle.getBundleId());
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
+    }
+
+    @Override
+    public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
+        LOG.debug("Bundle stopped: {}", bundle.getSymbolicName());
+        List<BaseService> r = resolvers.remove(bundle.getBundleId());
+        if (r != null) {
+            for (BaseService service : r) {
+                service.unregister();
+            }
+        }
+    }
+
+    protected void registerConfigurers(Bundle bundle, List<BaseService> resolvers) {
+        if (canSee(bundle, GeneratedPropertyConfigurer.class)) {
+            Map<String, String> configurers = new HashMap<>();
+            for (Enumeration<?> e = bundle.getEntryPaths(META_INF_CONFIGURER); e != null && e.hasMoreElements();) {
+                String path = (String) e.nextElement();
+                LOG.debug("Found configureer: {} in bundle {}", path, bundle.getSymbolicName());
+                String name = path.substring(path.lastIndexOf("/") + 1);
+                configurers.put(name, path);
+            }
+            if (!configurers.isEmpty()) {
+                resolvers.add(new BundleConfigurerResolver(bundle, configurers));
+            }
+        }
+    }
+
+    protected void registerComponents(Bundle bundle, List<BaseService> resolvers) {
+        if (canSee(bundle, Component.class)) {
+            Map<String, String> components = new HashMap<>();
+            for (Enumeration<?> e = bundle.getEntryPaths(META_INF_COMPONENT); e != null && e.hasMoreElements();) {
+                String path = (String) e.nextElement();
+                LOG.debug("Found entry: {} in bundle {}", path, bundle.getSymbolicName());
+                String name = path.substring(path.lastIndexOf("/") + 1);
+                components.put(name, path);
+            }
+            if (!components.isEmpty()) {
+                resolvers.add(new BundleComponentResolver(bundle, components));
+            }
+        }
+    }
+
+    protected void registerLanguages(Bundle bundle, List<BaseService> resolvers) {
+        if (canSee(bundle, Language.class)) {
+            Map<String, String> languages = new HashMap<>();
+            for (Enumeration<?> e = bundle.getEntryPaths(META_INF_LANGUAGE); e != null && e.hasMoreElements();) {
+                String path = (String) e.nextElement();
+                LOG.debug("Found entry: {} in bundle {}", path, bundle.getSymbolicName());
+                String name = path.substring(path.lastIndexOf("/") + 1);
+                languages.put(name, path);
+            }
+            if (!languages.isEmpty()) {
+                resolvers.add(new BundleLanguageResolver(bundle, languages));
+            }
+            for (Enumeration<?> e = bundle.getEntryPaths(META_INF_LANGUAGE_RESOLVER); e != null && e.hasMoreElements();) {
+                String path = (String) e.nextElement();
+                LOG.debug("Found entry: {} in bundle {}", path, bundle.getSymbolicName());
+                String name = path.substring(path.lastIndexOf("/") + 1);
+                resolvers.add(new BundleMetaLanguageResolver(bundle, name, path));
+            }
+        }
+    }
+
+    protected void registerDataFormats(Bundle bundle, List<BaseService> resolvers) {
+        if (canSee(bundle, DataFormat.class)) {
+            Map<String, String> dataformats = new HashMap<>();
+            for (Enumeration<?> e = bundle.getEntryPaths(META_INF_DATAFORMAT); e != null && e.hasMoreElements();) {
+                String path = (String) e.nextElement();
+                LOG.debug("Found entry: {} in bundle {}", path, bundle.getSymbolicName());
+                String name = path.substring(path.lastIndexOf("/") + 1);
+                dataformats.put(name, path);
+            }
+            if (!dataformats.isEmpty()) {
+                resolvers.add(new BundleDataFormatResolver(bundle, dataformats));
+            }
+        }
+    }
+
+    protected void registerTypeConverterLoader(Bundle bundle, List<BaseService> resolvers) {
+        if (canSee(bundle, TypeConverter.class)) {
+            URL url1 = bundle.getEntry(META_INF_TYPE_CONVERTER);
+            URL url2 = bundle.getEntry(META_INF_TYPE_CONVERTER_LOADER);
+            URL url3 = bundle.getEntry(META_INF_FALLBACK_TYPE_CONVERTER);
+            if (url2 != null) {
+                LOG.debug("Found TypeConverterLoader in bundle {}", bundle.getSymbolicName());
+                Set<String> packages = getConverterPackages(bundle.getEntry(META_INF_TYPE_CONVERTER_LOADER));
+
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Found {} {} packages: {}", packages.size(), META_INF_TYPE_CONVERTER_LOADER, packages);
+                }
+                for (String pkg : packages) {
+
+                    if (StringHelper.isClassName(pkg)) {
+                        // its a FQN class name so load it directly
+                        LOG.trace("Loading {} class", pkg);
+                        try {
+                            Class<?> clazz = bundle.loadClass(pkg);
+                            BundleTypeConverterLoader bundleTypeConverterLoader =
+                                new BundleTypeConverterLoader(bundle, url3 != null);
+                            bundleTypeConverterLoader.setTypeConverterLoader((TypeConverterLoader)clazz.getDeclaredConstructor().newInstance());
+                            resolvers.add(bundleTypeConverterLoader);
+                            BundleTypeConverterLoader fallBackBundleTypeConverterLoader =
+                                new BundleTypeConverterLoader(bundle, url3 != null);
+                            // the class could be found and loaded so continue to next
+                            resolvers.add(fallBackBundleTypeConverterLoader);
+                            continue;
+                        } catch (Throwable t) {
+                            // Ignore
+                            LOG.trace("Failed to load " + pkg + " class due " + t.getMessage() + ". This exception will be ignored.", t);
+                        }
+                    }
+                }
+                    
+            } else if (url1 != null || url3 != null) {
+                LOG.debug("Found TypeConverter in bundle {}", bundle.getSymbolicName());
+                resolvers.add(new BundleTypeConverterLoader(bundle, url3 != null));
+            }
+        }
+    }
+    
+    /**
+     * Check if bundle can see the given class
+     */
+    protected boolean canSee(Bundle bundle, Class<?> clazz) {
+        if (bundle.getBundleId() == bundleId) {
+            // Need extra handling of camel core as it does not import the api
+            return true;
+        }
+        BundleCapability packageCap = packageCapabilities.get(clazz.getPackage().getName());
+        if (packageCap != null) {
+            BundleWiring wiring = bundle.adapt(BundleWiring.class);
+            List<BundleWire> imports = wiring.getRequiredWires(PACKAGE_NAMESPACE);
+            for (BundleWire importWire : imports) {
+                if (packageCap.equals(importWire.getCapability())) {
+                    return true;
+                }
+            }
+        }
+
+        // it may be running outside real OSGi container such as when unit testing with camel-test-blueprint
+        // then we need to use a different canSee algorithm that works outside real OSGi
+        if (bundle.getBundleId() >= 0) {
+            Bundle root = bundle.getBundleContext().getBundle(0);
+            if (root != null && "org.apache.felix.connect".equals(root.getSymbolicName())) {
+                return checkCompat(bundle, clazz);
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Check if bundle can see the given class used by camel-test-blueprint
+     */
+    protected static boolean checkCompat(Bundle bundle, Class<?> clazz) {
+        // Check bundle compatibility
+        try {
+            if (bundle.loadClass(clazz.getName()) != clazz) {
+                return false;
+            }
+        } catch (Throwable t) {
+            return false;
+        }
+        return true;
+    }
+
+    protected static class BundleComponentResolver extends BaseResolver<Component> implements ComponentResolver {
+
+        private final Map<String, String> components;
+
+        public BundleComponentResolver(Bundle bundle, Map<String, String> components) {
+            super(bundle, Component.class);
+            this.components = components;
+        }
+
+        @Override
+        public Component resolveComponent(String name, CamelContext context) throws Exception {
+            return createInstance(name, components.get(name), context);
+        }
+
+        @Override
+        public void register() {
+            doRegister(ComponentResolver.class, "component", components.keySet());
+        }
+    }
+
+    protected static class BundleConfigurerResolver extends BaseResolver<GeneratedPropertyConfigurer> implements ConfigurerResolver {
+
+        private final Map<String, String> configurers;
+
+        public BundleConfigurerResolver(Bundle bundle, Map<String, String> configurers) {
+            super(bundle, GeneratedPropertyConfigurer.class);
+            this.configurers = configurers;
+        }
+
+        @Override
+        public GeneratedPropertyConfigurer resolvePropertyConfigurer(String name, CamelContext context) {
+            return createInstance(name, configurers.get(name), context);
+        }
+
+        @Override
+        public void register() {
+            doRegister(ConfigurerResolver.class, "configurer", configurers.keySet());
+        }
+    }
+
+    protected static class BundleLanguageResolver extends BaseResolver<Language> implements LanguageResolver {
+
+        private final Map<String, String> languages;
+
+        public BundleLanguageResolver(Bundle bundle, Map<String, String> languages) {
+            super(bundle, Language.class);
+            this.languages = languages;
+        }
+
+        @Override
+        public Language resolveLanguage(String name, CamelContext context) {
+            return createInstance(name, languages.get(name), context);
+        }
+
+        @Override
+        public void register() {
+            doRegister(LanguageResolver.class, "language", languages.keySet());
+        }
+    }
+
+    protected static class BundleMetaLanguageResolver extends BaseResolver<LanguageResolver> implements LanguageResolver {
+
+        private final String name;
+        private final String path;
+
+        public BundleMetaLanguageResolver(Bundle bundle, String name, String path) {
+            super(bundle, LanguageResolver.class);
+            this.name = name;
+            this.path = path;
+        }
+
+        @Override
+        public Language resolveLanguage(String name, CamelContext context) {
+            LanguageResolver resolver = createInstance(this.name, path, context);
+            return resolver.resolveLanguage(name, context);
+        }
+
+        @Override
+        public void register() {
+            doRegister(LanguageResolver.class, "resolver", name);
+        }
+    }
+
+    protected static class BundleDataFormatResolver extends BaseResolver<DataFormat> implements DataFormatResolver {
+
+        private final Map<String, String> dataformats;
+
+        public BundleDataFormatResolver(Bundle bundle, Map<String, String> dataformats) {
+            super(bundle, DataFormat.class);
+            this.dataformats = dataformats;
+        }
+
+        @Override
+        public DataFormat resolveDataFormat(String name, CamelContext context) {
+            DataFormat dataFormat = createInstance(name, dataformats.get(name), context);
+            if (dataFormat == null) {
+                dataFormat = createDataFormat(name, context);
+            }
+
+            return dataFormat;
+        }
+
+        @Override
+        public DataFormat createDataFormat(String name, CamelContext context) {
+            return createInstance(name, dataformats.get(name), context);
+        }
+
+        public DataFormatDefinition resolveDataFormatDefinition(String name, CamelContext context) {
+            return null;
+        }
+
+        @Override
+        public void register() {
+            doRegister(DataFormatResolver.class, "dataformat", dataformats.keySet());
+        }
+    }
+
+    protected static class BundleTypeConverterLoader extends BaseResolver<TypeConverter> implements TypeConverterLoader {
+
+        private TypeConverterLoader loader = new Loader();
+        private final Bundle bundle;
+        private final boolean hasFallbackTypeConverter;
+
+        public BundleTypeConverterLoader(Bundle bundle, boolean hasFallbackTypeConverter) {
+            super(bundle, TypeConverter.class);
+            ObjectHelper.notNull(bundle, "bundle");
+            this.bundle = bundle;
+            this.hasFallbackTypeConverter = hasFallbackTypeConverter;
+        }
+        
+        public void setTypeConverterLoader(TypeConverterLoader typeConverterloader) {
+            this.loader = typeConverterloader;
+        }
+
+        @Override
+        public synchronized void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {
+            // must be synchronized to ensure we don't load type converters concurrently
+            // which cause Camel apps to fails in OSGi thereafter
+            try {
+                loader.load(registry);
+            } catch (Exception e) {
+                throw new TypeConverterLoaderException("Cannot load type converters using OSGi bundle: " + bundle.getBundleId(), e);
+            }
+        }
+
+        @Override
+        public void register() {
+            if (hasFallbackTypeConverter) {
+                // The FallbackTypeConverter should have a higher ranking
+                doRegister(TypeConverterLoader.class, Constants.SERVICE_RANKING, 100);
+            } else {
+                // The default service ranking is Integer(0);
+                doRegister(TypeConverterLoader.class);
+            }
+        }
+
+        class Loader extends AnnotationTypeConverterLoader {
+
+            Loader() {
+                super(null);
+            }
+
+            @Override
+            public void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {
+                PackageScanFilter test = new AnnotatedWithPackageScanFilter(Converter.class, true);
+                Set<Class<?>> classes = new LinkedHashSet<>();
+                Set<String> packages = getConverterPackages(bundle.getEntry(META_INF_TYPE_CONVERTER));
+
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Found {} {} packages: {}", packages.size(), META_INF_TYPE_CONVERTER, packages);
+                }
+                // if we only have camel-core on the classpath then we have already pre-loaded all its type converters
+                // but we exposed the "org.apache.camel.core" package in camel-core. This ensures there is at least one
+                // packageName to scan, which triggers the scanning process. That allows us to ensure that we look for
+                // META-INF/services in all the JARs.
+                if (packages.size() == 1 && "org.apache.camel.core".equals(packages.iterator().next())) {
+                    LOG.debug("No additional package names found in classpath for annotated type converters.");
+                    // no additional package names found to load type converters so break out
+                    return;
+                }
+
+                // now filter out org.apache.camel.core as its not needed anymore (it was just a dummy)
+                packages.remove("org.apache.camel.core");
+
+                for (String pkg : packages) {
+
+                    if (StringHelper.isClassName(pkg)) {
+                        // its a FQN class name so load it directly
+                        LOG.trace("Loading {} class", pkg);
+                        try {
+                            Class<?> clazz = bundle.loadClass(pkg);
+                            classes.add(clazz);
+                            // the class could be found and loaded so continue to next
+                            continue;
+                        } catch (Throwable t) {
+                            // Ignore
+                            LOG.trace("Failed to load " + pkg + " class due " + t.getMessage() + ". This exception will be ignored.", t);
+                        }
+                    }
+
+                    // its not a FQN but a package name so scan for classes in the bundle
+                    Enumeration<URL> e = bundle.findEntries("/" + pkg.replace('.', '/'), "*.class", true);
+                    while (e != null && e.hasMoreElements()) {
+                        String path = e.nextElement().getPath();
+                        String externalName = path.substring(path.charAt(0) == '/' ? 1 : 0, path.indexOf('.')).replace('/', '.');
+                        LOG.trace("Loading {} class", externalName);
+                        try {
+                            Class<?> clazz = bundle.loadClass(externalName);
+                            if (test.matches(clazz)) {
+                                classes.add(clazz);
+                            }
+                        } catch (Throwable t) {
+                            // Ignore
+                            LOG.trace("Failed to load " + externalName + " class due " + t.getMessage() + ". This exception will be ignored.", t);
+                        }
+                    }
+                }
+
+                // load the classes into type converter registry
+                LOG.debug("Found {} @Converter classes to load", classes.size());
+                for (Class<?> type : classes) {
+                    if (LOG.isTraceEnabled()) {
+                        LOG.trace("Loading converter class: {}", ObjectHelper.name(type));
+                    }
+                    loadConverterMethods(registry, type);
+                }
+
+                // register fallback converters
+                URL fallbackUrl = bundle.getEntry(META_INF_FALLBACK_TYPE_CONVERTER);
+                if (fallbackUrl != null) {
+                    LOG.debug("Found {} to load the FallbackTypeConverter", META_INF_FALLBACK_TYPE_CONVERTER);
+                    TypeConverter tc = createInstance("FallbackTypeConverter", fallbackUrl, registry.getInjector());
+                    registry.addFallbackTypeConverter(tc, false);
+                }
+
+                // now clear the maps so we do not hold references
+                visitedClasses.clear();
+                visitedURIs.clear();
+            }
+        }
+
+    }
+
+    protected abstract static class BaseResolver<T> extends BaseService {
+
+        private final Class<T> type;
+
+        public BaseResolver(Bundle bundle, Class<T> type) {
+            super(bundle);
+            this.type = type;
+        }
+
+        protected T createInstance(String name, String path, CamelContext context) {
+            if (path == null) {
+                return null;
+            }
+            URL url = bundle.getEntry(path);
+            LOG.trace("The entry {}'s url is {}", name, url);
+            //Setup the TCCL with Camel context application class loader
+            ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+            try {
+                ClassLoader newClassLoader = context.getApplicationContextClassLoader();
+                if (newClassLoader != null) {
+                    Thread.currentThread().setContextClassLoader(newClassLoader);
+                }
+                T answer = createInstance(name, url, context.getInjector());
+                if (answer != null) {
+                    initBundleContext(answer);
+                }
+                return answer;
+            } finally {
+                Thread.currentThread().setContextClassLoader(oldClassLoader);
+            }
+        }
+
+        private void initBundleContext(T answer) {
+            try {
+                Method method = answer.getClass().getMethod("setBundleContext", BundleContext.class);
+                if (method != null) {
+                    method.invoke(answer, bundle.getBundleContext());
+                }
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        protected T createInstance(String name, URL url, Injector injector) {
+            try {
+                Properties properties = loadProperties(url);
+                String classname = (String) properties.get("class");
+                Class type = bundle.loadClass(classname);
+                if (!this.type.isAssignableFrom(type)) {
+                    throw new IllegalArgumentException("Type is not a " + this.type.getName() + " implementation. Found: " + type.getName());
+                }
+                return (T) injector.newInstance(type, false);
+            } catch (ClassNotFoundException e) {
+                throw new IllegalArgumentException("Invalid URI, no " + this.type.getName() + " registered for scheme : " + name, e);
+            }
+        }
+
+    }
+
+    protected abstract static class BaseService {
+
+        protected final Bundle bundle;
+        private ServiceRegistration<?> reg;
+
+        protected BaseService(Bundle bundle) {
+            this.bundle = bundle;
+        }
+
+        public abstract void register();
+
+        protected void doRegister(Class<?> type, String key, Collection<String> value) {
+            doRegister(type, key, value.toArray(new String[value.size()]));
+        }
+
+        protected void doRegister(Class<?> type, String key, Object value) {
+            Dictionary<String, Object> props = new Hashtable<>();
+            props.put(key, value);
+            doRegister(type, props);
+        }
+
+        protected void doRegister(Class<?> type) {
+            doRegister(type, null);
+        }
+
+        protected void doRegister(Class<?> type, Dictionary<String, ?> props) {
+            reg = bundle.getBundleContext().registerService(type.getName(), this, props);
+        }
+
+        public void unregister() {
+            reg.unregister();
+        }
+    }
+
+    protected static Properties loadProperties(URL url) {
+        Properties properties = new Properties();
+        BufferedInputStream reader = null;
+        try {
+            reader = IOHelper.buffered(url.openStream());
+            properties.load(reader);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            IOHelper.close(reader, "properties", LOG);
+        }
+        return properties;
+    }
+    
+    protected static Set<String> getConverterPackages(URL resource) {
+        Set<String> packages = new LinkedHashSet<>();
+        if (resource != null) {
+            BufferedReader reader = null;
+            try {
+                reader = IOHelper.buffered(new InputStreamReader(resource.openStream()));
+                while (true) {
+                    String line = reader.readLine();
+                    if (line == null) {
+                        break;
+                    }
+                    line = line.trim();
+                    if (line.startsWith("#") || line.length() == 0) {
+                        continue;
+                    }
+                    StringTokenizer iter = new StringTokenizer(line, ",");
+                    while (iter.hasMoreTokens()) {
+                        String name = iter.nextToken().trim();
+                        if (name.length() > 0) {
+                            packages.add(name);
+                        }
+                    }
+                }
+            } catch (Exception ignore) {
+                // Do nothing here
+            } finally {
+                IOHelper.close(reader, null, LOG);
+            }
+        }
+        return packages;
+    }
+
+}
+
+
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/package.html b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/package.html
new file mode 100644
index 0000000..aef59c0
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/impl/package.html
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+<html>
+<head>
+</head>
+<body>
+
+Camel OSGi Activator.
+
+</body>
+</html>
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.java
new file mode 100644
index 0000000..781c98a
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleContextUtils.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.core.osgi.utils;
+
+import java.lang.reflect.Method;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Helper class
+ */
+public final class BundleContextUtils {
+
+    private BundleContextUtils() {
+    }
+
+    /**
+     * Retrieve the BundleContext that the given class has been loaded from.
+     *
+     * @param clazz the class to find the bundle context from
+     * @return the bundle context or <code>null</code> if it can't be found
+     */
+    public static BundleContext getBundleContext(Class<?> clazz) {
+
+        // Ideally we should use FrameworkUtil.getBundle(clazz).getBundleContext()
+        // but that does not exist in OSGi 4.1, so until we upgrade, we keep that one
+
+        try {
+            ClassLoader cl = clazz.getClassLoader();
+            Class<?> clClazz = cl.getClass();
+            Method mth = null;
+            while (clClazz != null) {
+                try {
+                    mth = clClazz.getDeclaredMethod("getBundle");
+                    break;
+                } catch (NoSuchMethodException e) {
+                    // Ignore
+                }
+                clClazz = clClazz.getSuperclass();
+            }
+            if (mth != null) {
+                mth.setAccessible(true);
+                return ((Bundle) mth.invoke(cl)).getBundleContext();
+            }
+        } catch (Throwable t) {
+            // Ignore
+        }
+
+        return null;
+    }
+
+}
diff --git a/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleDelegatingClassLoader.java b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleDelegatingClassLoader.java
new file mode 100644
index 0000000..f0da831
--- /dev/null
+++ b/core/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/utils/BundleDelegatingClassLoader.java
@@ -0,0 +1,99 @@
+/*
+ * 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.core.osgi.utils;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+
+import org.osgi.framework.Bundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A ClassLoader delegating to a given OSGi bundle.
+ *
+ */
+public class BundleDelegatingClassLoader extends ClassLoader {
+    private static final Logger LOG = LoggerFactory.getLogger(BundleDelegatingClassLoader.class);
+    private final Bundle bundle;
+    private final ClassLoader classLoader;
+
+    public BundleDelegatingClassLoader(Bundle bundle) {
+        this(bundle, null);
+    }
+
+    public BundleDelegatingClassLoader(Bundle bundle, ClassLoader classLoader) {
+        this.bundle = bundle;
+        this.classLoader = classLoader;
+    }
+
+    @Override
+    protected Class<?> findClass(String name) throws ClassNotFoundException {
+        LOG.trace("FindClass: {}", name);
+        return bundle.loadClass(name);
+    }
+
+    @Override
+    protected URL findResource(String name) {
+        LOG.trace("FindResource: {}", name);
+        URL resource = bundle.getResource(name);
+        if (classLoader != null && resource == null) {
+            resource = classLoader.getResource(name);
+        }
+        return resource;
+    }
+
+    @Override
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    protected Enumeration findResources(String name) throws IOException {
+        LOG.trace("FindResource: {}", name);
+        return bundle.getResources(name);
+    }
+
+    @Override
+    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        LOG.trace("LoadClass: {}, resolve: {}", name, resolve);
+        Class<?> clazz;
+        try {
+            clazz = findClass(name);
+        } catch (ClassNotFoundException cnfe) {
+            if (classLoader != null) {
+                try {
+                    clazz = classLoader.loadClass(name);
+                } catch (ClassNotFoundException e) {
+                    throw new ClassNotFoundException(name + " from bundle " + bundle.getBundleId() + " (" + bundle.getSymbolicName() + ")", cnfe);
+                }
+            } else {
+                throw new ClassNotFoundException(name + " from bundle " + bundle.getBundleId() + " (" + bundle.getSymbolicName() + ")", cnfe);
+            }
+        }
+        if (resolve) {
+            resolveClass(clazz);
+        }
+        return clazz;
+    }
+
+    public Bundle getBundle() {
+        return bundle;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("BundleDelegatingClassLoader(%s)", bundle);
+    }
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundle.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundle.java
new file mode 100644
index 0000000..f0cf522
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundle.java
@@ -0,0 +1,132 @@
+/*
+ * 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.core.osgi;
+
+import java.net.URL;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.util.CastUtils;
+import org.osgi.framework.Version;
+import org.springframework.osgi.mock.MockBundle;
+
+/**
+ *  The mock bundle will make up a normal camel-components bundle
+ */
+public class CamelMockBundle extends MockBundle {
+    
+    public static final String META_INF_COMPONENT = "META-INF/services/org/apache/camel/component/";
+    public static final String META_INF_LANGUAGE = "META-INF/services/org/apache/camel/language/";
+    public static final String META_INF_LANGUAGE_RESOLVER = "META-INF/services/org/apache/camel/language/resolver/";
+    public static final String META_INF_DATAFORMAT = "META-INF/services/org/apache/camel/dataformat/";
+
+    private static class ListEnumeration<E> implements Enumeration<E> {
+        private final List<E> list;                    
+        private int index;
+        
+        ListEnumeration(List<E> list) {
+            this.list = list;
+        }
+
+        @Override
+        public boolean hasMoreElements() {
+            return list != null && index < list.size();
+        }
+
+        @Override
+        public E nextElement() {
+            E result = null;
+            if (list != null) { 
+                result =  list.get(index);
+                index++;
+            } 
+            return result;         
+        }
+        
+    }
+    
+    public CamelMockBundle() {
+        setClassLoader(getClass().getClassLoader());
+    }
+
+    private Enumeration<String> getListEnumeration(String prefix, String entrys[]) {
+        List<String> list = new ArrayList<>();
+        for (String entry : entrys) {            
+            list.add(prefix + entry);
+        }
+        return new ListEnumeration<>(list);
+    }
+
+    @Override
+    public Enumeration<String> getEntryPaths(String path) {
+        Enumeration<String> result = null;
+        if (META_INF_COMPONENT.equals(path)) {
+            String[] entries = new String[] {"timer_test", "file_test"};
+            result = getListEnumeration(META_INF_COMPONENT, entries);
+        }
+        if (META_INF_LANGUAGE.equals(path)) {
+            String[] entries = new String[] {"bean_test", "file_test"};
+            result = getListEnumeration(META_INF_LANGUAGE, entries);
+        }
+        if (META_INF_LANGUAGE_RESOLVER.equals(path)) {
+            String[] entries = new String[] {"default"};
+            result = getListEnumeration(META_INF_LANGUAGE_RESOLVER, entries);
+        }
+
+        return result;
+    }
+    
+    @Override
+    public Enumeration<URL> findEntries(String path, String filePattern, boolean recurse) {
+        if (path.equals("/org/apache/camel/core/osgi/test") && filePattern.equals("*.class")) {
+            List<URL> urls = new ArrayList<>();
+            URL url = getClass().getClassLoader().getResource("org/apache/camel/core/osgi/test/MyTypeConverter.class");
+            urls.add(url);
+            url = getClass().getClassLoader().getResource("org/apache/camel/core/osgi/test/MyRouteBuilder.class");
+            urls.add(url);
+            return new ListEnumeration<>(urls);
+        } else {
+            return CastUtils.cast(super.findEntries(path, filePattern, recurse));
+        }
+    }
+
+    @Override
+    public Map<X509Certificate, List<X509Certificate>> getSignerCertificates(int signersType) {
+        return null;
+    }
+
+    @Override
+    public Version getVersion() {
+        return Version.parseVersion("1.0.0");
+    }
+
+    @Override
+    public Class<?> loadClass(String name) throws ClassNotFoundException {
+        if (isLoadableClass(name)) {
+            return super.loadClass(name);
+        } else {
+            throw new ClassNotFoundException(name);
+        }
+    }
+
+    protected boolean isLoadableClass(String name) {
+        return !name.startsWith("org.apache.camel.core.osgi.other");
+    }
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
new file mode 100644
index 0000000..a1c61fa
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockBundleContext.java
@@ -0,0 +1,139 @@
+/*
+ * 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.core.osgi;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.component.file.FileComponent;
+import org.apache.camel.core.osgi.test.MyService;
+import org.apache.camel.language.simple.SimpleLanguage;
+import org.apache.camel.spi.ComponentResolver;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.springframework.osgi.mock.MockBundleContext;
+import org.springframework.osgi.mock.MockServiceReference;
+
+public class CamelMockBundleContext extends MockBundleContext {
+    
+    public static final String SERVICE_PID_PREFIX = "test.";
+
+    public CamelMockBundleContext(Bundle bundle) {
+        super(bundle);
+    }
+
+    @Override
+    public Object getService(@SuppressWarnings("rawtypes") ServiceReference reference) {
+        String[] classNames = (String[]) reference.getProperty(Constants.OBJECTCLASS);        
+        String classNames0 = classNames != null ? classNames[0] : null;
+        String pid = (String)reference.getProperty(Constants.SERVICE_PID);
+        if (classNames0 != null && classNames0.equals("org.apache.camel.core.osgi.test.MyService")) {
+            return new MyService();
+        } else if (pid != null && pid.equals(SERVICE_PID_PREFIX + "org.apache.camel.core.osgi.test.MyService")) {
+            return new MyService();
+        } else if (classNames0 != null && classNames0.equals(ComponentResolver.class.getName())) {
+            return new ComponentResolver() {
+                public Component resolveComponent(String name, CamelContext context) throws Exception {
+                    if (name.equals("file_test")) {
+                        return new FileComponent();
+                    }
+                    return null;
+                }
+            };
+        } else if (classNames0 != null && classNames0.equals(LanguageResolver.class.getName())) {
+            return new LanguageResolver() {
+                public Language resolveLanguage(String name, CamelContext context) {
+                    if (name.equals("simple")) {
+                        return new SimpleLanguage();
+                    }
+                    return null;
+                }
+            };
+        } else {
+            return null;
+        }    
+    }
+
+    @Override
+    public ServiceReference getServiceReference(String clazz) {
+        // lookup Java class if clazz contains dot (.) symbol
+        if (clazz.contains(".")) {
+            try {
+                Class.forName(clazz);
+                return super.getServiceReference(clazz);
+            } catch (ClassNotFoundException ex) {
+                return null; // class not found so no service reference is returned
+            }
+        } else {
+            return super.getServiceReference(clazz);
+        }
+    }
+    
+    private static void addServicePID(ServiceReference[] srs, String filter) {
+        for (ServiceReference sr : srs) {
+            if (sr instanceof MockServiceReference) {
+                Dictionary properties = new Hashtable();
+                String pid = filter.replace("(" + Constants.SERVICE_PID + "=", "").replace(")", "");
+                properties.put(Constants.SERVICE_PID, pid);
+                for (String key : sr.getPropertyKeys()) {
+                    if (properties.get(key) == null) {
+                        properties.put(key, sr.getProperty(key));
+                    }
+                }
+                ((MockServiceReference)sr).setProperties(properties);
+            }
+        }
+    }
+    
+    @Override
+    @SuppressWarnings("rawtypes")
+    public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        // just simulate when the bundle context doesn't have right service reference
+        if (filter != null && filter.indexOf("name=test") > 0) {
+            return null;
+        } else {
+            ServiceReference[] srs = super.getServiceReferences(clazz, filter);
+            
+            // set service.pid property by filter
+            if (filter != null && filter.indexOf(Constants.SERVICE_PID + "=") > 0) {
+                addServicePID(srs, filter);
+            }
+            return srs;
+        }
+    }
+   
+    @Override
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+        // just simulate when the bundle context doesn't have right service reference
+        if (filter != null && filter.indexOf("name=test") > 0) {
+            return null;
+        }
+        MockServiceReference reference = new MockServiceReference(getBundle(), new String[] {clazz});
+        // setup the name property with the class name
+        Dictionary properties = new Hashtable();
+        properties.put("name", clazz);
+        reference.setProperties(properties);
+        return new ServiceReference[] {reference};
+    }
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockLanguageResolver.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockLanguageResolver.java
new file mode 100644
index 0000000..6b5e04b
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelMockLanguageResolver.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.engine.DefaultLanguageResolver;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.LanguageResolver;
+
+public class CamelMockLanguageResolver implements LanguageResolver {
+    // Delegate to the DefaultLanguageResolver
+    private LanguageResolver delegate = new DefaultLanguageResolver();
+
+    @Override
+    public Language resolveLanguage(String name, CamelContext context) {
+        return delegate.resolveLanguage(name, context);
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelOsgiTestSupport.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelOsgiTestSupport.java
new file mode 100644
index 0000000..3fba2c5
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/CamelOsgiTestSupport.java
@@ -0,0 +1,53 @@
+/*
+ * 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.core.osgi;
+
+import org.apache.camel.spi.ClassResolver;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.osgi.framework.BundleContext;
+import org.springframework.osgi.mock.MockBundle;
+import org.springframework.osgi.mock.MockBundleContext;
+
+public class CamelOsgiTestSupport extends Assert {
+    private MockBundle bundle = new CamelMockBundle();
+    private MockBundleContext bundleContext = new CamelMockBundleContext(bundle);
+    private OsgiPackageScanClassResolver packageScanClassResolver = new OsgiPackageScanClassResolver(bundleContext);
+    private ClassResolver classResolver = new OsgiClassResolver(null, bundleContext);
+
+    @Before
+    public void setUp() throws Exception {        
+        bundleContext.setBundle(bundle);
+    }
+    
+    @After    
+    public void tearDown() throws Exception {
+    }
+    
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public OsgiPackageScanClassResolver getPackageScanClassResolver() {
+        return packageScanClassResolver;
+    }
+    
+    public ClassResolver getClassResolver() {
+        return classResolver;
+    }
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiClassResolverTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiClassResolverTest.java
new file mode 100644
index 0000000..928ae79
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiClassResolverTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.core.osgi;
+
+import java.io.InputStream;
+
+import org.apache.camel.spi.ClassResolver;
+import org.junit.Test;
+
+public class OsgiClassResolverTest extends CamelOsgiTestSupport {
+    
+    @Test
+    public void testResolveClass() {
+        ClassResolver classResolver = getClassResolver();
+        Class<?> routeBuilder = classResolver.resolveClass("org.apache.camel.core.osgi.test.MyRouteBuilder");
+        assertNotNull("The class of routeBuilder should not be null.", routeBuilder);
+    }
+    
+    @Test
+    public void testResolverResource() {
+        ClassResolver classResolver = getClassResolver();
+        InputStream is = classResolver.loadResourceAsStream("META-INF/services/org/apache/camel/TypeConverterLoader");
+        assertNotNull("The InputStream should not be null.", is);
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiComponentResolverTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiComponentResolverTest.java
new file mode 100644
index 0000000..1a12a13
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiComponentResolverTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.core.osgi;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.file.FileComponent;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.support.DefaultRegistry;
+import org.apache.camel.support.service.ServiceSupport;
+import org.junit.Test;
+
+public class OsgiComponentResolverTest extends CamelOsgiTestSupport {
+
+    @Test
+    public void testOsgiResolverFindComponentTest() throws Exception {
+        CamelContext camelContext = new DefaultCamelContext();
+        OsgiComponentResolver resolver = new OsgiComponentResolver(getBundleContext());
+        Component component = resolver.resolveComponent("file_test", camelContext);
+        assertNotNull("We should find file_test component", component);
+        assertTrue("We should get the file component here", component instanceof FileComponent);
+    }
+
+    @Test
+    public void testOsgiResolverFindComponentFallbackTest() throws Exception {
+        Registry registry = new DefaultRegistry();
+        registry.bind("allstar-component", new SampleComponent(true));
+
+        CamelContext camelContext = new DefaultCamelContext(registry);
+
+        OsgiComponentResolver resolver = new OsgiComponentResolver(getBundleContext());
+        Component component = resolver.resolveComponent("allstar", camelContext);
+        assertNotNull("We should find the super component", component);
+        assertTrue("We should get the super component here", component instanceof SampleComponent);
+    }
+
+    @Test
+    public void testOsgiResolverFindLanguageDoubleFallbackTest() throws Exception {
+        Registry registry = new DefaultRegistry();
+        registry.bind("allstar", new SampleComponent(false));
+        registry.bind("allstar-component", new SampleComponent(true));
+
+        CamelContext camelContext = new DefaultCamelContext(registry);
+
+        OsgiComponentResolver resolver = new OsgiComponentResolver(getBundleContext());
+        Component component = resolver.resolveComponent("allstar", camelContext);
+        assertNotNull("We should find the super component", component);
+        assertTrue("We should get the super component here", component instanceof SampleComponent);
+        assertFalse("We should NOT find the fallback component", ((SampleComponent) component).isFallback());
+    }
+
+    private static class SampleComponent extends ServiceSupport implements Component {
+
+        private boolean fallback;
+
+        SampleComponent(boolean fallback) {
+            this.fallback = fallback;
+        }
+
+        @Override
+        public void setCamelContext(CamelContext camelContext) {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public CamelContext getCamelContext() {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public Endpoint createEndpoint(String uri) throws Exception {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public Endpoint createEndpoint(String uri, Map<String, Object> parameters) throws Exception {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public boolean useRawUri() {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        public boolean isFallback() {
+            return fallback;
+        }
+
+        public void setFallback(boolean fallback) {
+            this.fallback = fallback;
+        }
+
+        @Override
+        protected void doStart() throws Exception {
+            // noop
+        }
+
+        @Override
+        protected void doStop() throws Exception {
+            // noop
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiDataFormatResolverTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiDataFormatResolverTest.java
new file mode 100644
index 0000000..dab6602
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiDataFormatResolverTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.core.osgi;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.DataFormat;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.support.DefaultDataFormat;
+import org.apache.camel.support.DefaultRegistry;
+import org.junit.Test;
+
+public class OsgiDataFormatResolverTest extends CamelOsgiTestSupport {
+
+    @Test
+    public void testOsgiResolverFindDataFormatFallbackTest() throws Exception {
+        Registry registry = new DefaultRegistry();
+        registry.bind("allstar-dataformat", new SampleDataFormat(true));
+
+        CamelContext camelContext = new DefaultCamelContext(registry);
+
+        OsgiDataFormatResolver resolver = new OsgiDataFormatResolver(getBundleContext());
+        DataFormat dataformat = resolver.resolveDataFormat("allstar", camelContext);
+        assertNotNull("We should find the super dataformat", dataformat);
+        assertTrue("We should get the super dataformat here", dataformat instanceof SampleDataFormat);
+    }
+
+    @Test
+    public void testOsgiResolverFindLanguageDoubleFallbackTest() throws Exception {
+        Registry registry = new DefaultRegistry();
+        registry.bind("allstar", new SampleDataFormat(false));
+        registry.bind("allstar-dataformat", new SampleDataFormat(true));
+
+        CamelContext camelContext = new DefaultCamelContext(registry);
+
+        OsgiDataFormatResolver resolver = new OsgiDataFormatResolver(getBundleContext());
+        DataFormat dataformat = resolver.resolveDataFormat("allstar", camelContext);
+        assertNotNull("We should find the super dataformat", dataformat);
+        assertTrue("We should get the super dataformat here", dataformat instanceof SampleDataFormat);
+        assertFalse("We should NOT find the fallback dataformat", ((SampleDataFormat) dataformat).isFallback());
+    }
+
+    private static class SampleDataFormat extends DefaultDataFormat {
+
+        private boolean fallback;
+
+        SampleDataFormat(boolean fallback) {
+            this.fallback = fallback;
+        }
+
+        @Override
+        public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        public boolean isFallback() {
+            return fallback;
+        }
+
+        public void setFallback(boolean fallback) {
+            this.fallback = fallback;
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiFactoryFinderTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiFactoryFinderTest.java
new file mode 100644
index 0000000..383a717
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiFactoryFinderTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.io.IOException;
+
+import org.apache.camel.impl.engine.DefaultClassResolver;
+import org.junit.Test;
+
+public class OsgiFactoryFinderTest extends CamelOsgiTestSupport {
+
+    @Test
+    public void testFindClass() throws Exception {
+        OsgiFactoryFinder finder = new OsgiFactoryFinder(getBundleContext(), new DefaultClassResolver(), "META-INF/services/org/apache/camel/component/");
+        Class<?> clazz = finder.findClass("file_test", "strategy.factory.").orElse(null);
+        assertNotNull("We should get the file strategy factory here", clazz);
+        
+        assertFalse(finder.findClass("nofile", "strategy.factory.").isPresent());
+
+        try {
+            finder.findClass("file_test", "nostrategy.factory.");
+            fail("We should get exception here");
+        } catch (Exception ex) {
+            assertTrue("Should get IOException", ex.getCause() instanceof IOException);
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiLanguageResolverTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiLanguageResolverTest.java
new file mode 100644
index 0000000..6e160f2
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiLanguageResolverTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.core.osgi;
+
+import java.io.IOException;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
+import org.apache.camel.Predicate;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.support.DefaultRegistry;
+import org.junit.Test;
+
+public class OsgiLanguageResolverTest extends CamelOsgiTestSupport {
+
+    @Test
+    public void testOsgiResolverFindLanguageTest() throws IOException {
+        CamelContext camelContext = new DefaultCamelContext();
+        OsgiLanguageResolver resolver = new OsgiLanguageResolver(getBundleContext());
+        Language language = resolver.resolveLanguage("simple", camelContext);
+        assertNotNull("We should find simple language", language);
+    }
+
+    @Test
+    public void testOsgiResolverFindLanguageFallbackTest() throws IOException {
+        Registry registry = new DefaultRegistry();
+        registry.bind("fuffy-language", new SampleLanguage(true));
+
+        CamelContext camelContext = new DefaultCamelContext(registry);
+
+        OsgiLanguageResolver resolver = new OsgiLanguageResolver(getBundleContext());
+        Language language = resolver.resolveLanguage("fuffy", camelContext);
+        assertNotNull("We should find fuffy language", language);
+        assertTrue("We should find the fallback language", ((SampleLanguage) language).isFallback());
+    }
+
+    @Test
+    public void testOsgiResolverFindLanguageDoubleFallbackTest() throws IOException {
+        Registry registry = new DefaultRegistry();
+        registry.bind("fuffy", new SampleLanguage(false));
+        registry.bind("fuffy-language", new SampleLanguage(true));
+
+        CamelContext camelContext = new DefaultCamelContext(registry);
+
+        OsgiLanguageResolver resolver = new OsgiLanguageResolver(getBundleContext());
+        Language language = resolver.resolveLanguage("fuffy", camelContext);
+        assertNotNull("We should find fuffy language", language);
+        assertFalse("We should NOT find the fallback language", ((SampleLanguage) language).isFallback());
+    }
+
+    private static class SampleLanguage implements Language {
+
+        private boolean fallback;
+
+        SampleLanguage(boolean fallback) {
+            this.fallback = fallback;
+        }
+
+        @Override
+        public Predicate createPredicate(String expression) {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        @Override
+        public Expression createExpression(String expression) {
+            throw new UnsupportedOperationException("Should not be called");
+        }
+
+        public boolean isFallback() {
+            return fallback;
+        }
+
+        public void setFallback(boolean fallback) {
+            this.fallback = fallback;
+        }
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolverTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolverTest.java
new file mode 100644
index 0000000..eed874c
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/OsgiPackageScanClassResolverTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.apache.camel.Converter;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.core.osgi.other.MyOtherRouteBuilder;
+import org.apache.camel.core.osgi.other.MyOtherTypeConverter;
+import org.apache.camel.core.osgi.test.MyRouteBuilder;
+import org.apache.camel.core.osgi.test.MyTypeConverter;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+
+public class OsgiPackageScanClassResolverTest extends CamelOsgiTestSupport {
+
+    @Test
+    public void testOsgiResolverFindAnnotatedTest() throws IOException {
+        BundleContext context = getBundleContext();
+        assertNotNull("The BundleContext should not be null", context);
+        OsgiPackageScanClassResolver resolver = new OsgiPackageScanClassResolver(context);
+             
+        String[] packageNames = {"org.apache.camel.core.osgi.test"};
+        Set<Class<?>> classes = resolver.findAnnotated(Converter.class, packageNames);
+        assertEquals("There should find a class", classes.size(), 1);
+        assertTrue("Find a wrong class", classes.contains(MyTypeConverter.class));
+    }
+ 
+    @Test
+    public void testOsgiResolverFindImplementationTest() {
+        BundleContext context = getBundleContext();
+        assertNotNull("The BundleContext should not be null", context);
+        OsgiPackageScanClassResolver resolver = new OsgiPackageScanClassResolver(context);
+        String[] packageNames = {"org.apache.camel.core.osgi.test"};
+        Set<Class<?>> classes = resolver.findImplementations(RoutesBuilder.class, packageNames);
+        assertEquals("There should find a class", classes.size(), 1);
+        assertTrue("Find a wrong class", classes.contains(MyRouteBuilder.class));
+    }
+    
+    @Test
+    public void testOsgiResolverFindAnnotatedWithFallbackClassLoaderTest() throws IOException {
+        BundleContext context = getBundleContext();
+        assertNotNull("The BundleContext should not be null", context);
+        OsgiPackageScanClassResolver resolver = new OsgiPackageScanClassResolver(context);
+             
+        String[] packageNames = {"org.apache.camel.core.osgi.other"};
+        Set<Class<?>> classes = resolver.findAnnotated(Converter.class, packageNames);
+        assertEquals("There should find a class", classes.size(), 1);
+        assertTrue("Find a wrong class", classes.contains(MyOtherTypeConverter.class));
+    }
+    
+    @Test
+    public void testOsgiResolverFindImplementationWithFallbackClassLoaderTest() {
+        BundleContext context = getBundleContext();
+        assertNotNull("The BundleContext should not be null", context);
+        OsgiPackageScanClassResolver resolver = new OsgiPackageScanClassResolver(context);
+        String[] packageNames = {"org.apache.camel.core.osgi.other"};
+        Set<Class<?>> classes = resolver.findImplementations(RoutesBuilder.class, packageNames);
+        assertEquals("There should find a class", classes.size(), 1);
+        assertTrue("Find a wrong class", classes.contains(MyOtherRouteBuilder.class));
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
new file mode 100644
index 0000000..e56fb40
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/ServiceRegistryTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.core.osgi;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.core.osgi.test.MyService;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.Test;
+
+public class ServiceRegistryTest extends CamelOsgiTestSupport {
+
+    @Test
+    public void camelContextFactoryServiceRegistryTest() throws Exception {
+        DefaultCamelContext context = new OsgiDefaultCamelContext(getBundleContext());
+        context.start();
+
+        MyService myService = context.getRegistry().lookupByNameAndType(MyService.class.getName(), MyService.class);
+        assertNotNull("MyService should not be null", myService);
+        
+        myService = context.getRegistry().lookupByNameAndType("test", MyService.class);
+        assertNull("We should not get the MyService Object here", myService);
+
+        Object service = context.getRegistry().lookupByName(MyService.class.getName());
+        assertNotNull("MyService should not be null", service);
+        assertTrue("It should be the instance of MyService ", service instanceof MyService);
+        
+        Object serviceByPid = context.getRegistry().lookupByName(CamelMockBundleContext.SERVICE_PID_PREFIX + MyService.class.getName());
+        assertNotNull("MyService should not be null", serviceByPid);
+        assertTrue("It should be the instance of MyService ", serviceByPid instanceof MyService);
+        
+        Map<String, MyService> collection = context.getRegistry().findByTypeWithName(MyService.class);
+        assertNotNull("MyService should not be null", collection);
+        assertNotNull("There should have one MyService.", collection.get(MyService.class.getName()));
+
+        Set<MyService> collection2 = context.getRegistry().findByType(MyService.class);
+        assertNotNull("MyService should not be null", collection2);
+        assertEquals(1, collection2.size());
+
+        context.stop();
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/other/MyOtherRouteBuilder.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/other/MyOtherRouteBuilder.java
new file mode 100644
index 0000000..1779087
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/other/MyOtherRouteBuilder.java
@@ -0,0 +1,28 @@
+/*
+ * 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.core.osgi.other;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class MyOtherRouteBuilder extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+        // Do nothing here
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/other/MyOtherTypeConverter.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/other/MyOtherTypeConverter.java
new file mode 100644
index 0000000..445a653
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/other/MyOtherTypeConverter.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.core.osgi.other;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.component.file.GenericFile;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+@Converter
+public final class MyOtherTypeConverter {
+
+    /**
+     * Utility classes should not have a public constructor.
+     */
+    private MyOtherTypeConverter() {
+    }
+    
+    /**
+     * Converts the given value to a boolean, handling strings or Boolean
+     * objects; otherwise returning false if the value could not be converted to
+     * a boolean
+     */
+    @Converter
+    public static boolean toBool(Object value) {
+        Boolean answer = null;    
+        if (value instanceof String) {
+            answer = Boolean.valueOf((String)value);
+        } 
+        if (value instanceof Boolean) {
+            answer = (Boolean) value;
+        }
+        if (answer != null) {
+            return answer.booleanValue();
+        }
+        return false;
+    }
+    
+    @Converter(fallback = true)
+    public static Object convertTo(Class<?> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
+        // use a fallback type converter so we can convert the embedded body if the value is GenericFile
+        if (GenericFile.class.isAssignableFrom(value.getClass())) {
+            GenericFile<?> file = (GenericFile<?>) value;
+            Class<?> from = file.getBody().getClass();
+
+            // maybe from is already the type we want
+            if (from.isAssignableFrom(type)) {
+                return file.getBody();
+            }
+            // no then try to lookup a type converter
+            TypeConverter tc = registry.lookup(type, from);
+            if (tc != null) {
+                Object body = file.getBody();
+                return tc.convertTo(type, exchange, body);
+            }
+        }
+        
+        return null;
+    }
+    
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MockTypeConverterRegistry.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MockTypeConverterRegistry.java
new file mode 100644
index 0000000..26c7c7f
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MockTypeConverterRegistry.java
@@ -0,0 +1,141 @@
+/*
+ * 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.core.osgi.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.TypeConverterExists;
+import org.apache.camel.TypeConverters;
+import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+public class MockTypeConverterRegistry implements TypeConverterRegistry {
+    private List<TypeConverter> typeConverters = new ArrayList<>();
+    private List<TypeConverter> fallbackTypeConverters = new ArrayList<>();
+    
+    public List<TypeConverter> getTypeConverters() {
+        return typeConverters;
+    }
+    
+    public List<TypeConverter> getFallbackTypeConverters() {
+        return fallbackTypeConverters;
+    }
+    
+    @Override
+    public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
+        typeConverters.add(typeConverter);
+    }
+
+    @Override
+    public void addTypeConverters(TypeConverters typeConverters) {
+        // noop
+    }
+
+    @Override
+    public boolean removeTypeConverter(Class<?> toType, Class<?> fromType) {
+        // noop
+        return true;
+    }
+
+    @Override
+    public void addFallbackTypeConverter(TypeConverter typeConverter, boolean canPromote) {
+        fallbackTypeConverters.add(typeConverter);
+    }
+
+    @Override
+    public TypeConverter lookup(Class<?> toType, Class<?> fromType) {
+        return null;
+    }
+
+    @Override
+    public List<Class<?>[]> listAllTypeConvertersFromTo() {
+        return null;
+    }
+
+    @Override
+    public void setInjector(Injector injector) {
+       // do nothing
+    }
+
+    @Override
+    public Injector getInjector() {
+        return null;
+    }
+
+    @Override
+    public Statistics getStatistics() {
+        return null;
+    }
+
+    @Override
+    public int size() {
+        return typeConverters.size();
+    }
+
+    @Override
+    public LoggingLevel getTypeConverterExistsLoggingLevel() {
+        return LoggingLevel.WARN;
+    }
+
+    @Override
+    public void setTypeConverterExistsLoggingLevel(LoggingLevel loggingLevel) {
+        // noop
+    }
+
+    @Override
+    public TypeConverterExists getTypeConverterExists() {
+        return TypeConverterExists.Override;
+    }
+
+    @Override
+    public void setTypeConverterExists(TypeConverterExists typeConverterExists) {
+        // noop
+    }
+
+    public boolean isAnnotationScanning() {
+        return false;
+    }
+
+    public void setAnnotationScanning(boolean annotationScanning) {
+        // noop
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        // noop
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return null;
+    }
+
+    @Override
+    public void start() {
+        // noop
+    }
+
+    @Override
+    public void stop() {
+        // noop
+    }
+}
+
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyRouteBuilder.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyRouteBuilder.java
new file mode 100644
index 0000000..90e8624
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyRouteBuilder.java
@@ -0,0 +1,28 @@
+/*
+ * 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.core.osgi.test;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class MyRouteBuilder extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+        // Do nothing here
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyService.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyService.java
new file mode 100644
index 0000000..637949f
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyService.java
@@ -0,0 +1,25 @@
+/*
+ * 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.core.osgi.test;
+
+public class MyService {
+
+    public String sayHi() {
+        return "Hello";
+    }
+
+}
diff --git a/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyTypeConverter.java b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyTypeConverter.java
new file mode 100644
index 0000000..9c71f15
--- /dev/null
+++ b/core/camel-core-osgi/src/test/java/org/apache/camel/core/osgi/test/MyTypeConverter.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.core.osgi.test;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.component.file.GenericFile;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+@Converter
+public final class MyTypeConverter {
+
+    /**
+     * Utility classes should not have a public constructor.
+     */
+    private MyTypeConverter() {
+    }
+    
+    /**
+     * Converts the given value to a boolean, handling strings or Boolean
+     * objects; otherwise returning false if the value could not be converted to
+     * a boolean
+     */
+    @Converter
+    public static boolean toBool(Object value) {
+        Boolean answer = null;    
+        if (value instanceof String) {
+            answer = Boolean.valueOf((String)value);
+        } 
+        if (value instanceof Boolean) {
+            answer = (Boolean) value;
+        }
+        if (answer != null) {
+            return answer.booleanValue();
+        }
+        return false;
+    }
+    
+    @Converter(fallback = true)
+    public static Object convertTo(Class<?> type, Exchange exchange, Object value, TypeConverterRegistry registry) {
+        // use a fallback type converter so we can convert the embedded body if the value is GenericFile
+        if (GenericFile.class.isAssignableFrom(value.getClass())) {
+            GenericFile<?> file = (GenericFile<?>) value;
+            Class<?> from = file.getBody().getClass();
+
+            // maybe from is already the type we want
+            if (from.isAssignableFrom(type)) {
+                return file.getBody();
+            }
+            // no then try to lookup a type converter
+            TypeConverter tc = registry.lookup(type, from);
+            if (tc != null) {
+                Object body = file.getBody();
+                return tc.convertTo(type, exchange, body);
+            }
+        }
+        
+        return null;
+    }
+    
+
+}
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/LICENSE.txt b/core/camel-core-osgi/src/test/resources/META-INF/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/NOTICE.txt b/core/camel-core-osgi/src/test/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/component/file_test b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/component/file_test
new file mode 100644
index 0000000..2172240
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/component/file_test
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.component.file.FileComponent
+strategy.factory.class=org.apache.camel.component.file.strategy.FileProcessStrategyFactory
\ No newline at end of file
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/component/timer_test b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/component/timer_test
new file mode 100644
index 0000000..87adb9a
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/component/timer_test
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.component.timer.TimerComponent
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/bean_test b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/bean_test
new file mode 100644
index 0000000..028e2cb
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/bean_test
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.language.bean.BeanLanguage
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/file_test b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/file_test
new file mode 100644
index 0000000..c907df9
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/file_test
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.language.simple.FileLanguage
\ No newline at end of file
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/resolver/default b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/resolver/default
new file mode 100644
index 0000000..b6a8d70
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/services/org/apache/camel/language/resolver/default
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class=org.apache.camel.core.osgi.CamelMockLanguageResolver
\ No newline at end of file
diff --git a/core/camel-core-osgi/src/test/resources/META-INF/spring/camel-context.xml b/core/camel-core-osgi/src/test/resources/META-INF/spring/camel-context.xml
new file mode 100644
index 0000000..440ef69
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/META-INF/spring/camel-context.xml
@@ -0,0 +1,66 @@
+<?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.
+
+-->
+<!--
+
+  The default Application Context used by the org.apache.camel.spring.Main if there
+  is no /META-INF/sprint.xml
+
+ -->
+
+<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.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:a.start"/>
+      <choice>
+        <when>
+          <xpath>$foo = 'bar'</xpath>
+          <to uri="mock:x"/>
+        </when>
+        <when>
+          <xpath>$foo = 'cheese'</xpath>
+          <to uri="mock:y"/>
+        </when>
+        <otherwise>
+          <to uri="mock:z"/>
+        </otherwise>
+      </choice>
+    </route>
+    <route>
+      <from uri="direct:b.start"/>
+      <filter>
+        <xpath>/person[@name='James']</xpath>
+        <to uri="mock:b.end"/>
+      </filter>
+    </route>
+    <route>
+      <from uri="direct:c.start"/>
+      <resequence>
+        <simple>body</simple>
+        <to uri="mock:c.end"/>
+      </resequence>
+    </route>
+  </camelContext>
+
+</beans>
diff --git a/core/camel-core-osgi/src/test/resources/log4j2.properties b/core/camel-core-osgi/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..2b6df8b
--- /dev/null
+++ b/core/camel-core-osgi/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-core-osgi-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/core/pom.xml b/core/pom.xml
new file mode 100644
index 0000000..fb91603
--- /dev/null
+++ b/core/pom.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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>3.2.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <groupId>org.apache.camel.karaf</groupId>
+    <artifactId>core-modules</artifactId>
+    <name>Camel Karaf :: Core Modules</name>
+    <description>Camel Karaf Core Modules</description>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>camel-core-osgi</module>
+    </modules>
+
+</project>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..61931ab
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,921 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>21</version>
+    </parent>
+
+    <groupId>org.apache.camel.karaf</groupId>
+    <artifactId>karaf</artifactId>
+    <version>3.2.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <name>Camel Karaf</name>
+    <description>Camel Karaf Root POM</description>
+    <url>https://camel.apache.org</url>
+    <inceptionYear>2007</inceptionYear>
+
+    <developers>
+        <developer>
+            <name>The Apache Camel Team</name>
+            <email>dev@camel.apache.org</email>
+            <url>https://camel.apache.org</url>
+            <organization>Apache Software Foundation</organization>
+            <organizationUrl>http://apache.org/</organizationUrl>
+        </developer>
+    </developers>
+
+    <mailingLists>
+        <mailingList>
+            <name>Development List</name>
+            <subscribe>dev-subscribe@camel.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@camel.apache.org</unsubscribe>
+            <post>dev@camel.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>User List</name>
+            <subscribe>users-subscribe@camel.apache.org</subscribe>
+            <unsubscribe>users-unsubscribe@camel.apache.org</unsubscribe>
+            <post>users@camel.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>Commits List</name>
+            <subscribe>commits-subscribe@camel.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@camel.apache.org</unsubscribe>
+            <post>commits@camel.apache.org</post>
+        </mailingList>
+    </mailingLists>
+
+    <prerequisites>
+        <maven>3.5.0</maven>
+    </prerequisites>
+
+    <modules>
+        <!--<module>tooling</module>-->
+        <module>core</module>
+        <!--<module>components-starter</module>
+        <module>catalog</module>
+        <module>tests</module>
+        <module>examples</module>
+        <module>docs</module>-->
+    </modules>
+
+    <scm>
+        <connection>scm:git:http://gitbox.apache.org/repos/asf/camel-karaf.git</connection>
+        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/camel-karaf.git</developerConnection>
+        <url>https://gitbox.apache.org/repos/asf?p=camel-karaf.git;a=summary</url>
+        <tag>HEAD</tag>
+    </scm>
+    <issueManagement>
+        <system>jira</system>
+        <url>https://issues.apache.org/jira/browse/CAMEL</url>
+    </issueManagement>
+    <distributionManagement>
+        <site>
+            <id>apache.website</id>
+            <url>${site-repo-url}</url>
+        </site>
+    </distributionManagement>
+
+    <properties>
+
+        <!-- unify the encoding for all the modules -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <site-repo-url>scpexe://people.apache.org/www/camel.apache.org/maven/</site-repo-url>
+        <jdk.version>1.8</jdk.version>
+        <compiler.fork>false</compiler.fork>
+
+        <!-- Spring-Boot target version -->
+        <spring-boot-version>2.2.5.RELEASE</spring-boot-version>
+
+        <!-- Camel target version -->
+        <camel-version>3.2.0-SNAPSHOT</camel-version>
+
+        <!-- versions -->
+        <aether-version>1.0.2.v20150114</aether-version>
+        <arquillian-container-se-managed-version>1.0.2.Final</arquillian-container-se-managed-version>
+        <arquillian-version>1.5.0.Final</arquillian-version>
+        <asciidoctorj-version>2.1.0</asciidoctorj-version>
+        <atomix-version>1.0.8</atomix-version>
+        <avro-version>1.8.1</avro-version>
+        <cassandra-driver-guava-version>19.0</cassandra-driver-guava-version>
+        <cdi-api-2.0-version>2.0</cdi-api-2.0-version>
+        <curator-version>4.3.0</curator-version>
+        <deltaspike-version>1.9.0</deltaspike-version>
+        <egit-github-core-version>2.1.5</egit-github-core-version>
+        <exec-maven-plugin-version>1.6.0</exec-maven-plugin-version>
+        <freemarker-version>2.3.29</freemarker-version>
+        <geronimo-ws-metadata-spec-version>1.1.3</geronimo-ws-metadata-spec-version>
+        <glassfish-jaxb-runtime-version>${jakarta-jaxb-version}</glassfish-jaxb-runtime-version>
+        <google-guava-version>19.0</google-guava-version>
+        <groovy-version>3.0.2</groovy-version>
+        <grpc-guava-version>28.1-jre</grpc-guava-version>
+        <grpc-version>1.27.0</grpc-version>
+        <gson-version>2.8.5</gson-version>
+        <hadoop2-version>2.7.4</hadoop2-version>
+        <hibernate-validator-version>6.1.2.Final</hibernate-validator-version>
+        <hibernate-version>5.4.12.Final</hibernate-version>
+        <infinispan-spring-boot-version>2.2.3.Final</infinispan-spring-boot-version>
+        <jackson-version>1.9.12</jackson-version>
+        <jakarta-jaxb-version>2.3.2</jakarta-jaxb-version>
+        <jandex-version>2.1.1.Final</jandex-version>
+        <javax-annotation-api-version>1.3.2</javax-annotation-api-version>
+        <jaxb-version>2.3.0</jaxb-version>
+        <jetty9-version>9.4.20.v20190813</jetty9-version>
+        <jolokia-version>1.6.2</jolokia-version>
+        <junit-jupiter-version>5.6.0</junit-jupiter-version>
+        <kafka-avro-serializer-version>5.2.2</kafka-avro-serializer-version>
+        <log4j2-version>2.13.1</log4j2-version>
+        <lucene3-version>3.6.0</lucene3-version>
+        <maven-checkstyle-plugin-version>3.1.0</maven-checkstyle-plugin-version>
+        <maven-checkstyle-version>8.26</maven-checkstyle-version>
+        <maven-compiler-plugin-version>3.8.1</maven-compiler-plugin-version>
+        <maven-javadoc-plugin-version>3.0.1</maven-javadoc-plugin-version>
+        <maven-resources-plugin-version>3.1.0</maven-resources-plugin-version>
+        <maven-surefire-plugin-version>3.0.0-M4</maven-surefire-plugin-version>
+        <mvel-version>2.4.5.Final</mvel-version>
+        <mycila-license-version>3.0</mycila-license-version>
+        <openjpa-version>3.1.1</openjpa-version>
+        <opentracing-version>0.33.0</opentracing-version>
+        <os-maven-plugin-version>1.6.0</os-maven-plugin-version>
+        <protobuf-maven-plugin-version>0.6.1</protobuf-maven-plugin-version>
+        <protobuf-version>3.11.1</protobuf-version>
+        <reactor-version>3.2.15.RELEASE</reactor-version>
+        <roaster-version>2.20.1.Final</roaster-version>
+        <rxjava-version>1.3.8</rxjava-version>
+        <shrinkwrap-resolver-version>3.1.3</shrinkwrap-resolver-version>
+        <shrinkwrap-version>1.2.6</shrinkwrap-version>
+        <spring-cloud-commons-version>2.2.2.RELEASE</spring-cloud-commons-version>
+        <spring-cloud-consul-version>2.2.2.RELEASE</spring-cloud-consul-version>
+        <spring-cloud-netflix-version>2.2.2.RELEASE</spring-cloud-netflix-version>
+        <spring-cloud-zookeeper-version>2.2.1.RELEASE</spring-cloud-zookeeper-version>
+        <surefire.version>${maven-surefire-plugin-version}</surefire.version>
+        <testcontainers-version>1.13.0</testcontainers-version>
+        <tomcat-version>9.0.31</tomcat-version>
+        <undertow-version>2.0.30.Final</undertow-version>
+        <weld3-version>3.0.5.RELEASE</weld3-version>
+    </properties>
+
+
+    <!-- Comment out the snapshot repositories as we don't need them now -->
+    <repositories>
+        <repository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots/</url>
+            <name>Apache Snapshot Repo</name>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-parent</artifactId>
+                <version>${camel-version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin-version}</version>
+                <configuration>
+                    <source>${jdk.version}</source>
+                    <target>${jdk.version}</target>
+                    <maxmem>512M</maxmem>
+                    <fork>${compiler.fork}</fork>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <configuration>
+                    <attach>true</attach>
+                    <source>${jdk.version}</source>
+                    <quiet>true</quiet>
+                    <bottom>Apache Camel</bottom>
+                    <detectOfflineLinks>false</detectOfflineLinks>
+                    <javadocVersion>1.8.0</javadocVersion>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>${maven-javadoc-plugin-version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-eclipse-plugin</artifactId>
+                    <version>2.10</version>
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.apache.camel</groupId>
+                            <artifactId>camel-buildtools</artifactId>
+                            <version>${camel-version}</version>
+                        </dependency>
+                    </dependencies>
+                    <configuration>
+                        <downloadSources>true</downloadSources>
+                        <downloadJavadocs>false</downloadJavadocs>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.rat</groupId>
+                    <artifactId>apache-rat-plugin</artifactId>
+                    <configuration>
+                        <excludeSubProjects>false</excludeSubProjects>
+                        <excludes>
+                            <exclude>**/*.mvel</exclude>
+                            <exclude>**/catalog/*.properties</exclude>
+                            <exclude>**/*.json</exclude>
+                            <exclude>**/README</exclude>
+                            <exclude>**/README.txt</exclude>
+                            <exclude>**/README.md</exclude>
+                            <exclude>**/ReadMe.md</exclude>
+                            <exclude>**/resources/**/*.xsd</exclude>
+                            <exclude>**/webapp/js/**/*</exclude>
+                            <exclude>**/test/resources/**/*</exclude>
+                            <exclude>**/test/data*/**/*</exclude>
+                            <exclude>.gitignore</exclude>
+                            <exclude>.git/**/*</exclude>
+                            <exclude>**/*.adoc</exclude>
+                            <exclude>**/*.adoc.template</exclude>
+                            <exclude>**/*.md</exclude>
+                            <exclude>**/*.sh</exclude>
+                            <exclude>**/*.bat</exclude>
+                            <exclude>**/java9-maven-settings</exclude>
+                            <exclude>**/*.pfx</exclude>
+                            <!-- tooling json-simple parser -->
+                            <exclude>**/src/main/java/org/json/simple/**</exclude>
+                            <!-- tooling/camel-manual/src/styles/print.css use a different license -->
+                            <exclude>**/src/styles/print.css</exclude>
+                            <!-- tooling for component docs -->
+                            <exclude>**/component-header.mvel</exclude>
+                            <exclude>**/component-options.mvel</exclude>
+                            <exclude>**/endpoint-options.mvel</exclude>
+                            <exclude>**/dataformat-options.mvel</exclude>
+                            <exclude>**/eip-options.mvel</exclude>
+                            <exclude>**/language-options.mvel</exclude>
+                            <exclude>**/website-components-list.mvel</exclude>
+                            <exclude>**/website-languages-list.mvel</exclude>
+                            <exclude>**/website-others-list.mvel</exclude>
+                            <exclude>**/website-dataformats-list.mvel</exclude>
+                            <exclude>**/readme-examples.mvel</exclude>
+                            <exclude>**/spring-boot-auto-configure-options.mvel</exclude>
+                            <exclude>**/camel-NOTICE.txt</exclude>
+                            <exclude>**/spring-boot-starter-NOTICE.txt</exclude>
+                            <!-- cxf does not handle comments here -->
+                            <exclude>**/src/main/resources/META-INF/cxf/cxf.extension</exclude>
+                            <exclude>**/src/main/resources/META-INF/cxf/bus-extensions.txt</exclude>
+                            <!-- ignore the api signatures files -->
+                            <exclude>**/src/signatures/*.txt</exclude>
+                            <!-- camel-salesforce BSD license from salesforce developers -->
+                            <exclude>**/CometDReplayExtension.java</exclude>
+                            <exclude>**/LICENSE-SALESFORCE.txt</exclude>
+                            <!-- camel-as2 -->
+                            <exclude>**/mdnDescription.vm</exclude>
+                            <!-- camel-jbpm -->
+                            <exclude>**/src/main/resources/*.wid</exclude>
+                            <!-- camel website and user-manual -->
+                            <exclude>**/node/**</exclude>
+                            <exclude>**/node_modules/**</exclude>
+                            <exclude>**/user-manual/**</exclude>
+                            <exclude>**/yarn.lock</exclude>
+                            <!-- examples -->
+                            <exclude>**/fabric8/*.yaml</exclude>
+                            <exclude>**/src/main/data/*.patient</exclude>
+                            <exclude>**/src/main/data/*.csv</exclude>
+                            <exclude>**/src/main/resources/avro/*.avsc</exclude>
+                            <!-- generated files -->
+                            <exclude>**/target/**/*</exclude>
+                            <exclude>**/eclipse-classes/**/*</exclude>
+                            <exclude>**/.*</exclude>
+                            <exclude>**/.settings/**/*</exclude>
+                            <exclude>**/*.iml</exclude>
+                            <exclude>**/.idea/**/*</exclude>
+                            <exclude>**/avro/**/*.avpr</exclude>
+                            <exclude>**/OSGI-INF/bundle.info</exclude>
+                            <exclude>**/test_rsa*</exclude>
+                            <exclude>**/data*/**/*.xml</exclude>
+                            <exlucde>**/*.log</exlucde>
+                            <exclude>**/id_file</exclude>
+                            <exclude>**/dependency-reduced-pom.xml</exclude>
+                            <exclude>**/Dropbox_API_Terms_and_Conditions.txt</exclude>
+                            <exclude>**/MerchandiseRestResource.apxc</exclude>
+                            <exclude>**/file-sig-api.txt</exclude>
+                            <exclude>**/Tasks__c.java</exclude>
+                            <exclude>**/*.proto</exclude>
+                            <exclude>
+                                **/src/main/resources/META-INF/services/org.kie.server.services.api.KieServerExtension
+                            </exclude>
+                            <!-- Maven Wrapper -->
+                            <exclude>.mvn/**/*</exclude>
+                        </excludes>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <!-- see https://issues.apache.org/jira/browse/MRELEASE-812 -->
+                    <version>2.4.2</version>
+                    <dependencies>
+                        <dependency>
+                            <groupId>org.apache.maven.scm</groupId>
+                            <artifactId>maven-scm-provider-gitexe</artifactId>
+                            <version>1.9</version>
+                        </dependency>
+                    </dependencies>
+                    <configuration>
+                        <localCheckout>true</localCheckout>
+                        <pushChanges>true</pushChanges>
+                        <tagNameFormat>@{project.artifactId}-@{project.version}</tagNameFormat>
+                        <useReleaseProfile>false</useReleaseProfile>
+                        <preparationGoals>clean install</preparationGoals>
+                        <goals>deploy</goals>
+                        <!-- The profile we want to use when doing the release -->
+                        <arguments>-Prelease,apache-release,sourcecheck</arguments>
+                        <autoVersionSubmodules>true</autoVersionSubmodules>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-remote-resources-plugin</artifactId>
+                    <executions>
+                        <execution>
+                            <id>process-resource-bundles</id>
+                            <phase>disabled</phase>
+                        </execution>
+                    </executions>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>flatten-maven-plugin</artifactId>
+                    <version>1.1.0</version>
+                    <executions>
+                        <execution>
+                            <id>default-cli</id>
+                            <phase>process-resources</phase>
+                            <goals>
+                                <goal>flatten</goal>
+                            </goals>
+                            <configuration>
+                                <updatePomFile>true</updatePomFile>
+                                <pomElements>
+                                    <build>keep</build>
+                                    <dependencyManagement>keep</dependencyManagement>
+                                    <description>keep</description>
+                                    <name>keep</name>
+                                    <parent>expand</parent>
+                                    <pluginManagement>keep</pluginManagement>
+                                    <profiles>remove</profiles>
+                                    <properties>keep</properties>
+                                </pomElements>
+                            </configuration>
+                        </execution>
+                    </executions>
+                </plugin>
+
+                <plugin>
+                    <artifactId>maven-invoker-plugin</artifactId>
+                    <configuration>
+                        <skipInstallation>${invoker.skip}</skipInstallation>
+                        <skipInvocation>${invoker.skip}</skipInvocation>
+                        <mavenOpts>-Xmx64m -XshowSettings</mavenOpts>
+                        <showVersion>true</showVersion>
+                    </configuration>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>exec-maven-plugin</artifactId>
+                    <version>${exec-maven-plugin-version}</version>
+                </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>${maven-surefire-plugin-version}</version>
+                    <configuration>
+                        <!--forkMode>pertest</forkMode -->
+                        <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>
+                        <childDelegation>false</childDelegation>
+                        <useFile>true</useFile>
+                        <failIfNoTests>false</failIfNoTests>
+                        <runOrder>alphabetical</runOrder>
+                        <!-- lets re-run the failed test one more time, just to be sure -->
+                        <rerunFailingTestsCount>2</rerunFailingTestsCount>
+                        <systemPropertyVariables>
+                            <javax.xml.accessExternalSchema>file,http,https</javax.xml.accessExternalSchema>
+                            <javax.xml.accessExternalDTD>file,http</javax.xml.accessExternalDTD>
+                            <derby.stream.error.file>target/derby.log</derby.stream.error.file>
+                            <java.awt.headless>${java.awt.headless}</java.awt.headless>
+                            <java.util.logging.config.file>${basedir}/target/test-classes/logging.properties
+                            </java.util.logging.config.file>
+                            <org.apache.activemq.default.directory.prefix>target/
+                            </org.apache.activemq.default.directory.prefix>
+                        </systemPropertyVariables>
+                        <includes>
+                            <include>**/*Test.java</include>
+                        </includes>
+                        <excludes>
+                            <exclude>**/*IntegrationTest.java</exclude>
+                            <exclude>**/*XXXTest.*</exclude>
+                        </excludes>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <camel-version>3.2.0-SNAPSHOT</camel-version>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>fastinstall</id>
+            <activation>
+                <property>
+                    <name>fastinstall</name>
+                </property>
+            </activation>
+            <properties>
+                <maven.test.skip.exec>true</maven.test.skip.exec>
+                <assembly.skipAssembly>true</assembly.skipAssembly>
+                <fastinstall>true</fastinstall>
+                <noassembly>true</noassembly>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>setup.eclipse</id>
+            <!-- set up the eclipse workspace and generate the .classpath and .project
+              files for modules -->
+            <properties>
+                <eclipse.workspace.dir>${basedir}/../workspace</eclipse.workspace.dir>
+                <maven.test.skip.exec>true</maven.test.skip.exec>
+            </properties>
+            <build>
+                <defaultGoal>package</defaultGoal>
+                <pluginManagement>
+                    <plugins>
+                        <plugin>
+                            <groupId>org.apache.maven.plugins</groupId>
+                            <artifactId>maven-compiler-plugin</artifactId>
+                            <version>${maven-compiler-plugin-version}</version>
+                            <configuration>
+                                <source>${jdk.version}</source>
+                                <target>${jdk.version}</target>
+                                <maxmem>512M</maxmem>
+                                <fork>${compiler.fork}</fork>
+                            </configuration>
+                        </plugin>
+                    </plugins>
+                </pluginManagement>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-eclipse-plugin</artifactId>
+                        <inherited>false</inherited>
+                        <executions>
+                            <execution>
+                                <id>setup.eclipse.workspace</id>
+                                <phase>process-test-sources</phase>
+                                <goals>
+                                    <goal>configure-workspace</goal>
+                                </goals>
+                                <configuration>
+                                    <workspace>${eclipse.workspace.dir}</workspace>
+                                    <workspaceCodeStylesURL>file:etc/eclipse/CamelCodeFormatter.xml
+                                    </workspaceCodeStylesURL>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <inherited>false</inherited>
+                        <executions>
+                            <execution>
+                                <id>setup.workspace</id>
+                                <phase>validate</phase>
+                                <configuration>
+                                    <target>
+                                        <path id="ecp.ws.path" location="${eclipse.workspace.dir}" />
+                                        <property name="full.eclipse.workspace" refid="ecp.ws.path" />
+                                        <path path="${basedir}/etc" id="etc.path" />
+
+                                        <path id="buildtools.classpath">
+                                            <fileset dir="${basedir}/buildingtools/target" includes="*.jar" />
+                                            <pathelement location="${basedir}/buildingtools/target/classes" />
+                                            <pathelement location="${basedir}/buildingtools/src/main/resources" />
+                                        </path>
+
+                                        <whichresource resource="/camel-eclipse-pmd" property="pmd.url" classpathref="buildtools.classpath" />
+                                        <whichresource resource="/camel-pmd-ruleset.xml" property="pmdruleset.url" classpathref="buildtools.classpath" />
+                                        <whichresource resource="/camel-eclipse-checkstyle" property="eclipse.checkstyle.url" classpathref="buildtools.classpath" />
+                                        <whichresource resource="/camel-checkstyle.xml" property="checkstyle.url" classpathref="buildtools.classpath" />
+
+                                        <mkdir dir="${full.eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings" />
+                                        <mkdir dir="${full.eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core" />
+                                        <mkdir dir="${full.eclipse.workspace}/.metadata/.plugins/net.sourceforge.pmd.eclipse" />
+
+                                        <get src="${checkstyle.url}" dest="${full.eclipse.workspace}/camel-checkstyle.xml" />
+
+                                        <!-- Add checkstyle config -->
+                                        <copy file="${basedir}/etc/eclipse/template.checkstyle-config.xml" tofile="${full.eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core/checkstyle-config.xml" overwrite="no">
+                                            <filterset>
+                                                <filter token="CHECKSTYLE_CONFIG_FILE" value="${full.eclipse.workspace}/camel-checkstyle.xml" />
+                                                <filter token="APACHE_HEADER_FILE" value="${full.eclipse.workspace}/apache-header.txt" />
+                                            </filterset>
+                                        </copy>
+
+                                        <xslt style="${basedir}/etc/eclipse/addcheckstyle.xsl" in="${full.eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core/checkstyle-config.xml" out="${full.eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core/checkstyle-config.xml.new">
+                                            <param name="checkstyleconfig" expression="${full.eclipse.workspace}/camel-checkstyle.xml" />
+                                        </xslt>
+                                        <copy file="${full.eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core/checkstyle-config.xml.new" tofile="${full.eclipse.workspace}/.metadata/.plugins/net.sf.eclipsecs.core/checkstyle-config.xml" overwrite="yes" />
+
+                                        <!-- Add code format rules -->
+                                        <concat destfile="${full.eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs" append="true" fixlastline="true">
+                                            <filelist dir="${basedir}/etc/eclipse" files="org.eclipse.jdt.core.prefs" />
+                                        </concat>
+                                        <loadfile property="eclipse.code.format" srcFile="${basedir}/etc/eclipse/CamelCodeFormatter.xml" />
+                                        <loadfile property="eclipse.code.templates" srcFile="${basedir}/etc/eclipse/codetemplates.xml" />
+                                        <loadfile property="eclipse.camel.java.code.templates" srcFile="${basedir}/etc/eclipse/camel_java_templates.xml" />
+                                        <loadfile property="eclipse.camel.xml.code.templates" srcFile="${basedir}/etc/eclipse/camel_xml_templates.xml" />
+                                        <propertyfile file="${full.eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs">
+                                            <entry key="formatter_profile" value="Camel Java Conventions" />
+                                            <entry key="org.eclipse.jdt.ui.formatterprofiles" value="${eclipse.code.format}" />
+                                            <entry key="org.eclipse.jdt.ui.text.custom_code_templates" value="${eclipse.code.templates}" />
+
+                                            <!-- Add Camel templates for Java DSL -->
+                                            <entry key="org.eclipse.jdt.ui.text.custom_templates" value="${eclipse.camel.java.code.templates}" />
+
+                                            <!-- Add import order -->
+                                            <entry key="org.eclipse.jdt.ui.importorder" value="java;javax;org.w3c;org.xml;w3c;" />
+                                            <!-- Sort order -->
+                                            <entry key="org.eclipse.jdt.ui.visibility.order" value="B,R,D,V," />
+                                            <entry key="outlinesortoption" value="T,SF,F,SI,I,C,SM,M," />
+                                            <entry key="org.eclipse.jdt.ui.enable.visibility.order" value="true" />
+                                        </propertyfile>
+                                        <propertyfile file="${full.eclipse.workspace}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.xml.ui.prefs">
+                                            <entry key="eclipse.preferences.version" value="1" />
+                                            <!-- Add Camel templates for Spring DSL -->
+                                            <entry key="org.eclipse.wst.sse.ui.custom_templates" value="${eclipse.camel.xml.code.templates}" />
+                                        </propertyfile>
+                                    </target>
+                                </configuration>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <!-- When not on the Mac, we need to add tools.jar to the antrun plugin
+              for schemagen to work -->
+            <id>not-mac</id>
+            <activation>
+                <os>
+                    <family>!mac</family>
+                </os>
+            </activation>
+            <build>
+                <pluginManagement>
+                    <plugins>
+                        <plugin>
+                            <groupId>org.apache.maven.plugins</groupId>
+                            <artifactId>maven-antrun-plugin</artifactId>
+                            <dependencies>
+                                <dependency>
+                                    <groupId>com.sun.xml.bind</groupId>
+                                    <artifactId>jaxb-core</artifactId>
+                                    <version>${jaxb-version}</version>
+                                </dependency>
+                                <dependency>
+                                    <groupId>com.sun.xml.bind</groupId>
+                                    <artifactId>jaxb-impl</artifactId>
+                                    <version>${jaxb-version}</version>
+                                </dependency>
+                                <dependency>
+                                    <groupId>com.sun.xml.bind</groupId>
+                                    <artifactId>jaxb-jxc</artifactId>
+                                    <version>${jaxb-version}</version>
+                                </dependency>
+                                <dependency>
+                                    <groupId>xerces</groupId>
+                                    <artifactId>xercesImpl</artifactId>
+                                    <version>2.11.0</version>
+                                </dependency>
+                                <dependency>
+                                    <groupId>ant-contrib</groupId>
+                                    <artifactId>ant-contrib</artifactId>
+                                    <version>1.0b3</version>
+                                    <exclusions>
+                                        <exclusion>
+                                            <groupId>ant</groupId>
+                                            <artifactId>ant</artifactId>
+                                        </exclusion>
+                                    </exclusions>
+                                </dependency>
+                                <dependency>
+                                    <groupId>org.apache.ant</groupId>
+                                    <artifactId>ant-trax</artifactId>
+                                    <version>1.8.0</version>
+                                </dependency>
+                                <dependency>
+                                    <groupId>org.apache.ant</groupId>
+                                    <artifactId>ant-nodeps</artifactId>
+                                    <version>1.8.1</version>
+                                </dependency>
+                            </dependencies>
+                        </plugin>
+                    </plugins>
+                </pluginManagement>
+            </build>
+        </profile>
+
+        <profile>
+            <id>jdk8-build</id>
+            <activation>
+                <jdk>(,1.9)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <dependencies>
+                            <dependency>
+                                <groupId>com.sun</groupId>
+                                <artifactId>tools</artifactId>
+                                <version>1.5.0</version>
+                                <scope>system</scope>
+                                <systemPath>${java.home}/../lib/tools.jar</systemPath>
+                            </dependency>
+                        </dependencies>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>deploy</id>
+            <build>
+                <defaultGoal>deploy</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-javadocs</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                                <configuration>
+                                    <additionalOptions>${javadoc.opts}</additionalOptions>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>source-jar</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>release</id>
+            <activation>
+                <property>
+                    <name>release</name>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <!-- We want to deploy the artifact to a staging location for perusal -->
+                    <plugin>
+                        <inherited>true</inherited>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-deploy-plugin</artifactId>
+                        <configuration>
+                            <updateReleaseInfo>true</updateReleaseInfo>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-javadocs</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <additionalOptions>${javadoc.opts}</additionalOptions>
+                        </configuration>
+                    </plugin>
+                    <!-- We want to sign the artifact, the POM, and all attached artifacts -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <configuration>
+                            <passphrase>${gpg.passphrase}</passphrase>
+                            <useAgent>${gpg.useagent}</useAgent>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>doclint-java8-disable</id>
+            <activation>
+                <jdk>[1.8,)</jdk>
+            </activation>
+            <properties>
+                <javadoc.opts>-Xdoclint:none</javadoc.opts>
+            </properties>
+        </profile>
+
+        <profile>
+            <id>cleanrepo</id>
+            <build>
+                <defaultGoal>build-helper:remove-project-artifact</defaultGoal>
+            </build>
+        </profile>
+
+        <profile>
+            <id>license</id>
+            <build>
+                <defaultGoal>license:format</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>com.mycila</groupId>
+                        <artifactId>license-maven-plugin</artifactId>
+                        <version>${mycila-license-version}</version>
+                        <configuration>
+                            <header>header.txt</header>
+                            <excludes>
+                                <exclude>KEYS</exclude>
+                                <exclude>**/NOTICE</exclude>
+                                <exclude>**/LICENSE</exclude>
+                                <exclude>**/NOTICE.txt</exclude>
+                                <exclude>**/LICENSE.txt</exclude>
+                                <exclude>doap.rdf</exclude>
+                                <exclude>**/README</exclude>
+                                <exclude>**/*.adoc</exclude>
+                                <exclude>**/node_modules/**</exclude>
+                                <exclude>**/cacerts</exclude>
+                                <exclude>**/*.p12</exclude>
+                                <exclude>**/*.txt</exclude>
+                                <exclude>.mvn/**</exclude>
+                                <exclude>mvnw*</exclude>
+                                <exclude>**/META-INF/persistence*.xsd</exclude>
+                            </excludes>
+                            <mapping>
+                                <java>SLASHSTAR_STYLE</java>
+                                <properties>CAMEL_PROPERTIES_STYLE</properties>
+                                <spring.factories>CAMEL_PROPERTIES_STYLE</spring.factories>
+                                <spring.provides>CAMEL_PROPERTIES_STYLE</spring.provides>
+                            </mapping>
+                            <headerDefinitions>
+                                <headerDefinition>license-properties-headerdefinition.xml</headerDefinition>
+                            </headerDefinitions>
+                        </configuration>
+                        <dependencies>
+                            <dependency>
+                                <groupId>org.apache.camel</groupId>
+                                <artifactId>camel-buildtools</artifactId>
+                                <version>${camel-version}</version>
+                            </dependency>
+                        </dependencies>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+    </profiles>
+</project>


[camel-karaf] 02/05: Camel-Karaf: Added KEYS, LICENSE and NOTICE

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git

commit 74991e0811aee6adb0110650ae98b202ecd701c5
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Mar 23 08:50:51 2020 +0100

    Camel-Karaf: Added KEYS, LICENSE and NOTICE
---
 KEYS        | 1773 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 LICENSE.txt |  203 +++++++
 NOTICE.txt  |   11 +
 3 files changed, 1987 insertions(+)

diff --git a/KEYS b/KEYS
new file mode 100644
index 0000000..5099276
--- /dev/null
+++ b/KEYS
@@ -0,0 +1,1773 @@
+pub   1024D/F5BA7E4F 2006-02-10
+uid                  Hiram Chirino <hi...@hiramchirino.com>
+sig 3        F5BA7E4F 2006-02-10  Hiram Chirino <hi...@hiramchirino.com>
+sub   1024g/6733C080 2006-02-10
+sig          F5BA7E4F 2006-02-10  Hiram Chirino <hi...@hiramchirino.com>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.1 (Darwin)
+
+mQGiBEPspSsRBADdguKAxMQbA32vTQrCyONR6Zs/YGdvau2Zrr3SSSSR0Ge4FMjZ
+4tzwpf6+32m4Bsf7YIwdLl0H5hI1CgT5gDl9kXvfaFUehFnwR+FDyiBRiyHjUpGF
+4dgkQfWy9diYeWGtsvszsvWHXtED4SXb322StX4MfJj+YesA1iEdTiXK6wCg1QDa
+RucfjC+kx4zPsJwkJOgYpyMEAMTiXtNwQcke6nIFb/lb5374NjwwVAuuMTrRWLyq
+5HodugEIHaw3EitQWtnFfXNkXTJZzS6t2HAGv29UTfhiBzKdkydgCkOk2MLWISOV
+fqcg0tNIp5ZJCmUHg3s+OFNSH4oUi65u+FyDseUid3OKtPI+ZhIk8N+DjOIg2Kvo
+/UALA/9q+WfBd7re+W3iUtU7TutUcwbKsjP+jpaJeUHg2ChOBxVfQKt4YlPHVdrR
+iCrfNi90Z8qbsZ0iAXuqexrfMq20pAPmpHRpe54mmP1CMT5m+Gq71eKIfkUrb3LC
+/zv08dLG2vm9oghd242wbcifaX+t7AhNAIpe/WTvQsB0gpdO4LQmSGlyYW0gQ2hp
+cmlubyA8aGlyYW1AaGlyYW1jaGlyaW5vLmNvbT6IWwQTEQIAGwUCQ+ylKwYLCQgH
+AwIDFQIDAxYCAQIeAQIXgAAKCRCf8lmA9bp+T/G/AKDM1QDs7il/CJhTycgDvE3c
+EOgUBwCfelsVK4sgBCooZptoaCCDgVtt71G5AQ0EQ+ylLhAEAJD25AWgwcNgBFKY
+svExQaGIojIGJyn4Cf/5U30cui/K7fIU7JtyNhKcfZdCrh2hKx+x3H/dTF6e0SrR
+hzKV7Dx0j76yhHHB1Ak25kjRxoU4Jk+CG0m+bRNTF9xz9k1ALSm3Y+A5RqNU10K6
+e/5KsPuXMGSGoQgJ1H6g/i80Wf8PAAMFA/9mIxu7lMaqE1OE7EeAsHgLslNbi0h9
+pjDUVNv8bc1Os2gBPaJD8B89EeheTHw6NMNIe75HVOpKk4UA0gvOBrxJqCr18yFJ
+BM5sIlaEmuJwZOW4dDGOR1oS5qgE9NzpmyKhE+fu/S1wmy0coL667+1xZcnrPbUF
+D4i7/aD1r8qJhohGBBgRAgAGBQJD7KUuAAoJEJ/yWYD1un5Pth0An0QEUs5cxpl8
+zL5kZCj7c8MN8YZDAKDR9LTb6woveul50+uGtUl2fIH1uA==
+=RBPl
+-----END PGP PUBLIC KEY BLOCK-----
+pub   1024D/E31AF533 2007-12-17 [expires: 2009-06-09]
+uid                  Hadrian Zbarcea (Apache) <ha...@apache.org>
+sig 3        E31AF533 2007-12-17  Hadrian Zbarcea (Apache) <ha...@apache.org>
+sig          B4493B94 2007-12-17  Guillaume Nodet <gn...@apache.org>
+sig          BB550746 2007-12-17  J. Daniel Kulp <da...@kulp.com>
+sub   2048g/6180521C 2007-12-17 [expires: 2009-06-09]
+sig          E31AF533 2007-12-17  Hadrian Zbarcea (Apache) <ha...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+mQGiBEdmrcgRBADzy0H/OIT7ASGfTj4JDdnBiJCQfSZpeY2n3r5yW0tzMtb1jik/
+TyAwGyWvXMUCrRHlw33dVKNLztFQcNDfprmZxxORyTphhf6MMDhp3nAk56KT0vSF
+i/D8Kh4ERb86/bjveJDZJf0oPIaiwTz6Rdr5YxJCkR58cW/xpxBayb858wCgoex4
+1/1wipbpe7mGp9H2g8r/8WcEAOkm7S8gcg3NLZ62+RCwUZOJuIKCnq/UlwPEfIEL
+WwnOFVn3rL+y8U1560U3LYIAykBko+aCa7ZvqwvrW4OPUXJi+6MR1dKBAPiOQYkW
+NCtcGLa/Wdrxo5wjrP/XBFpSabvmxv19LUW8SJr/vH3XWQRYm5SJlnBaDgAzSBp3
+Cb7CBACj8wi9tJ8k5U/VV74ORRBJltlqaWBtMm3q9zf5WN/Rb1fxnfpZjvvpDQjQ
+PY6W0RNufE8V27558aTfuniBAVBOvxn4xedS91L7PMB2D/32J09/ICYFT9ekYGTA
+5Yl2pcTLd8PZu8MjFUssa8k/oxG9XrM4Zd764eIOAT+FmrZX9bQtSGFkcmlhbiBa
+YmFyY2VhIChBcGFjaGUpIDxoYWRyaWFuQGFwYWNoZS5vcmc+iGYEExECACYFAkdm
+rcgCGwMFCQLH6gAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRAINWtR4xr1Mzuu
+AJ9mQdn6z2+gh5dDi6/fX7k1tISp7wCeON1lHB3RaQfJrabz63bLkKzROeOIRgQQ
+EQIABgUCR2a94wAKCRDs3+o8tEk7lJzcAJ9qAzsu1SoLekNJboMzJbsuQxrgNgCg
+vZcr6fHEXJajUejbOkd8caQQFQyIRgQQEQIABgUCR2a9SAAKCRCryO45u1UHRgf6
+AJ9BCGTjrCOQsrIfLYoIVxTVDT9pCACeMYK/6kaf80OHvBwlM3BwQbXBF065Ag0E
+R2at1xAIALiA44fG70XTj+XnlAbqq705B/yTCOTkOJh/Jayof9Rp78cok2eeCKOO
+HZ+YupiWcp6shdmyXAQGcfxyqcyskPIG42wwoDBONWj5kMvGbuJgooZRwDhbaPaY
+PRAHhPlCj+QTrzTsTJmy94bzYkkbfqNI3TOyvKUzmgYy9TLfLku7dLzncmSs+W/d
+bzjRpeoyLxQ+t7aeHPjxG93tIVvNrFHgAYGgvof5sWl0h0MitSVI7PHvVlHTHhNG
+dJ/quacr+xYLdF95eXDXGPvM0Jl/+UJk1GFdoDd1LXdzo0d4OzEMv2mWPZy+HVnB
+MFjTsrZp7+YIJj3WXU0WVgX0p+AYjE8AAwUH/ieONEnadpYN9bShfJKOiSNxlZ8L
+Y6L1nrWIhXtfibPIJsaW5AkFugVZfpMqvODV+ccildADJRQRvoRP7xUedztedeLw
+3ZsK5ApIoEVeEx9oSaS06QgQ8CFRptb3hRFAAmb9tzWalxpghXUR63fMO0bpaKDI
+VgFykuJyLjcW5RQsSHqfNk4LbfaSq3qCGL/3iVZlFtk4dbo70NLzFC7MnG27CWKK
+NPLjldTQXDU388GTzYqQTdy+SyPj9TzBFTlOATg+4a6KQsL9KMMMJQ56VX1c5Hyp
+WYkcDV9c/38/zVV80BfqYuX1DAJty3uRKn9+d86SYHDQ2YN4wDE/UtQpwsaITwQY
+EQIADwUCR2at1wIbDAUJAsfqAAAKCRAINWtR4xr1M27MAJ0VEQ9j2h5cgdhbrXnB
+bMLb26TK5ACgjeCxQDIepWB96CZMGDPb2CMdeFg=
+=2f9B
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub  4096R/6A70C608 2009-06-10
+         Fingerprint=4AAC 7338 D125 F866 4167  6AF6 1522 6672 6A70 C608
+
+uid Hadrian Zbarcea <ha...@apache.org>
+sig  sig3  6A70C608 2009-06-10 __________ __________ [selfsig]
+sig  sig   B4493B94 2009-06-10 __________ __________ Guillaume Nodet <gn...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: SKS 1.1.0
+
+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
+HzSpeZz97HtFnC/bNqM=
+=H3nh
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub   4096R/F43856A3 2009-08-22
+      Key fingerprint = 51B5 2DC5 DD45 2F92 BE34  2CC2 858F C4C4 F438 56A3
+uid                  J. Daniel Kulp <da...@kulp.com>
+uid                  J. Daniel Kulp <dk...@apache.org>
+uid                  J. Daniel Kulp <dk...@progress.com>
+uid                  J. Daniel Kulp <da...@sopera.com>
+uid                  J. Daniel Kulp <dk...@talend.com>
+sub   4096R/6A36A392 2009-08-22
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.17 (GNU/Linux)
+
+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
+=xhT3
+-----END PGP PUBLIC KEY BLOCK-----
+pub   1024D/7FBBDC54 2007-09-24
+uid                  Freeman Fang <fr...@gmail.com>
+sig 3        7FBBDC54 2011-01-05  Freeman Fang <fr...@gmail.com>
+sub   1024g/9A39DC2F 2007-09-24
+sig          7FBBDC54 2007-09-24  Freeman Fang <fr...@gmail.com>
+
+pub   4096R/9F9C8684 2011-01-05
+uid                  Freeman(Yue) Fang (new signing key) <ff...@apache.org>
+sig 3        9F9C8684 2011-01-05  Freeman(Yue) Fang (new signing key) <ff...@apache.org>
+sig          7FBBDC54 2011-01-05  Freeman Fang <fr...@gmail.com>
+sub   4096R/C1270665 2011-01-05
+sig          9F9C8684 2011-01-05  Freeman(Yue) Fang (new signing key) <ff...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG/MacGPG2 v2.0.16 (Darwin)
+
+mQGiBEb3GWIRBADPBQjRwj9zqK/o0O+ahz02OncAN4AoSkv6W3BpRV3E4t6Agq40
+KhleD2BIn94eV6sAt+JltFhqFC4vrb35dmCqVqX6Rmi5X543aIJTBdUYKfbirbxQ
+zJZMv+AxgSfWRHQo5LCV8H20DjLybso/YDuSkA8xFqGnnypvNH6alUhBdwCguaJf
+2NiJCVllFTbfKiFbFyNKLUcD/3OXL5cI0sDPz7YhZ9bcFZC4zf2/5N1xFgavfmU7
+OWQpQKoP7jJmvNofNNHcDOBrXnG7L6+DxMUmL93QwUpuYh1/v9v0oFmTifXn8/12
+Px/bDdfJVHQGGXYY5+FmtVCcvC39hdcjUA52+yBZjaHeNyCP5533+ieh2l1QXPIT
+OH+8BACC6BeHZ3ONFtxfnaAsvlUQvmEZsWyIa6UaLmJUxWObYjtbW3USbEepCHGs
+K+b4x4TB9Sb88NrLuXl8EU2zAeiO0UE6OlXrhpvx0xbs2er8S65Zn8fUZCK3G467
+/n7lbmRUMRmQaLzwDrZSPo9a36RF+e2wWBk8zA1B69VdVFdcRbQlRnJlZW1hbiBG
+YW5nIDxmcmVlbWFuLmZhbmdAZ21haWwuY29tPohWBBMRAgAWAhsDAh4BAheABQJN
+JFRTBhUKCQgLAgAKCRDjK/8if7vcVDsaAJ9ESZgmrWO0lBoLYz0BvO1ydNoEywCe
+K+NJ3cheqgcyEmkhQPjJ89g5+Bq5AQ0ERvcZYxAEAJRJuWzIlKYu7yDq/1Ed+eC3
+6rbi21mGVfQ58HkrkW/glMpLfwxCZVewwn4Gr0Ooi07jEcA3fLhG0CQldKPVcSGw
+JVzY8+Ix+CpaKHKrXZ68Qj47pXkN99ctbmPpTTgqcsh0ozeOIjWSjCjvuFkawet1
+fhsVp/fjQyjdPjZ1ojTDAAMFA/4txISVDwFgfwqt+T0V0YFt9P3+KIaEGs1H6ipQ
+ujSt3GFy01ezLC9HDFG5vd7RFj2uoYwUu7ajaDtkcB0b2i/TtzdM2VFHfoOH/cQL
+Uwtmbx1u1EC0+dzsA4G0EjxMz+/AgQLYcIcrEchhLDY+pC+I0cjjK7h46YO1hGNU
+w3rpw4hIBBgRAgAJBQJG9xljAhsMAAoJEOMr/yJ/u9xUjK0AmKXZKposMEdmfcLK
+A36vMcxR/gkAnj6OoFeo8i+9j+2H1sX1l25PoSWXmQINBE0kVKQBEACshOznApFj
+OJp5FGstZoUtsBHvVXcYlbNMWzuVmcS4qIqfT6qjrMUjLX8OTyjdBmN+jOvCxFGt
+QRmzC9XOQsz8Nu8MhN88rZzmKsmOGZR7ZlIkbNQpNJx6k4f30Sqx8bw44kJUlrVl
+pm+fnjnbwfjVRjL/reDKGzfKrUoBWMg1A3cofuESwrrziHgMjfGu9FusulDMA1w5
+7JR/9z76jmr9Zx4XDswjPl+SEQ7CsckLaSWSv0sqYVAeGvGIlWkR/1th2Guz3lRW
+BhL1uhhpW5xF0F1Fr4LK3UwTO2xC+l4xJTh9kT8CzCPCWjaZEUf+JUHvK3qjeBzk
+1YFMRjUj+OapIJDKknPJvzXDoWEAOkn15/a4Nw44G54vJom9tc8Nsvq6Wg0mBwsF
+RZJKeEPzuQPmQK1sTFGYiWeDciwabzjdwwC4EQEqgt28jH+pK3FsCMQKX/XWl7Zi
+IRB2fxn1GDkd3ZuelZVwWtqnSlD7d4ToTSljq4SbPlr5pbrX117CenQXSppieC1R
+q558HVsb4xEpPp5IaM2YS0AEAPBu0VIZp5efunQjun1hDPPpltZKTaCh6O4BtF2R
+MS4sxmLSgEFOrbyZutv0INrYg58FXk4QYTN1gjsj7j28hlwXsU9mdDp3KjT0CpmW
+tGes/Ytraax7IEIyPko/DPrZLCJhfUyuDwARAQABtDZGcmVlbWFuKFl1ZSkgRmFu
+ZyAobmV3IHNpZ25pbmcga2V5KSA8ZmZhbmdAYXBhY2hlLm9yZz6JAiwEEwECABYC
+GwMCHgECF4AFAk0kVc8GFQoJCAsCAAoJELWdPQ+fnIaECPUQAIhxVXlw0VML6Ogk
+xXmZcl+jMiGzrdZrclZgumdflBuX4wkLxCceuiwzVfTPvFQulGryYcf9HBoqrXQr
+yJsCVM2176CNo31XlrnqYh5+/DKlwcGQtiNSZjjwcFe+BX1RcOXsDc1QV5W6AQkt
+T7/ogwiwq1kb0Rp14c3AO9RUGZeVpNXhUVlcp+BYc1QaXWlbYwUYznyhCnOHlQGq
+3Y+JbJh6eXhPxmOWNm9BJIS64DXABwyALBkLt6MGkwxNxJ0cUm69/HyUS97K0EFW
+kYIwRmWw+y4X/1br0zGuM6EPUK2CxAR4QTlZ222R6J+Q8IgtZZRnJ+0Uf0KD4RTZ
+6m9/gDNGXk6wPv0tXABSx9CKjP1DqrIByF86AZ1mA9ZAP5fGxGWFy/kPr60FE3hU
+fEXYGKXC9u8yyvnNwF688/dz4r3fz2pcw1gfmOM70gTy5+0QLg/fcic5gvlyShyT
+RwrDyjwdONaqOYgluhFhhmHmonQNWlCGII2JGXGN2o9cp34AvsK0plF5ZJNsWDre
+rIliAImcXKCRHgivSMdgNUU6T6rw4DlcU0dpGD1iMytmS3UTod+dDxxut8aSZbBV
+VgxP8P67lj0U9kTrkXXLDAl8fYAcfVWUIqIKvUZBJ14xOkTqSfGiNkTaQ6TRJLLh
+UEhX6E6tv7JnSnZi90SKY7YE2/6wiEYEEBECAAYFAk0kVkQACgkQ4yv/In+73FTo
+BgCePGkgDrONFTce6CAqq0v3Eb8G+2AAoKWd3MIwTfdTMi2OV/oax9QDXvdguQIN
+BE0kVKQBEAC/Li5vRmGyNNX6n1qrSYESUTgzzIBPdin5n7fga0oTU51fc5pzl8oF
+2ioKdSnGneZRrZouMrDf8nUmIZHZLTe5Kz9ncCFx9VtVhOkp84bwe9gBLrqglDy0
+mn5uB2DlRi2iB6vmxMy4Lm8mblGycJxN8uaAerJtHhNkInAYAY3SRl/zGZfrweFn
+WlFRAsjMYl1Ml3y0dv7WGfb/TmakF2Ngh3iMgaWAbzF0oC0NZ0VLSY9eB5SCg9Kb
+wFMf+T4cYjzM8OH89Lmv5if7CC4PQ71voVC90rfNweLQ0hMT/t+gFL1vwludjZ9M
+57flxMUta/RJk4yJ5wc3LBH8xf+Br8tTkX0Q5yCdMskCw6CMImDQjJNDUD7gfb/f
+pkX7qW6hfLBRpdK8Iwk5q06/bjZZa2VfCL6gZO3U5i1+HQDbCqfz9RVcrT6VDzY2
+RIB6KxUDa9xrEEzO+kTKMuW6gXCplPInV4Jfi3payCrH1G8hvAA/CsNr+uqICRFX
+kE8uKn1c6b/1dsUzJdMwnCT2V6+DjDtESbil4AR+p3PIzDl03kyRjk6QvLeQ/UEq
+aaspV9QFiVt1unhu/7sKlZVSlAZE0MNREiKnvr0xdG+IZVo8OO/F50+4Esew82oM
+9RTmTxLpyTbhc2byb67cXjyv+1I/jUXdyv/7JKUtv/FRDcCj/G5gOwARAQABiQIf
+BBgBAgAJBQJNJFSkAhsMAAoJELWdPQ+fnIaEgjsP/AufC5z1XsKD9qz/VWhp0hwI
+LCIY9au83XHUpZdgYm56VjVh9V+YmVoT0I2dedRrw9bMtUc8xLFvV/uY3iFvioOi
+lGrhzdqiWFw3DH/gIJ/D2U2XmAbAOj8ZBa0Cd0L5n6hlE6ztpaE3xqXG+y3vxm5w
+Chq0/6id0S3MRpPVH6rVlJBeAL3fqbT3Pt6eCsc9JEkNY3ek8oTg2tWzz2fqafF4
+KTvfIec/0+8GuzKRU2uiCJz/h4nl7wy8CO2Hrx2nqrvXq7O84u7EHp1AxNX9No+9
+Lc5k9+CmDtlUpNnl8XU9K/Ld5aIJHZLE4YRTb3oWf1lVDrvPbm9lSq0psaP6M0wr
+oMYie2UeszVK4xpRSP2uCWIINRL7hFP+AaPgS0pgudfXOE8ac8Wl+hQIhENxrrUz
+puBOVAzRGEAZE7popymd79TkttFofFJguJtHRjGUP2q+vVFt+Xrg3cm61ZNcgwhz
+fvYEnW4fIYDnDwBP7FLXbIuj9CpdVk5y05FGIEJXHjETj8Lll95npK2WgcfRnFC7
+XmfXs9o6izeRyWvNBGzUldooBSNibsQJLdzjuepjpW+sbKFaoTtcLUO20ZlYpmb8
+aXBFB9GtEAATQf2vS/UJw/PtInCQlF3Or3MmBPYR0qZVLHIxBjZRheRFSWffpThw
+/Gq+wPWmBdjNBDyd5REj
+=aGvL
+-----END PGP PUBLIC KEY BLOCK-----
+pub   1024D/AE8DE9E4 2008-02-26
+uid                  Willem Jiang <ni...@apache.org>
+sig 3        AE8DE9E4 2011-01-07  Willem Jiang <ni...@apache.org>
+sig 2        7FBBDC54 2008-02-29  Freeman Fang <fr...@gmail.com>
+sub   2048g/7103E49E 2008-02-26
+sig          AE8DE9E4 2008-02-26  Willem Jiang <ni...@apache.org>
+
+pub   4096R/14D0DEE9 2011-01-07
+uid                  Willem Jiang (CODE SIGNING KEY) <ni...@apache.org>
+sig 3        14D0DEE9 2011-01-07  Willem Jiang (CODE SIGNING KEY) <ni...@apache.org>
+sig          AE8DE9E4 2011-01-07  Willem Jiang <ni...@apache.org>
+sub   4096R/FE639F22 2011-01-07
+sig          14D0DEE9 2011-01-07  Willem Jiang (CODE SIGNING KEY) <ni...@apache.org>
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG/MacGPG2 v2.0.16 (Darwin)
+
+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
+gxPfPeJOHeS8nl6gLwgouXCN/s2so4l1YeE3ig==
+=lu9b
+-----END PGP PUBLIC KEY BLOCK-----
+pub   4096R/2A239C2C 2011-11-01
+uid                  Christian Mueller (CODE SIGNING KEY) <cm...@apache.org>
+sig 3        2A239C2C 2011-11-01  Christian Mueller (CODE SIGNING KEY) <cm...@apache.org>
+sig          4E24517C 2011-11-10  Hyrum K. Wright (Personal) <hy...@hyrumwright.org>
+sig          C4FC9A65 2011-11-10  Bernd Bohmann <bo...@apache.org>
+sig          1F49ECA5 2011-11-10  Ulrich Staerk <ul...@apache.org>
+sig 2        F2EFD0F0 2011-11-17  Christopher David Schultz (Christopher David Schultz) <ch...@christopherschultz.net>
+sig          352ACF76 2011-11-11  Richard Keith Turner (CODE SIGNING KEY) <ke...@deenlo.com>
+sig          B84508EC 2011-11-11  Bryan W. Call <bc...@apache.org>
+sig          B6CD3280 2011-11-11  Udo Schnurpfeil <lo...@apache.org>
+sig          F5CBAE6B 2011-11-16  Akitoshi Yoshida (CODE SIGNING KEY) <ay...@apache.org>
+sig          0208FC11 2011-11-14  Carlos Sanchez <ca...@apache.org>
+sig          088335A9 2011-11-24  Chris Darroch (CODE SIGNING KEY) <ch...@apache.org>
+sig          E1303A99 2011-12-02  Marshall I Schor (Code Signing Key 2) <sc...@apache.org>
+sig          791485A8 2011-11-10  Jim Jagielski (Release Signing Key) <ji...@apache.org>
+sub   4096R/7501638F 2011-11-01
+sig          2A239C2C 2011-11-01  Christian Mueller (CODE SIGNING KEY) <cm...@apache.org>
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: SKS 1.1.0
+
+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
+21fnJtXDujubpXKuQqFl/SY=
+=drZJ
+-----END PGP PUBLIC KEY BLOCK-----
+pub   2048R/94CB9113 2013-02-04 [verf�llt: 2017-02-04]
+uid                  Babak Vahdat <ba...@swissonline.ch>
+sig 3        94CB9113 2013-02-04  Babak Vahdat <ba...@swissonline.ch>
+sub   2048R/CB41C100 2013-02-04 [verf�llt: 2017-02-04]
+sig          94CB9113 2013-02-04  Babak Vahdat <ba...@swissonline.ch>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG/MacGPG2 v2.0.18 (Darwin)
+Comment: GPGTools - http://gpgtools.org
+
+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
+S0maYlA=
+=OANb
+-----END PGP PUBLIC KEY BLOCK-----
+pub   2048R/9C8D3B59 2012-10-10
+uid                  Henryk Konsek <he...@apache.com>
+sub   2048R/4DF29C4A 2012-10-10
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+mQENBFB05RYBCAC5Gvz0zm/upu2XNyiDCxGe62vCjRWGo+lLRmlAYxYLm9iMI7Tf
+8Vh32TlgVCn0D0fKsFzz/7cmPCXjaTNH/8wc+cJrZVPgO4+9h9DKPADjtpbaYIgR
+toHMSLHH+jzcIJ4Q3uCXR0CoM7tDvybCfHGInkUTECYGEa6Owbl6yJ/KBfUqXxGk
+hayAnNXO3kQXWutqkCEfUmGbXHq7YYcPf2jQc3a1oIB1BQcMSGOlsko3Dvf/kOrr
+7tiEOAlpdkQRc5oSnw4wmWwU+Sij9kTdymka5lCBxhrgsnv4YhFgn4tXyhn405pR
+l4MBcvDanM3KpVHYzNKfb2SMgpVdqk1A8hxRABEBAAG0I0hlbnJ5ayBLb25zZWsg
+PGhla29uc2VrQGFwYWNoZS5jb20+iQE4BBMBAgAiBQJQdOUWAhsDBgsJCAcDAgYV
+CAIJCgsEFgIDAQIeAQIXgAAKCRBo2rMmnI07WYAiB/46HxLhPNNRQ0O1sThZZiXz
+OrELs0KePIDMb2Y++N/iRiR5qi/sCXmLD1AvHaknCN7fucWiVnRepGAgogC2rt8P
++Cnfa+aFo+Cck8OXX915GS5uUoWJhdMWRAAgVBNg5LdiAQD0dkG2v8uzfAW1n/eR
+dvnSGTGzxAJ2kTQ9zRuljOKYn639w/ErfzN88jNpVNe658xHRgwxVOxxRuWHW5EF
+Z5YWZZDAkhmbKPk8nnbdqJGXI/mGbczGYIZt9CJcy5dbELmFoz6aFL1dYMwzHFjv
+LKZSrxLi52vXny3gNOCOki21cJWqnDYrlZTXoHteb3dftJvuf+yW5SjTRc0lx1me
+uQENBFB05RYBCAC8oKi2jJ39OAtRC7BTeaTIcTtTeoZel1xTL6jxOt5ijF8md2ra
+VL5lVhrthCWuWXanypT3Gc0lcn14RcFy3zXdEamRmihpKfSsMzbmvd2BD7PCzwk7
+6My8XRHXuwWCsjdn2RmtwUMNlkOVSMAMOiUEQg2nUOIQkzblMmzlYH+3aTrYxdn+
+y6J2/odY/SVrOH2crmImh/pPB3Q9u5LA+G3wXWsyccIBQgPqTtMLpEZyyL4/1MiX
+cjnpA90ICyhC0AYSAwNe0yshKy702ucGO3OwpNPEm5L6hprw0TUZDKCcQORr5sI9
+teR2rauC8Q582mIiB9WMN2vJ2MMUO6kGJtkpABEBAAGJAR8EGAECAAkFAlB05RYC
+GwwACgkQaNqzJpyNO1mFegf/bTN0NFDem3bGMSlEZedOTUMSRsEGZY7/nD0sfmLe
+gSsAoxKQg48/MnSFRGgWkSCSkerZRtjmLi0JguP0ufxcV/t5dd0nbYrIC/YrYHNu
+hijWCHSd+XY67RD9sQ3AV+SA0/4y8vZlnudrDz6SvP5EV3bZ+p8TBE7ch7OgyLM9
+zisG9BugFPsD5S7Zy0+ES2x4E+IxVYzZrUiajfT1PLrAgLfQ2TOwCggvSRU17xu8
+VcGkOXenZaUgBAp1p1GyxGlmFa8/VJAhsMzUvOUVU2T3nVKb/moMk7kZ34L11Ycm
+O89+mqkE1TM0W6OF2aHV+RbQgyyufR/gsvKBfIKxEDATew==
+=eNwt
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub   4096R/5942C049 2015-10-15
+uid                  Gregor Zurowski <gz...@apache.org>
+sig 3        5942C049 2015-10-15  Gregor Zurowski <gz...@apache.org>
+sub   4096R/A48CCE10 2015-10-15
+sig          5942C049 2015-10-15  Gregor Zurowski <gz...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+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
+uxLacDc=
+=QAF1
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub   4096R/6B400F69 2015-12-17 [expires: 2019-12-17]
+uid       [ultimate] Claus Ibsen <cl...@gmail.com>
+uid       [ultimate] [jpeg image of size 13356]
+sub   4096R/5E3FACEC 2015-12-17 [expires: 2019-12-17]
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Comment: GPGTools - https://gpgtools.org
+
+mQINBFZybkIBEADjxTHn+rgc0kSVC7AbzFAI3IwVaSl0G1NOP+6lxZ/JbIlEONat
+yJCpiDz9vPV5zSv0ErkRLXxzS2jl0letfqcaVl1NfQFxoKBrh+2z/S6jHWaFgItz
+y7rdGNnPZBgPIINzQ0EGz9rYS3QatdurGZB8U06NEgLWOhpNFSZ9UQZKU6WDHhw9
+9y2jcgfhxEdGxMUv/KxoWY9CICSLMrtLHLQmshLW24aIXZJXhi6X2wjRJdrAS1gb
+1kBci71st20i3EU9qP5vKwxefKEhqx5D3oBwVST3wQyI9t5yl1XnQwffCcFDkhg0
+NeRZUgntA9cdJ36qoO5g9dXOaUplm1gAqHes3uM29O7J4RabXdHv6wASeDWIP2NI
+iGyyMOnC16h0n5IaTD294bLXo7/iOuuXPxMXfq7qq6p2n/bRVNrpX3XT0gIuowHE
+rtHqPBixTAOeaU1S9qWmyBgF0OuW+GD2SkU8moDEIAGItYmu+riFib0Hv4I3cnRJ
+iPeP1Ne0f10tceUNLC5hBsmIfJA5DURDMGQONZZUePgwkcpT6IPvIQhdemWE62B7
+v2v/gnlidWe6QAZa/LJmr2s88p59CGpm1x7SXKbxGMr+T90n2NTS15cn9XCi7sF0
+A9LTEhaePO3uPzMORmbjjmo5VjwhlBNrvItr9dHgxPDUeXMZmWCr+K0rMwARAQAB
+tCNDbGF1cyBJYnNlbiA8Y2xhdXMuaWJzZW5AZ21haWwuY29tPokCPQQTAQoAJwUC
+VnJuQgIbAwUJB4YfgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRDdcFCna0AP
+aYmKEACfLh42vaslFiGJsgw25oWVTKDqKkBEukHWCqcBMjkoClBWLD5sl1pSnCiR
+tlUnwHMwyQz7d/jfsNDFvuZrAVh1Tn6ZhOUzDWaP11N2dJlB0fFCu5LDoEY2l3xV
+0Ku7SEh9Kqbf/Ia3rlYYVafwFarFzyydE9gTlQMxC5kuef/SHDOAZDYyXY1f+hCw
+63CuylDKTZQzPi1WgBpBeOpSZaIdeMGg9+YzaH5414yyEG0eUFialR8OVvpXLyNe
+95RFH+74DPXcGvU55QidKnDuEMCpoPgscYPyBwk/tJC6/+kIN63xk24Vxs6PK0lD
+QTN+R9tTUpx6peg1cpxzul+hUKIqWCNLKaC8r4dNvqlfg5onUqxGPloaVZciVqhg
+v6Pg2spFoDMdLeAvS7xIEKTz3Zsu2mo3YisqoD9QyX1CZ+qyzlJH2CrBnid+4wUi
+kBnCvjXPjhxEqcl6vvv2B0ZpxvYlsMJkegKKSEqUzLHLMSswrsDFX0wMT9nnbD/P
+xlJtSSYwHwd+xd4ABgRLyW2Z2ExeNABH45LHoIyqp5jokYfDzLIb7VsrN+d1l/PN
+Rz5xoai49GTXYk9gFyRC2eETzQs5CMkaX1uGQd8imv2vpC8ZxTSJhm1PJDaMuURL
+egUvNXl8amjU95ZBpwwpsuvoxCAmQbcv7KMt7JuBb7q2cCtM1dH/AAA0Qv8AADQ9
+ARAAAQEAAAAAAAAAAAAAAAD/2P/gABBKRklGAAEBAABIAEgAAP/hAGRFeGlmAABN
+TQAqAAAACAADAQYAAwAAAAEAAgAAARIAAwAAAAEAAQAAh2kABAAAAAEAAAAyAAAA
+AAADoAEAAwAAAAEAAQAAoAIABAAAAAEAAAFAoAMABAAAAAEAAAFzAAAAAP/hCSFo
+dHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/
+IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1s
+bnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4g
+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIy
+LXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIv
+PiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz4A/+0AOFBob3Rvc2hvcCAzLjAA
+OEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv/AABEIAXMB
+QAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1
+EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR
+8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdo
+aWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE
+xcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEB
+AQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQF
+ITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3
+ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SV
+lpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo
+6ery8/T19vf4+fr/2wBDAAoKCgoKChEKChEYERERGCEYGBgYISkhISEhISkyKSkp
+KSkpMjIyMjIyMjI8PDw8PDxGRkZGRk5OTk5OTk5OTk7/2wBDAQwNDRQSFCISEiJS
+Ny03UlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJS
+UlJSUlL/3QAEABT/2gAMAwEAAhEDEQA/AKPGMYpoxt6U7pTRyKCA5FHuKWikA3FB
+p3PWm/WgA5pB6Cne1HvTAbwBS9qMUnSgA/Kij6UoGBnFIBOvNJxjNIzY5qLLPwtJ
+uxcYt7D2kUZqAzE8CrMdo8mMitGGwXgYzWTqdjojQ7mIGlbOBSrHKw5rp0sMYZR7
+GrC2SgHI7dahzZqqUTk/IlIzzzTltZsZGTXUm125Uc09IcHp7/4Uudlezj2ORMc6
+djRlx94V2BtuQCMg881aGnwSD5lANP2jJdCLOIDcZNOyOtddLokcgynBxWPcaLcw
+ZKjI9quNXuZSw9tjK4/L1pKeyshIYYporZO5zuLW4lJjPWl+lFMkSgDindKQ0AJQ
+aMYo60AFJS9aSgQH2pPb1paO1IYmKMc5peKOvagBOlJTv50mCOlAH//Qpc0xepFS
+YqNepoIHHikp2MUmKAEpDil9qWgBhH40uM9KXtRz0zQAdfekxS0ZzzSAbxSE4GaX
+qdtaFtZlh83Oaic7G1OnzMzUt5GY+hrSt7YA/MK1IrXGMVpQ2ykYYYINc7lc7owS
+2KEMCjqKvpaqxyp5rRW1Ucr1qZUA4xipKII7XB5HBqdrcdhVtAMVKExTJuY/2QPz
+jmm/Z8nGK2fLGc0vlj0pWFzGULXOKlEQ44rQVMcUhT0osPnKiqMVJtHepCpFJnFI
+dzHvdKt7lSSNp9RXIXulz2jbsbl9a9F5qKSKOVSrDIPY1Sk0KUU9zyw8cUmM10+q
+aMUBkts4HUVzHKnDjBFdEKl9ziqUnHVBR7GlpK1MBPrSY4p1BHPNACdBg0H9aKKA
+E7YpPrTuaSgAFIaPrR169aQATRnvR70n0oGf/9Gn2zUag5NSe1MTGST+VBA7rR1F
+KaTigQmKKBS9BzQAmOaO+KPaloAO9NxnpSnjnNT2sPnPk1MnZGkIczJ7S23HLit6
+KNeKZEgUYFXkHFccnc9OEEkTxxCrSoowBUSDH4VYUjpSNCZfSpAM9aYDxTwaZkx+
+0Dmnq4Ye9R7uKZuJ6Gi5NrljPFAY96rhmzg1ZUZHNO5DVh+RSZPemhMH2p3IoJAg
+EVAyCpsUu2lYadiptYe9BWrZQEVEUx0pWLUio4B61z+paPHcqXi+VvbpXTMKiYCh
+Oxe55RMkls5SQHihWDDIru9U0uO6Qug+YVwU8EtrIQc8V0QqdGctSj1Q8+9FMSTd
+Tz7VsjlasGfXik/yaXGKTkVQhT+VIPSj6Ue9IAoOaQijnGaADvSUuM0YNAH/0quK
+YlSHimKKDMWkxilo+tMBMUlL0peaBDOc5oxzTsUx2Cr70hoFy7BBW9bRBAOKzrGE
+H52HWtyMc4rlqT1selQpWVyzCgzmroTFQRYHFT7iDisTrsTKvepgxpicipRQSxVL
+GnrTVpxPaghis3FIoH3jTttBFMRMBUqnmokPFTKM00YyJO1KopcUqL61SRk2KAKc
+FoKnNPA45q0iHIYVqNkqfrxTcEUNApFF1wahK5GCKvOoI6VUIHUVk0dMJEAXGRWH
+qWmrMC6iuiKhhkU0puFBdzya7s3gOV7VBHLu4PWvQdS09ZFLDrXDXdo9u+5ea1hK
+xlUp8yGUYxTEbd9akFdKZwtW0Y0ijHrTscc0UxCY9aMUtJQAdePSjFKB3pDSA//T
+peanc0iyJgndXAC7nz98/nQbqb++fzoIsegeYnqKTzE9a8/+0z5zvP50G6n/AL7f
+nTCx6B5ic80b145rgRdTD+NvzqQXc398/nSCx3W9D3qNP3820dBXKW7zyvw5x9a7
+nTrcxoC/U1nUlZG9Gnd3NS3QIo9avRDvVdBVxF6ZrjZ6aJ0Aq0FAGcVAi5ANWFpF
+EgPYVYHIpkYzVoRk1SRnJkaoSc0/ZTsEcU+qsZtjSMDNICDilJ7U2gCVT2pwIzUG
+403cc9aBONy+rds1KpzWeJKmWYd6pMylBl4MO9SYzVIfNyDUyFxwTxVpmEok2KYT
+S7qjZx0obEkNbJFVGXFWNx7VE5rNm8NCFTk4qWq/fI61MDUpmjRBNHxnrXLajZxu
+Cw4z1rsG5rIuoQQe9MpHmNzE1vJxT1cEZra1CFXBB4Irjr1DjKNW1OXQ56sL6mzk
+Ubh27VxfnODjJ/OkMzE8k/ma3OWx2m4UfL0rifOIHU/nULTPnhj+dMLHeEijcO+K
+4Lz37k/nSedJ/eP50gsf/9Tyra1BU0ebR5tAg2mlCmk82l83mgA2mpI42ZsDio/O
+rWsYWk+YUmykrm1o9kGbLDp1rs1GBjrWfp8HkxjI5rTXrXHN3Z30o2RPHg9auLki
+qqZxxVpCKzN0WB7VKM8ZqJODz2pwk+amhl5HUCrAnUDissk5oVmzyapEuNzU84N0
+pPMqkDTw5PFO4uRFjfk80jSADFQYJ6UYPVhRcLEm89qN3tTaUbfWkFhd3NSJ70zj
+pTgB3oQmWlbHerKy5FUQSKcT2qrmMoJllpeeaZv3d6gAxjmnhcGk2LlSJhkCg471
+FlqXOeopXCxG6HOVpoLg+tPOAMUwYNItEuciq0wGCDU+ccVDMQRleDTEczewAk8d
+a429tFy2O/au9uhu6VzF/G3Jx71SZMtTzW5jMcpU1Xwa1dSUxybmH41leaK647HH
+JahjioyrU/zVo80CqJI9p9KNpxUnmjrR5opAf//V8u8haX7Olbv9iah12Gj+xb8d
+Y6ZNzE+zr2pRar61t/2PfjnyzSjSr3rsNAXMdLNWOM11GmW+1gPSqK2c0DAzKQK6
+PTIcnJrKo9LG9FXZuooCYHWnjgg0pAxilAxXIzvROh4qVe5NQL7VJg9akosBmxg9
+qXd61CBx0p2496dykTKxpcMaavuKnGCKYxVBxz3qUcHmolJHHWnggjmmIl3cU7ce
+tQA46U9Gz1FIVhSSeKUAgUcCk8wfd/WmFh4YZqUGq6kGpVO3FANFpBuqfZVdCOoq
+3uyOKaOeQzYOlLtGKdmlBFOxFyBuO1NXn2qZgDTAvpSaKTGngVBntUrZqux9Khmk
+USqexpkuD8p/Omq4HFSDDDA/KmhNGTOBzisO8UkEDnrW5dArkEYrAl5JUng0yGcF
+rNu7E84rnDaP613OqxFQd3I965jmuyGxxz3Mv7M9J9mb1rSPvVdjhua0M7lX7M/r
+SG3b1rQHIyKQ4pDP/9bu8ClwPT9KWjmmZXE2j0owpHSlHWloFc5rxBs8kLgZ+lZO
+nLxWjrwy65qnaFQOK56u52UNjQJGeKQfNwKUgYzTVYZ5Fc7O2JKuM1MKg68jtUy9
+M1JoPA4zTlQ54pq5qVeBigZKsZqUI1MUjFKHIOBVAO2npSgAHBpfMGOetBIPWgY7
+HORTc0bgOlQvIR1pgkWMjHNRFufWoQ4700uBz6UirFsOg68U8TAdOlUPNU9agLEH
+INO4rG0Je4qRbjrzWIkretWA2RycUEOKNYTZqdZCayVkRe9WUuE9cU7mbijTBzya
+QnAqkLpR3zTvPz0waG0Z8jHOapuxzUrPmoWwRk1DNooN2Rg1NGc9TVMnB61Kr44p
+JjaJblQ6Ed/euSudyuQRiuokJK/Subu23Ha3UVa1MJqw7T4ormQxXMYce9bx0HR+
+9qn61gaUdt1gk4rts5FdlPY8+q/eMVtA0dhj7MlNXw5oo4Nshrco5zWhncxf+Ee0
+br9lj/Wj/hHdEP8Ay6R/r/jW1RSHc//X7ounTIpDKnQmmC3TuSfxp3kRD+GmYifa
+IxTftKGpxGg5CinYA6CgDkNelBK4qpZdga0/EUeURqzbZiFx0rnq7nZQ2NLPGKaO
+DQpyOaaeDXOztiTZx+NSjFQrk0/IHWpNEWO2aAcVCHGMZo8wDrVWGWw4A+tI0v0q
+sXHY/hULTDOCaYJl3zwRg4pwnwOazPMWgTA9KRaNXzxUbSA1nedik80nv0ouNIuF
+sDg1CZj0quZOKgds8mkUWXlA61CLk9AapSs9VGmZeDTM5M1HuSp61DJqMnRT+NYs
+k7HvxVRmZie1Oxk2b63zZHOTWtDcqyAs1cSA4ORU37xupp8ornZrdjdhWrTiuEI5
+NefpLInBwffvWjBfMvyycj1qeVhc7P7UM9ealEwc8jBrAgu4T/rCMHvVk3cacbhj
+1BpWY7mowxyKeuCKowXSSHarhvbNXlxjilYfMBasK9K7/c1tjGaxtRRQd1VEyqbC
+acqGcEHB9q7JeQK4SxZWuV45Fd0nCiuynsedV3HDiijrRWhkFHWl9qSgD//Q7760
+v6UlLQYh9OlFFFMDE12EyWZdeq81ylo7HvXeXkfm2zp7VwNqNrsjdQaxqrqdWHet
+jaRqM81ECetO3BeTXKz0EycOq00yYHJqk0hPSoZbraDmiw+YtvcKoqm191wfzrJe
+4eQ1C0MknzVSQrmi9/n5c4NQ/bSec1R8hgDnmkMZHWnYVzSF42c5496eLrJrIJxS
+hgetJotM3ln3Ywato2RWHGxB61qRfMMipsWmXSvGQcVE4wKmVHIpGjfoaRTZRc4F
+ZspJP0rUnTbzWYUdzhBmqRlIpkikxV4Wm35piBVaaeGPhBmtEjJyBeByKk3IBknF
+VFuXwS+COuDUL3kS8KozVqJm52L3nRnr/KrIWBlyD+oFYX2+U/dUcVYiuZJBkruH
+0quUj2l9jVQxBtuOR71sWdvBKwzGoPuMiubDwt0JQ1ahvLq3YYkJFRYtnaPY223a
+1pE2f7vB/Ajms9L42TGN1YrzjJyR7VLZavMMFjn34pt8kmpOrI3Q9wB/Kpduoldb
+FSfXpE5ijz9TVd9biugFljMbfmKsSaTGiYlf8q5+5gSA/u2YqPXmhcoPn6m/Zuou
+VdO9d/GcoCe4rzXRlLyqUO6vRg6RoMmt46I5KibZPSdOlUmvUXsSPWrUciSruTpV
+KSZMqco6tElFAo4pkH//0e/6VRuL+C3cRyHBPU9hVuRgiFz2Ga5FI5tQBZ1whOST
+3xQYnYKQQGB4NOx3rl11d4tu5coOOOwHc+1acGrW8sRkY7T6HrQBqFcqQec1wd3F
+5GoOo4Dc1151G1C5LgfjXKatKHu1dT1qJ7GtF2khc8VHI+Ohpc4XOazZJCrcVy2P
+RuOlmA44quPnPJppG45xTwY4xl2qrBcnjjjHJxUzSwqMcVU823Ydc/hUEtxapjnn
+61XKHOkTSXEXUVUaeNuKzpb+3Gdq5pFv4H4MeM0+Rk+1RfJU8io8YORUfnKR8oxS
+7m7j8qVi+Ysx9q37LB69qwI8KAc5HfjBFalveRR9PyqXEuM11OthhDripTaHHIrE
+TWZFXEKZxTjfanMCQAv4UuQHVXQi1NPJXjuaxfPKLlas3kl25AkbdnqOKrtFvTIH
+WmlYzlJyM6eaWQ8mqTYBya1WtWb2zU8Okwt80jVaEkZKW7TRnBOayZIpASAOld/H
+aQQ4xzSNa2jHLx5J5qlKxEqbkcFAZQ3zfyrqdKsy45XrWktvbqflj/OtKA7PugLj
+0puYo0bO7MmTRWmY7MCp4dCnAxnOO1b63MCcscmp1vlJ+TpWdzVxOYWynt5MbSK1
+E3RLubIrdMqkZYA1k3m2Q4QY+lRJjjHUy5pWlOBk0v8AZrTxktxmtO3swvzNzWhg
+KMdqzuaWOe06wltHOw4H+Fb0km0bpWzioVby2PX6Vj6hNLLlIzzjFXzXKp01vYr3
++vyoxitwOO9X9A1aSaTy5sZPpXHTRFD8wq1pMpju1I9aadmbzpqUGj14c4peKjhb
+fGpqSu0+das7H//S7uZPMiaMdwRWUtpcRaY1tF9/GK26KZicjDpKmyKOG3sQGB64
+qaTTmtrmO7f541HJA5H1FdRSnmkBhzw2uoonlojbGBPA7VzmswrBcbgm0ew613P7
+mNiQFUmuI8UXO2RUUZApS2NIaNMr+YoQA85rMlcA802C5WR1X2xVq4gLjI/Guax3
+p3M55+Pl4rPLtIxLmrUkZU4NLHYvLzVAQebuxHHUN5ayIoc9MVvRaaEw2OauvCXU
+I65HvVJ2FKDa0PPmSTPygmr9tbTtjIPWuzWGBE2iLkd6ifanQAfSrcyI0ddTMNoX
+AGPzp0emMf48Zqdrhc+9WoElkPtWTZ02HjTisZBIPvWdJBLaXAjIBVv0rqEQKFDH
+oayppFubvOO+TWbkJR1R0OlWsLJuZc5ro4rS3YEFQRWFpxxxmuhiyRmkmazVlocJ
+rWneTcboDt5yPSpbWOO6tw2MSJww9xXQarbGWPcOSOa522hIk3qcN6j+tFyHG45r
+THGKga2ZfuHBrfUbxyeaY8QPSmmPlOYZriM+uaia5kx8wxXQvbBh61W+wbqq47GJ
+9ofOBmpFe4lwFzXQRaaD1WtSKwSMZAFK4WMO006WTDTHGa2gltbrjGassiqOtUXQ
+MeP1qGxqIyWZ2OxQADU0Fv3bmiKAZFaKIqjFQ2VZIjK4GMVVZsdavOOKpPUgijcE
+L81VIk3OSfwq/MQFy3IqoJI942VaNqe5n6jbKw3AYrBtYz9pUd9wrsbmMSR5ArFs
+7fberuHeqW5rJ2iz0O0BEC59KtYqKFcRqPapK7kfMy3Z/9P0KkpAwAG44zT+tMwE
+prHapPoKdSMMgj1FAHnl9rC/aDG7EY9KydQD3IEqMWAH1qLVLc/a3x61UgkeE7QT
+g9RXM27ntezTglYs2ltJ5gfpjtXUpHuAzWJG5Uhh0Nbdu4Zc/jWcpGcY2GzWEbfN
+jmmLF5YwKu+YRweaTKHrU8xpymW87oOlVGvZPStx4oW6io/scTHOKtSHymA1zK3A
+FNWG5mOOce9dKlpGvRKspa5PyjFPmCxgW+m7cM9bCoEGFGK1ltO7kCkcQxLgcn/P
+ek2NIyGB79KqRQqGLDqasXUqsdi8ZpyAKo9azNUjTsQQ2a6GJgBWFbcVqIaEE1dF
+hsNkHpXP3VsbeXzV+6TW+FLcjmoZ13xlTTZCM6ERyjKnBqz5GRWJ5j2suMHFaS3o
+dcg80rl2LCwsvGKeqYPIFVDeMBSC7Bp3GomgAByKl3e+KyvtVPS4dj0pA4lqUZ+7
+VcKx6irCMcc1IPapZJGowPepAxA5pSAaiPFTcB7NxVKQnmrBwRVZ+BzzSAo3JbyT
+g1y8dy6ufWurmXdEwxniuMZGFwy+9WjeludXaSNMgz9KSCIi+U9jzTLFCibs1q2K
+h59xHIFaRWo6rtBs6NB8gHtTuaKWu0+ab1P/1OntZ453aYvlhngH9MVbtzNKRKWH
+P8NPhsIIX3pnJ9cVLHaJE+5GYZ7dRTMCq2oojMHBCjvjimDUHIz5bAdScdvb1q1J
+ZRSPvyRnqB0/KrSRqibF6UAed6ggknLjoazZLYZziuu1e0WKQOowp5rGZQyBh+Nc
+k7pn0dC06aaKKx5jAq3bSFSAaYBjj1oddvzCs2c7jZ2NQ4bpTWO33qhFMe5pzyYP
+1qC0i8rZNXYlDcHisuH5hzWnCVAxVIuxcWPAzT8Y9artc7elQtdSNwtMfKTyPjkn
+FZVxdY+VOTUrRTSff4qq8aR9etBaRUVvm3N1q4CTyarQr5j57VPO4hHA4oEzdsJF
+x89aJkQHANcSt8o4zipv7RK8ZzTJ0O5hvVj4IzmmPPG7ZXj2rhf7SOeDUqakwIZu
+lPUz5UndHYyWsU6fMOveufubOW1bcvK1atdZi2gMavPdwzIRkUrFK5iRzBsDvU/y
+vzVB/llODVhJCKg2TLqRg9Ktxx4HOaqRuCAc9KtK+OnNMTLahaGJXpUayDFNL81D
+M7Em81GzetLn0phwRUCE3EGoXkQnaaUqcc1CVUHOOTTGKRk4xxXPXVqwuAAM5roQ
+Senemx2wZtx/CrRdN2ZRhVolAb9a39NXv6msySKRnGRwK2tPTaMVtT+IWLl+7ZqC
+loorsPnj/9X0P6UdqYHRuhFPpmAtL9aSloApX9uJ7cjuBkVxZHl7lPevQMZ61xur
+QeVOdo4PNYVY9T1cvrWbpsyG65qYjcuDTpYwIwwpkbAjFc7OqqveKpUo1B65qy6g
+nJpvlg1IRJImIHFX4UJ6mq0SACrQkC4pmqLSxp3Gam+RBwKqh89DTXm7GmOw6acg
+cVjTO0jYqWaXv3qGIBjk0FD45BCvPWsu/v4wpB4qe9V4xvXp7VzVwBMfmppGUxq3
+0TtgNzV1ZSe9ZyWYznFWhGU4FXoYaloSY+aq9xdzsNkdKM1OkRbmgNzMiF9u3byD
+6V0Vle3CAKxyTUKWjyYwMVt2mlqvLdaTNI6DonZyCe9XvLbGRyKmW1xwBVxYPl4r
+NmlzPVip5q7G+KY8JHXtVYtsNIdzUVyTzTuO9UopAasAnODUskmzxSljjFMyR0pC
+xx0qCRGORTO1ISTSAjpTAF3Z4qdJwDtbg1EOOlPCq3zNyferiVHcnJ4ya1LRQFzW
+GsgZwi10kC7Yx7100lrc5sbO0eUlooorpPIP/9bpk0q4jbdDM6j0JyKs7b+EclXA
+/CtXrTXjWQYagwMc6jcocPCxHqORTl1iL/lorKfpWj9lh9D+Z/xpDbf3XP44NAFZ
+dVtG43AfXisrVpIp1V4mzgdq2Wts/ejRx+X86yNRt7ZYdyx+Ww9iKma91nThpWqJ
+mIGEsJXPzL2qpGxB5NSCJw5dDxUGSrYauQ9ituW/rSggcVGh3DNOHFQyIssKcDJN
+SbgwxVdTjrTh6UGiZPuIGPSombdncaRjxjvUDEqKotMjfk4qxBGeoqNcMRxV1MKM
+ZpFXEaIFcEVjS6bCz5Ax9K2y/GTVRmyeKpGbM2OzjXoM1HPApGVrUABIp5tmftRc
+hxOWaNkPTir1sOma2vsGVzipIdMfd0xTuJIfbKoA6VqRj2qNLFk4NWcMoqWyrEoK
+dKeSByKoNIV681WknK8rSFc1SVeqksWazDenPWp47wleDSFzEi5U4PFWlY/UGqWC
+/JFPVnHBqWFy/kd+9IcZqAPn73Wn7/UVIEjHFQ43U7jGaYx9KAJF6ZNNZmAwv5np
+Sq5rYsI1ZOQG+ta048zsZVKvs1zEdjp+397J35rawKqGJ7f57flO6f1H+FWI5FlT
+cnINd0Y2R5dSo5u8iSkp2KSmZn//1/RMjvS1m73nu8Ifkj4+p71fdxGhdjwKDAfR
+2rOW8lHzPGwX1AyB9cVbe4RITOeVAzxTAnxVS+TfauMVMJl8sOTjPFErqiEkZz2p
+Di7NM4lCM4FZ067XKnpVy4Ei3L+UpwD0xiqUm5sbgRXI4tM92VSM4qSCI1OenFVU
+wDip93pUNEJkgzUoqINnpUopFpiMSRUByTUpyDilA7igtMVQVpWkI60xnKj8KotM
+Cfmpg5F/zCw+tPVATVGJ1Xr060kt+ka4700gTuaw8tep6VZhngJwTxXEzagWJwaq
+G+c8DNVyladT0w3dogzuGRWdNrMC8RnkVwn2idj3qMGSQ8GjlFzRR2H9vyA84qdN
+fT/loK40QzYzioCJQM0cpLqRO+OpWc4+8BVaWeMLuU59q4QvIOaja8mThM4o5DOU
+l0OkkugH4qeC6y1ceZrmQ56Vq2TyZw1KSsZpndQTZWrQAasi0BwK10BxxWLNEN+6
+fXNTgjtzTCO9IVGM1JQ8nPSmbscUgPFNPXmmBMGFbFhMqEK+RuHB7Vhg4FbNpZSP
+87yfKOwH6V0UNzkxT903PeqhHk3GRwr9RVwCqt0PkB9/6V1nnFqimqcqCetPpgf/
+0OvtLmGIeU3ysOoPBq3ckSQ7h0BBNWGjR+HUN9RSrGiLtVQB6DpTMCtJMog+Q5LD
+AHuaglXFskbHjcM/hzVkWcKvvUEe2eKneNJFKOMigDMvSkkCxLycj8K0412xBT2F
+MW3hQYC9PXmpHj3psyR7igDOMSyCSVhzkkH6f/qqC9tYriyMhQbwM5HBq59luCdr
+OpT6EGrfljyynrxSauVGTWx5iRh/oamU5FS38DQXToeMHiq6juK45K2h60JXVyfp
+zUgb6ZqIN607FSaEucEVJtyKamCOalP3eKkdzNuCUGc1iyzbW5P51r3jMAa5ya2n
+mfbGOtXElhNqGBgNWcboueuauHQJm5dqki0ZUb5m6VqkiVz9CltwQSeDViExK4LV
+qppytwea1INKi6EUXRfsZvdmcGj28Cq437vlQmuuisLZBjYKtJHAn3VFK5Sw3dnI
+LFduPkQirUGhXVxy3yiupE0aEYFKbwD7h20XL9hFGSvhuJV/enmlHh20zkCtI3Rc
+/N3NWInZvpUOYezRgS6DEozGKrw6YYzyK7aMKRg1HLCrD5R+FZOTIcUYUELKOa0o
++CBUTR7Oc4o34qCSd8Y461X3HnNKWJ5WoWJzmgdxTknjmlGAOaRT2P5012/CqsDZ
+InzOqDua7C2XbEO2a5OyQyTAjnFdb5kcKDcQABXXQjZXPOxUruxOPSqM7+ZIsSc/
+5/pTftElx8tsuR/e6D8/8KswwLEM/eY9TXQchOAAMUtFFAz/0fRA6nvTqq/Y4/8A
+lmzJ9Dx+RzSeROv3ZAfqP8DTMC3S9apbbwd1P4n/AApcXvov/fX/ANagC5S1Txe+
+i/n/APWo8u8I5ZR+dAFuo3mjTqfyqD7NI335PyH+NSLaxA8gt9aBHKa6gkP2iMH0
+6fzNc+hJHNekXlus9s8WOo4rzV0MUjIeoOK56sep6GGndWLA61KAetQKanX2rBnY
+iZal4AqvuIxmnNJtAYc1LGMkiV+vNTRWyfexT42V14qfcFGKm5SRUmjxx1qg6YPS
+tNyDUDRkjpVpmqKAcKc077dt+oqR4ge1U5Ie2KtMOclbVGxUDalIaha3A9xUHl4O
+Kdw9qy0LyZzj8KtxO5PPSqkURJ5HSta3tyalsXO2T247VswDAqvDBj71aSR8Vm2F
+xUkVuO9SEkcimiMD5loJrO5LKkxB5NUifSrkq4ORVOXgZHFUjNiFtvT9KYXPWmbh
+2PWmMcDIqrE3J9+aikeq5mxx3pYD50yoB1NXGNyJSsjoNLsmlUPuZM8nFbyWFuhD
+OC59XOf06VJZwiKEAd6s12xVlY8ycuZ3EwBxS0UtUQJS0mKWgZ//0vSKKKBx1pmA
+e1FGR1pu8AUDsOoqMSrnFS0CasGMUfWgUUCCuF8QWf2ecXKDCv1+td3VG/tFvLZo
+SOcEj61MldWNKc+WSZ5qsmMVaDgjIqlLG0ExhfhlOKRGKtnPWuVo9SMrq5dDNnnm
+pByMZqAPxzTkfjB4NQ0XcsxnYKlLbqhXn3pTgGoZpFj84OCKlAG3PrUY5qYDilc0
+GFO+KryRE/dFaPl7hkVKIwevWmmFjDNszCg2Zxkj8q3xGOmKnWIelXcLGRb2KsM1
+sQ2gA6cinoixnirqMoPFJsTQ1YgOo/GpQg6Cn7gRTGIBrNkjH4qseSfSppW3KQKp
+eYVyGOamxLYyRl6His6WQdDU08hznNZUs5DEHmrSIbHlgajeUrxVKWY9qreeR3rR
+Izciw0hLZ71r6Su+5VjWBDulfjkV1WnR+XKn1rRaEPVM7xPuD6U4UyM/IKfXWecw
+ozSUUCFopKPrQM//0/ScUd80zcyqS31qut0h+98v1ouZKLexaYZ4pojUdRn608EE
+cUuO1MWwgAHtS8UUUCYYopaKBCUYpe9FAHJeItK81PtsI+ZOWHtXCCQHrXskqB42
+Q9CMV43qcJtrtwvTPespx6nXQm9i0knAzVhWU1iRzgECrQmPY1g0dakbCtg5/SrA
+wwzxWMk56Grcc3PXrWbRrGRorgcVOpUGqIYEZzVgNgVPKaqRcjY1MCpqkr9zTvN9
+OtFh8xoqVXoal8wEVlibHNI9yAPUUyrmsHUfWphKvasAXa9CakW6HrkUWJcjaEwp
+TKOvSsf7SOoPFMe7AHBpWIcjRlm2jGaoyzjBORWfLdbun5VQmuBtwT0pqJnKRZlu
+F6g/lWTJcZPBqtNcluBVXJJya1UTFyuWGlOaWNS7c1GE3VqWsPIzVCLlpAVwa6G1
+TDqc96z4IwDWnCAHU+9Zt6mqWh10RzGKlqGD/VipfrXatjypbhRRRTEFLSZ7UooG
+f//U9Kqu2TOF7Y5qzUQX94WoZMHuQNmBgR9w8EelWsjrUM5DAR9STQwO9B2oG1ez
+GJcNI+FU7RVokAc1TkR7djLFyvdasFVnQMTxSTHOC0a2JAytyDmgnFVbeFVU9fzq
+tK8ruqg4Vj19v/r0nKwKjd2TNNWDDg0vWoDmGLI5IFMjeYruZcg+lVcj2fVExZk+
+8Mj2rzfxDArXDFOc+lelBgyBhXFa7E3m+YQOR1Heonsa0VqecMrxnkU5ZmBrWuIA
+ecVjOhUntWW50PQs+fmpkucdazOfWlGRRYOY3kux9Kti5BA5rld7DpT1uWTgnik4
+jUzrRcj1xTvtAPOa5pbzJwaf9qHalylqob7zcHae1U3uScjNZhuc9ahaYE5oUQdQ
+1Bc+vWpBdLjg4NYLTe9HnDrnpT5Sec3/ALXg5BxmoHuj61jmfAxmozMx6UcgnM1X
+uSR1qsZWfhuaqAk9alXNO1iL3JQDUi5NNUVZjU5pFJFi3jGa2YV29BVKEE4GK1Yl
+4wahs1ii3GARnpV2P76/UVWjAPIqfJA3L1AyKzvqadDrYP8AVipq4qy8YWQuRYXw
+8puMP1U59fSuyV1ddyHIPpXoLY8mas2P+lFFFMgKWk4paBn/1fS8Z4NRGE/wsR+t
+M3zDqhP60vnY4ZSPwoJUWh6QhTk8mpcc5qv9pSl+0R+tANSElSZiVUjaaljTYoX0
+pguIz3pwljPQigHe1rD9oxgd6hkt1ePZ09COxqXep70u4dqGSpSjsRRxuEKSHd71
+XxcxZRRuXsfSruRjNc5rPiC106I/MA3TP+FKxSmzdBSJMORXJaw6sfLDZA6GvNb/
+AMS6ldu22Qxp6Dr+dM0m5me5IldmyO5JpTWhrSl7x1DpkGs2aHPJrXyO9QvGrHBr
+nudjic40eOCMVGRitaaA59qotCcVSZm4lQjuKiK5q0Y6jYVRm0V8EUhZhUhXimci
+gQzzGNGWIpwANP25pgQnJpdtT7BilCGgdiEIakUU/bipQnFAWEVanUelMAI6VZRC
+enepZaQ6NS3atGKMDtUMcfPTitOKMdahmiiSRrznFaEeKqqM8VZjznms2apFtPWp
+x2qBOvFTDg1DKMDXPD8d3Gbu3G2UDn0NUPDfieXS3+w6kWMQOATyV/8ArV3yYaOv
+KvEtsIL7eoxu610Uajb5WcdekviR7ba39leqHtJklB9Dz+VXPavmhZXUhkYqw7g4
+P6V0+meMdW08hJH+0R/3ZOo+jda6jjse4UtcrpXi7StSAR28iX+45/keldSrBhlT
+nPcUCsf/1vS+1L2pO1L2pmQDkZowD2pR0NAoHdiED0FMaOMnlR+VSGkPWkNNkRgi
+x92s6+JgjLREqfrWuelZGqf6k1Jsjh7zVNQCsPOOAPavOLm5nuZGedy5B712950f
+6VwLfeb61aIluNFaGlH/AEtazxWhpX/H2lKWwQ3R3I5HNNcAg596cvSmt3/GuQ9I
+r4BTJ9KpygDpVz+A1Um60yGVcA4zUDKp5IqwO1QGrRkys1MwMU9qb2pkgAMU8AYz
+TB0p4+7QCEPFSDpUZqQdKQx+BmnCm9zThQMeoG6ra8dKqL96ra9allovoOKvIMcV
+STpV5KhmiJl+7mrS/dBqsv3fxqyv3RUs0JkJxU684HvVdOlWF6j61DGadv0x7GvO
+PF4Hnp9f6V6Pb9PwNec+MP8AXp9f6VVH4kYVvhZxOTmlNJ3pT0r0TzgU5Nd54Nv7
+xNRFoJW8ojJQnI/XpXBJ1rsvB/8AyGl/3aBH/9mJAj0EEwEKACcFAlZybwgCGwMF
+CQeGH4AFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQ3XBQp2tAD2lw5w//Q+gk
+/QLUsLQA9ZsaefH005sJEO8qiK1tZAXPAnCUr5eWgheBh2Z5t4mtSfUiz6B+0gCw
+PL5a6If5TqYak6iQC8EhbrLoSB2DfSE5YksKztcjxE7kDzYYVnIP7uGOpZjuIqDs
+34mAkWaI+tB1aBab9FcRkJQXIhDlHRadBhDhD3UMduNbH1wRpSL7x/mL5jluYSdb
+LcqsGzuXUAgHO+Uzh3lVgm7j/Rnfgc2WPAh9Jb2gGTSoY5Em+ot1xSLCfgJH/+AW
+JW3BDZlLtQ4otw13lc7alPOsqIHAA3wzX1XXo1sdjRPaJnqYWrUX7bdWsRxn4tK4
+4ZSYa8wYsQmnRXLvelpN+e3LGCTCX2oODx8soMwpLwj1yF1DMLi8cNmEKo/rA8+h
+aynVg7CcouoASspzVjbtNah5HyiS6e2W7SeINwgZ/KxKkKLK1o2ehTW7Qj5avyPy
+4+/AxNbeT3rtP7HGO2k+976tOTCzQpo++DSWls12QC0eyxaNxIK0i8up0UF/2IC4
+uGSKEOUZFPn3HMl9OCFqJA61UjZFgszsSKQtDKFdN6qDiT7iAVR6An9tST/aa8na
+lQL3XhR3FDhUk8V6q9xQBaydUqRVInhbDlHHFSHIRQeIrlCk7uHHy2cl8JNDwokw
+92Om5vOcZOe3f8yfpO/G6yLcNUeh6hDenWDR8wu5Ag0EVnJuQgEQALLSsIIP9BVN
+oCVmx+xbqn+y15EGYW7rLuFjqsYC2p2uQX99K7MFKBjTRNx+T0GwEcH0196f0kZR
+gAhAvH5oruYRqOYTXs/yJMHxIyscIQ8mxiHb5UrUapmZfnXOdf1wHFXfh114o8jU
+3prHeIIqBIW+hB3PCGIFGNClLg8JhjtZ/uZTmR8tdfe2D+N/2wPRkXlt7Rx3PutI
+uQ21ru2/ZMLLxuJ9fWmelOkwIjedfwymOGi97kr+Zxyh6N15fjD6DKY6ylaRFlYz
+tGsRkWE+Tg0YjJKwLhIzkcWwv9Mo76lCTJH/6mUlXV+4b463MscWBIe2wOBtupjk
+Qphv7CL1bjw0P/rBxHXO2MGfngw4A4xHGf7ktgQcGTvMg9HCumftOxX/tIV0lAQn
+aVBy7D9l7pCee+ePbFW7bCW5D5QgB4tOVyXT6Z9mBwFCuPKY4LsXPa/fWh0JTZsP
++WhIJ7z9mqUnIe9e0RQJSfB4VJuEMoLrqCTtisubHJC14mxsIb1CgpTZEF/8/lkp
+ft5GJJmqr+hYOWV23p5klPVKTGeMaak18dMoy5xE5zqqsWlflS3jAfva3kwYYDdI
+46nkl/80Rvyi6Ufk9Xg6UT51JYzZ7heSg1YC3/ZaTleLQtT7UWT468yOjeBkEgJ+
+vGV3j5YNUKsSYotU1O0tEaY2sq6BDFGzABEBAAGJAiUEGAEKAA8FAlZybkICGwwF
+CQeGH4AACgkQ3XBQp2tAD2lc+Q/6AoVPdjid73NgpK5h1ZxrBV053rNFxi+kkWPj
+GG4fj4g2gI2suP2qFIeGSh/c/6Gx+gOnxhNcjTsdZ7SuFnuv2xjlKFR0yuo69zHi
+k3ydsxq1QAnNSuysDmNfh0dRzmd55zHgUo6qVrjj1CEvCtee50vGGbrpRhWYIQ3R
+mTy7W32K5Kx8WH+FowFlbLYIL9IeG/4v+J3v3PSZcp7sM4xfECe2vG5cDYhqvTiL
+N48OOMEjIG4dCBYm7dw3eCXsS8v2vG+2yhsMJ+lthzWErDCtQHKXr1aVQzYlPpqK
+sAq5vWL+djAhol+/2hjvPgEWiYIDZ5zGJMb3wwlmrrrkzBlUAOFaLhtbVXT6JrMm
+86QkBq0DgfV1a2OCBF0+B52swPfAfLnlWcGtoQpbz7WgzVNVkNJ+Sa39HfNEEksw
+jg4GtesjYXB8jryHNESvUWaSlZzp+fIxvGnMkKGj0DtjpM/mmy/HAtxRVwvUPcfi
+1NXeiuDVox4o2ODygYxXQCWygoWGN5z7el3J/mPoyAiQ/VRon1wY9eV4L2WX3ykN
+dhHe8PCJlNqo5pvM1QQwgSjPipuYeSr8o0+nQLFnHhk9GIQ+Nr8+7pov6eIL6BfU
+leNvaMo98VMZTkFFg0c4N40D369pN6bOe+ca25bHTtR5gDBIij8PuoOxCbOgNEF4
++T34FjE=
+=FJmK
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub   4096R/1AC2F4BA 2013-03-06
+uid                  Jonathan Anstey (CODE SIGNING KEY) <ja...@gmail.com>
+sig 3        1AC2F4BA 2013-03-06  Jonathan Anstey (CODE SIGNING KEY) <ja...@gmail.com>
+sub   4096R/8F2837E7 2013-03-06
+sig          1AC2F4BA 2013-03-06  Jonathan Anstey (CODE SIGNING KEY) <ja...@gmail.com>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1
+
+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
+advtsGhpGw2bQvnPEt4JVU+CV6/I
+=SRdD
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub   2048R/02FF4100 2015-02-05
+uid                  Andrea Cosentino (Chiave) <an...@yahoo.com>
+sig 3        02FF4100 2015-02-05  Andrea Cosentino (Chiave) <an...@yahoo.com>
+sub   2048R/D7B65D33 2015-02-05
+sig          02FF4100 2015-02-05  Andrea Cosentino (Chiave) <an...@yahoo.com>
+
+pub   4096R/FD34417D 2015-04-23
+uid                  Andrea Cosentino (COMMITER KEY) <ac...@apache.org>
+sig 3        FD34417D 2015-04-23  Andrea Cosentino (COMMITER KEY) <ac...@apache.org>
+sub   4096R/E334BF85 2015-04-23
+sig          FD34417D 2015-04-23  Andrea Cosentino (COMMITER KEY) <ac...@apache.org>
+
+pub   4096R/B4889CC0 2015-04-24
+uid                  Andrea Cosentino (NEW COMMITTER KEY) <ac...@apache.org>
+sig 3        B4889CC0 2015-04-24  Andrea Cosentino (NEW COMMITTER KEY) <ac...@apache.org>
+sub   4096R/D31B42C9 2015-04-24
+sig          B4889CC0 2015-04-24  Andrea Cosentino (NEW COMMITTER KEY) <ac...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2.0.22 (GNU/Linux)
+
+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
+Wg==
+=4Now
+-----END PGP PUBLIC KEY BLOCK-----
+pub   4096R/229754D2 2019-03-05
+uid                  Nicola Ferraro <nf...@apache.org>
+sub   4096R/A5AAD514 2019-03-05
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+SaGp
+=GGoO
+-----END PGP PUBLIC KEY BLOCK-----
+pub   rsa4096 2016-04-07 [SC]
+      33E8BA5A41AB4B428475386137461E41A7B768D7
+uid           [ unknown] Luca Burgazzoli <lb...@apache.org>
+sig 3        37461E41A7B768D7 2016-04-07  Luca Burgazzoli <lb...@apache.org>
+sub   rsa4096 2016-04-07 [E]
+sig          37461E41A7B768D7 2016-04-07  Luca Burgazzoli <lb...@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+Bq6lxl6uAA==
+=f/Ot
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.


[camel-karaf] 04/05: Added .gitattributes

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git

commit d8ee18c633a737321af1bae5a66b91775bafbfd9
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Mar 23 08:55:49 2020 +0100

    Added .gitattributes
---
 .gitattributes | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..8ecd788
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,3 @@
+# OS specific line endings for the Maven wrapper script
+mvnw text eol=lf
+mvnw.cmd text eol=crlf


[camel-karaf] 05/05: Added camel-paxloggin component and more

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-karaf.git

commit 4327aba452d739a5422c15f5091202066b0b946f
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Mar 23 09:28:17 2020 +0100

    Added camel-paxloggin component and more
---
 components/camel-paxlogging/pom.xml                |  75 ++++++++++++++
 .../paxlogging/PaxLoggingComponentConfigurer.java  |  55 ++++++++++
 .../paxlogging/PaxLoggingEndpointConfigurer.java   |  63 ++++++++++++
 .../services/org/apache/camel/component.properties |   7 ++
 .../services/org/apache/camel/component/paxlogging |   2 +
 .../apache/camel/configurer/paxlogging-component   |   2 +
 .../apache/camel/configurer/paxlogging-endpoint    |   2 +
 .../camel/component/paxlogging/paxlogging.json     |  34 +++++++
 .../src/main/docs/paxlogging-component.adoc        | 113 +++++++++++++++++++++
 .../component/paxlogging/PaxLoggingComponent.java  |  59 +++++++++++
 .../component/paxlogging/PaxLoggingConsumer.java   | 104 +++++++++++++++++++
 .../component/paxlogging/PaxLoggingEndpoint.java   |  75 ++++++++++++++
 components/pom.xml                                 | 104 +++++++++++++++++++
 core/pom.xml                                       | 105 +++++++++++++++++++
 pom.xml                                            |  50 ++++++++-
 15 files changed, 848 insertions(+), 2 deletions(-)

diff --git a/components/camel-paxlogging/pom.xml b/components/camel-paxlogging/pom.xml
new file mode 100644
index 0000000..6a28700
--- /dev/null
+++ b/components/camel-paxlogging/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.karaf</groupId>
+        <artifactId>components</artifactId>
+        <version>3.2.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-paxlogging</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: Pax Logging</name>
+    <description>Camel OSGi PaxLogging support</description>
+
+    <properties>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-api</artifactId>
+            <version>${pax-logging-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-service</artifactId>
+            <version>${pax-logging-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/components/camel-paxlogging/src/generated/java/org/apache/camel/component/paxlogging/PaxLoggingComponentConfigurer.java b/components/camel-paxlogging/src/generated/java/org/apache/camel/component/paxlogging/PaxLoggingComponentConfigurer.java
new file mode 100644
index 0000000..bb7d7ea
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/java/org/apache/camel/component/paxlogging/PaxLoggingComponentConfigurer.java
@@ -0,0 +1,55 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.paxlogging;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class PaxLoggingComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        PaxLoggingComponent target = (PaxLoggingComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "bundlecontext":
+        case "bundleContext": target.setBundleContext(property(camelContext, org.osgi.framework.BundleContext.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        Map<String, Object> answer = new CaseInsensitiveMap();
+        answer.put("basicPropertyBinding", boolean.class);
+        answer.put("bridgeErrorHandler", boolean.class);
+        answer.put("bundleContext", org.osgi.framework.BundleContext.class);
+        return answer;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        PaxLoggingComponent target = (PaxLoggingComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "bundlecontext":
+        case "bundleContext": return target.getBundleContext();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-paxlogging/src/generated/java/org/apache/camel/component/paxlogging/PaxLoggingEndpointConfigurer.java b/components/camel-paxlogging/src/generated/java/org/apache/camel/component/paxlogging/PaxLoggingEndpointConfigurer.java
new file mode 100644
index 0000000..39a651c
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/java/org/apache/camel/component/paxlogging/PaxLoggingEndpointConfigurer.java
@@ -0,0 +1,63 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.paxlogging;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class PaxLoggingEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        PaxLoggingEndpoint target = (PaxLoggingEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true;
+        case "exceptionhandler":
+        case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true;
+        case "exchangepattern":
+        case "exchangePattern": target.setExchangePattern(property(camelContext, org.apache.camel.ExchangePattern.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        Map<String, Object> answer = new CaseInsensitiveMap();
+        answer.put("basicPropertyBinding", boolean.class);
+        answer.put("bridgeErrorHandler", boolean.class);
+        answer.put("exceptionHandler", org.apache.camel.spi.ExceptionHandler.class);
+        answer.put("exchangePattern", org.apache.camel.ExchangePattern.class);
+        answer.put("synchronous", boolean.class);
+        return answer;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        PaxLoggingEndpoint target = (PaxLoggingEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "bridgeerrorhandler":
+        case "bridgeErrorHandler": return target.isBridgeErrorHandler();
+        case "exceptionhandler":
+        case "exceptionHandler": return target.getExceptionHandler();
+        case "exchangepattern":
+        case "exchangePattern": return target.getExchangePattern();
+        case "synchronous": return target.isSynchronous();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..86311c8
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=paxlogging
+groupId=org.apache.camel
+artifactId=camel-paxlogging
+version=3.2.0-SNAPSHOT
+projectName=Camel :: Pax Logging
+projectDescription=Camel OSGi PaxLogging support
diff --git a/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/component/paxlogging b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/component/paxlogging
new file mode 100644
index 0000000..801af80
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/component/paxlogging
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.paxlogging.PaxLoggingComponent
diff --git a/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/configurer/paxlogging-component b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/configurer/paxlogging-component
new file mode 100644
index 0000000..ee14d36
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/configurer/paxlogging-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.paxlogging.PaxLoggingComponentConfigurer
diff --git a/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/configurer/paxlogging-endpoint b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/configurer/paxlogging-endpoint
new file mode 100644
index 0000000..d3c948f
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/resources/META-INF/services/org/apache/camel/configurer/paxlogging-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.paxlogging.PaxLoggingEndpointConfigurer
diff --git a/components/camel-paxlogging/src/generated/resources/org/apache/camel/component/paxlogging/paxlogging.json b/components/camel-paxlogging/src/generated/resources/org/apache/camel/component/paxlogging/paxlogging.json
new file mode 100644
index 0000000..7f61f17
--- /dev/null
+++ b/components/camel-paxlogging/src/generated/resources/org/apache/camel/component/paxlogging/paxlogging.json
@@ -0,0 +1,34 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "paxlogging",
+    "extendsScheme": "",
+    "syntax": "paxlogging:appender",
+    "title": "OSGi PAX Logging",
+    "description": "The paxlogging component can be used in an OSGi environment to receive PaxLogging events and process them.",
+    "label": "monitoring",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": true,
+    "producerOnly": false,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.paxlogging.PaxLoggingComponent",
+    "firstVersion": "2.6.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-paxlogging",
+    "version": "3.2.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "bridgeErrorHandler": { "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by [...]
+    "bundleContext": { "kind": "property", "displayName": "Bundle Context", "group": "consumer", "required": false, "type": "object", "javaType": "org.osgi.framework.BundleContext", "deprecated": false, "secret": false, "description": "The OSGi BundleContext is automatic injected by Camel" },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" }
+  },
+  "properties": {
+    "appender": { "kind": "path", "displayName": "Appender", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Appender is the name of the pax appender that need to be configured in the PaxLogging service configuration." },
+    "bridgeErrorHandler": { "kind": "parameter", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled b [...]
+    "exceptionHandler": { "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with [...]
+    "exchangePattern": { "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut", "InOptionalOut" ], "deprecated": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }
+  }
+}
diff --git a/components/camel-paxlogging/src/main/docs/paxlogging-component.adoc b/components/camel-paxlogging/src/main/docs/paxlogging-component.adoc
new file mode 100644
index 0000000..f6b46e2
--- /dev/null
+++ b/components/camel-paxlogging/src/main/docs/paxlogging-component.adoc
@@ -0,0 +1,113 @@
+[[paxlogging-component]]
+= OSGi PAX Logging Component
+
+*Since Camel 2.6*
+
+// HEADER START
+*Only consumer is supported*
+// HEADER END
+
+The PAX Logging component can be used in an OSGi environment to receive
+http://wiki.ops4j.org/display/paxlogging/Pax+Logging[PaxLogging] events
+and process them.
+
+== Dependencies
+
+Maven users need to add the following dependency to their `pom.xml`
+
+[source,xml]
+-------------------------------------------
+<dependency>
+  <groupId>org.apache.camel</groupId>
+  <artifactId>camel-paxlogging</artifactId>
+  <version>${camel-version}</version>
+</dependency>
+-------------------------------------------
+
+where `${camel-version`} must be replaced by the actual version of Camel.
+
+== URI format
+
+[source,xml]
+-----------------------------
+paxlogging:appender[?options]
+-----------------------------
+
+where `appender` is the name of the pax appender that need to be
+configured in the PaxLogging service configuration.
+
+== URI options
+
+
+
+// component options: START
+The OSGi PAX Logging component supports 3 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
+| *bundleContext* (consumer) | The OSGi BundleContext is automatic injected by Camel |  | BundleContext
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The OSGi PAX Logging endpoint is configured using URI syntax:
+
+----
+paxlogging:appender
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *appender* | *Required* Appender is the name of the pax appender that need to be configured in the PaxLogging service configuration. |  | String
+|===
+
+
+=== Query Parameters (5 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
+| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
+| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+|===
+// endpoint options: END
+
+
+== Message body
+
+The `in` message body will be set to the received PaxLoggingEvent.
+
+== Example usage
+
+[source,xml]
+----------------------------------
+<route>
+    <from uri="paxlogging:camel"/>
+    <to uri="stream:out"/>
+</route>
+----------------------------------
+
+Configuration:
+
+[source,java]
+----------------------------------------------------------
+log4j.rootLogger=INFO, out, osgi:VmLogAppender, osgi:camel
+----------------------------------------------------------
diff --git a/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingComponent.java b/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingComponent.java
new file mode 100644
index 0000000..c1428e1
--- /dev/null
+++ b/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingComponent.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.paxlogging;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.util.ObjectHelper;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The OSGi pax-logging component allows receiving log events from OPS4j PaxLogging
+ * and send them to Camel routes.
+ */
+@Component("paxlogging")
+public class PaxLoggingComponent extends DefaultComponent {
+
+    private BundleContext bundleContext;
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    /**
+     * The OSGi BundleContext is automatic injected by Camel
+     */
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        PaxLoggingEndpoint endpoint = new PaxLoggingEndpoint(uri, this, remaining);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+        ObjectHelper.notNull(bundleContext, "BundleContext", this);
+    }
+}
diff --git a/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingConsumer.java b/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingConsumer.java
new file mode 100644
index 0000000..72aafa5
--- /dev/null
+++ b/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingConsumer.java
@@ -0,0 +1,104 @@
+/*
+ * 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.paxlogging;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.concurrent.ExecutorService;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.support.DefaultConsumer;
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Paxlogging consumer.
+ * This camel consumer will register a paxlogging appender and will
+ * receive all logging events and send them into the route.
+ * To avoid generating new logging events from sending the message,
+ * an MDC attribute is set in the sending thread, and all log events
+ * from this thread are ignored.
+ * Camel exchanges are actually sent from a specific thread to make
+ * sure the log events are cleanly separated. 
+ */
+public class PaxLoggingConsumer extends DefaultConsumer implements PaxAppender {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PaxLoggingConsumer.class);
+
+    private final PaxLoggingEndpoint endpoint;
+    private ExecutorService executor;
+    private ServiceRegistration registration;
+
+    public PaxLoggingConsumer(PaxLoggingEndpoint endpoint, Processor processor) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+    }
+
+    @Override
+    public void doAppend(final PaxLoggingEvent paxLoggingEvent) {
+        // in order to "force" the copy of properties (especially the MDC ones) in the local thread
+        paxLoggingEvent.getProperties();
+        sendExchange(paxLoggingEvent);
+    }
+
+    protected void sendExchange(final PaxLoggingEvent paxLoggingEvent) {
+        Exchange exchange = endpoint.createExchange();
+        // TODO: populate exchange headers
+        exchange.getIn().setBody(paxLoggingEvent);
+
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("PaxLogging {} is firing", endpoint.getAppender());
+        }
+        try {
+            getProcessor().process(exchange);
+        } catch (Exception e) {
+            exchange.setException(e);
+        }
+        // log exception if an exception occurred and was not handled
+        if (exchange.getException() != null) {
+            getExceptionHandler().handleException("Error processing exchange", exchange, exchange.getException());
+        }
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        // start the executor before the registration
+        executor = endpoint.getCamelContext().getExecutorServiceManager().newSingleThreadExecutor(this, "PaxLoggingEventTask");
+
+        Dictionary<String, String> props = new Hashtable<>();
+        props.put("org.ops4j.pax.logging.appender.name", endpoint.getAppender());
+        registration = endpoint.getComponent().getBundleContext().registerService(PaxAppender.class.getName(), this, props);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (registration != null) {
+            registration.unregister();
+        }
+        if (executor != null) {
+            endpoint.getCamelContext().getExecutorServiceManager().shutdownNow(executor);
+            executor = null;
+        }
+        super.doStop();
+    }
+}
diff --git a/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingEndpoint.java b/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingEndpoint.java
new file mode 100644
index 0000000..e731361
--- /dev/null
+++ b/components/camel-paxlogging/src/main/java/org/apache/camel/component/paxlogging/PaxLoggingEndpoint.java
@@ -0,0 +1,75 @@
+/*
+ * 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.paxlogging;
+
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.DefaultEndpoint;
+
+/**
+ * The paxlogging component can be used in an OSGi environment to receive PaxLogging events and process them.
+ */
+@UriEndpoint(firstVersion = "2.6.0", scheme = "paxlogging", title = "OSGi PAX Logging", syntax = "paxlogging:appender",
+    consumerOnly = true, label = "monitoring")
+public class PaxLoggingEndpoint extends DefaultEndpoint {
+
+    @UriPath @Metadata(required = true)
+    private final String appender;
+
+    public PaxLoggingEndpoint(String uri, PaxLoggingComponent component, String appender) {
+        super(uri, component);
+        this.appender = appender;
+    }
+
+    /**
+     * Appender is the name of the pax appender that need to be configured in the PaxLogging service configuration.
+     */
+    public String getAppender() {
+        return appender;
+    }
+
+    /**
+     * @deprecated use {@link #getAppender()}
+     */
+    @Deprecated
+    public String getName() {
+        return getAppender();
+    }
+
+    @Override
+    public PaxLoggingComponent getComponent() {
+        return (PaxLoggingComponent) super.getComponent();
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        throw new RuntimeCamelException("Cannot produce to a PaxLoggingEndpoint: " + getEndpointUri());
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        PaxLoggingConsumer answer = new PaxLoggingConsumer(this, processor);
+        configureConsumer(answer);
+        return answer;
+    }
+
+}
diff --git a/components/pom.xml b/components/pom.xml
new file mode 100644
index 0000000..3ad2047
--- /dev/null
+++ b/components/pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+         http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>3.2.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+
+    <groupId>org.apache.camel.karaf</groupId>
+    <artifactId>components</artifactId>
+    <name>Camel Karaf :: Components Modules</name>
+    <description>Camel Karaf Components Modules</description>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>camel-paxlogging</module>
+    </modules>
+
+    <properties>
+        <camel.osgi.manifest>${project.build.outputDirectory}/META-INF/MANIFEST.MF</camel.osgi.manifest>
+
+        <camel-prepare-component>true</camel-prepare-component>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bundle-plugin</artifactId>
+                <version>${project.version}</version>
+                <extensions>false</extensions>
+                <configuration>
+                    <supportIncrementalBuild>true</supportIncrementalBuild>
+                    <noWarningProjectTypes>pom</noWarningProjectTypes>
+                    <excludeDependencies>${camel.osgi.exclude.dependencies}</excludeDependencies>
+                    <instructions>
+                        <Bundle-Name>${project.artifactId}</Bundle-Name>
+                        <Bundle-SymbolicName>${camel.osgi.symbolic.name}</Bundle-SymbolicName>
+                        <Bundle-Activator>${camel.osgi.activator}</Bundle-Activator>
+                        <Import-Package>${camel.osgi.import}</Import-Package>
+                        <Export-Package>${camel.osgi.export}</Export-Package>
+                        <DynamicImport-Package>${camel.osgi.dynamic}</DynamicImport-Package>
+                        <Private-Package>${camel.osgi.private.pkg}</Private-Package>
+                        <Require-Capability>${camel.osgi.require.capability}</Require-Capability>
+                        <Provide-Capability>${camel.osgi.provide.capability}</Provide-Capability>
+                        <Implementation-Title>Apache Camel</Implementation-Title>
+                        <Implementation-Version>${project.version}</Implementation-Version>
+                        <Karaf-Info>Camel;${project.artifactId}=${project.version}</Karaf-Info>
+                        <_versionpolicy>${camel.osgi.import.default.version}</_versionpolicy>
+                        <_failok>${camel.osgi.failok}</_failok>
+                        <_removeheaders>Bnd-LastModified</_removeheaders>
+                        <_plugin>
+                            org.apache.felix.bundleplugin.BlueprintPlugin,
+                            aQute.lib.spring.SpringXMLType,
+                            org.apache.felix.bundleplugin.JpaPlugin,
+                            org.apache.camel.maven.bundle.CamelPlugin
+                        </_plugin>
+                    </instructions>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>versions</id>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>cleanVersions</goal>
+                        </goals>
+                        <configuration>
+                            <versions>
+                                <camel.osgi.version.clean>${project.version}</camel.osgi.version.clean>
+                            </versions>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>bundle-manifest</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>manifest</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
diff --git a/core/pom.xml b/core/pom.xml
index fb91603..e2e21a4 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -34,4 +34,109 @@
         <module>camel-core-osgi</module>
     </modules>
 
+    <properties>
+        <camel.osgi.manifest>${project.build.outputDirectory}/META-INF/MANIFEST.MF</camel.osgi.manifest>
+    </properties>
+
+    <build>
+        <plugins>
+            <!--<plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>-->
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>recompile</id>
+                        <goals>
+                            <goal>compile</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                            <goal>add-resource</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/generated/java</source>
+                            </sources>
+                            <resources>
+                                <resource>
+                                    <directory>src/generated/resources</directory>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bundle-plugin</artifactId>
+                <version>${project.version}</version>
+                <configuration>
+                    <supportIncrementalBuild>true</supportIncrementalBuild>
+                    <noWarningProjectTypes>pom</noWarningProjectTypes>
+                    <excludeDependencies>${camel.osgi.exclude.dependencies}</excludeDependencies>
+                    <instructions>
+                        <Bundle-Name>${project.artifactId}</Bundle-Name>
+                        <Bundle-SymbolicName>${camel.osgi.symbolic.name}</Bundle-SymbolicName>
+                        <Bundle-Activator>${camel.osgi.activator}</Bundle-Activator>
+                        <Import-Package>${camel.osgi.import}</Import-Package>
+                        <Export-Package>${camel.osgi.export}</Export-Package>
+                        <DynamicImport-Package>${camel.osgi.dynamic}</DynamicImport-Package>
+                        <Private-Package>${camel.osgi.private.pkg}</Private-Package>
+                        <Require-Capability>${camel.osgi.require.capability}</Require-Capability>
+                        <Provide-Capability>${camel.osgi.provide.capability}</Provide-Capability>
+                        <Implementation-Title>Apache Camel</Implementation-Title>
+                        <Implementation-Version>${project.version}</Implementation-Version>
+                        <Karaf-Info>Camel;${project.artifactId}=${project.version}</Karaf-Info>
+                        <_versionpolicy>${camel.osgi.import.default.version}</_versionpolicy>
+                        <_failok>${camel.osgi.failok}</_failok>
+                        <_removeheaders>Bnd-LastModified</_removeheaders>
+                    </instructions>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>versions</id>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>cleanVersions</goal>
+                        </goals>
+                        <configuration>
+                            <versions>
+                                <camel.osgi.version.clean>${project.version}</camel.osgi.version.clean>
+                            </versions>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>bundle-manifest</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>manifest</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
diff --git a/pom.xml b/pom.xml
index 61931ab..0c47c81 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,8 +74,8 @@
     <modules>
         <!--<module>tooling</module>-->
         <module>core</module>
-        <!--<module>components-starter</module>
-        <module>catalog</module>
+        <module>components</module>
+        <!--<module>catalog</module>
         <module>tests</module>
         <module>examples</module>
         <module>docs</module>-->
@@ -150,6 +150,7 @@
         <kafka-avro-serializer-version>5.2.2</kafka-avro-serializer-version>
         <log4j2-version>2.13.1</log4j2-version>
         <lucene3-version>3.6.0</lucene3-version>
+        <maven-jar-plugin-version>3.2.0</maven-jar-plugin-version>
         <maven-checkstyle-plugin-version>3.1.0</maven-checkstyle-plugin-version>
         <maven-checkstyle-version>8.26</maven-checkstyle-version>
         <maven-compiler-plugin-version>3.8.1</maven-compiler-plugin-version>
@@ -161,6 +162,7 @@
         <openjpa-version>3.1.1</openjpa-version>
         <opentracing-version>0.33.0</opentracing-version>
         <os-maven-plugin-version>1.6.0</os-maven-plugin-version>
+        <pax-logging-version>1.11.2</pax-logging-version>
         <protobuf-maven-plugin-version>0.6.1</protobuf-maven-plugin-version>
         <protobuf-version>3.11.1</protobuf-version>
         <reactor-version>3.2.15.RELEASE</reactor-version>
@@ -177,6 +179,40 @@
         <tomcat-version>9.0.31</tomcat-version>
         <undertow-version>2.0.30.Final</undertow-version>
         <weld3-version>3.0.5.RELEASE</weld3-version>
+
+        <!-- OSGi bundles properties -->
+        <camel.osgi.import.camel.version>
+            version="[$(version;==;${camel.osgi.version.clean}),$(version;=+;${camel.osgi.version.clean}))"
+        </camel.osgi.import.camel.version>
+        <camel.osgi.import.strict.version>
+            version="[$(version;===;${camel.osgi.version.clean}),$(version;==+;${camel.osgi.version.clean}))"
+        </camel.osgi.import.strict.version>
+        <camel.osgi.import.default.version>[$(version;==;$(@)),$(version;+;$(@)))</camel.osgi.import.default.version>
+        <camel.osgi.import.defaults>
+        </camel.osgi.import.defaults>
+        <camel.osgi.import.before.defaults />
+        <camel.osgi.import.additional />
+        <camel.osgi.import.pkg>
+            org.apache.camel.*;${camel.osgi.import.camel.version},
+            ${camel.osgi.import.before.defaults},
+            ${camel.osgi.import.defaults},
+            ${camel.osgi.import.additional},
+            *
+        </camel.osgi.import.pkg>
+        <camel.osgi.activator />
+        <camel.osgi.failok>false</camel.osgi.failok>
+        <camel.osgi.private.pkg>!*</camel.osgi.private.pkg>
+        <camel.osgi.export.pkg>$${replace;{local-packages};;;\;}</camel.osgi.export.pkg>
+        <camel.osgi.export>${camel.osgi.export.pkg};-noimport:=true;${camel.osgi.version}</camel.osgi.export>
+        <camel.osgi.version>version=${project.version}</camel.osgi.version>
+        <camel.osgi.import>${camel.osgi.import.pkg}</camel.osgi.import>
+        <camel.osgi.dynamic />
+        <camel.osgi.symbolic.name>${project.groupId}.${project.artifactId}</camel.osgi.symbolic.name>
+        <camel.osgi.exclude.dependencies>false</camel.osgi.exclude.dependencies>
+        <camel.osgi.require.capability />
+        <camel.osgi.provide.capability />
+
+        <camel.osgi.manifest>${project.build.outputDirectory}/META-INF/MANIFEST.MF</camel.osgi.manifest>
     </properties>
 
 
@@ -254,6 +290,16 @@
                     <encoding>UTF-8</encoding>
                 </configuration>
             </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>${maven-jar-plugin-version}</version>
+                    <configuration>
+                        <archive>
+                            <manifestFile>${camel.osgi.manifest}</manifestFile>
+                        </archive>
+                    </configuration>
+                </plugin>
         </plugins>
 
         <pluginManagement>