diff --git a/karaf-2.2.x/.gitignore b/karaf-2.2.x/.gitignore
new file mode 100644
index 0000000..27bf151
--- /dev/null
+++ b/karaf-2.2.x/.gitignore
@@ -0,0 +1,8 @@
+*.i??
+.idea
+.project
+.classpath
+.settings
+target
+eclipse-classes
+bin
diff --git a/karaf-2.2.x/BUILDING b/karaf-2.2.x/BUILDING
new file mode 100644
index 0000000..474fa48
--- /dev/null
+++ b/karaf-2.2.x/BUILDING
@@ -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.
+ */
+
+Building Apache Karaf
+=====================
+
+Initial Setup
+-------------
+
+1) Install J2SE 5.0 SDK (or later), which can be downloaded from 
+   http://www.oracle.com/technetwork/java/javase/downloads/index-jdk5-jsp-142662.html. 
+   Use version of "JDK 5.0 Update 22" (or later).
+
+2) Make sure that your JAVA_HOME environment variable is set to the newly installed 
+   JDK location, and that your PATH includes %JAVA_HOME%\bin (windows) or 
+   $JAVA_HOME$/bin (unix).
+
+3) Install Maven 2.2.1 (or later), which can be downloaded from 
+   http://maven.apache.org/download.html. Make sure that your PATH includes 
+   the MVN_HOME/bin directory. 
+
+
+Building
+--------
+
+1) Change to the top level directory of Apache Karaf source distribution.
+2) Run
+         $> mvn
+   This will compile Apache Karaf and run all of the tests in the
+   Apache Karaf source distribution. Alternatively, you can run
+         $> mvn -Pfastinstall
+   This will compile Apache Karaf without running the tests and takes less
+   time to build.
+   Depending on the load of remote Maven 2.0 repositories, you may have 
+   to run "mvn" several times until the required dependencies are 
+   all located in your local maven repository. It usually takes some time for 
+   maven to download required dependencies in the first build.
+3) The distributions will be available under "assembly/target" directory.
+
diff --git a/karaf-2.2.x/LICENSE b/karaf-2.2.x/LICENSE
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/karaf-2.2.x/LICENSE
@@ -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/karaf-2.2.x/NOTICE b/karaf-2.2.x/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/README b/karaf-2.2.x/README
new file mode 100644
index 0000000..fc19797
--- /dev/null
+++ b/karaf-2.2.x/README
@@ -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.
+ */
+
+Welcome to Apache Karaf
+=======================
+Apache Karaf is a small OSGi based kernel which provides a
+lightweight container onto which various bundles can be deployed.
+
+The following features are included:
+    * Hot deployment: Karaf supports hot deployment of OSGi bundles by monitoring
+      jar files inside the [home]/deploy directory. Each time a jar is copied in this folder,
+      it will be installed inside the runtime. You can then update or delete it and changes will
+      be handled automatically. In addition, the Kernel also supports exploded bundles and custom
+      deployers (a spring one is included by default).
+    * Dynamic configuration: Services are usually configured through the ConfigurationAdmin OSGi
+      service. Such configuration can be defined in Karaf using property files inside
+      the [home]/etc directory. These configurations are monitored and changes on the properties
+      files will be propagated to the services.
+    * Logging System: using a centralized logging back end supported by Log4J, Karaf
+      supports a number of different APIs (JDK 1.4, JCL, SLF4J, Avalon, Tomcat, OSGi)
+    * Provisioning: Provisioning of libraries or applications can be done through a number of
+      different ways, by which they will be downloaded locally, installed and started.
+    * Native OS integration: Karaf can be integrated into your own Operating System as
+      a service so that the lifecycle will be bound to your Operating System.
+    * Extensible Shell console: Karaf features a nice text console where you can manage the
+      services, install new applications or libraries and manage their state. This shell is easily
+      extensible by deploying new commands dynamically along with new features or applications.
+    * Remote access: use any SSH client to connect to the kernel and issue commands in the console
+    * Security framework based on JAAS
+    * Managing instances: Karaf provides simple commands for managing instances of Karaf.
+      You can easily create, delete, start and stop instances of Karaf through the console.
+
+Getting Started
+===============
+For an Apache Karaf source distribution, please read
+BUILDING for instructions on building Apache Karaf.
+
+For an Apache Karaf binary distribution, please read
+RELEASE-NOTES for installation instructions and list of supported 
+and unsupported features.
+
+The PDF manual is the right place to find any information about Karaf.
+
+Alternatively, you can also find out how to get started here:
+    http://karaf.apache.org/
+
+If you need more help try talking to us on our mailing lists
+    http://karaf.apache.org/site/mailinglists.html
+
+If you find any issues with Apache Karaf, please submit reports
+with JIRA here:
+    http://issues.apache.org/jira/browse/KARAF
+
+We welcome contributions, and encourage you to get involved in the 
+Karaf community. If you'd like to learn more about how you can
+contribute, please see:
+    http://karaf.apache.org/index/community/contributing.html
+
+Many thanks for using Apache Karaf.
+
+
+The Karaf Team
+
diff --git a/karaf-2.2.x/RELEASE-NOTES b/karaf-2.2.x/RELEASE-NOTES
new file mode 100644
index 0000000..8c70cbd
--- /dev/null
+++ b/karaf-2.2.x/RELEASE-NOTES
@@ -0,0 +1,1494 @@
+/*
+ * 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.
+ */
+
+                    Apache Karaf 2.2.7
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is considered a high priority update for users of Apache
+ Karaf 2.2.6. An issue in which configuration updates were not being persisted to storage
+ was detected, an update to FileInstall version 3.2.2 was made necessary.
+  In addition to the above other bug fixes have been resolved, including; updating the 
+ features repo pointer for pax-wicket, removing an unnecessary warning on missing repository
+ name when the name is defined however not presently loaded, the SSHD authorized key provider
+ now logs in DEBUG, and SSH now correctly uses the karaf.base variable. A version update
+ to pax web 1.0.9 has also been included in the dependencies.
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-1343] - Features repo points to the old pax-wicket app
+    * [KARAF-1360] - Configration update doesn't work
+    * [KARAF-1367] - Remove line number logging from default logging config
+    * [KARAF-1373] - features-maven-plugin, unexpected text in stderr
+    * [KARAF-1374] - Fileinstaller logging by default is not enabled.
+    * [KARAF-1376] - Demo deployer is not sync with Karaf version
+    * [KARAF-1387] - Warning to missing a feature repository name even when the name is defined
+    * [KARAF-1388] - SSHD authorized key provider should log in DEBUG
+    * [KARAF-1389] - SSH doesn't correctly use the karaf.base variable
+
+** Dependency upgrade
+    * [KARAF-1366] - Upgrade to Pax Web 1.0.9
+    * [KARAF-1378] - Upgrade to fileinstall 3.2.2
+
+** Improvement
+    * [KARAF-1328] - jclouds feature repo url has been changed after version 1.0
+    * [KARAF-1368] - Make it easy to enable Karaf PropertiesLoginModule via an optional feature
+
+
+                    Apache Karaf 2.2.6
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
+ update to Apache Karaf 2.2.5. It contains bug fixes identified in the prior release,
+ and introduces improvements including; improved Windows, AIX, HP-UX, and Solaris support
+ in the service wrapper, three new deployer demos showing how to make an OSGi bundle, a
+ features file, and how to wrap a third party jar into a bundle, and support for ssh public
+ key authentication and agent forwarding. A few new commands also appear in this release
+ including; features:status to indicate feature loaded or not, feature:chooseurl to make
+ it easy to install well known feature files, and a watch command to allow users to watch
+ the output of a karaf command like when using the unix watch mechanism. Several dependencies
+ were also updated, bringing Spring to 3.0.7-RELEASE, eventadmin to 1.2.14, Apache Pom
+ to version 10, the maven bundle plugin to 2.3.7, and fileinstall to 3.2.0.
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-610] - Can't input the path string completely via karaf shell
+    * [KARAF-669] - Dependency artifacts should be available on the Maven central repo
+    * [KARAF-675] - Longer shell commands affect the shell view when using up and down arrows
+    * [KARAF-811] - Combination of wrap+mvn and instructions doesnt work any more
+    * [KARAF-875] - Unable to define escape the event designator '!' using '\!'
+    * [KARAF-891] - Problem with $ charact in wrap:mvn URL
+    * [KARAF-913] - Omitted @Command on Gogo plugin is hard to debug because of NPE
+    * [KARAF-918] - pax-url prerequisites for a feature are not respected
+    * [KARAF-953] - features.xml dropped into deploy BEFORE karaf is started are not recognised
+    * [KARAF-1018] - using auto-complete (TAB key) on commands that don't take Arguments/Options throws IndexOutOfBoundsException. 
+    * [KARAF-1116] - Scripts fail at resolving java jdk. 
+    * [KARAF-1117] - Log messages appear on stdout when the feature http is installed
+    * [KARAF-1121] - Error when installing feature camel-cxf : jetty.xml is empty
+    * [KARAF-1122] - Feature <configfile/> creates an empty file if the file URL is not resolved
+    * [KARAF-1124] - karaf does not work properly with closing brace in the working directory path
+    * [KARAF-1126] - features-maven-plugin:validate goal raises a NPE if karafConfig configuration is not set
+    * [KARAF-1127] - Boot features failed to startup when karaf started from directory with closing brace; logs also unavailable
+    * [KARAF-1133] - Error executing command 'start' when starting a child instance
+    * [KARAF-1139] - Redeploy kar cause installing old feature
+    * [KARAF-1143] - Karaf (Config Mbean) can not recognize the features when Karaf installation path containing blank space
+    * [KARAF-1144] - When running a single remote command through SSH, the SCOPE variable isn't set
+    * [KARAF-1161] - The shell:new action does not support the creation of arrays
+    * [KARAF-1164] - Archetypes are not valid
+    * [KARAF-1174] - war feature cannot be installed after the cxf
+    * [KARAF-1175] - Duplicate key exception should be handle locally to avoid to affect the whole MBean
+    * [KARAF-1179] - "dev:watch *" doesn't notice new bundles added to the container
+    * [KARAF-1182] - Karaf features-maven-plugin always selects lowest version in range
+    * [KARAF-1199] - dev:watch command issues "[WATCH]" announcements only to the issuing shell
+    * [KARAF-1212] - NPE during update of the FeatureFinder
+    * [KARAF-1215] - Shell scripts are incompatible with /bin/sh on Solaris
+    * [KARAF-1216] - add-features-to-repo goal does not reclaim file handles fast enough
+    * [KARAF-1220] - o.p.karaf.management bundles must stop when its configured keystore is not available
+    * [KARAF-1241] - admin script does not pass on JAVA_OPTS to instance
+    * [KARAF-1243] - Karaf JMX Config MBean behaves in unpredictable ways
+    * [KARAF-1244] - Deployer Transformers Supports Manifest Element without A Supporting Schema
+    * [KARAF-1252] - Features core bundle should not depend to shell and management bundles
+    * [KARAF-1256] - Archetypes should use dynamic variables
+    * [KARAF-1257] - Configuration completers should avoid using getConfiguration method of config admin
+    * [KARAF-1260] - Karaf 2.2.x branch - Console doesn't like it when the console window is to small - no line wrapping for commands
+    * [KARAF-1264] - Dump demo in Karaf 2.2.x can not resolve package org.apache.karaf.diagnostic.demo package.
+    * [KARAF-1265] - Add AIX, HP-UX, Solaris, and "custom" support in the service wrapper
+    * [KARAF-1266] - Minimal distribution doesn't start due to missing management bundle
+    * [KARAF-1268] - Allow multiple commands in karaf script
+    * [KARAF-1279] - IOExceptions used in an incompatible way with Java 5.
+    * [KARAF-1284] - Karaf bundle archetype maven bundle plugin configuration is missing "instructions" tags.
+    * [KARAF-1298] - dev:watch does not work in some cases
+    * [KARAF-1304] - Quick help text for features:info command is erroneous
+    * [KARAF-1318] - User bundles are treated as system bundles
+    * [KARAF-1323] - Testfailures in source package
+
+** Dependency upgrade
+    * [KARAF-1151] - Upgrade to Spring 3.0.7.RELEASE
+    * [KARAF-1154] - Upgrade to eventadmin 1.2.14
+    * [KARAF-1155] - Upgrade to Apache POM 10
+    * [KARAF-1183] - Upgrade to slf4j 1.6.4
+    * [KARAF-1184] - Upgrade to JUnit 4.10
+    * [KARAF-1185] - Upgrade to Pax Logging 1.6.5
+    * [KARAF-1205] - Upgrade to maven-bundle-plugin 2.3.7
+    * [KARAF-1231] - Upgrade to EasyMock 3.1
+    * [KARAF-1232] - Upgrade to Jasypt 1.9.0
+    * [KARAF-1233] - Upgrade to asm 3.3.1
+    * [KARAF-1272] - Upgrade to fileinstall 3.2.0
+
+** Improvement
+    * [KARAF-693] - features:addurl raises "Premature end of file" when network is not available
+    * [KARAF-783] - Improve security docs wrt role policies
+    * [KARAF-916] - use org.apache.aries.jmx.core instead of org.apache.aries.jmx
+    * [KARAF-970] - feature <config/> tag doesn't create the cfg file
+    * [KARAF-999] - local-repo folder shouldn't be used
+    * [KARAF-1010] - Add 64Bit ServiceWrapper to karaf
+    * [KARAF-1072] - Provide man command as an alias to help
+    * [KARAF-1145] - Upgrade to pax-logging 1.6.4
+    * [KARAF-1153] - Jetty feature should also install the jetty-websocket bundle
+    * [KARAF-1191] - Switch back to millis per default on shell:sleep and introduce -s option
+    * [KARAF-1214] - Improvement in Karaf log4j appender docs
+    * [KARAF-1245] - blueprint deployer and spring deployer should get started before features.core bundle
+    * [KARAF-1261] - Jaas commands should allow you to distinguish between to realms that have the same name
+    * [KARAF-1271] - Feature service should log in DEBUG instead of INFO
+    * [KARAF-1280] - Add wrap third party jar example
+    * [KARAF-1283] - Add a simple OSGi bundle demo to deployer examples
+    * [KARAF-1292] - Add a feature demo
+    * [KARAF-1295] - serviceUrl in org.apache.karaf.management.cfg should use 0.0.0.0 but not localhost
+    * [KARAF-1299] - Make sure that all karaf archetype contain a description
+    * [KARAF-1300] - features managment should be more robust if customer features descriptor file has duplicated feature name
+
+** New Feature
+    * [KARAF-32] - Support ssh public key authentication and agent forwarding
+    * [KARAF-798] - Support for relocating karaf.history file
+    * [KARAF-1059] - Karaf command features:status to indicate feature loaded or not
+    * [KARAF-1132] - Introduce new command feature:chooseurl to make it easy to install well known feature files
+    * [KARAF-1196] - implement a 'watch' command so we can watch the output of a karaf command like the unix 'watch' mechanism
+
+** Question
+    * [KARAF-806] - ProxyLoginModule should actually be on the bootclasspath classpath right?
+
+** Task
+    * [KARAF-1274] - Please set svn:ignore to all eclipse's project files
+
+** Test
+    * [KARAF-1195] - FeaturesServiceImplTest intermittently fails on slower machines
+
+
+                    Apache Karaf 2.2.5
+                    ==================
+
+  Overview
+  --------
+  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
+ update to Apache Karaf 2.2.4. It contains bug fixes identified in the prior release,
+ and introduces improvements including; multiple JAAS support improvements, better support 
+ for Linux systems with certain versions of libc, SCP support, and demos for extending 
+ Karaf's console commands and using Karaf Archives (KARs). Several dependencies were also 
+ updated, bringing Pax Web to version 1.0.8, Jetty to 7.5.4.v20111024, and Jasypt to 1.8.
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-867] - Inconsistent deployment behavior between bundle installer and feature installer 
+    * [KARAF-926] - JAAS: Properties backing engine doesn't respect encryptor prefix and suffix
+    * [KARAF-939] - the realm set for JAASLoginService in jetty.xml should be karaf but not the default
+    * [KARAF-951] - dev:create-dump raises a NullPointerException
+    * [KARAF-952] - config:propdel doesn't delete the property in the cfg file
+    * [KARAF-954] - Double quotes missing in generated karaf-wrapper.conf
+    * [KARAF-959] - features:create-kar goal doesn't create a valid kar
+    * [KARAF-985] - LDAPLoginModule generates a large number of DirContext objects
+    * [KARAF-1003] - Karaf fails to start on a linux 32 bit system who's libc version is 2.3.4.
+    * [KARAF-1015] - ConfigMBean should use a different config pid than the config shell
+    * [KARAF-1020] - BundleWatcher should look for SNAPSHOT
+    * [KARAF-1030] - Grep command breaks existing line formating
+    * [KARAF-1064] - BootstrapLogManager does not reuse the instantiated Handler
+    * [KARAF-1065] - TextDumpProvider.createDump(DumpDestination) does not flush OutputStreamWriter
+    * [KARAF-1104] - Add plexus-utils dependency to features-maven-plugin to allow it to work with Maven 2.2.x to create KARs
+    * [KARAF-1105] - Fix url in Command Demo Readme file.
+    * [KARAF-1106] - Jetty feature should use ServiceMix Spec for activation
+    * [KARAF-1108] - Features should use correct start-level
+    * [KARAF-1110] - Archetypes don't work
+    * [KARAF-1111] - Add documentation about archetypes
+    * [KARAF-1114] - osgi shell blueprint bundle shouldn't use lazy default-activation
+
+** Dependency upgrade
+    * [KARAF-997] - Upgrade to Pax Web 1.0.8
+    * [KARAF-998] - upgrade to jetty 7.5.4.v20111024
+    * [KARAF-1092] - Upgrade to Jasypt 1.8
+    * [KARAF-1107] - Karaf should use directly commons-* bundles
+
+** Improvement
+    * [KARAF-606] - JAAS: Allow LDAPLoginModule to supply role "DN" from LDAP group search
+    * [KARAF-936] - Features info command should display the start level of a bundle if available.
+    * [KARAF-940] - Align various bat and sh scripts
+    * [KARAF-945] - Use singular for shell commands
+    * [KARAF-956] - jaas module should throw generic FailedLoginException 
+    * [KARAF-965] - Allow features-maven-plugin to handle multiple versions of the same feature
+    * [KARAF-968] - Features file should require name attribute on features element
+    * [KARAF-981] - Set kar as a boot feature
+    * [KARAF-1013] - Less verbose in log when mistyped commands at INFO level
+    * [KARAF-1014] - Make files specified by ${includes} optional
+    * [KARAF-1019] - Set java memory options only when required
+    * [KARAF-1022] - java.io.tmpdir system property should use $KARAF_DATA/tmp in place of $KARAF_BASE/tmp
+    * [KARAF-1032] - Text improvements to Features XSD
+    * [KARAF-1041] - create-kar goal should handle configfile
+    * [KARAF-1057] - Update the list of supported execution environments
+    * [KARAF-1087] - kar archetype
+    * [KARAF-1088] - assembly archetype
+    * [KARAF-1091] - Upgrade maven bundle plugin to 2.3.6
+    * [KARAF-1112] - shell:sleep should be in seconds
+    * [KARAF-1115] - Add a jre.properties.cxf with all changes required to run cxf
+
+** New Feature
+    * [KARAF-541] - Support JMX SSL via etc/org.apache.karaf.management.cfg 
+    * [KARAF-934] - Provide a way to select which features are to be installed when dropping a descriptor to the deploy folder.
+    * [KARAF-977] - config propset, propappend & propdel could use some autocompletion
+    * [KARAF-980] - Add demo for extending Karaf's console commands
+    * [KARAF-987] - Add scp support
+    * [KARAF-1029] - Add completer support on option values
+    * [KARAF-1085] - Add Kar deployer demo using features-maven-plugin
+    * [KARAF-1109] - Provide archetypes for bundle, bundle-blueprint, web-bundle, war
+
+** Task
+    * [KARAF-976] - Update Apache Karaf 2.2.x documentation for Child Instances
+
+
+                    Apache karaf 2.2.4
+                    ==================
+
+  Overview
+  --------
+  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
+ update to Apache Karaf 2.2.3. It contains bug fixes identified in the prior release,
+ and introduces improvements including; significant improvements to KAR support, and new
+ MBeans (such as Dev, HTTP, Log, OBR, Bundles, Services and System). Several dependencies
+ were also updated, bringing Apache Felix Gogo to version 0.10.0, and Pax Web to 1.0.7.
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-771] - KAR Deployer doesn't work
+    * [KARAF-773] - KAR docu outdated
+    * [KARAF-816] - Wrapper feature doesn't load security libraries
+    * [KARAF-889] - dev:framework commands incorrect workflow
+    * [KARAF-892] - EventAdmin events from Gogo not being sent from Karaf's console bundle
+    * [KARAF-893] - Wrong URL in release notes [1]
+    * [KARAF-894] - Kar deployment failed
+    * [KARAF-895] - NPE during webconsole startup
+    * [KARAF-896] - Karaf webconsole exports wrong version of Felix webconsole package
+    * [KARAF-902] - Jaas: Properties backing engine doesn't remove users
+    * [KARAF-904] - add jetty.port=8181 to jetty.xml so that configuration for jetty connector could take effect
+    * [KARAF-905] - propdel() method in the ConfigMBean didn't work
+    * [KARAF-914] - Add ICU4J in Jasypt bundle
+    * [KARAF-915] - KAR deployment failed in the features XML is not the first entry of the KAR archive
+    * [KARAF-917] - warn instead of info when failing to install a feature
+    * [KARAF-919] - Kar redeployment failed
+    * [KARAF-920] - Feature autoinstall from kar failed
+    * [KARAF-921] - maven eclipse plugin 2.8 does not work correctly with karaf
+    * [KARAF-922] - features-maven-plugin ignores repository tags in feature files
+    * [KARAF-923] - features-maven-plugin#AddFeaturesToRepoMojo does not handle spaces in repository urls well
+    * [KARAF-929] - MBean bundles should be seen as system bundles
+    * [KARAF-932] - ConfigMBean raise a NPE when dictionnary is null
+
+** Dependency upgrade
+    * [KARAF-901] - Upgrade to Pax Web 1.0.7
+
+** Improvement
+    * [KARAF-756] - Add ability to have KeyStoreManager to wait for SSL keystore to be fully initialize by other bundle through timeout
+    * [KARAF-762] - dev:watch should support multiple bundle IDs
+    * [KARAF-786] - Add more MBeans
+    * [KARAF-847] - Provide Karaf features covering all Spring bundles
+    * [KARAF-851] - Upgrade Maven plugins in use
+    * [KARAF-864] - obr:deploy command should provide a start option
+    * [KARAF-881] - Make aliases to osgi:* commands to be more clear for the users
+    * [KARAF-885] - StartBundle doesn't deploy all bundles if one failed
+    * [KARAF-886] - Document security properties in the relevant configuration files
+    * [KARAF-897] - Fixing text in bundle.info files
+    * [KARAF-898] - Config delete operation should remove the pid.cfg file
+    * [KARAF-899] - Upgrade to Apache Felix Gogo version 0.10.0
+    * [KARAF-900] - Shutdown command should display the instance name
+    * [KARAF-907] - Include 64 bits wrapper library
+    * [KARAF-925] - Karaf config.properties doesn't define J2SE-1.6 and J2SE-1.7 execution environment
+    * [KARAF-930] - Bundles MBean should mimic the BundleSelector like osgi:* commands
+
+** New Feature
+    * [KARAF-541] - Support JMX SSL via etc/org.apache.karaf.management.cfg 
+    * [KARAF-657] - kar deployer should start the feature
+    * [KARAF-845] - Add a jasypt based property placeholder to support encrypted values
+    * [KARAF-912] - Add a goal to create a kar file
+
+** Task
+    * [KARAF-887] - Refer PrinceXML website in the manual
+
+
+                    Apache Karaf 2.2.3
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
+ update to Apache Karaf 2.2.2. It contains bug fixes identified in the prior release,
+ and introduces improvements including; Optional JDK 7 support, a spring-jms feature, 
+ and a macro allowing users to identify the contents of a specific config file. Several
+ dependencies were also updated, bringing Jetty to version 7.4.5.v20110725, Eclispe
+ Equinox to 4.6.2.R36x_v20110210, and Pax web to 1.0.6. 
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-281] - History using up arrow does not work on windows
+    * [KARAF-706] - variable substitution doesn't work for system.properties
+    * [KARAF-712] - Karaf's ls command does not represent URL objects correctly
+    * [KARAF-718] - Grep doesn't work when piped from features:listurl
+    * [KARAF-735] - java.util.NoSuchElementException if issue the first command as an empty command
+    * [KARAF-753] - commandlist --help points to help for jaas:pending
+    * [KARAF-760] - MInor time rendering bug
+    * [KARAF-766] - Wrong help for features:install
+    * [KARAF-769] - Update NOTICE file to mention JSW
+    * [KARAF-776] - jclouds features require OSS Sonatype repository
+    * [KARAF-796] - Editing Pax Web Configuration Via Karaf Console
+    * [KARAF-800] - karaf does not start when using java7
+    * [KARAF-809] - MainStartTest fails on WinXP
+    * [KARAF-815] - Generic the Karaf manual link
+    * [KARAF-820] - Karaf client.bat swallows commands to be passed to the Karaf instance
+    * [KARAF-824] - Web demo folder in 2.2.2 release is missing content and README.txt has bugs
+    * [KARAF-826] - KarArtifactInstaller should look for "features" classifier in place of "feature"
+    * [KARAF-827] - Karaf Web deployer (Pax-Web) always tries to deploy the deploy/README file
+
+** Dependency upgrade
+    * [KARAF-757] - upgrade to jetty 7.4.4.v20110707
+    * [KARAF-768] - Upgrade to Eclipse Equinox 3.6.2.R36x_v20110210
+    * [KARAF-775] - upgrade to pax web 1.0.5
+    * [KARAF-789] - Upgrade jetty to 7.4.5.v20110725
+    * [KARAF-790] - Upgrade paxurl to 1.2.8
+    * [KARAF-792] - Upgrade pax-runner to 1.6.2
+    * [KARAF-833] - Upgrade to Pax Web 1.0.6
+    * [KARAF-834] - Upgrade to Spring 3.0.6 - in std. features.xml
+
+** Improvement
+    * [KARAF-645] - Add a flag to suppress --help Option output on 
+    * [KARAF-667] - Improve error message when OBR resolution fails due to invalid URLs
+    * [KARAF-698] - Technical edits to User's Guide
+    * [KARAF-699] - Grammar fixes to source code files
+    * [KARAF-700] - Updates to developer's guide
+    * [KARAF-722] - throw more meaningful exception but not NPE when the BUNDLE_SYMBOLICNAME is null
+    * [KARAF-729] - Karaf Maven Plugin source code cleanup
+    * [KARAF-733] - Doc fixes to the quick start guide and overview page
+    * [KARAF-752] - Editorial fixes to the assemblies/ configuration files
+    * [KARAF-755] - Recommended improvements to help commands
+    * [KARAF-764] - Correct links to ops4j in documentation
+    * [KARAF-784] - Add date in the default Karaf log
+    * [KARAF-795] - Kar builder uses a different version for easymock then the rest of the project
+    * [KARAF-802] - Upgrade mail bundle version to 1.4.4.
+    * [KARAF-803] - Add JDK7 compile support to 2.2.x source build
+    * [KARAF-807] - Add a features name to the karaf-cellar features.xml
+    * [KARAF-808] - Remove author attribute tags from Karaf source code
+    * [KARAF-813] - Install Pax URL OBR with the OBR feature
+    * [KARAF-817] - Allow to set Karaf window name via parameter
+    * [KARAF-818] - Allow JAVA_MAX_MEM, JAVA_PERM_MEM, JAVA_MIN_MEM, JAVA_MAX_PERM_MEM the same way as for linux startup file
+    * [KARAF-829] - Support of Java 7
+    * [KARAF-840] - specify javax.annotation packages version to 1.1.0 for jre-1.6 as Annotation 1.1 Spec is used for Java 6
+
+** New Feature
+    * [KARAF-696] - Add a macro allowing users to identify the contents of a specific config file.
+    * [KARAF-835] - Provide a spring-jms feature
+
+** Task
+    * [KARAF-673] - Page failover.html contains invalid configuration properties
+
+
+                    Apache Karaf 2.2.2
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
+ update to Apache Karaf 2.2.1. It contains bug fixes identified in the prior release, 
+ and introduces improvements including; improved behavior for the OracleDB locking 
+ mechanism and http feature jetty port usage. Several improvements to the shell have 
+ been incorporated, such as completion for shell aliases and a warning on osgi:shutdown
+ to avoid inadvertently shutting down the container. There has also been a few small 
+ dependency upgrades to felix event admin, Pax URL, and jetty.
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-496] - Karaf prompt displayed twice
+    * [KARAF-622] - Jaas Cancel command is not working
+    * [KARAF-633] - NOTICE distribution file still refers Apache Felix Karaf
+    * [KARAF-634] - README file refers an incorrect contribution URL
+    * [KARAF-637] - Update branding-console documentation to include the changes to custom.properties
+    * [KARAF-648] - maven-enforcer-plugin configuration not used
+    * [KARAF-653] - Karaf minimal is missing the feature files. 
+    * [KARAF-655] - Remove http://repository.ops4j.org/maven2 from org.apache.karaf.management.cfg
+    * [KARAF-656] - kar deployer service not exported
+    * [KARAF-670] - Missing ${karaf.base}/system cause NullPointerException
+    * [KARAF-686] - introduce an override flag to configfile element so that we get chance to not override the finalname if it already exist
+    * [KARAF-689] - Karaf instance can wrongly obtain a lock when the locking table is empty on a Oracle DB
+    * [KARAF-690] - install http feature will start both 8080 and 8181 jetty port
+
+** Dependency upgrade
+    * [KARAF-672] - Upgrade to felix event admin 1.2.12
+    * [KARAF-680] - Upgrade to Pax URL 1.2.7
+    * [KARAF-682] - upgrade to jetty 7.4.2.v20110526
+
+** Improvement
+    * [KARAF-445] - Add completion for shell aliases
+    * [KARAF-573] - Print out that karaf has to be restarted if using framework with new framework
+    * [KARAF-614] - Add warning to osgi:shutdown to avoid inadvertently shutting down the container
+    * [KARAF-618] - Align Cellar major version with the Karaf one
+    * [KARAF-651] - features-maven-plugin should "embed" the Karaf features descriptor
+    * [KARAF-654] - Merge jetty feature with jetty-jaas feature
+    * [KARAF-661] - Typing ^D should behave as on Unix
+    * [KARAF-662] - Clarify relationship of config.properties and custom.properties
+    * [KARAF-663] - features-maven-plugin add-features-to-repo should embed Karaf core features descriptor
+
+** Task
+    * [KARAF-543] - Add manual section around log custom appenders
+    * [KARAF-619] - Add Cellar manual
+    * [KARAF-620] - Cellar should use the parent Karaf POM
+    * [KARAF-646] - Upgrade to Jetty 7.4.1.v20110513
+    * [KARAF-694] - Upgrade to Pax-Logging 1.6.3
+    * [KARAF-695] - Upgrade to Pax-Web 1.0.4
+
+** Test
+    * [KARAF-683] - use filter ${karaf.version} instead of the hard code one to fix archetypes/itests failure
+
+                    Apache Karaf 2.2.1
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.2.x series branch, representing an
+ update to Apache Karaf 2.2.0. It contains bug fixes identified in the prior release, 
+ and introduces improvements including; updates to pax-logging, pax-runner, pax-web, 
+ jetty, and felix versions. The config commands have has been updated, and kar features 
+ are now in features-maven-plugin.
+  For more detail please see the change log below. 
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-456] - Artifact versions named in the documentation are not replaced with the version of the current project
+    * [KARAF-493] - Various site fixes
+    * [KARAF-494] - Include the .kar features in 2.2.1
+    * [KARAF-504] - Features Maven Plugin does not work with Maven 3
+    * [KARAF-506] - The config shell commands offer no way to delete a command
+    * [KARAF-507] - The config shell completer does not allow completion of factory based pids
+    * [KARAF-508] - The config:edit create does not allow the creation of factory configs
+    * [KARAF-509] - The config:update command does not save factory configurations to the correct file
+    * [KARAF-512] - WebConsole installation failed due to missing jetty-jaas feature
+    * [KARAF-518] - Unable to load features.xml with included schema attribute
+    * [KARAF-521] - Executing complex scripts is extremely difficult
+    * [KARAF-525] - Bundles listed in etc/startup.properties should only installed the first time
+    * [KARAF-527] - The console bundle should indicate it provides the gogo related services
+    * [KARAF-528] - Error while using correct feature descriptor in features-maven-plugin
+    * [KARAF-534] - Startlevel: Strange deployment behaviour 
+    * [KARAF-535] - Description for List command incorrectly claims Threshold default is -1
+    * [KARAF-537] - admin.bat prints stacktraces to standard out
+    * [KARAF-546] - Null point exception when executing log:display on an empty log
+    * [KARAF-547] - Missing features file in the system directory of the distribution
+    * [KARAF-557] - Feature: Failed to check to not install a bundle with the symbolic name contains attributes
+    * [KARAF-558] - Boot feature from configuration file, can contain some spaces; the name should be trimmed
+    * [KARAF-559] - AdminService loses root flag for instances
+    * [KARAF-562] - Config properties defined in <config> tag (features.xml) are loaded during each refresh
+    * [KARAF-568] - minimal assembly: zip and tar.gz do differ in content
+    * [KARAF-569] - Installing and uninstalling the jetty feature leaves Karaf in an ususable state
+    * [KARAF-577] - Cannot Run WAR From Root Context
+    * [KARAF-580] - Kar installer in 2.2 uses feature instead of features as classifier
+    * [KARAF-585] - When connected to a remote instance, Ctrl-C closes the connection instead of simply interrupting the command
+    * [KARAF-589] - Shell console ExampleSubclassMain unit test is broken
+    * [KARAF-599] - Archetypes CommandArchetypeTest unit test fails
+    * [KARAF-600] - "Extending the console" documentation still refers to org.osgi.service.command
+    * [KARAF-610] - Can't input the path string completely via karaf shell
+    * [KARAF-621] - features-maven-plugin:2.2.0:generate-features-xml fails with NullPointerException
+    * [KARAF-625] - Missing property 'log4j.appender.out.file' in the file org.ops4j.pax.logging.cfg caused a NPE
+    * [KARAF-626] - admin:connect always fails with "Authentication failed"
+    * [KARAF-629] - CommandArchetypeTest test case failure, expected START_TAG or END_TAG not TEXT.
+    * [KARAF-630] - SpringDeploymentListenerTest fails on IBM JDK builds with No Class Def Found Error
+    * [KARAF-632] - Itests failures
+
+** Dependency upgrade
+    * [KARAF-590] - Upgrade to pax-logging 1.6.2
+    * [KARAF-591] - Upgrade aopalliance ServiceMix bundle to 1.0_5
+    * [KARAF-592] - Upgrade asm ServiceMix bundle to 3.3_2
+    * [KARAF-593] - Upgrade cglib ServiceMix bundle to 2.1_3_7
+    * [KARAF-594] - Upgrade commons-codec ServiceMix bundle to 1.3_4
+    * [KARAF-595] - Upgrade commons-collections ServiceMix bundle to 3.2.1_2
+    * [KARAF-596] - Upgrade commons-lang ServiceMix bundle to 2.4_5
+    * [KARAF-597] - Upgrade jasypt ServiceMix bundle to 1.7_3
+    * [KARAF-598] - Upgrade junit ServiceMix bundle to 4.7_3
+    * [KARAF-613] - Upgrade to Blueprint 0.3.1
+
+** Improvement
+    * [KARAF-461] - dev:create-dump command should generate a cleaner zip file name
+    * [KARAF-476] - The admin-command should be extended to handle RMI-server-port settings
+    * [KARAF-483] - pax-web jetty.xml configfile should contain default security realm 
+    * [KARAF-484] - Upgrade to Felix Framework 3.0.9
+    * [KARAF-487] - Improve --help information for obr:list
+    * [KARAF-488] - obr:list should also include the bundle-symbolic-name of the packages it lists as this is used to execute other OBR commands
+    * [KARAF-495] - Add a Tutorials section to the website.
+    * [KARAF-497] - Resolve mvn: urls in <descriptor/> element for features-maven-plugin:add-features-to-repo
+    * [KARAF-513] - The ssh:ssh and admin:connect command do not allow passing a command to execute
+    * [KARAF-514] - When starting a child instance, there's no way to wait until it's started 
+    * [KARAF-517] - Upgrade to pax-runner 1.6.1
+    * [KARAF-533] - Improve depdencny handling to manual
+    * [KARAF-539] - Document configfile xml tag of features
+    * [KARAF-542] - Support of next line with '>' character
+    * [KARAF-551] - Implement the shell:source command
+    * [KARAF-554] - Add karaf version in system properties and display in shell:info command output
+    * [KARAF-563] - Adjustable PermSize and MaxPermSize in karaf script
+    * [KARAF-564] - Allow configuring features OBR resolver to resolve optional imports as well
+    * [KARAF-574] - Re-introduce export version in packages:exports command
+    * [KARAF-576] - introduce start-level attribute for feature element in features.xml
+    * [KARAF-588] - Some fixes to Karaf Site
+    * [KARAF-603] - Add 'karaf-framework' feature to describe core Karaf bundles
+    * [KARAF-606] - JAAS: Allow LDAPLoginModule to supply role "DN" from LDAP group search
+
+** New Feature
+    * [KARAF-463] - Add chapter for Pax Web and the OSGi HttpService
+    * [KARAF-605] - Add param to Gogo Argument and Option to override default value with specific value
+
+** Task
+    * [KARAF-489] - Upgrade pax-logging to 1.6.1
+    * [KARAF-492] - Upgrade Karaf to version 1.0.2 of pax-web
+    * [KARAF-500] - Upgrade to Jetty 7.3.1
+    * [KARAF-501] - Upgrade to PAX Exam 1.2.4
+    * [KARAF-516] - Upgrade to felix eventadmin 1.2.10
+    * [KARAF-552] - Upgrade to Pax URL 1.2.6
+    * [KARAF-566] - Build: Remove duplicate entries from build artefacts.
+    * [KARAF-567] - org.apache.karaf.jaas.config.impl accidentally exported?
+    * [KARAF-578] - Upgrade to PAX-WEB 1.0.3 
+
+
+                    Apache Karaf 2.2.0
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf contains a multitude of new features, improvements, and
+bug fixes.  Some highlights include many new or updated commands, a LDAP JAAS module
+with login support, an updated feature service, a feature for Aries transaction, JPA &
+JNDI modules, expanded documentation, and new versions of most dependencies.  The help
+system and manual have also undergone major updates. Please note that if you are using 
+pax-exam with scanFeatures that you also have to upgrade pax-exam to the latest version.
+  For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Sub-task
+    * [KARAF-272] - Update Release Notes in kit and online. 
+    * [KARAF-392] - Ability to use features-maven-plugin:add-features-to-repo without specifying features
+    * [KARAF-393] - Ability to use features-maven-plugin:add-features-to-repo with explicitly specified remote maven repositories
+    * [KARAF-441] - Add Karaf-2.2.x to Hudson
+    * [KARAF-462] - Update SCM section in main pom.xml to reference branch 2.2.x instead of trunk.
+
+** Bug
+    * [KARAF-8] - Improve error reporting for features installer
+    * [KARAF-17] - ANSI support not properly initialized when creating an Karaf instances from WebConsole or JMX
+    * [KARAF-156] - command dev:dynamic-import does not work
+    * [KARAF-221] - When starting a bare karaf, a single bundle is displayed when using osgi:list, we should display none
+    * [KARAF-230] - 2.1.0 Wrapper doesn't work and if hacked no SSH
+    * [KARAF-232] - validate goal of features-maven-plugin should support wrap jar
+    * [KARAF-236] - Command Features:info with tree switch displays partial information
+    * [KARAF-238] - SLF4J Duplicate bindings warning when using Equinox
+    * [KARAF-239] - Equinox Framework Extensions
+    * [KARAF-241] - Shell commands are not registered in OSGi
+    * [KARAF-244] - features-maven-plugin does not work with maven 3
+    * [KARAF-254] - Web configmanager did not list all available configurations
+    * [KARAF-261] - Cannot run command admin on cygwin.
+    * [KARAF-262] - The command admin create new instance cannot create good script in bash language on cygwin
+    * [KARAF-265] - add-features-to-repo goal of features-maven-plugin should support wrap jar with additional instructions
+    * [KARAF-268] - When installing a bundle from a feature with blancks before  / after the bundle url, those bundles are not loaded on restart (on felix)
+    * [KARAF-270] - karaf-service scripts tries to create "data" directory in wrong location 
+    * [KARAF-273] - java.lang.NullPointerException: Inflater has been closed
+    * [KARAF-282] - The shell:exec does not always capture the whole output
+    * [KARAF-285] - The bin/shell script should not read the input stream when a command is passed
+    * [KARAF-286] - When running in the plain shell console (using bin/shell), tab completion prints lots of exceptions
+    * [KARAF-288] - Shell history doesn't work anymore (at leas on windows)
+    * [KARAF-292] - Maven filtering issue for Windows batch files in kit
+    * [KARAF-295] - Webconsole - Configuration Admin, shows multiple entries for FileInstall after restart
+    * [KARAF-299] - [patch] miscellaneous cleanups
+    * [KARAF-300] - Incorrect behavior of backspace/delete keys in web console Gogo plugin
+    * [KARAF-304] - Startup problems: javax.naming.NoInitialContextException: Unable to determine caller'sBundleContext
+    * [KARAF-311] - Deploying a sample application in the User's Guide is missing a command
+    * [KARAF-313] - feature.xml is not read correct if it contains linebreaks
+    * [KARAF-321] - karaf shell script does not work with mingw and whitespaces in path
+    * [KARAF-324] - Shell/Console tests fail in windows
+    * [KARAF-326] - eclipse:eclipse importing error
+    * [KARAF-327] - Graceful shutdown of Windows service, revisited
+    * [KARAF-330] - Removal of a JAAS realm service actually remove the wrong reference in the internal storage
+    * [KARAF-331] - Failure to execute script against Karaf sshd. 
+    * [KARAF-335] - The lib folder should be optional
+    * [KARAF-344] - Deploying a new JAAS config requires to restart the framework
+    * [KARAF-347] - org.ops4j.pax.url.mvn.cfg contains incorrect comment on last property
+    * [KARAF-357] - shell.bat won't start with NoClassDefFoundError and NPE
+    * [KARAF-358] - When the feature service calls refresh(), it should wait for the refresh to happen before returning
+    * [KARAF-360] - Empty comment in some config files
+    * [KARAF-384] - Cannot find some jar in ext directory
+    * [KARAF-389] - Remove transitive dependencies from features-maven-plugin
+    * [KARAF-398] - Features schema is not correct
+    * [KARAF-414] - The apache-karaf-2.1.99-SNAPSHOT-minimal.tar.gz generated contains unresolved dependencies
+    * [KARAF-415] - Config commands do not support the use of Managed Service Factories
+    * [KARAF-421] - StringCompleter extension cannot return own strings
+    * [KARAF-425] - Info command shows duplicated sections
+    * [KARAF-428] - obr:addurl/removeurl generate incorrect "obr.repository.url" property
+    * [KARAF-429] - Configuration not found warning in wrap deployer
+    * [KARAF-436] - Typo mistake in the FeaturesServiceMBean
+    * [KARAF-440] - features-maven-plugin throws NullPointerException maven 3.0.2
+    * [KARAF-442] - Wrong EventType called in FeaturesService.uninstallFeature
+    * [KARAF-453] - Manual war contains two web.xml files - cannot be served by pax-web
+    * [KARAF-458] - Fix the karaf shell to look nice within Eclipse console
+    * [KARAF-472] - features-maven-plugin: TAB-characters in feature-repository lead to resolution-errors in add-features-to-repo
+    * [KARAF-480] - Minor ansi issue with admin:rename command
+    * [KARAF-481] - Karaf 2.2.x manuals do not get signature files created
+    * [KARAF-485] - Karaf MBeans are not registered
+
+** Improvement
+    * [KARAF-5] - [karaf] admin:create should support a -r, --rmi-registry-port option to allow the RMI registry port to be configured 
+    * [KARAF-53] - Provide XML Schema for feature descriptors and support it's validation
+    * [KARAF-58] - Improve terminal height / width support
+    * [KARAF-60] -  Improve history support by using the !
+    * [KARAF-197] - The SSH layer should dynamically handle configuration changes
+    * [KARAF-202] - Create la alias in shell.init.script
+    * [KARAF-214] - Print a nice error when a command is not found
+    * [KARAF-215] - Upgrade to latest jline2 /  jansi
+    * [KARAF-224] - Improve log:display command to display colored log events
+    * [KARAF-227] - The shell/log commands should use a dynamic configuration
+    * [KARAF-228] - The jaas/modules should use a dynamic configuration
+    * [KARAF-229] - The management bundle should use a dynamic config
+    * [KARAF-234] - validate goal of features-maven-plugin should support spring/blueprint/feature protocol prefix
+    * [KARAF-237] - print importer bundle in packages:imports
+    * [KARAF-240] - Cleanup Karaf pom to use version and groupId from the parent pom
+    * [KARAF-243] - Provide InfoProvider that will collect information from bundle MANIFEST.MF 
+    * [KARAF-247] - Add J2SE-1.2 to org.osgi.framework.executionenvironment
+    * [KARAF-251] - Allow the use of version ranges on dependant features
+    * [KARAF-252] - Add a dependency boolean attribute on features' bundles and allow specifiying an optional resolver
+    * [KARAF-253] - changing the default JMX service uri to be more enterprise frendly
+    * [KARAF-255] - Move Karaf manual generation out of standard install to its own profile
+    * [KARAF-259] - Upgrade dependencies to their latest version
+    * [KARAF-266] - Upgrade Karaf encryption to use Jasypt 1.7
+    * [KARAF-267] - Use ServiceMix ASM 3.1.0 bundle in place of the springsource one
+    * [KARAF-274] - Upgrade to JLine 2.5
+    * [KARAF-283] - Make Vm options for child karaf server persistent and part of the configuration
+    * [KARAF-289] - Webconsole - Admin should look like the other webconsole plugins
+    * [KARAF-291] - Webconsole - Features should look like the other webconsole plugins
+    * [KARAF-297] - Spring Features should provide spring-web bundles
+    * [KARAF-302] - Features for Jetty-JAAS
+    * [KARAF-306] - Improve documentation on creating commands with completers
+    * [KARAF-309] - Provide jetty.xml with preconfigured JAAS Authentication.
+    * [KARAF-314] - feature-maven-plugin does not fail if component couldn't be found
+    * [KARAF-316] - Add head/tail commands
+    * [KARAF-318] - JdbcBackingEngine should acquire schema configuration from JdbcLoginModule
+    * [KARAF-320] - Missing svn:ignores
+    * [KARAF-329] - improve test-util methods
+    * [KARAF-332] - Add log tail command
+    * [KARAF-336] - Make sure users using console / shell / webconsole have a known role 
+    * [KARAF-338] - Upgrade Karaf to version 1.0.0 of pax-web
+    * [KARAF-340] - When the webconsole is invoked, the code should be run under the credentials of the authenticated user
+    * [KARAF-341] - When a ssh console is invoked, the code should be run under the credentials of the authenticated user
+    * [KARAF-343] - Upgrade to fileinstall 3.1.10
+    * [KARAF-346] - make features:install more verbose
+    * [KARAF-349] - Upgrade to SLF4j 1.5.8
+    * [KARAF-353] - features commands should allow more than 1 argument
+    * [KARAF-356] - The main console should run under the user's subject
+    * [KARAF-362] - Add documentation how to build a custom karaf distribution including branding
+    * [KARAF-375] - features-maven-plugin always uses transitive features
+    * [KARAF-385] - Upgrade to felix framework 3.0.8
+    * [KARAF-386] - Add a debug argument on the bin/karaf shell script to start karaf using remote debugging
+    * [KARAF-387] - Create an assembly mmaven module under feature to generate basic and enterprise features xml file
+    * [KARAF-388] - allow specifying a version for a boot feature in etc/org.apache.karaf.features.cfg
+    * [KARAF-394] - Add aries-application in features enterprise file + made small enhancements
+    * [KARAF-395] - Modify org.apache.karaf.features.cfg to use features files standard and enterprise
+    * [KARAF-396] - Upgrade to Pax-Logging 1.6.0 (providing slf4j 1.6.x support)
+    * [KARAF-403] - Improve Bundle-Description header display
+    * [KARAF-404] - Upgrade to felix maven-bundle-plugin 2.3.4
+    * [KARAF-405] - Force JDK 1.5 compiler
+    * [KARAF-409] - Use the new Karaf Logo on Webconsole
+    * [KARAF-412] - Documentation: Add notes on how to make multiple configuration files available to the bundle context.
+    * [KARAF-416] - All PaxAppenders should be automatically called instead of having to configure them explicitely
+    * [KARAF-417] - Move extractNameVersionType() method into Karaf utils
+    * [KARAF-420] - Automatically import paxlogging packages when deploying a war
+    * [KARAF-422] - If no version was found, features-maven-plugin try to create an artifact with a null version
+    * [KARAF-423] - KarafJaasPasswordAuthenticator should log reason for authentication failure.
+    * [KARAF-443] - Most of the blueprint bundles should be lazy by default
+    * [KARAF-446] - Upgrade to Felix webconsole 3.1.8
+    * [KARAF-455] - Improve the confluence output for commands
+
+** New Feature
+    * [KARAF-151] - Implement an assembly 'extract' deployment option, with automatic detection of feature repositories
+    * [KARAF-188] - Provide commands to manage users, passwords and roles
+    * [KARAF-209] - Allow the info command to display custom information such as Apache ServiceMix version number
+    * [KARAF-211] - osgi:list to other command to display context-path for web applications or a new war command for that
+    * [KARAF-213] - create an automatic completer if an @Argument is a File by using the current working directory and completing on files. I wonder if we could provide an optional filter method maybe to restrict available files?
+    * [KARAF-218] - Add a more pager command
+    * [KARAF-225] - FeaturesService should publish OSGi events
+    * [KARAF-233] - Add a log:clear command
+    * [KARAF-257] - Features - Add description attribute and have it listed in the features overview
+    * [KARAF-290] - Optional feature event-admin
+    * [KARAF-293] - Feature for Aries Transaction,JPA & JNDI modules.
+    * [KARAF-307] - Ldap jaas login module
+    * [KARAF-310] - Add LDAP JAAS module
+    * [KARAF-348] - Add admin:rename command
+    * [KARAF-350] - Add KARAF_OPTS param to startup scripts
+    * [KARAF-373] - Add option to features-maven-plugin to automatically include <descriptors> into <repository>
+    * [KARAF-380] - Add .jar deployer autowrapping non-bundle-jar files dropped to deploy folder
+    * [KARAF-391] - Ability to use features-maven-plugin:add-features-to-repo without specifying features
+    * [KARAF-426] - Manage Karaf shell.name by branding
+    * [KARAF-473] - Support version resolving in FeatureService#getFeatures(name/version)
+    * [KARAF-477] - Karaf console should gracefully handle errors due to the history file being read only
+    * [KARAF-478] - Subclasses of Console should be able to change the history file
+
+** Task
+    * [KARAF-42] - Use an svn based mechanism  for Karaf's manual
+    * [KARAF-43] - Use overriden properties instead of configuring the maven bundle plugin in each module
+    * [KARAF-219] - Upgrade to latest gogo
+    * [KARAF-235] - Upgrade to latest Aries JMX / Blueprint
+    * [KARAF-258] - Use the org.osgi groupId for core and compendium specs
+    * [KARAF-276] - upgrade to pax-url 1.2.1
+    * [KARAF-287] - Bump the jaas xsd / namespace handler as it has changed
+    * [KARAF-301] - Create integration tests for the distribution itself
+    * [KARAF-333] - Update karaf to use pax-url-mvn ver 1.2.4
+    * [KARAF-345] - upgrade to spring 3.0.5.RELEASE
+    * [KARAF-351] - Upgrade to pax-exam 1.2.3
+    * [KARAF-390] - Upgrade to event admin 1.2.8
+    * [KARAF-410] - Upgrade to spring-dm 1.2.1
+    * [KARAF-411] - Upgrade to jetty 7.2.2.v20101205
+    * [KARAF-427] - Use slf4j as default logger
+    * [KARAF-431] - Add documentation around remote management via JMX
+    * [KARAF-433] - Add documentation about KAR archive format and deployer
+    * [KARAF-434] - Add wrap deployer description in the deployer section of the Karaf user guide
+    * [KARAF-435] - Add diagnostic documentation (dev:create-dump, etc) in the Karaf User Guide
+    * [KARAF-437] - Document jre.properties tuning
+    * [KARAF-438] - Upgrade to Aries 0.3
+    * [KARAF-439] - Provide documentation about the Karaf wrapper
+    * [KARAF-444] - Upgrade to latest version of pax-url
+    * [KARAF-454] - Upgrade Karaf to version 1.0.1 of pax-web
+
+
+                    Apache Karaf 2.1.4
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.3. It contains several bug fixes identified in the prior release, and introduces several improvements including; better behavior of the features-maven-plugin, documentation for making multiple configuration files available to the bundle context, and a more efficient bundle description for header display. For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-8] - Improve error reporting for features installer
+    * [KARAF-384] - Cannot find some jar in ext directory
+    * [KARAF-421] - StringCompleter extension cannot return own strings
+    * [KARAF-428] - obr:addurl/removeurl generate incorrect "obr.repository.url" property
+    * [KARAF-436] - Typo mistake in the FeaturesServiceMBean
+    * [KARAF-440] - features-maven-plugin throws NullPointerException maven 3.0.2
+    * [KARAF-442] - Wrong EventType called in FeaturesService.uninstallFeature
+
+** Improvement
+    * [KARAF-375] - features-maven-plugin always uses transitive features
+    * [KARAF-388] - allow specifying a version for a boot feature in etc/org.apache.karaf.features.cfg
+    * [KARAF-403] - Improve Bundle-Description header display
+    * [KARAF-412] - Documentation: Add notes on how to make multiple configuration files available to the bundle context.
+    * [KARAF-422] - If no version was found, features-maven-plugin try to create an artifact with a null version
+    * [KARAF-430] - don't force a karaf deploy to have a lib directory
+
+** New Feature
+    * [KARAF-373] - Add option to features-maven-plugin to automatically include <descriptors> into <repository>
+
+
+                    Apache Karaf 2.1.3
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.2. It contains several bug fixes identified in the prior release, and updates the versions of SLF4j, pax-url-mvn, spring, and pax-exam. For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-244] - features-maven-plugin does not work with maven 3
+    * [KARAF-282] - The shell:exec does not always capture the whole output
+    * [KARAF-292] - Maven filtering issue for Windows batch files in kit
+    * [KARAF-299] - [patch] miscellaneous cleanups
+    * [KARAF-300] - Incorrect behavior of backspace/delete keys in web console Gogo plugin
+    * [KARAF-304] - Startup problems: javax.naming.NoInitialContextException: Unable to determine caller'sBundleContext
+    * [KARAF-313] - feature.xml is not read correct if it contains linebreaks
+    * [KARAF-319] - Pom hierarchy error
+    * [KARAF-321] - karaf shell script does not work with mingw and whitespaces in path
+    * [KARAF-326] - eclipse:eclipse importing error
+    * [KARAF-327] - Graceful shutdown of Windows service, revisited
+    * [KARAF-331] - Failure to execute script against Karaf sshd. 
+    * [KARAF-344] - Deploying a new JAAS config requires to restart the framework
+    * [KARAF-347] - org.ops4j.pax.url.mvn.cfg contains incorrect comment on last property
+    * [KARAF-357] - shell.bat won't start with NoClassDefFoundError and NPE
+    * [KARAF-358] - When the feature service calls refresh(), it should wait for the refresh to happen before returning
+    * [KARAF-360] - Empty comment in some config files
+
+** Improvement
+    * [KARAF-314] - feature-maven-plugin does not fail if component couldn't be found
+    * [KARAF-320] - Missing svn:ignores
+    * [KARAF-329] - improve test-util methods
+    * [KARAF-349] - Upgrade to SLF4j 1.5.8
+
+** Task
+    * [KARAF-333] - Update karaf to use pax-url-mvn ver 1.2.4
+    * [KARAF-345] - upgrade to spring 3.0.5.RELEASE
+    * [KARAF-351] - Upgrade to pax-exam 1.2.3
+
+
+                    Apache Karaf 2.1.2
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.1. It contains several bug fixes identified in the prior release, and updates the pax-url version. For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Bug
+    * [KARAF-270] - karaf-service scripts tries to create "data" directory in wrong location 
+    * [KARAF-273] - java.lang.NullPointerException: Inflater has been closed
+    * [KARAF-277] - The bin/client script does not work anymore
+    * [KARAF-262] - The command admin create new instance cannot create good script in bash language on cygwin
+    * [KARAF-284] - Remove snapshot dependency on org.apache.karaf.shell.console in archetypes/command/src/main/resources/archetype-resources/pom.xml
+    * [KARAF-285] - The bin/shell script should not read the input stream when a command is passed
+    * [KARAF-286] - When running in the plain shell console (using bin/shell), tab completion prints lots of exceptions
+    * [KARAF-292] - Maven filtering issue for Windows batch file in kit.
+
+** Task
+    * [KARAF-276] - upgrade to pax-url 1.2.1
+
+
+                    Apache Karaf 2.1.1
+                    ==================
+
+  Overview
+  --------
+
+  This release of Apache Karaf is based off of the 2.1.x series branch, representing an update to Apache Karaf 2.1.0. It contains multiple bug fixes, while introducing a minimal number of changes to dependencies from our last release. For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+** Sub-task
+    * KARAF-269 - Update jetty bundle version in main karaf 2.1.1 pom.
+
+** Bug
+    * KARAF-17 - ANSI support not properly initialized when creating an Karaf instances from WebConsole or JMX
+    * KARAF-156 - command dev:dynamic-import does not work
+    * KARAF-221 - When starting a bare karaf, a single bundle is displayed when using osgi:list, we should display none
+    * KARAF-232 - validate goal of features-maven-plugin should support wrap jar
+    * KARAF-238 - SLF4J Duplicate bindings warning when using Equinox
+    * KARAF-239 - Equinox Framework Extensions
+    * KARAF-261 - Cannot run command admin on cygwin.
+    * KARAF-265 - add-features-to-repo goal of features-maven-plugin should support wrap jar with additional instructions
+    * KARAF-268 - When installing a bundle from a feature with blancks before / after the bundle url, those bundles are not loaded on restart (on felix)
+
+** Improvement
+    * KARAF-234 - validate goal of features-maven-plugin should support spring/blueprint/feature protocol prefix
+    * KARAF-247 - Add J2SE-1.2 to org.osgi.framework.executionenvironment
+    * KARAF-263 - Upgrade to Spring 3.0.4.RELEASE
+    * KARAF-264 - Upgrade to Jetty 6.1.25
+
+** New Feature
+    * KARAF-225 - FeaturesService should publish OSGi events
+
+
+                    Apache Karaf 2.1.0
+                    ==================
+
+  Overview
+  --------
+
+   New to this release of Apache Karaf is a JAAS Database Login Module, a way to store
+ passwords in a secured way, a mechanism that allows a karaf application to distinguish 
+ between UserPrincipal and RolePrincipal without depending from the Karaf JAAS Module. 
+   The shell console has been enhanced to be available in a plain non-OSGi environment and
+ smart tab completion has been improved, along with various commands. 
+   We have also resolved a number of outstanding issues, and improved support on OS X and 
+ IBM Java based systems. For more detail please see the change log below.
+
+  Changelog
+  ---------
+
+ The following list shows the bug fixes and enhancements included in this release:
+
+** Bug
+    * [KARAF-13] - javax.annotation not exported
+    * [KARAF-19] - Exception in pax-web when shutting down karaf
+    * [KARAF-125] - Webconsole can't concat strings?
+    * [KARAF-133] - NPE when installing a bundle with a MANIFEST.MF not in the first entry of the zip
+    * [KARAF-134] - The sort command does not work when trying to sort on the last field
+    * [KARAF-136] - should override equals method for FeaturesListener to handle the proxy compared to wrapped object case
+    * [KARAF-137] - IOException on web demo when trying to connect through SSH
+    * [KARAF-138] - WarDeploymentListener: checks for manifest osgi entries but fails if no manifest is found
+    * [KARAF-142] - NPE at org.apache.felix.webconsole.internal.servlet.OsgiManager.service - karaf started in server mode
+    * [KARAF-143] - Setting "karaf.instances" system property has no effect
+    * [KARAF-145] - Reading Properties like karaf.framework should be trimmed before reusage
+    * [KARAF-150] - Config admin contains 2 configurations for SSH port in Karaf
+    * [KARAF-162] - need exactly specify the import jline package version for webconsole.gogo
+    * [KARAF-167] - Creating a new config using the shell commands lead to a FileNotFoundException instead of the file being created
+    * [KARAF-169] - Do not use the ClassPath manifest header for the karaf client jar
+    * [KARAF-178] - When the karaf runtime is launched under JSW, the bin/client script fails to connect
+    * [KARAF-189] - Java endorsed dirs on AIX (IBM JVM)
+    * [KARAF-190] - karaf-wrapper.conf is incorrect
+    * [KARAF-199] - WarDeploymentListener: doesn't handle the default Webapp-Context correct on a Windows System
+    * [KARAF-204] - Ctrl+D needs to be followed by another character to be recognized (at least when using the karaf client)
+    * [KARAF-206] - The converter used for converting commands arguments and options can't convert objects to String
+
+** Improvement
+    * [KARAF-106] - Provide a more minimal / static disitrbution of karaf
+    * [KARAF-130] - Allow a repository URL to be added to feature repository URL list even though it is an invalid one
+    * [KARAF-135] - The package:export command should have more option to control the output
+    * [KARAF-139] - Add a Shell Console branding demo
+    * [KARAF-140] - Modifying properties and saving them via the Config Console removes comments in the original file
+    * [KARAF-141] - Tests should be able to be run without any internet connections
+    * [KARAF-146] - osgi:list should only print out 'system' bundles above a certain level, by default, this should be 50, but it should be configurable
+    * [KARAF-148] - features:listUrl should print the repository names as well as the Url. 
+    * [KARAF-152] - when using the @Argument annotation, if there is no name specified it would be nice to reuse the name of the field, rather than use VAL
+    * [KARAF-155] - optional @Argument values (and I guess @Option values) can have default values which could be displayed in the help screen by reflecting into the value and finding non-zero/null values
+    * [KARAF-157] - [PATH] minor patch to make it easier to reuse the Karaf command line console from outside Karaf specialising the user and application
+    * [KARAF-158] - better display of errors when running a non-osgi command line outside of the shell
+    * [KARAF-159] - when a bad command is typed (e.g. invalid command, argument, option) we should use some kind of syntax highlighting for the name of the command/argument/option in the error message
+    * [KARAF-161] - provide an easy implementation of "public static void main(String[] args)" for a single command (i.e. for non-shells)
+    * [KARAF-163] - Generate Features XML should handle artifact types
+    * [KARAF-164] - Allow sub classes of Main to override the META-INF path used to discover commands
+    * [KARAF-168] - Upgrade to latest Felix framework
+    * [KARAF-170] - Main --help should behave like Main someCommand --help and list all the possible sub commands when outside of OSGi
+    * [KARAF-171] - provide a default "help" sub command in shells used outside of OSGi
+    * [KARAF-173] - Make it easier to configure the Karaf Main shell by subclassing.
+    * [KARAF-174] - tab completion of sub commands not working in the non-osgi shell
+    * [KARAF-175] - Upgrade to Java Service Wrapper 3.2.3
+    * [KARAF-176] - Improve integration to provide a clean shutdown when running as a service
+    * [KARAF-177] - Support 64 bits platforms for Java Service Wrapper on OS X
+    * [KARAF-181] - Allow the cmdhelp maven plugin to generate output in confluence format
+    * [KARAF-182] - Upgrade to Aries 0.2-incubating
+    * [KARAF-184] - Enhance the dev:framework command to display or set the OSGi framework name
+    * [KARAF-185] - Have a 'clean' parameter on the main shell script to clean the working folder
+    * [KARAF-186] - Upgrade to pax-logging 1.5.3
+    * [KARAF-187] - The completers do not work when several commands are on the same line separated by a column or pipe
+    * [KARAF-191] - Create a Karaf Util module gathering all util classes
+    * [KARAF-192] - Completion does not work on options, or even on arguments if an option is specified
+    * [KARAF-193] - It should be possible to load a Command description from a text file
+    * [KARAF-196] - Improve the output of osgi:headers command
+    * [KARAF-198] - Remove dependency upon org.slf4j.helpers.MessageFormatter
+    * [KARAF-200] - Upgrade to latest pax-runner and pax-exam
+    * [KARAF-202] - Create la alias in shell.init.script
+    * [KARAF-207] - The webconsole feature should not depend on the admin bundles
+    * [KARAF-208] - when reusing the karaf shell outside of OSGi where there's only one shell scope, it would be nice to avoid prefixing the command names with the scope or with "*:" which is confusing
+    * [KARAF-210] - Allow to specific context-path when installing a war file using the war url handler
+
+** New Feature
+    * [KARAF-26] - have restart clean command/API
+    * [KARAF-144] - Allow using the console and commands outside of OSGi
+    * [KARAF-147] - We should have a features:listVersions command that lists all the known versions of a feature
+    * [KARAF-149] - Add a features:removeRepository command
+    * [KARAF-166] - Allow subclasses of org.apache.karaf.shell.console.Main to be used as sub shells
+    * [KARAF-172] - Implement a mechanism that would allow a karaf application to distingush between UserPrincipal & RolePrincipal without depending from Karaf JAAS Modules
+    * [KARAF-180] - JAAS Database Login Module
+    * [KARAF-212] - provide a simple annotation, say,@CompleterValues which can be used on methods on an action to provide a list of available values for an argument for tab completion
+
+** Task
+    * [KARAF-40] - Create a maven archetype for creating shell commands
+
+
+                    Apache Karaf 2.0.0
+                    ==================
+
+  Overview
+  --------
+
+ The Apache Karaf 2.0.0 is the first release since the move of Apache Felix Karaf to Apache Karaf.
+ This release brings new features, improvements and bug fixes. The changelog below contains the whole
+ list of changes.
+
+  Changelog
+  ---------
+
+ The following list shows the bug fixes and enhancements included in this release:
+
+** New Feature
+    * [KARAF-31] - Use OBR if available to compute the transitive closure of karaf features
+    * [KARAF-110] - Provide a placeholder for overriding the configuration properties
+    * [KARAF-111] - Allow includes of additional configuration files through a custom property when loading the main configuration files
+
+** Improvement
+    * [KARAF-45] - Improve war deployer in order to provide the WebApp-context
+    * [KARAF-54] - Minimum default properties
+    * [KARAF-59] - Introduce a ${karaf.data} system property to be able to easily move the data directory to a different location
+    * [KARAF-67] - Change the webconsole config in the features descriptor to specifiy the realm and not the username/password which aren't used anymore
+    * [KARAF-95] - Upgrade Spring to 3.x
+    * [KARAF-96] - Enhance the features to support the start level
+    * [KARAF-97] - Upgrade to Felix framework 3.x
+    * [KARAF-98] - Upgrade to equinox 3.6.0
+    * [KARAF-103] - add a spring-dm feature which use spring 2.5.6 inside
+    * [KARAF-105] - Remove dependencies on the preference service
+    * [KARAF-107] - Improve default log configuration with a rolling file appender
+    * [KARAF-108] - Change 'storage.location' system property to 'karaf.instances' for better homogeneity
+    * [KARAF-109] - Split the JVM packages from the main config.properties file for easier maintenance
+    * [KARAF-112] - Free the org.osgi.framework.system.packages.extra property for users
+    * [KARAF-117] - refactor tooling/testing/Helper to accomodate recent changes in config.properties
+    * [KARAF-118] - Update Pax Url Wrap to version 1.1.3
+    * [KARAF-120] - Some jars are not included in our system repository
+    * [KARAF-121] - Better exception handling in JaasSecurityProvider
+    * [KARAF-127] - Enahnce features mechanism to allow to stop/start bundle
+
+** Bug
+    * [KARAF-4] - [Karaf] If features:refreshUrl reads an incorrect <features> definition, it deletes the old version
+    * [KARAF-16] - The JRE provided ciphers are not used on ubuntu server
+    * [KARAF-65] - NPE in StandardEmitterMBean on JDK 6
+    * [KARAF-99] - new spring 3.0.3.RELEASE feature miss some bundles
+    * [KARAF-100] - The list of OBR repositories is not persisted
+    * [KARAF-101] - features:refreshUrl doesn't auto complete!
+    * [KARAF-102] - The client jar does not work when given a command to execute on the command line
+    * [KARAF-122] - Webconsole login doesn't work with karaf.framework set to equinox
+    * [KARAF-123] - File jre.properties is not copied and so it is not possible to start a second karaf instance
+    * [KARAF-124] - Karaf start script doesn't correctly include jre/lib/ext directory
+    * [KARAF-126] - Password: Error executing command: Failed to get the session.
+    * [KARAF-128] - java.lang.IndexOutOfBoundsException during generation of User Guide pdf blocking release build.
+
+** Task
+    * [KARAF-113] - Change the namespace of the two blueprint schemas
+
+** Sub-task
+    * [KARAF-115] - Document Karaf Release Guide
+    * [KARAF-119] - Establish KEYS file.
+
+
+                    Apache Felix Karaf 1.6.0
+                    ========================
+
+  Changelog
+  ---------
+
+ The following list shows the bug fixes and enhancements included in this release:
+
+** Bug
+    * [FELIX-2129] - [Karaf] Possible hang with slave instances of Karaf when using Oracle JDBC lock.
+    * [FELIX-2130] - [Karaf] Failover Clustering Mechanism - Database shutdown / loss results in all Karaf instances becoming Active on restart of that DB
+    * [FELIX-2169] - Improve dev:show-tree performance and avoid NPE for installed bundle
+    * [FELIX-2191] - Drop-in deployment of feature descriptor with spring-dm bundles fails
+    * [FELIX-2196] - Karaf uses old version of Aries artifacts
+    * [FELIX-2270] - Don't install jaas.boot bundle, its in the startup classpath
+    * [FELIX-2295] - Referenced service throws UndeclaredThrowableException instead of real one
+    * [FELIX-2311] - Remove the Bootstrap class which is not needed anymore
+    * [FELIX-2319] - The order of the list of boot features is not used when installing the features
+    * [FELIX-2326] - NullPointerException thrown from PropertiesLoginModule if a user doesn't exist in the properties file
+    * [FELIX-2343] - Features maven plugin does not honor local and remote repository overrides
+    * [FELIX-2347] - Configurations on features should not override existing configurations
+
+** Improvement
+    * [FELIX-1921] - Provide a way to configure the host used for karaf ssh server
+    * [FELIX-2058] - The Oracle, MySql and default jdbc lock classes should inherit from a common base class
+    * [FELIX-2109] - OBR should support matching resources for a given requirement
+    * [FELIX-2110] - The resolver should be able to resolve for some requirements in addition to resources
+    * [FELIX-2113] - Add obr:find and obr:resolve to find matching resources and show the resolution output
+    * [FELIX-2193] - add-features-to-repo goal of features-maven-plugin should be able to download dependencies if necessary
+    * [FELIX-2237] - ^C should interrupt the thread
+    * [FELIX-2239] - features-maven-plugin validate goal should be able to use configurable config.properties
+    * [FELIX-2278] - refactor features-maven-plugin to use Parser/Clause/VersionRange from utils
+    * [FELIX-2280] - To much code duplication in DefaultJDBCLock, OracleJDBCLock and MySQLJDBCLock
+    * [FELIX-2293] - features-maven-plugin validate should support  specify the feature repositories from the maven plugin configure
+    * [FELIX-2297] - features-maven-plugin validate goal should be able to use configurable jre version
+    * [FELIX-2312] - Support for ext and endorsed directories
+    * [FELIX-2314] - Improve logging support
+    * [FELIX-2315] - Upgrade to felix web console 3.0.0
+    * [FELIX-2320] - Override default Karaf shell prompt
+    * [FELIX-2327] - Disable and delay Jline terminal initialization
+    * [FELIX-2329] - Improve the URL handling in features-maven-plugin regarding the add-features-to-repo goal
+    * [FELIX-2330] - Uninstall, refresh, and resolve osgi shell commands do not support multiple bundle ids
+
+** Task
+    * [FELIX-1990] - Use aries blueprint / jmx
+
+
+                    Apache Felix Karaf 1.4.0
+                    ========================
+
+  Changelog
+  ---------
+
+ The following list shows the bug fixes and enhancements included in this release:
+
+
+** Bug
+    * [FELIX-1768] - should catch exception for FeaturesServiceImpl.internalAddRepository per uri
+    * [FELIX-1843] - Karaf shell doens't work properly under windows
+    * [FELIX-1932] - Possible NullPointerException when itest fails
+    * [FELIX-1939] - [karaf] Ssh client out put is poorly formatted.
+    * [FELIX-1964] - Unable to choose the framework using system properties
+    * [FELIX-1970] - The stop script should always work even if the default user / password / host has been changed
+    * [FELIX-1994] - Web Console admin,features and gogo plugins do not work with Equinox
+    * [FELIX-1995] - Spring status does not show properly after osgi:list command
+    * [FELIX-2012] - NullPointerException when some links clicked if karaf.framework=equinox
+    * [FELIX-2025] - grep -v doesn't filter linefeed on Windows
+    * [FELIX-2026] - Remove org.ops4j.pax.logging.DefaultServiceLog.level from system.properties
+    * [FELIX-2027] - The custom deployers leveraging url handlers must not be registered before the url handler is actually registered in the osgi framework
+    * [FELIX-2032] - file host.key is not correctly written for a new instance(s)
+    * [FELIX-2043] - When launching Karaf with equinox, the osgi framework state is not written until 30s after the boot
+    * [FELIX-2044] - System bundles are started out of order if the karaf.lock.level is > 1
+    * [FELIX-2045] - Restarting the framework from the web console (or using update on the system bundle) does not work
+    * [FELIX-2053] - Completion does not reprint previous characters in some circumstances
+    * [FELIX-2054] - Logo is garbled when connecting using putty
+    * [FELIX-2063] - [karaf] hardcoding org.ops4j.pax.exam.rbc.rmi.port property in raw pax runner --vmOptions is problematic when 1099 is not the next free port
+    * [FELIX-2065] - BootstrapLogManager doesn't load etc/org.ops4j.pax.logging.cfg file
+    * [FELIX-2072] - [Karaf]  OracleJDBCLock filling UNDO segment.
+    * [FELIX-2074] - Bring back the history command
+
+** Improvement
+    * [FELIX-1914] - Add a development subshell to ease troubleshooting classloading/resolution issues
+    * [FELIX-1947] - [Karaf] Remove import java.util.* from karaf.main.StringMap and replace with proper import list.
+    * [FELIX-2001] - Add more info to log and console when feature bundles fail to resolve
+    * [FELIX-2018] - features-maven-plugin add-features-to-repo should suport the bundle start with wrap: in features.xml
+    * [FELIX-2028] - Upgrade to preferences services 1.0.4
+    * [FELIX-2046] - Upgrade web bundles to their latest version (jetty, pax-web, felix console)
+    * [FELIX-2049] - extend org.apache.felix.karaf.testing.Helper to emit a karaf-specific execution environment file for pax-runner
+    * [FELIX-2055] - Use a nicer shutdown mechanism when stopping a managed instance
+    * [FELIX-2061] - [karaf] use waitForFrameworkStartup pax-exam option in the integration tests
+    * [FELIX-2070] - Upgrade to felix framework 2.0.3
+    * [FELIX-2075] - Add a "new" command to create java objects from the command line
+    * [FELIX-2084] - Make the display of exception stack traces available through a variable in the shell
+    * [FELIX-2182] - An improved "list" command implementation that correctly displays Spring column status
+
+** New Feature
+    * [FELIX-1815] - Introduce 'shell:logout' command to close the current shell
+    * [FELIX-1975] - [Karaf] Add oracle database support to Karaf jdbc locking feature.
+    * [FELIX-2033] - Provide an easy to use layer for writing pax-exam test for Karaf
+    * [FELIX-2047] - Support for WAR files
+
+** Task
+    * [FELIX-1902] - [karaf] sanitize web demo README of references to FUSE SNAPSHOT version
+    * [FELIX-1915] - [karaf] allow overridding of etc/system.properties via environment
+
+
+                    Apache Felix Karaf 1.2.0
+                    ========================
+
+  Overview
+  --------
+
+ This release is mostly a bug fix release and contains a lot of bug fixes and improvements in the console,
+ commands, features service, instance administration.  The binary distribution now also includes the user's
+ manual in pdf and html formats.
+
+  Changelog
+  ---------
+
+ The following list shows the bug fixes and enhancements included in this release:
+
+** Sub-task
+    * [FELIX-1701] - Aggregate all the Karaf related pages in one single Confluence page using the include macro
+
+** Bug
+    * [FELIX-1620] - Script for running the created Karaf instances with a console
+    * [FELIX-1626] - Configuration loaded from the etc/ directory are only available after a delay
+    * [FELIX-1638] - [karaf] The branding properties load can't find the external branding file
+    * [FELIX-1642] - osgi:shutdown just hang when use karaf-client.jar
+    * [FELIX-1660] - karaf should not hardcode the "system" location of its maven-like repository
+    * [FELIX-1681] - Bundles of webconsole feature are not assembled into distribution packages
+    * [FELIX-1705] - [Karaf] Hot undeploy does not work after a Karaf restart
+    * [FELIX-1715] - osgi:update on xml deployments will cause ZIPExceptions
+    * [FELIX-1717] - osgi:list column for spring is sometimes filled and sometimes not
+    * [FELIX-1723] - [Karaf] Slave instances on same host as Master instance does not properly lock.
+    * [FELIX-1728] - Karaf itest fail on IBM JDK due to Pax Exam annotations not found
+    * [FELIX-1730] - When displaying help for commands, arguments are not ordered correctly
+    * [FELIX-1745] - Unable to alter/unset a log level after it has been set from the console
+    * [FELIX-1751] - [karaf] admin:start silently fails to launch new instance
+    * [FELIX-1766] - Refactor and enable AdminServiceMBean
+    * [FELIX-1768] - should catch exception for FeaturesServiceImpl.internalAddRepository per uri
+    * [FELIX-1771] - Feature deployer is broken on windows
+    * [FELIX-1777] - Hitting backspace beyond last character causes LOUD BEEP
+    * [FELIX-1778] - instances/myinst/bin/karaf.bat leaks environment variables to shell
+    * [FELIX-1779] - The port for the jmx server needs to be configured at two locations
+    * [FELIX-1784] - install one feature failed in org.apache.felix.karaf.features.cfg featuresBoot list shouldn't block install other features in this list
+    * [FELIX-1786] - The features deployment listener tacks installed bundles and force their resolution
+    * [FELIX-1793] - ensure launch karaf java process from KARAF_BASE folder
+    * [FELIX-1799] - Hot-deployment does not work on admin:create'd instances
+    * [FELIX-1801] - Case insensitive grep outputs all uppercase in match results
+    * [FELIX-1802] - Grep command line prefix (-n) not working properly
+    * [FELIX-1803] - Unable to edit or backspace on multiline commands
+    * [FELIX-1805] - Upgrade equinox to 3.5.1
+    * [FELIX-1817] - Backspace does not work anymore when connecting from the karaf-client
+    * [FELIX-1818] - Ctrl-C kills the karaf-client, but it should be sent to the server
+    * [FELIX-1855] - exec command eats first keystroke of subsequent commands
+    * [FELIX-1857] - Backspace not working when using admin:connect
+    * [FELIX-1858] - Remote commands via ssh only work once per restart
+    * [FELIX-1869] - Need better UI feedback when features commands fail
+    * [FELIX-1877] - karaf.main.BootstrapLogManager possible resource leak and ignored exception in open method.
+    * [FELIX-1878] - karaf.main.Main possible resource leaks and ignored exceptions from mkdirs().
+    * [FELIX-1887] - The stop script can't be used if the user or password has been changed
+    * [FELIX-1888] - The karaf client hangs if the authentication fails
+    * [FELIX-1899] - Karaf itest (CoreTest) fails on slower CI machines
+
+** Improvement
+    * [FELIX-1064] - New goal for the features-maven-plugin: validate a features xml file
+    * [FELIX-1207] - [PATCH] Ignore files generated by mvn:eclipse
+    * [FELIX-1643] - Improvements / Fixes for Karaf commands and their helps
+    * [FELIX-1655] - Provide an additional argument to the Karaf admin:create command that specifies the featuresBoot
+    * [FELIX-1675] - karaf web demo README references old servicemix-client.jar
+    * [FELIX-1682] - The newly installed bundles for a feature should be uninstalled when feature install failed
+    * [FELIX-1689] - When deploying a feature, we need to refresh some bundles to cope with newly resolved optional dependencies
+    * [FELIX-1693] - [karaf][shell] Make "system bundles" start level configurable via properties
+    * [FELIX-1694] - [karaf][shell] Do not print stack traces on exceptions
+    * [FELIX-1700] - Create quality PDF manual for Karaf
+    * [FELIX-1706] - Highlight grep matches
+    * [FELIX-1707] - Add OSGi framework information to InfoAction
+    * [FELIX-1718] - karaf shell config:update command should persist / override configurations from the etc/ folder
+    * [FELIX-1729] - The if / each commands are not available in the console
+    * [FELIX-1737] - Upgrade to fileinstall 2.0.4
+    * [FELIX-1744] - Add a -C/--context option to shell:grep
+    * [FELIX-1748] - Make the command history persistent across restarts
+    * [FELIX-1749] - Improve log:set command - add auto-completion for log levels and support lower case level
+    * [FELIX-1752] - [Karaf] Extend DefaultJDBCLock to support MySQL out of the box.
+    * [FELIX-1755] - Provide a script file that would be loaded when starting a new shell (to create closures, etc...)
+    * [FELIX-1757] - Completer for session scopes
+    * [FELIX-1759] - Upgrade to latest webconsole
+    * [FELIX-1772] - Upgrade to felix framework 2.0.1
+    * [FELIX-1791] - Update to the karaf web demo readme.
+    * [FELIX-1810] - Improvements to Main startup class
+    * [FELIX-1882] - [karaf] karaf-client should have the option to retry connection establishment
+
+** New Feature
+    * [FELIX-1656] - new Shell command: shell:clear
+
+** Task
+    * [FELIX-1091] - Re-enable gshell integration tests on windows
+    * [FELIX-1761] - Include felix as a platform for the karaf integration tests
+    * [FELIX-1762] - Upgrade to pax-web 0.7.1
+    * [FELIX-1763] - Upgrade to latest pax-url
+    * [FELIX-1848] - Include instance name in the JMX ObjectName for AdminService and FeaturesService MBeans
+    * [FELIX-1849] - Provide Instance details for root instance via AdminServiceMBean.getInstances() attribute
+    * [FELIX-1850] - Expose additional isRoot attribute on AdminServiceMBean
+    * [FELIX-1892] - Upgrade to sshd-0.3.0, mina-2.0.0-RC1, gogo-0.2.2, jansi-1.1
+
+
+
+                    Apache Felix Karaf 1.0.0
+                    ========================
+
+  Overview
+  --------
+
+ The Apache Felix Karaf 1.0.0 release is the first release since the move of ServiceMix Kernel to Apache Felix.
+ This release brings a lot of new features:
+  * Switch from Spring-DM to Blueprint for the default Dependency Injection container (Spring-DM is still
+       fully supported and easy to install through the features service)
+  * Switch from Geronimo GShell to Felix Gogo
+      This changes is a bit disruptive for the command line syntax, but offers much more features such
+      as closures
+  * Integration with the Felix Web Console (easily installed using the features service).
+  * Built-in support for Equinox
+  * Upgrade to OSGi 4.2 frameworks (both Felix and Equinox)
+ This release also contains a lot of small improvements and bug fixes.  The changelog below contains the whole
+ list of changes.
+
+
+  Changelog
+  ---------
+
+ The following list shows the bug fixes and enhancements included in this release:
+
+ ** Bug
+     * [FELIX-1087] - Unable to log into ServiceMix Kernel using Windows putty SSH client
+     * [FELIX-1097] - ServiceMix -> Karaf in base directory notices
+     * [FELIX-1100] - Cat Command fails to display ?wsdl files
+     * [FELIX-1125] - "features/list -i" returns "ERROR CommandLineExecutionFailed: org.apache.geronimo.gshell.command.CommandException: java.lang.ArrayStoreException: org.apache.servicemix.kernel.gshell.features.internal.FeatureImpl"
+     * [FELIX-1128] - Features installed via the deploy directory aren't listed by the "features/list" command
+     * [FELIX-1152] - wrapper scripts fail to start Karaf
+     * [FELIX-1153] - change parent artifact id from kernel to karaf in some modules to make the build pass from clean local maven repo
+     * [FELIX-1161] - Stange classloading issues when using compendium services
+     * [FELIX-1192] - KARAF: Locking error in DefaultJDBCLock, also contains an eventual OutOfMemory error on locked processes.
+     * [FELIX-1199] - Karaf: closing IO stream, removal of minor file descriptor leak.
+     * [FELIX-1212] - Possible infinit loop when a remote ssh connection is closed
+     * [FELIX-1218] - Existing configurations are not retrieved when installing a feature
+     * [FELIX-1222] - [features-maven-plugin:add-features-to-repo] Incorrect parsing of pax mvn url string
+     * [FELIX-1243] - Change the default port for the OSGI HTTP Service from 8080 to 8181
+     * [FELIX-1253] - Cursor is blocked when the correct syntax is not displaed
+     * [FELIX-1265] - The command refreshUrl does not work if the features.xml file is embedded in a Jar. The JVM caches jar entries
+     * [FELIX-1274] - Spring deployer fails when bean class is from java.* packages
+     * [FELIX-1315] - Karaf console is garbled on Windows
+     * [FELIX-1320] - Authentication failed connecting via ssh on Windows
+     * [FELIX-1361] - Issue with import/export version of the package : org.osgi.util.tracker in Apache Felix Karaf
+     * [FELIX-1373] - featuresBoot in etc/org.apache.felix.karaf.featues no longer works
+     * [FELIX-1375] - [Karaf] There's no 'help' command
+     * [FELIX-1378] - Optional branding does not work in new gogo console
+     * [FELIX-1391] - Unable to create new ConfigAdmin PID through karaf console
+     * [FELIX-1423] - karaf fails to start in cygwin bash
+     * [FELIX-1431] - Add a web console plugin to have access to the gogo shell
+     * [FELIX-1449] - Tab completion doesn't work on Windows
+     * [FELIX-1454] - install --help throws exception
+     * [FELIX-1458] - 'servicemix server' and servicemix client' not working properly on windows
+     * [FELIX-1459] - bin/karaf may fail to start when CDPATH is set (on POSIX shells)
+     * [FELIX-1465] - Make symbolic names of Karaf webconsole bundles consistent with other bundles
+     * [FELIX-1466] - org.apache.felix.karaf.features.FeaturesServiceTest fails
+     * [FELIX-1468] - wrapper:install and admin:create prints old ansi output that need to be converted to real ansi
+     * [FELIX-1472] - Better handling of configurations from the deployer and feature service
+     * [FELIX-1515] - Entering an illegal command has an unusual effect
+     * [FELIX-1517] - Manually deleting an instance breaks admin:list
+     * [FELIX-1519] - Karaf Failover does not work with PostgreSQL and Oracle
+     * [FELIX-1529] - The console does not work anymore when connecting to another karaf instance
+     * [FELIX-1564] - Authentication failed when using admin:connect to connect to a newly created instance
+     * [FELIX-1566] - Possible NPE when uninstalling a feature
+     * [FELIX-1567] - When dropping an empty xml file (i.e. just an empty file with an xml extension) in the deploy folder, errors are printed to the console
+     * [FELIX-1575] - The JMX connector can not be registered because of a clash in the name in the RMI registry
+     * [FELIX-1576] - The features service should do a PackageAdmin.refresh() after uninstalling a feature
+     * [FELIX-1602] - Unable to configure boot features on admin:create-d instance
+     * [FELIX-1618] - in spring-dm feature, optional imports in spring-context won't get resolved
+
+ ** Improvement
+     * [FELIX-1062] - Upgrade to latest Felix Runtime
+     * [FELIX-1063] - Upgrade to latest Felix Bundle Repository
+     * [FELIX-1092] - The client jar / ssh deamon should support direct commands
+     * [FELIX-1102] - Make gshell-core really independant of the MainService
+     * [FELIX-1104] - Allow osgi/stop command to specify more than one bundle per command entry.
+     * [FELIX-1107] - Make org.apache.servicemix.kernel.gshell.features dependency on org.apache.servicemix.kernel.filemonitor optional
+     * [FELIX-1110] - Refactor filemonitor / deployers inside a deployer sub module
+     * [FELIX-1112] - [PATCH] Allow osgi/start command to specify more than one bundle per command entry
+     * [FELIX-1115] - Use better version ranges for imports
+     * [FELIX-1121] - Add feature for installing Felix Web Console
+     * [FELIX-1126] - No errors are generated for a bad URL passed to the "features/addUrl", "features/refreshUrl", or "features/list" commands.
+     * [FELIX-1127] - Add a name for a repository
+     * [FELIX-1133] - Allow usage of fragments in Karaf features
+     * [FELIX-1149] - Describe ConfigAdmin configurations using metatype
+     * [FELIX-1150] - Upgrade to SpringDM and SpringFramework
+     * [FELIX-1172] - Rebrand Karaf locking mechanism.
+     * [FELIX-1180] - Improve Karaf DefaultJDBCLock to use proper logging mechanism instead of System err prints.
+     * [FELIX-1196] - Felix Web Console can't list Karaf features
+     * [FELIX-1204] - Fix the karaf client to allow direct execution of commands
+     * [FELIX-1220] - Remove unnecssary parts of a filter
+     * [FELIX-1276] - There is no way to get all the Feature information from the FeaturesService
+     * [FELIX-1303] - add an osgi/imports and osgi/exports to show a pretty-printed output of the imports/exports packages for a bundle
+     * [FELIX-1450] - Karaf branding and plugins for Felix webconsole
+     * [FELIX-1455] - OSGi Storage is hardcoded to be data/cache
+     * [FELIX-1457] - Externalize and refactory management layer for FeatureService to be more scalable and more consistent with the OSGi management (using open mbeans)
+     * [FELIX-1463] - Switch to Felix Fileinstall instead of our own file deployer
+     * [FELIX-1467] - Add Karaf to top-level build files
+     * [FELIX-1469] - Add svn:ignore property to a few Karaf projects
+     * [FELIX-1528] - [karaf] Use a defined location for storing the list of managed instances create by the admin service
+     * [FELIX-1555] - The osgi:list command should print spring-dm bundle state if spring-dm has been deployed
+     * [FELIX-1558] - use com.sun.* instead of com.sun.management* for boot delegation
+     * [FELIX-1594] - include blueprint bundle in karaf kit system folder
+
+ ** New Feature
+     * [FELIX-1109] - Deployer for blueprint applications
+     * [FELIX-1111] - Ability to run Karaf on Equinox
+     * [FELIX-1206] - [PATCH] config/propappend
+     * [FELIX-1261] - Install/Uninstall Karaf Features from Felix WebConsole
+     * [FELIX-1485] - Admin commands support in Karaf webconsole
+     * [FELIX-1524] - Implement a better tac command
+     * [FELIX-1547] - OS shell level admin commands for Karaf
+
+ ** Task
+     * [FELIX-1098] - Switch from spring-dm to blueprint
+     * [FELIX-1099] - Switch from spring-dm integration tests to pax-exam
+     * [FELIX-1116] - Rename to Apache Felix Karaf
+     * [FELIX-1200] - Move features-maven-plugin into Karaf
+     * [FELIX-1312] - Switch from gshell to gogo
+     * [FELIX-1523] - Fix Karaf version to 0.9.0-SNAPSHOT as next release will be 1.0.0
+
+ ** Sub-task
+     * [FELIX-1117] - Update branding
+     * [FELIX-1118] - Update shell scripts
+     * [FELIX-1132] - Get rid of the JMX spring stuff in gshell-features
+
+
+
+
+                    Apache ServiceMix Kernel 1.1.0
+                    ==============================
+
+  Overview
+  --------
+
+ The Apache ServiceMix Kernel 1.1.0 release brings a lot of new features enhancements and bug fixes:
+  * remote connection using SSH protocol
+  * provisioning enhancements: versioning / hot deployment of features
+  * new commands, including OSGi related commands for the Configuration Admin and Package Admin services
+  * improved spring integration: upgrade to spring 2.5.6 and spring-dm 1.2.0-m2, the osgi/list command
+       now displays spring applications status
+  * container level locking for master / slave deployments
+  * support for JAXP 1.4 on all platforms
+  * improved JMX support for managing the OSGi framework and features
+ Note that the commands syntax has changed due to the upgrade to the latest gshell version.
+
+  Known issues
+  ============
+
+     * [SMX4KNL-141] - The config/edit command changes does not takes precedence over configuration files in the etc folder at restart
+     * [SMX4KNL-183] - features/uninstall behaves different in version selection than features/install
+     * [SMX4KNL-189] - Shell completion works only in the root shell
+     * [SMX4KNL-200] - The client jar / ssh daemon should support direct commands
+     * [SMX4KNL-227] - Full support of fragment bundles
+     * [SMX4KNL-228] - Warning messages when using OpenSSH 5.1 to connect to ServiceMix Kernel
+     * [SMX4KNL-231] - Unable to log into ServiceMix Kernel using OpenSolaris SSH client
+     * [SMX4KNL-232] - Unable to log into ServiceMix Kernel using Windows putty SSH client
+
+  Changelog
+  ---------
+
+  The following list shows the bug fixes and enhancements included in this release:
+
+ ** Bug
+     * [SMX4KNL-72] - If there is no etc/startup.properties, the kernel hangs without displaying any error
+     * [SMX4KNL-79] - When starting the kernel, a log entry states "Can not install feature ''"
+     * [SMX4KNL-86] - When running integration tests, the container classpath contains all the test bundles which may cause problems
+     * [SMX4KNL-87] - Problems with batch files on windows
+     * [SMX4KNL-95] - kernel build failed in testing/itests
+     * [SMX4KNL-96] - package missing for felix.config.properties
+     * [SMX4KNL-97] - Dissociate the name and the location of ServiceMix Kernel instances managed by the admin shell
+     * [SMX4KNL-100] - The client does not close when running "osgi shutdown" command
+     * [SMX4KNL-102] - The file monitor should use ${servicemix.base} for default polling locations
+     * [SMX4KNL-104] - When using a remote connection, errors are not reported correctly
+     * [SMX4KNL-105] - Features are reinstalled on restart of servicemix
+     * [SMX4KNL-112] - gshell pom needs to include gshell-config and gshell-packages modules
+     * [SMX4KNL-115] - config.properties for SMX-Kernel needs to be updated
+     * [SMX4KNL-117] - The Smx testing platform should take into account the boot delegation packages specified in the configuration file
+     * [SMX4KNL-118] - The configuration file for felix comes from 3 different places in the svn tree, only one copy should be used
+     * [SMX4KNL-122] - When using the client and trying to connect to another instance using the "admin connect" command, the console hangs
+     * [SMX4KNL-123] - XML parsing does not work on non Sun JVMs and Sun's SAAJ bundle requires Sun's JAXP implementation
+     * [SMX4KNL-124] - Issuing command "log d" fails with NullPointerException on AIX.
+     * [SMX4KNL-126] - The user is no more authenticated with the new gshell integration
+     * [SMX4KNL-128] - Remove OBR support from default distribution
+     * [SMX4KNL-132] - osgi/list command should display the spring application state
+     * [SMX4KNL-133] - jaxp-ri bundle miss javax.xml.datatype.DatatypeFactory factoryId under META-INF/services
+     * [SMX4KNL-134] - XPathFactoryFinder in jaxp api should use factoryId to load the spi class in osgi enviroment
+     * [SMX4KNL-135] - Remote shell missing help resources
+     * [SMX4KNL-138] - No command history with Shell console
+     * [SMX4KNL-140] - Shell commands references not cleaned up when bundle uninstalled
+     * [SMX4KNL-142] - Starting a new instance that was created with admin on windows fails to start
+     * [SMX4KNL-145] - java.lang.IllegalStateException: Streams not registered for thread
+     * [SMX4KNL-148] - OPS4J maven repo missing form default search list
+     * [SMX4KNL-149] - Build failure due to new sshd snapshot
+     * [SMX4KNL-150] - Shell group name variable doesn't resolve
+     * [SMX4KNL-151] - Update displayed version in Shell to be 1.1.0-SNAPSHOT for trunk
+     * [SMX4KNL-153] - Stopping one of the "core" bundles of the servicemix engine block the server
+     * [SMX4KNL-155] - Error changing manifest while bundle is deployed
+     * [SMX4KNL-162] - The default jaas realm uses the config admin to store clear password
+     * [SMX4KNL-164] - features/removeUrl does not remove the repository
+     * [SMX4KNL-165] - Initial provisioning using features is very slow especially when using snapshots
+     * [SMX4KNL-170] - Unknown protoc
diff --git a/karaf-2.2.x/admin/command/NOTICE b/karaf-2.2.x/admin/command/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/admin/command/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/admin/command/pom.xml b/karaf-2.2.x/admin/command/pom.xml
new file mode 100644
index 0000000..aa13b49
--- /dev/null
+++ b/karaf-2.2.x/admin/command/pom.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.admin</groupId>
+        <artifactId>admin</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.admin.command</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Admin :: Command</name>
+    <description>Admin shell commands to manipulate Karaf child instances.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.command</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymockclassextension</artifactId>
+            <version>${easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+     </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            !${project.artifactId}*,
+                            !org.apache.karaf.admin.internal,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.admin.main;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
new file mode 100644
index 0000000..e830076
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.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.karaf.admin.command;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+public abstract class AdminCommandSupport extends OsgiCommandSupport {
+
+    private AdminService adminService;
+
+    public AdminService getAdminService() {
+        return adminService;
+    }
+
+    public void setAdminService(AdminService adminService) {
+        this.adminService = adminService;
+    }
+
+    protected Instance getExistingInstance(String name) {
+        Instance i = adminService.getInstance(name);
+        if (i == null) {
+            throw new IllegalArgumentException("Instance '" + name + "' does not exist");
+        }
+        return i;
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeOptsCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeOptsCommand.java
new file mode 100644
index 0000000..d5ebb1a
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeOptsCommand.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "admin", name = "change-opts", description = "Changes the Java options of an existing container instance.")
+public class ChangeOptsCommand extends AdminCommandSupport {
+
+    @Argument(index = 0, name = "name", description="The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    @Argument(index = 1, name = "javaOpts", description = "The new Java options to set", required = true, multiValued = false)
+    private String javaOpts;
+
+    protected Object doExecute() throws Exception {
+        getExistingInstance(instance).changeJavaOpts(javaOpts);
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiRegistryPortCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiRegistryPortCommand.java
new file mode 100644
index 0000000..46d3d21
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiRegistryPortCommand.java
@@ -0,0 +1,36 @@
+/*
+ * 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.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "admin", name = "change-rmi-registry-port", description = "Changes the RMI registry port (used by management layer) of an existing container instance.")
+public class ChangeRmiRegistryPortCommand extends AdminCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    @Argument(index = 1, name = "port", description = "The new RMI registry port to set", required = true, multiValued = false)
+    private int port = 0;
+
+    protected Object doExecute() throws Exception {
+        getExistingInstance(instance).changeRmiRegistryPort(port);
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiServerPortCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiServerPortCommand.java
new file mode 100644
index 0000000..d0cbcaa
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiServerPortCommand.java
@@ -0,0 +1,36 @@
+/*
+ * 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.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "admin", name = "change-rmi-server-port", description = "Changes the RMI server port (used by management layer) of an existing container instance.")
+public class ChangeRmiServerPortCommand extends AdminCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    @Argument(index = 1, name = "port", description = "The new RMI server port to set", required = true, multiValued = false)
+    private int port = 0;
+
+    public Object doExecute() throws Exception {
+        getExistingInstance(instance).changeRmiServerPort(port);
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeSshPortCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeSshPortCommand.java
new file mode 100644
index 0000000..a437765
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeSshPortCommand.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "admin", name = "change-ssh-port", description = "Changes the secure shell port of an existing container instance.")
+public class ChangeSshPortCommand extends AdminCommandSupport {
+
+    @Argument(index = 0, name = "name", description="The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    @Argument(index = 1, name = "port", description = "The new secure shell port to set", required = true, multiValued = false)
+    private int port = 0;
+
+    protected Object doExecute() throws Exception {
+        getExistingInstance(instance).changeSshPort(port);
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ConnectCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ConnectCommand.java
new file mode 100644
index 0000000..e2d05c2
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ConnectCommand.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.karaf.admin.command;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "admin", name = "connect", description = "Connects to an existing container instance.")
+public class ConnectCommand extends AdminCommandSupport {
+
+    @Option(name="-u", aliases={"--username"}, description="Remote user name (Default: karaf)", required = false, multiValued = false)
+    private String username = "karaf";
+
+    @Option(name="-p", aliases={"--password"}, description="Remote user password (Default: karaf)", required = false, multiValued = false)
+    private String password = "karaf";
+
+    @Argument(index = 0, name="name", description="The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    @Argument(index = 1, name = "command", description = "Optional command to execute", required = false, multiValued = true)
+    private List<String> command;
+
+    protected Object doExecute() throws Exception {
+        String cmdStr = "";
+        if (command != null) {
+            StringBuilder sb = new StringBuilder();
+            for (String cmd : command) {
+                if (sb.length() > 0) {
+                    sb.append(' ');
+                }
+                sb.append(cmd);
+            }
+            cmdStr = "'" + sb.toString().replaceAll("'", "\\'") + "'";
+        }
+
+        int port = getExistingInstance(instance).getSshPort();
+        session.execute("ssh -l " + username + " -P " + password + " -p " + port + " localhost " + cmdStr);
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
new file mode 100644
index 0000000..93bf7d0
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.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.karaf.admin.command;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.admin.InstanceSettings;
+import org.apache.karaf.features.command.completers.AllFeatureCompleter;
+import org.apache.karaf.features.command.completers.FeatureRepositoryCompleter;
+
+
+/**
+ * Creates a new Karaf instance 
+ *
+ * @version $Rev: 679826 $ $Date: 2008-07-25 17:00:12 +0200 (Fri, 25 Jul 2008) $
+ */
+@Command(scope = "admin", name = "create", description = "Creates a new container instance.")
+public class CreateCommand extends AdminCommandSupport
+{
+    @Option(name = "-s", aliases = {"--ssh-port"}, description = "Port number for remote secure shell connection", required = false, multiValued = false)
+    int sshPort = 0;
+
+    @Option(name = "-r", aliases = {"-rr", "--rmi-port", "--rmi-registry-port"}, description = "Port number for RMI registry connection", required = false, multiValued = false)
+    int rmiRegistryPort = 0;
+
+    @Option(name = "-rs", aliases = {"--rmi-server-port"}, description = "Port number for RMI server connection", required = false, multiValued = false)
+    int rmiServerPort = 0;
+
+    @Option(name = "-l", aliases = {"--location"}, description = "Location of the new container instance in the file system", required = false, multiValued = false)
+    String location;
+
+    @Option(name = "-o", aliases = {"--java-opts"}, description = "JVM options to use when launching the instance", required = false, multiValued = false)
+    String javaOpts;
+    
+    @Option(name = "-f", aliases = {"--feature"},
+            description = "Initial features. This option can be specified multiple times to enable multiple initial features", required = false, multiValued = true)
+    List<String> features;
+    
+    @Option(name = "-furl", aliases = {"--featureURL"}, 
+            description = "Additional feature descriptor URLs. This option can be specified multiple times to add multiple URLs", required = false, multiValued = true)
+    List<String> featureURLs;
+
+    @Argument(index = 0, name = "name", description="The name of the new container instance", required = true, multiValued = false)
+    String instance = null;
+
+    protected Object doExecute() throws Exception {
+        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features);
+        getAdminService().createInstance(instance, settings);
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/DestroyCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/DestroyCommand.java
new file mode 100644
index 0000000..a3f2ce1
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/DestroyCommand.java
@@ -0,0 +1,38 @@
+/*
+ * 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.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+/**
+ * Destroy an existing Karaf instance
+ *
+ * @version $Rev: 679826 $ $Date: 2008-07-25 17:00:12 +0200 (Fri, 25 Jul 2008) $
+ */
+@Command(scope = "admin", name = "destroy", description = "Destroys an existing container instance.")
+public class DestroyCommand extends AdminCommandSupport
+{
+    @Argument(index = 0, name = "name", description="The name of the container instance to destroy", required = true, multiValued = false)
+    private String instance = null;
+
+    protected Object doExecute() throws Exception {
+        getExistingInstance(instance).destroy();
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ListCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ListCommand.java
new file mode 100644
index 0000000..ab144f7
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/ListCommand.java
@@ -0,0 +1,84 @@
+/*
+ * 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.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.admin.Instance;
+
+/**
+ * List available instances
+ */
+@Command(scope = "admin", name = "list", description = "Lists all existing container instances.")
+public class ListCommand extends AdminCommandSupport {
+
+    @Option(name = "-l", aliases = { "--location" }, description = "Displays the location of the container instances", required = false, multiValued = false)
+    boolean location;
+
+    @Option(name = "-o", aliases = { "--java-opts" }, description = "Displays the Java options used to launch the JVM", required = false, multiValued = false)
+    boolean javaOpts;
+
+    protected Object doExecute() throws Exception {
+        Instance[] instances = getAdminService().getInstances();
+        if (javaOpts) {
+            System.out.println("  SSH Port   RMI Ports         State       Pid  JavaOpts");
+        } else if (location) {
+            System.out.println("  SSH Port   RMI Ports         State       Pid  Location");
+        } else {
+            System.out.println("  SSH Port   RMI Ports         State       Pid  Name");
+        }
+        for (Instance instance : instances) {
+            StringBuilder sb = new StringBuilder();
+            sb.append('[');
+            String s = Integer.toString(instance.getSshPort());
+            for (int i = s.length(); i < 8; i++) {
+                sb.append(' ');
+            }
+            sb.append(s);
+            sb.append("] [");
+            String rmiRegistryPort = Integer.toString(instance.getRmiRegistryPort());
+            String rmiServerPort = Integer.toString(instance.getRmiServerPort());
+            sb.append(rmiRegistryPort).append("/").append(rmiServerPort);
+            for (int i = rmiRegistryPort.length() + rmiServerPort.length() + 1; i < 15; i++) {
+                sb.append(' ');
+            }
+            sb.append("] [");
+            String state = instance.getState();
+            while (state.length() < "starting".length()) {
+                state += " ";
+            }
+            sb.append(state);
+            sb.append("] [");
+            s = Integer.toString(instance.getPid());
+            for (int i = s.length(); i < 5; i++) {
+                sb.append(' ');
+            }
+            sb.append(s);
+            sb.append("] ");
+            if (javaOpts) {
+                sb.append(instance.getJavaOpts());
+            } else if (location) {
+                sb.append(instance.getLocation());
+            } else {
+                sb.append(instance.getName());
+            }
+            System.out.println(sb.toString());
+        }
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/RenameCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/RenameCommand.java
new file mode 100644
index 0000000..3f9757a
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/RenameCommand.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+/**
+ * Rename an existing Karaf container instance.
+ */
+@Command(scope = "admin", name = "rename", description = "Renames an existing container instance.")
+public class RenameCommand extends AdminCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "The name of the container instance to rename", required = true, multiValued = false)
+    String instance = null;
+
+    @Argument(index = 1, name = "new-name", description = "The new name of the container instance", required = true, multiValued = false)
+    String newName = null;
+
+    protected Object doExecute() throws Exception {
+        getAdminService().renameInstance(instance, newName);
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/StartCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/StartCommand.java
new file mode 100644
index 0000000..1494466
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/StartCommand.java
@@ -0,0 +1,54 @@
+/*
+ * 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.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.admin.Instance;
+
+@Command(scope = "admin", name = "start", description = "Starts an existing container instance.")
+public class StartCommand extends AdminCommandSupport {
+
+    @Option(name = "-o", aliases = { "--java-opts"}, description = "Java options when launching the instance", required = false, multiValued = false)
+    private String javaOpts;
+
+    @Option(name = "-w", aliases = { "--wait"}, description = "Wait for the instance to be fully started", required = false, multiValued = false)
+    private boolean wait;
+
+    @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    protected Object doExecute() throws Exception {
+        Instance child = getExistingInstance(instance);
+        if (wait) {
+            String state = child.getState();
+            if (Instance.STOPPED.equals(state)) {
+                child.start(javaOpts);
+            }
+            if (!Instance.STARTED.equals(state)) {
+                do {
+                    Thread.sleep(500);
+                    state = child.getState();
+                } while (Instance.STARTING.equals(state));
+            }
+        } else {
+            child.start(javaOpts);
+        }
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/StopCommand.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/StopCommand.java
new file mode 100644
index 0000000..73fe6b3
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/StopCommand.java
@@ -0,0 +1,32 @@
+/*
+ * 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.karaf.admin.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "admin", name = "stop", description = "Stops an existing container instance.")
+public class StopCommand extends AdminCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "The name of the container instance", required = true, multiValued = false)
+    private String instance = null;
+
+    protected Object doExecute() throws Exception {
+        getExistingInstance(instance).stop();
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/completers/InstanceCompleter.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/completers/InstanceCompleter.java
new file mode 100644
index 0000000..c894da9
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/command/completers/InstanceCompleter.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.admin.command.completers;
+
+import java.util.List;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.console.Completer;
+
+/**
+ * {@link jline.Completor} for server instance names.
+ *
+ * Displays a list of configured server instances for the Admin commands.
+ *
+ */
+public class InstanceCompleter implements Completer {
+    private AdminService adminService;
+
+    public void setAdminService(AdminService adminService) {
+        this.adminService = adminService;
+    }
+
+    public int complete(String buffer, int cursor, List candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+        for (Instance instance : adminService.getInstances()) {
+            delegate.getStrings().add(instance.getName());
+        }
+        return delegate.complete(buffer, cursor, candidates);
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/main/Execute.java b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/main/Execute.java
new file mode 100644
index 0000000..1e52d06
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/java/org/apache/karaf/admin/main/Execute.java
@@ -0,0 +1,155 @@
+/*
+ * 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.karaf.admin.main;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.karaf.admin.command.*;
+import org.apache.karaf.admin.command.ChangeSshPortCommand;
+import org.apache.karaf.admin.internal.AdminServiceImpl;
+import org.fusesource.jansi.AnsiConsole;
+
+public class Execute {
+    static Class<? extends Action> x = CreateCommand.class;
+    private static final Class<?> [] COMMAND_CLASSES = new Class[] {
+        CreateCommand.class,
+        StartCommand.class,
+        StopCommand.class,
+        DestroyCommand.class,
+        ListCommand.class,
+        ChangeSshPortCommand.class,
+        ChangeRmiRegistryPortCommand.class,
+        ChangeRmiServerPortCommand.class};
+    private static final Map<String, Class<?>> COMMANDS = new TreeMap<String, Class<?>>();
+    static {
+        for (Class<?> c : COMMAND_CLASSES) {
+            Command ann = c.getAnnotation(Command.class);
+            if (ann == null) {
+                continue;
+            }
+            COMMANDS.put(ann.name(), c);
+        }
+    }    
+    
+    // For testing
+    static boolean exitAllowed = true;
+    
+    /**
+     * Environment variable for specifying extra options to the Karaf admin 
+     * process kicked off from this Java process.
+     */
+    private static final String ENV_KARAF_OPTS = "KARAF_OPTS";
+    
+    /**
+     * System property for specifying extra options to the Karaf admin 
+     * process kicked off from this Java process.
+     */
+    private static final String PROP_KARAF_OPTS = "karaf.opts";    
+
+    public static void main(String[] args) throws Exception {
+        AnsiConsole.systemInstall();
+
+        if (args.length == 0) {
+            listCommands();
+            exit(0);
+        }
+        String commandName = args[0];
+        Class<?> cls = COMMANDS.get(commandName);
+        if (cls == null) {
+            System.err.println("Command not found: " + commandName);
+            exit(-1);
+        }
+
+        String storage = System.getProperty("karaf.instances");
+        if (storage == null) {
+            System.err.println("System property 'karaf.instances' is not set. \n" +
+        		"This property needs to be set to the full path of the instance.properties file.");
+            exit(-1);
+        }
+        File storageFile = new File(storage);
+        System.setProperty("user.dir", storageFile.getParentFile().getParentFile().getCanonicalPath());
+        
+        try {
+            String karafOpts = System.getenv(ENV_KARAF_OPTS);
+            if (karafOpts != null) {
+                System.setProperty(PROP_KARAF_OPTS, karafOpts);
+            }
+        } catch(Exception e) {
+            System.err.println("Could not read KARAF_OPTS environment variable: " + e.getMessage());
+            if (System.getProperty("karaf.showStackTrace") != null) {
+                throw e;
+            }
+        }        
+        
+        Object command = cls.newInstance();
+        if (command instanceof AdminCommandSupport) {
+            try {
+                execute((AdminCommandSupport) command, storageFile, args);
+            } catch (Exception e) {
+                System.err.println("Error execution command '" + commandName + "': " + e.getMessage());
+                if (System.getProperty("karaf.showStackTrace") != null) {
+                    throw e;
+                }
+            }
+        } else {
+            System.err.println("Not an admin command: " + commandName);
+            exit(-1);
+        }
+    }
+    
+    static void execute(AdminCommandSupport command, File storageFile, String[] args) throws Exception {
+        DefaultActionPreparator dap = new DefaultActionPreparator();
+        List<Object> params = new ArrayList<Object>(Arrays.asList(args));
+        params.remove(0); // this is the actual command name
+
+        if (!dap.prepare(command, null, params)) {
+            return;
+        }
+                
+        AdminServiceImpl admin = new AdminServiceImpl();
+        admin.setStorageLocation(storageFile);
+        admin.init();
+        command.setAdminService(admin);
+        command.execute(null);
+    }
+
+    private static void listCommands() {
+        System.out.println("Available commands:");
+        for (Map.Entry<String, Class<?>> entry : COMMANDS.entrySet()) {
+            Command ann = entry.getValue().getAnnotation(Command.class);
+            System.out.printf("  %s - %s\n", entry.getKey(), ann.description());
+        }
+        
+        System.out.println("Type 'command --help' for more help on the specified command.");
+    }
+
+    private static void exit(int rc) {
+        if (exitAllowed) {
+            System.exit(rc);
+        } else {
+            throw new RuntimeException("" + rc);
+        }
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml b/karaf-2.2.x/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
new file mode 100644
index 0000000..9ffb90a
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
@@ -0,0 +1,136 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
+        <command name="admin/create">
+            <action class="org.apache.karaf.admin.command.CreateCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <optional-completers>
+                   <entry key="-f" value-ref="allFeatureCompleter"/>
+                   <entry key="-furl" value-ref="featureUrlCompleter"/>
+            </optional-completers>
+        </command>
+        <command name="admin/connect">
+            <action class="org.apache.karaf.admin.command.ConnectCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="admin/list">
+            <action class="org.apache.karaf.admin.command.ListCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+        </command>
+        <command name="admin/start">
+            <action class="org.apache.karaf.admin.command.StartCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="admin/stop">
+            <action class="org.apache.karaf.admin.command.StopCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="admin/destroy">
+            <action class="org.apache.karaf.admin.command.DestroyCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="admin/rename">
+            <action class="org.apache.karaf.admin.command.RenameCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null />
+            </completers>
+        </command>
+        <command name="admin/change-ssh-port">
+            <action class="org.apache.karaf.admin.command.ChangeSshPortCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="admin/change-rmi-registry-port">
+            <action class="org.apache.karaf.admin.command.ChangeRmiRegistryPortCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null />
+            </completers>
+        </command>
+        <command name="admin/change-rmi-server-port">
+            <action class="org.apache.karaf.admin.command.ChangeRmiServerPortCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null />
+            </completers>
+        </command>
+        <command name="admin/change-opts">
+            <action class="org.apache.karaf.admin.command.ChangeOptsCommand">
+                <property name="adminService" ref="adminService" />
+            </action>
+            <completers>
+                <ref component-id="instanceCompleter" />
+                <null/>
+            </completers>
+        </command>
+    </command-bundle>
+
+    <reference id="adminService" interface="org.apache.karaf.admin.AdminService" />
+    <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService" />
+
+    <bean id="instanceCompleter" class="org.apache.karaf.admin.command.completers.InstanceCompleter">
+        <property name="adminService" ref="adminService" />
+    </bean>
+
+    <bean id="allFeatureCompleter" class="org.apache.karaf.features.command.completers.AllFeatureCompleter">
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+
+    <bean id="featureUrlCompleter" class="org.apache.karaf.features.command.completers.FeatureRepositoryCompleter">
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+
+</blueprint>
diff --git a/karaf-2.2.x/admin/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/admin/command/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..bedc2e0
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,26 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle contains all Karaf shell commands related to the admin feature.
+
+    The following commands are available:
+    \u001B[36madmin:create\u001B[0m Creates a new container instance.
+    \u001B[36madmin:connect\u001B[0m Connects to an existing container instance.
+    \u001B[36madmin:list\u001B[0m Lists all existing container instances.
+    \u001B[36madmin:start\u001B[0m Starts an existing container instance.
+    \u001B[36madmin:stop\u001B[0m Stops an existing container instance.
+    \u001B[36madmin:destroy\u001B[0m Destroys an existing container instance.
+    \u001B[36madmin:rename\u001B[0m Renames an existing container instance.
+    \u001B[36madmin:change-ssh-port\u001B[0m Changes the secure shell port of an existing container instance.
+    \u001B[36madmin:change-rmi-registry-port\u001B[0m Changes the RMI registry port (used by management layer) of an existing container instance.
+    \u001B[36madmin:change-rmi-server-port\u001B[0m Changes the RMI server port (used by management layer) of an existing container instance.
+    \u001B[36madmin:change-opts\u001B[0m Changes the java options of an existing container instance.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[31mCommands\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/admin/command/src/test/java/org/apache/karaf/admin/command/CreateCommandTest.java b/karaf-2.2.x/admin/command/src/test/java/org/apache/karaf/admin/command/CreateCommandTest.java
new file mode 100644
index 0000000..23fa60a
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/test/java/org/apache/karaf/admin/command/CreateCommandTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.karaf.admin.command;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.InstanceSettings;
+import org.easymock.EasyMock;
+
+public class CreateCommandTest extends TestCase {
+    public void testCreateCommandExecute() throws Exception {
+        AdminService adminService = EasyMock.createMock(AdminService.class);
+        EasyMock.replay(adminService);
+        
+        CreateCommand cc = new CreateCommand();
+        cc.setAdminService(adminService);
+        cc.sshPort = 9941;
+        cc.rmiRegistryPort = 1122;
+        cc.rmiServerPort = 44444;
+        cc.location = "top";
+        cc.javaOpts = "foo";
+        cc.features = Arrays.asList("abc", "def");
+        cc.featureURLs = Collections.singletonList("http://something");
+        cc.instance = "myInstance";
+        
+        EasyMock.verify(adminService); // check precondition
+        EasyMock.reset(adminService);
+        InstanceSettings expectedIS =
+            new InstanceSettings(9941, 1122, 44444, "top", "foo", Collections.singletonList("http://something"), Arrays.asList("abc", "def"));
+        EasyMock.expect(adminService.createInstance("myInstance", expectedIS)).andReturn(null);
+        EasyMock.replay(adminService);
+        
+        cc.doExecute();
+        EasyMock.verify(adminService);
+    }
+}
diff --git a/karaf-2.2.x/admin/command/src/test/java/org/apache/karaf/admin/main/ExecuteTest.java b/karaf-2.2.x/admin/command/src/test/java/org/apache/karaf/admin/main/ExecuteTest.java
new file mode 100644
index 0000000..92cf9aa
--- /dev/null
+++ b/karaf-2.2.x/admin/command/src/test/java/org/apache/karaf/admin/main/ExecuteTest.java
@@ -0,0 +1,185 @@
+/*
+ * 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.karaf.admin.main;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.command.AdminCommandSupport;
+import org.apache.karaf.admin.internal.AdminServiceImpl;
+import org.easymock.IAnswer;
+import org.easymock.classextension.EasyMock;
+
+public class ExecuteTest extends TestCase {
+    private String userDir;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        Execute.exitAllowed = false;
+        userDir = System.getProperty("user.dir");
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        Execute.exitAllowed = true;
+        System.setProperty("user.dir", userDir);
+    }
+
+    public void testListCommands() throws Exception {
+        PrintStream oldOut = System.out;
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream capturedOut = new PrintStream(baos); 
+        System.setOut(capturedOut);
+
+        try {
+            Execute.main(new String [] {});            
+        } catch (RuntimeException re) {
+            assertEquals("0", re.getMessage());
+
+            String s = new String(baos.toByteArray());            
+            assertTrue(s.contains("list"));
+            assertTrue(s.contains("create"));
+            assertTrue(s.contains("destroy"));
+        } finally {
+            System.setOut(oldOut);
+        }
+    }
+    
+    public void testNonexistingCommand() throws Exception {
+        try {
+            Execute.main(new String [] {"bheuaark"});
+        } catch (RuntimeException re) {
+            assertEquals("-1", re.getMessage());
+        }
+    }
+    
+    public void testNoStorageFile() throws Exception {
+        PrintStream oldErr = System.err;
+        
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream capturedErr = new PrintStream(baos); 
+        System.setErr(capturedErr);
+
+        try {
+            Execute.main(new String [] {"create"});            
+        } catch (RuntimeException re) {
+            assertEquals("-1", re.getMessage());
+            
+            String s = new String(baos.toByteArray());            
+            assertTrue(s.contains("karaf.instances"));
+            assertTrue(s.contains("instance.properties"));
+        } finally {
+            System.setErr(oldErr);
+        } 
+    }
+    
+    public void testSetDir() throws Exception {
+        Properties oldProps = (Properties) System.getProperties().clone();
+        final File tempFile = createTempDir(getName());
+        assertFalse("Precondition failed", 
+            tempFile.getParentFile().getParentFile().getCanonicalPath().equals(System.getProperty("user.dir")));
+
+        System.setProperty("karaf.instances", tempFile.getCanonicalPath());
+        try {
+            Execute.main(new String [] {"list"});            
+            assertTrue(tempFile.getParentFile().getParentFile().getCanonicalPath().equals(System.getProperty("user.dir")));
+        } finally {
+            System.setProperties(oldProps);
+            assertNull("Postcondition failed", System.getProperty("karaf.instances"));
+            delete(tempFile);
+        }        
+    }
+    
+    public void testExecute() throws Exception {
+        final File tempFile = createTempDir(getName());
+        Properties p = new Properties();
+        p.setProperty("ssh.port", "1302");
+        p.setProperty("rmi.registry.port", "1122");
+        p.setProperty("rmi.server.port", "44444");
+        FileOutputStream fos = new FileOutputStream(new File(tempFile, AdminServiceImpl.STORAGE_FILE));
+        p.store(fos, "");
+        fos.close();
+
+        final List<AdminServiceImpl> admins = new ArrayList<AdminServiceImpl>();
+        try {
+            AdminCommandSupport mockCommand = EasyMock.createStrictMock(AdminCommandSupport.class);
+            mockCommand.setAdminService((AdminService) EasyMock.anyObject());
+            EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
+                public Object answer() throws Throwable {
+                    AdminServiceImpl svc = (AdminServiceImpl) EasyMock.getCurrentArguments()[0];
+                    assertEquals(tempFile, svc.getStorageLocation());
+                    admins.add(svc);
+                    return null;
+                }
+            });
+            
+            EasyMock.expect(mockCommand.execute(null)).andAnswer(new IAnswer<Object>() {
+                public Object answer() throws Throwable {
+                    // The Admin Service should be initialized at this point.
+                    // One way to find this out is by reading out the port number
+                    AdminServiceImpl admin = admins.get(0);
+                    Field sshField = AdminServiceImpl.class.getDeclaredField("defaultSshPortStart");
+                    sshField.setAccessible(true);
+                    assertEquals(1302, sshField.get(admin));
+                    Field rmiRegistryField = AdminServiceImpl.class.getDeclaredField("defaultRmiRegistryPortStart");
+                    rmiRegistryField.setAccessible(true);
+                    assertEquals(1122, rmiRegistryField.get(admin));
+                    Field rmiServerField = AdminServiceImpl.class.getDeclaredField("defaultRmiServerPortStart");
+                    rmiServerField.setAccessible(true);
+                    assertEquals(44444, rmiServerField.get(admin));
+                    return null;
+                }
+            });
+            EasyMock.replay(mockCommand);            
+            
+            Execute.execute(mockCommand, tempFile, new String [] {"test"});
+            
+            EasyMock.verify(mockCommand);
+        } finally {
+            delete(tempFile);
+        }
+    }
+
+    private static File createTempDir(String name) throws IOException {
+        final File tempFile = File.createTempFile(name, null);
+        tempFile.delete();
+        tempFile.mkdirs();
+        return tempFile.getCanonicalFile();
+    }
+
+    private static void delete(File tmp) {
+        if (tmp.isDirectory()) {
+            for (File f : tmp.listFiles()) {
+                delete(f);
+            }
+        }
+        tmp.delete();
+    }
+}
diff --git a/karaf-2.2.x/admin/core/NOTICE b/karaf-2.2.x/admin/core/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/admin/core/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/admin/core/pom.xml b/karaf-2.2.x/admin/core/pom.xml
new file mode 100644
index 0000000..838ae52
--- /dev/null
+++ b/karaf-2.2.x/admin/core/pom.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.admin</groupId>
+        <artifactId>admin</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.admin.core</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Admin :: Core</name>
+    <description>Core implementation of the admin feature to manipulate Karaf child instances.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.obr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-config-properties</id>
+                        <!-- here the phase you need -->
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/classes/org/apache/karaf/admin/etc</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>../../assemblies/apache-karaf/src/main/distribution/text/etc/</directory>
+                                    <includes>
+                                        <include>*.properties</include>
+                                        <include>*.cfg</include>
+                                    </includes>
+                                    <excludes>
+                                        <exclude>org.apache.karaf.shell.cfg</exclude>
+                                        <exclude>org.ops4j.pax.url.mvn.cfg</exclude>
+                                        <exclude>system.properties</exclude>
+                                    </excludes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>copy-filtered</id>
+                        <!-- here the phase you need -->
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/classes/org/apache/karaf/admin/etc</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>../../assemblies/apache-karaf/src/main/filtered-resources/etc</directory>
+                                    <filtering>true</filtering>
+                                    <includes>
+                                        <include>*.properties</include>
+                                        <include>*.cfg</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.admin;version=${project.version},
+                            org.apache.karaf.jpm;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.admin,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.admin.bin;-split-package:=merge-first,
+                            org.apache.karaf.admin.etc;-split-package:=merge-first,
+                            org.apache.karaf.admin.internal;-split-package:=merge-first,
+                            org.apache.karaf.jpm.impl;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                  <excludes>
+                    <!-- this is not a unit test but an application used for testing -->
+                    <exclude>**/MainTest.java</exclude>
+                  </excludes>
+                </configuration>
+           </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/AdminService.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/AdminService.java
new file mode 100644
index 0000000..1d69372
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/AdminService.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.karaf.admin;
+
+public interface AdminService {
+
+    Instance createInstance(String name, InstanceSettings settings) throws Exception;
+
+    void renameInstance(String name, String newName) throws Exception;
+
+    Instance[] getInstances();
+
+    Instance getInstance(String name);    
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/Instance.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/Instance.java
new file mode 100644
index 0000000..ce2b250
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/Instance.java
@@ -0,0 +1,62 @@
+/*
+ * 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.karaf.admin;
+
+public interface Instance {
+
+    String STOPPED = "Stopped";
+    String STARTING = "Starting";
+    String STARTED = "Started";
+    String ERROR = "Error";
+
+    String getName();
+
+    void setName(String name);
+    
+    boolean isRoot();
+
+    String getLocation();
+
+    void setLocation(String location);
+
+    int getPid();
+
+    int getSshPort();
+
+    void changeSshPort(int port) throws Exception;
+
+    int getRmiRegistryPort();
+
+    void changeRmiRegistryPort(int port) throws Exception;
+
+    int getRmiServerPort();
+
+    void changeRmiServerPort(int port) throws Exception;
+
+    String getJavaOpts();
+
+    void changeJavaOpts(String javaOpts) throws Exception;
+
+    void start(String javaOpts) throws Exception;
+
+    void stop() throws Exception;
+
+    void destroy() throws Exception;
+
+    String getState() throws Exception;
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
new file mode 100644
index 0000000..9b068cf
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
@@ -0,0 +1,95 @@
+/*
+ * 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.karaf.admin;
+
+import java.util.List;
+
+public class InstanceSettings {
+    private final int sshPort;
+    private final int rmiRegistryPort;
+    private final int rmiServerPort;
+    private final String location;
+    private final String javaOpts;
+    private final List<String> featureURLs;
+    private final List<String> features;
+
+    public InstanceSettings(int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, List<String> featureURLs, List<String> features) {
+        this.sshPort = sshPort;
+        this.rmiRegistryPort = rmiRegistryPort;
+        this.rmiServerPort = rmiServerPort;
+        this.location = location;
+        this.javaOpts = javaOpts;
+        this.featureURLs = featureURLs;
+        this.features = features;
+    }
+
+    public int getSshPort() {
+        return sshPort;
+    }
+
+    public int getRmiRegistryPort() {
+        return rmiRegistryPort;
+    }
+
+    public int getRmiServerPort() {
+        return rmiServerPort;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public String getJavaOpts() {
+        return javaOpts;
+    }
+
+    public List<String> getFeatureURLs() {
+        return featureURLs;
+    }
+
+    public List<String> getFeatures() {
+        return features;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (!(o instanceof InstanceSettings)) {
+            return false;
+        }
+        InstanceSettings is = (InstanceSettings) o;
+        return is.sshPort == sshPort &&
+               is.rmiRegistryPort == rmiRegistryPort &&
+               is.rmiServerPort == rmiServerPort &&
+               (location == null ? is.location == null : location.equals(is.location)) &&
+               (javaOpts == null ? is.javaOpts == null : javaOpts.equals(is.javaOpts)) &&
+               (featureURLs == null ? is.featureURLs == null : featureURLs.equals(is.featureURLs)) &&
+               (features == null ? is.features == null : features.equals(is.features));
+    }
+
+    @Override
+    public int hashCode() {
+        int result = sshPort + rmiRegistryPort + rmiServerPort;
+        result = 31 * result + (location != null ? location.hashCode() : 0);
+        result = 31 * result + (javaOpts != null ? javaOpts.hashCode() : 0);
+        result = 31 * result + (featureURLs != null ? featureURLs.hashCode() : 0);
+        result = 31 * result + (features != null ? features.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
new file mode 100644
index 0000000..70d151b
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
@@ -0,0 +1,461 @@
+/*
+ * 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.karaf.admin.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Scanner;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.InstanceSettings;
+import org.fusesource.jansi.Ansi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AdminServiceImpl implements AdminService {
+    public static final String STORAGE_FILE = "instance.properties";
+    public static final String BACKUP_EXTENSION = ".bak";
+    private static final String FEATURES_CFG = "etc/org.apache.karaf.features.cfg";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(AdminServiceImpl.class);
+
+    private Map<String, Instance> instances = new HashMap<String, Instance>();
+
+    private int defaultSshPortStart = 8101;
+
+    private int defaultRmiRegistryPortStart = 1099;
+
+    private int defaultRmiServerPortStart = 44444;
+
+    private File storageLocation;
+
+    private long stopTimeout = 30000;
+
+    public File getStorageLocation() {
+        return storageLocation;
+    }
+
+    public void setStorageLocation(File storage) {
+        this.storageLocation = storage;
+    }
+
+    public long getStopTimeout() {
+        return stopTimeout;
+    }
+
+    public void setStopTimeout(long stopTimeout) {
+        this.stopTimeout = stopTimeout;
+    }
+
+    private Properties loadStorage(File location) throws IOException {
+        InputStream is = null;
+        try {
+            is = new FileInputStream(location);
+            Properties props = new Properties();
+            props.load(is);
+            return props;
+        } finally {
+            if (is != null) {
+                is.close();
+            }
+        }
+    }
+
+    private void saveStorage(Properties props, File location, String comment) throws IOException {
+        OutputStream os = null;
+        try {
+            os = new FileOutputStream(location);
+            props.store(os, comment);
+        } finally {
+            if (os != null) {
+                os.close();
+            }
+        }
+    }
+
+    public synchronized void init() throws Exception {
+        try {
+            File storageFile = new File(storageLocation, STORAGE_FILE);
+            if (!storageFile.isFile()) {
+                if (storageFile.exists()) {
+                    LOGGER.error("Instances storage location should be a file: " + storageFile);
+                }
+                return;
+            }
+            Properties storage = loadStorage(storageFile);
+            int count = Integer.parseInt(storage.getProperty("count", "0"));
+            defaultSshPortStart = Integer.parseInt(storage.getProperty("ssh.port", Integer.toString(defaultSshPortStart)));
+            defaultRmiRegistryPortStart = Integer.parseInt(storage.getProperty("rmi.registry.port", Integer.toString(defaultRmiRegistryPortStart)));
+            defaultRmiServerPortStart = Integer.parseInt(storage.getProperty("rmi.server.port", Integer.toString(defaultRmiServerPortStart)));
+            Map<String, Instance> newInstances = new HashMap<String, Instance>();
+            for (int i = 0; i < count; i++) {
+                String name = storage.getProperty("item." + i + ".name", null);
+                String loc = storage.getProperty("item." + i + ".loc", null);
+                String opts = storage.getProperty("item." + i + ".opts", null);
+                int pid = Integer.parseInt(storage.getProperty("item." + i + ".pid", "0"));
+                boolean root = Boolean.parseBoolean(storage.getProperty("item." + i + ".root", "false"));
+                if (name != null) {
+                    InstanceImpl instance = new InstanceImpl(this, name, loc, opts, root);
+                    if (pid > 0) {
+                        try {
+                            instance.attach(pid);
+                        } catch (IOException e) {
+                            // Ignore
+                        }
+                    }
+                    newInstances.put(name, instance);
+                }
+            }
+            instances = newInstances;
+        } catch (Exception e) {
+            LOGGER.warn("Unable to reload Karaf instance list", e);
+        }
+    }
+
+    public synchronized Instance createInstance(String name, InstanceSettings settings) throws Exception {
+        if (instances.get(name) != null) {
+            throw new IllegalArgumentException("Instance '" + name + "' already exists");
+        }
+        String loc = settings.getLocation() != null ? settings.getLocation() : name;
+        File karafBase = new File(loc);
+        if (!karafBase.isAbsolute()) {
+            karafBase = new File(storageLocation, loc);
+        }
+        int sshPort = settings.getSshPort();
+        if (sshPort <= 0) {
+            sshPort = ++defaultSshPortStart;
+        }
+        int rmiRegistryPort = settings.getRmiRegistryPort();
+        if (rmiRegistryPort <= 0) {
+            rmiRegistryPort = ++defaultRmiRegistryPortStart;
+        }
+        int rmiServerPort = settings.getRmiServerPort();
+        if (rmiServerPort <= 0) {
+            rmiServerPort = ++defaultRmiServerPortStart;
+        }
+        println(Ansi.ansi().a("Creating new instance on SSH port ").a(sshPort).a(" and RMI ports ").a(rmiRegistryPort).a("/").a(rmiServerPort).a(" at: ").a(Ansi.Attribute.INTENSITY_BOLD).a(karafBase).a(Ansi.Attribute.RESET).toString());
+
+        mkdir(karafBase, "bin");
+        mkdir(karafBase, "etc");
+        mkdir(karafBase, "system");
+        mkdir(karafBase, "deploy");
+        mkdir(karafBase, "data");
+
+        copyResourceToDir(karafBase, "etc/config.properties", true);
+        copyResourceToDir(karafBase, "etc/jre.properties", true);
+        copyResourceToDir(karafBase, "etc/custom.properties", true);
+        copyResourceToDir(karafBase, "etc/java.util.logging.properties", true);
+        copyResourceToDir(karafBase, "etc/org.apache.felix.fileinstall-deploy.cfg", true);
+        copyResourceToDir(karafBase, "etc/org.apache.karaf.log.cfg", true);
+        copyResourceToDir(karafBase, FEATURES_CFG, true);
+        copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true);
+        copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true);
+        copyResourceToDir(karafBase, "etc/startup.properties", true);
+        copyResourceToDir(karafBase, "etc/users.properties", true);
+
+        HashMap<String, String> props = new HashMap<String, String>();
+        props.put("${SUBST-KARAF-NAME}", name);
+        props.put("${SUBST-KARAF-HOME}", System.getProperty("karaf.home"));
+        props.put("${SUBST-KARAF-BASE}", karafBase.getPath());
+        props.put("${SUBST-SSH-PORT}", Integer.toString(sshPort));
+        props.put("${SUBST-RMI-REGISTRY-PORT}", Integer.toString(rmiRegistryPort));
+        props.put("${SUBST-RMI-SERVER-PORT}", Integer.toString(rmiServerPort));
+        copyFilteredResourceToDir(karafBase, "etc/system.properties", props);
+        copyFilteredResourceToDir(karafBase, "etc/org.apache.karaf.shell.cfg", props);
+        copyFilteredResourceToDir(karafBase, "etc/org.apache.karaf.management.cfg", props);
+        // If we use batch files, use batch files, else use bash scripts (even on cygwin)
+        boolean windows = System.getProperty("os.name").startsWith("Win");
+        boolean cygwin = windows && new File( System.getProperty("karaf.home"), "bin/admin" ).exists();
+        if( windows && !cygwin ) {
+            copyFilteredResourceToDir(karafBase, "bin/karaf.bat", props);
+            copyFilteredResourceToDir(karafBase, "bin/start.bat", props);
+            copyFilteredResourceToDir(karafBase, "bin/stop.bat", props);
+        } else {
+            copyFilteredResourceToDir(karafBase, "bin/karaf", props);
+            copyFilteredResourceToDir(karafBase, "bin/start", props);
+            copyFilteredResourceToDir(karafBase, "bin/stop", props);
+            if ( !cygwin ) {
+                chmod(new File(karafBase, "bin/karaf"), "a+x");
+                chmod(new File(karafBase, "bin/start"), "a+x");
+                chmod(new File(karafBase, "bin/stop"), "a+x");
+            }
+        }
+        
+        handleFeatures(new File(karafBase, FEATURES_CFG), settings);
+
+        String javaOpts = settings.getJavaOpts();
+        if (javaOpts == null || javaOpts.length() == 0) {
+            javaOpts = "-server -Xmx512M -Dcom.sun.management.jmxremote";
+        }
+        Instance instance = new InstanceImpl(this, name, karafBase.toString(), settings.getJavaOpts());
+        instances.put(name, instance);
+        saveState();
+        return instance;
+    }
+
+    void handleFeatures(File featuresCfg, InstanceSettings settings) throws IOException {
+        Properties p = loadStorage(featuresCfg);
+
+        appendToPropList(p, "featuresBoot", settings.getFeatures());
+        appendToPropList(p, "featuresRepositories", settings.getFeatureURLs());
+        saveStorage(p, featuresCfg, "Features Configuration");
+    }
+
+    private void appendToPropList(Properties p, String key, List<String> elements) {
+        if (elements == null) {
+            return;
+        }
+        StringBuilder sb = new StringBuilder(p.getProperty(key).trim());
+        for (String f : elements) {
+            if (sb.length() > 0) {
+                sb.append(',');
+            }
+            sb.append(f);
+        }
+        p.setProperty(key, sb.toString());
+    }
+    
+    public synchronized Instance[] getInstances() {
+        return instances.values().toArray(new Instance[0]);
+    }
+
+    public synchronized Instance getInstance(String name) {
+        return instances.get(name);
+    }
+
+    synchronized void forget(String name) {
+        instances.remove(name);
+    }
+
+    public synchronized void renameInstance(String oldName, String newName) throws Exception {
+        if (instances.get(newName) != null) {
+            throw new IllegalArgumentException("Instance " + newName + " already exists");
+        }
+        Instance instance = instances.get(oldName);
+        if (instance == null) {
+            throw new IllegalArgumentException("Instance " + oldName + " not found");
+        }
+        if (instance.isRoot()) {
+            throw new IllegalArgumentException("Root instance cannot be renamed");
+        }
+        if (instance.getPid() != 0) {
+            throw new IllegalStateException("Instance not stopped");
+        }
+
+        println(Ansi.ansi().a("Renaming instance ")
+                .a(Ansi.Attribute.INTENSITY_BOLD).a(oldName).a(Ansi.Attribute.RESET)
+                .a(" to ")
+                .a(Ansi.Attribute.INTENSITY_BOLD).a(newName).a(Ansi.Attribute.RESET).toString());
+        // remove the old instance
+        instances.remove(oldName);
+        // update instance
+        instance.setName(newName);
+        // rename directory
+        String oldLocationPath = instance.getLocation();
+        File oldLocation = new File(oldLocationPath);
+        String basedir = oldLocation.getParent();
+        File newLocation = new File(basedir, newName);
+        oldLocation.renameTo(newLocation);
+        // update the instance location
+        instance.setLocation(newLocation.getPath());
+        // create the properties map including the instance name and instance location
+        HashMap<String, String> props = new HashMap<String, String>();
+        props.put(oldName, newName);
+        props.put(oldLocationPath, newLocation.getPath());
+        // replace all references to the "old" name by the new one in etc/system.properties
+        // NB: it's replacement to avoid to override the user's changes
+        filterResource(newLocation, "etc/system.properties", props);
+        // replace all references to the "old" name by the new one in bin/karaf
+        filterResource(newLocation, "bin/karaf", props);
+        filterResource(newLocation, "bin/start", props);
+        filterResource(newLocation, "bin/stop", props);
+        filterResource(newLocation, "bin/karaf.bat", props);
+        filterResource(newLocation, "bin/start.bat", props);
+        filterResource(newLocation, "bin/stop.bat", props);
+        // add the renamed instances
+        instances.put(newName, instance);
+        // save instance definition in the instances.properties
+        saveState();
+    }
+
+    synchronized void saveState() throws IOException {
+        Properties storage = new Properties();
+        Instance[] data = getInstances();
+        storage.setProperty("ssh.port", Integer.toString(defaultSshPortStart));
+        storage.setProperty("rmi.registry.port", Integer.toString(defaultRmiRegistryPortStart));
+        storage.setProperty("rmi.server.port", Integer.toString(defaultRmiServerPortStart));
+        storage.setProperty("count", Integer.toString(data.length));
+        for (int i = 0; i < data.length; i++) {
+            storage.setProperty("item." + i + ".name", data[i].getName());
+            storage.setProperty("item." + i + ".root", data[i].isRoot() + "");
+            storage.setProperty("item." + i + ".loc", data[i].getLocation());
+            storage.setProperty("item." + i + ".pid", Integer.toString(data[i].getPid()));
+            storage.setProperty("item." + i + ".opts", data[i].getJavaOpts() != null ? data[i].getJavaOpts() : "");
+        }
+        saveStorage(storage, new File(storageLocation, STORAGE_FILE), "Admin Service storage");
+    }
+    
+    private void copyResourceToDir(File target, String resource, boolean text) throws Exception {
+        File outFile = new File(target, resource);
+        if( !outFile.exists() ) {
+            println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
+            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
+            try {
+                if( text ) {
+                    // Read it line at a time so that we can use the platform line ending when we write it out.
+                    PrintStream out = new PrintStream(new FileOutputStream(outFile));
+                    try {
+                        Scanner scanner = new Scanner(is);
+                        while (scanner.hasNextLine() ) {
+                            String line = scanner.nextLine();
+                            out.println(line);
+                        }
+                    } finally {
+                        safeClose(out);
+                    }
+                } else {
+                    // Binary so just write it out the way it came in.
+                    FileOutputStream out = new FileOutputStream(new File(target, resource));
+                    try {
+                        int c=0;
+                        while((c=is.read())>=0) {
+                            out.write(c);
+                        }
+                    } finally {
+                        safeClose(out);
+                    }
+                }
+            } finally {
+                safeClose(is);
+            }
+        }
+    }
+
+    private void println(String st) {
+        System.out.println(st);
+    }
+
+    private void filterResource(File basedir, String path, HashMap<String, String> props) throws Exception {
+        File file = new File(basedir, path);
+        File bak = new File(basedir, path + BACKUP_EXTENSION);
+        if (!file.exists()) {
+            return;
+        }
+        // rename the file to the backup one
+        file.renameTo(bak);
+        // copy and filter the bak file back to the original name
+        copyAndFilterResource(new FileInputStream(bak), new FileOutputStream(file), props);
+        // remove the bak file
+        bak.delete();
+    }
+
+    private void copyFilteredResourceToDir(File target, String resource, HashMap<String, String> props) throws Exception {
+        File outFile = new File(target, resource);
+        if( !outFile.exists() ) {
+            println(Ansi.ansi().a("Creating file: ").a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
+            InputStream is = getClass().getClassLoader().getResourceAsStream("org/apache/karaf/admin/" + resource);
+            copyAndFilterResource(is, new FileOutputStream(outFile), props);
+        }
+    }
+
+    private void copyAndFilterResource(InputStream source, OutputStream target, HashMap<String, String> props) throws Exception {
+        try {
+            // read it line at a time so that we can use the platform line ending when we write it out.
+            PrintStream out = new PrintStream(target);
+            try {
+                Scanner scanner = new Scanner(source);
+                while (scanner.hasNextLine()) {
+                    String line = scanner.nextLine();
+                    line = filter(line, props);
+                    out.println(line);
+                }
+            } finally {
+                safeClose(out);
+            }
+        } finally {
+            safeClose(source);
+        }
+    }
+
+    private void safeClose(InputStream is) throws IOException {
+        if (is == null) {
+            return;
+        }
+        try {
+            is.close();
+        } catch (Throwable ignore) {
+        }
+    }
+
+    private void safeClose(OutputStream is) throws IOException {
+        if (is == null) {
+            return;
+        }
+        try {
+            is.close();
+        } catch (Throwable ignore) {
+        }
+    }
+
+    private String filter(String line, HashMap<String, String> props) {
+        for (Map.Entry<String, String> i : props.entrySet()) {
+            int p1 = line.indexOf(i.getKey());
+            if( p1 >= 0 ) {
+                String l1 = line.substring(0, p1);
+                String l2 = line.substring(p1+i.getKey().length());
+                line = l1+i.getValue()+l2;
+            }
+        }
+        return line;
+    }
+
+    private void mkdir(File karafBase, String path) {
+        File file = new File(karafBase, path);
+        if( !file.exists() ) {
+            println(Ansi.ansi().a("Creating dir:  ").a(Ansi.Attribute.INTENSITY_BOLD).a(file.getPath()).a(Ansi.Attribute.RESET).toString());
+            file.mkdirs();
+        }
+    }
+
+    private int chmod(File serviceFile, String mode) throws Exception {
+        ProcessBuilder builder = new ProcessBuilder();
+        builder.command("chmod", mode, serviceFile.getCanonicalPath());
+        Process p = builder.start();
+
+        // gnodet: Fix SMX4KNL-46: cpu goes to 100% after running the 'admin create' command
+        // Not sure exactly what happens, but commenting the process io redirection seems
+        // to work around the problem.
+        //
+        //PumpStreamHandler handler = new PumpStreamHandler(io.inputStream, io.outputStream, io.errorStream);
+        //handler.attach(p);
+        //handler.start();
+        int status = p.waitFor();
+        //handler.stop();
+        return status;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/internal/InstanceImpl.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/internal/InstanceImpl.java
new file mode 100644
index 0000000..ffd2fe2
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/admin/internal/InstanceImpl.java
@@ -0,0 +1,532 @@
+/*
+ * 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.karaf.admin.internal;
+
+import java.io.*;
+import java.net.Socket;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.jpm.Process;
+import org.apache.karaf.jpm.ProcessBuilderFactory;
+import org.apache.karaf.jpm.impl.ScriptUtils;
+import org.fusesource.jansi.Ansi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class InstanceImpl implements Instance {
+
+    private static final Logger LOG = LoggerFactory.getLogger(InstanceImpl.class);
+
+    private static final String CONFIG_PROPERTIES_FILE_NAME = "config.properties";
+
+    private static final String KARAF_SHUTDOWN_PORT = "karaf.shutdown.port";
+
+    private static final String KARAF_SHUTDOWN_HOST = "karaf.shutdown.host";
+
+    private static final String KARAF_SHUTDOWN_PORT_FILE = "karaf.shutdown.port.file";
+
+    private static final String KARAF_SHUTDOWN_COMMAND = "karaf.shutdown.command";
+
+    private static final String KARAF_SHUTDOWN_PID_FILE = "karaf.shutdown.pid.file";
+
+    private static final String DEFAULT_SHUTDOWN_COMMAND = "SHUTDOWN";
+
+    private AdminServiceImpl service;
+    private String name;
+    private String location;
+    private String javaOpts;
+    private Process process;
+    private boolean root;
+
+    public InstanceImpl(AdminServiceImpl service, String name, String location, String javaOpts) {
+        this(service, name, location, javaOpts, false);
+    }
+    
+    public InstanceImpl(AdminServiceImpl service, String name, String location, String javaOpts, boolean root) {
+        this.service = service;
+        this.name = name;
+        this.location = location;
+        this.javaOpts = javaOpts;
+        this.root = root;
+    }
+
+    public void attach(int pid) throws IOException {
+        checkProcess();
+        if (this.process != null) {
+            throw new IllegalStateException("Instance already started");
+        }
+        this.process = ProcessBuilderFactory.newInstance().newBuilder().attach(pid);
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+    
+    public boolean isRoot() {
+        return root;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public boolean exists() {
+        return new File(location).isDirectory();
+    }
+
+    public int getPid() {
+        checkProcess();
+        return this.process != null ? this.process.getPid() : 0;
+    }
+
+    public int getSshPort() {
+        InputStream is = null;
+        try {
+            File f = new File(location, "etc/org.apache.karaf.shell.cfg");
+            is = new FileInputStream(f);
+            Properties props = new Properties();
+            props.load(is);
+            String loc = props.getProperty("sshPort");
+            return Integer.parseInt(loc);
+        } catch (Exception e) {
+            return 0;
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    public void changeSshPort(int port) throws Exception {
+        checkProcess();
+        if (this.process != null) {
+            throw new IllegalStateException("Instance not stopped");
+        }
+        Properties props = new Properties();
+        File f = new File(location, "etc/org.apache.karaf.shell.cfg");
+        InputStream is = new FileInputStream(f);
+        try {
+            props.load(is);
+        } finally {
+            is.close();
+        }
+        props.setProperty("sshPort", Integer.toString(port));
+        OutputStream os = new FileOutputStream(f);
+        try {
+            props.store(os, null);
+        } finally {
+            os.close();
+        }
+    }
+
+    public int getRmiRegistryPort() {
+        InputStream is = null;
+        try {
+            File f = new File(location, "etc/org.apache.karaf.management.cfg");
+            is = new FileInputStream(f);
+            Properties props = new Properties();
+            props.load(is);
+            String loc = props.getProperty("rmiRegistryPort");
+            return Integer.parseInt(loc);
+        } catch (Exception e) {
+            return 0;
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    public void changeRmiRegistryPort(int port) throws Exception {
+        checkProcess();
+        if (this.process != null) {
+            throw new IllegalStateException("Instance not stopped");
+        }
+        Properties props = new Properties();
+        File f = new File(location, "etc/org.apache.karaf.management.cfg");
+        InputStream is = new FileInputStream(f);
+        try {
+            props.load(is);
+        } finally {
+            is.close();
+        }
+        props.setProperty("rmiRegistryPort", Integer.toString(port));
+        OutputStream os = new FileOutputStream(f);
+        try {
+            props.store(os, null);
+        } finally {
+            os.close();
+        }
+    }
+
+    public int getRmiServerPort() {
+        InputStream is = null;
+        try {
+            File f = new File(location, "etc/org.apache.karaf.management.cfg");
+            is = new FileInputStream(f);
+            Properties props = new Properties();
+            props.load(is);
+            String loc = props.getProperty("rmiServerPort");
+            return Integer.parseInt(loc);
+        } catch (Exception e) {
+            return 0;
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    public void changeRmiServerPort(int port) throws Exception {
+        checkProcess();
+        if (this.process != null) {
+            throw new IllegalStateException("Instance not stopped");
+        }
+        Properties props = new Properties();
+        File f = new File(location, "etc/org.apache.karaf.management.cfg");
+        InputStream is = new FileInputStream(f);
+        try {
+            props.load(is);
+        } finally {
+            is.close();
+        }
+        props.setProperty("rmiServerPort", Integer.toString(port));
+        OutputStream os = new FileOutputStream(f);
+        try {
+            props.store(os, null);
+        } finally {
+            os.close();
+        }
+    }
+
+    public String getJavaOpts() {
+        return javaOpts;
+    }
+
+    public void changeJavaOpts(String javaOpts) throws Exception {
+        this.javaOpts = javaOpts;
+        this.service.saveState();
+    }
+
+    public synchronized void start(String javaOpts) throws Exception {
+        checkProcess();
+        if (this.process != null) {
+            throw new IllegalStateException("Instance already started");
+        }
+        if (javaOpts == null || javaOpts.length() == 0) {
+            javaOpts = this.javaOpts;
+        }
+        if (javaOpts == null || javaOpts.length() == 0) {
+            javaOpts = "-server -Xmx512M -Dcom.sun.management.jmxremote";
+        }
+        String karafOpts = System.getProperty("karaf.opts", "");  
+        
+        File libDir = new File(System.getProperty("karaf.home"), "lib");
+        File[] jars = libDir.listFiles(new FilenameFilter() {
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".jar");
+            }
+        });
+        StringBuilder classpath = new StringBuilder();
+        for (File jar : jars) {
+            if (classpath.length() > 0) {
+                classpath.append(System.getProperty("path.separator"));
+            }
+            classpath.append(jar.getCanonicalPath());
+        }
+        String command = new File(System.getProperty("java.home"), ScriptUtils.isWindows() ? "bin\\java.exe" : "bin/java").getCanonicalPath()
+                + " " + javaOpts 
+                + " " + karafOpts
+                + " -Djava.util.logging.config.file=\"" + new File(location, "etc/java.util.logging.properties").getCanonicalPath() + "\""
+                + " -Djava.endorsed.dirs=\"" + new File(new File(new File(System.getProperty("java.home"), "jre"), "lib"), "endorsed") + System.getProperty("path.separator") + new File(new File(System.getProperty("java.home"), "lib"), "endorsed") + System.getProperty("path.separator") + new File(libDir, "endorsed").getCanonicalPath() + "\""
+                + " -Djava.ext.dirs=\"" + new File(new File(new File(System.getProperty("java.home"), "jre"), "lib"), "ext") + System.getProperty("path.separator") + new File(new File(System.getProperty("java.home"), "lib"), "ext") + System.getProperty("path.separator") + new File(libDir, "ext").getCanonicalPath() + "\""
+                + " -Dkaraf.home=\"" + System.getProperty("karaf.home") + "\""
+                + " -Dkaraf.base=\"" + new File(location).getCanonicalPath() + "\""
+                + " -Dkaraf.startLocalConsole=false"
+                + " -Dkaraf.startRemoteShell=true"
+                + " -classpath " + classpath.toString()
+                + " org.apache.karaf.main.Main";
+        LOG.debug("Starting instance " + name + " with command: " + command);
+        this.process = ProcessBuilderFactory.newInstance().newBuilder()
+                        .directory(new File(location))
+                        .command(command)
+                        .start();
+        this.service.saveState();
+    }
+
+    public synchronized void stop() throws Exception {
+        checkProcess();
+        if (this.process == null) {
+            throw new IllegalStateException("Instance not started");
+        }
+        // Try a clean shutdown
+        cleanShutdown();
+        if (this.process != null) {
+            this.process.destroy();
+        }
+    }
+
+    public synchronized void destroy() throws Exception {
+        checkProcess();
+        if (this.process != null) {
+            throw new IllegalStateException("Instance not stopped");
+        }
+        deleteFile(new File(location));
+        this.service.forget(name);
+        this.service.saveState();
+    }
+
+    public synchronized String getState() {
+        int port = getSshPort();
+        if (!exists() || port <= 0) {
+            return ERROR;
+        }
+        checkProcess();
+        if (this.process == null) {
+            return STOPPED;
+        } else {
+            try {
+                Socket s = new Socket("localhost", port);
+                s.close();
+                return STARTED;
+            } catch (Exception e) {
+                // ignore
+            }
+            return STARTING;
+        }
+    }
+
+    protected void checkProcess() {
+        if (this.process != null) {
+            try {
+                if (!this.process.isRunning()) {
+                    this.process = null;
+                }
+            } catch (IOException e) {
+            }
+        }
+    }
+
+    protected void cleanShutdown() {
+        try {
+            File file = new File(new File(location, "etc"), CONFIG_PROPERTIES_FILE_NAME);
+            URL configPropURL = file.toURI().toURL();
+            Properties props = loadPropertiesFile(configPropURL);
+            props.put("karaf.base", new File(location).getCanonicalPath());
+            props.put("karaf.home", System.getProperty("karaf.home"));
+            props.put("karaf.data", new File(new File(location), "data").getCanonicalPath());
+            for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
+                String name = (String) e.nextElement();
+                props.setProperty(name,
+                        substVars(props.getProperty(name), name, null, props));
+            }
+            int port = Integer.parseInt(props.getProperty(KARAF_SHUTDOWN_PORT, "0"));
+            String host = props.getProperty(KARAF_SHUTDOWN_HOST, "localhost");
+            String portFile = props.getProperty(KARAF_SHUTDOWN_PORT_FILE);
+            String shutdown = props.getProperty(KARAF_SHUTDOWN_COMMAND, DEFAULT_SHUTDOWN_COMMAND);
+            if (port == 0 && portFile != null) {
+                BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(portFile)));
+                String portStr = r.readLine();
+                port = Integer.parseInt(portStr);
+                r.close();
+            }
+            // We found the port, try to send the command
+            if (port > 0) {
+                Socket s = new Socket(host, port);
+                s.getOutputStream().write(shutdown.getBytes());
+                s.close();
+                long t = System.currentTimeMillis() + service.getStopTimeout();
+                do {
+                    Thread.sleep(100);
+                    checkProcess();
+                } while (System.currentTimeMillis() < t && process != null);
+            }
+        } catch (Exception e) {
+            LOG.debug("Unable to cleanly shutdown instance", e);
+        }
+    }
+
+    protected static boolean deleteFile(File fileToDelete) {
+        if (fileToDelete == null || !fileToDelete.exists()) {
+            return true;
+        }
+        boolean result = true;
+        if (fileToDelete.isDirectory()) {
+            File[] files = fileToDelete.listFiles();
+            if (files == null) {
+                result = false;
+            } else {
+                for (int i = 0; i < files.length; i++) {
+                    File file = files[i];
+                    if (file.getName().equals(".") || file.getName().equals("..")) {
+                        continue;
+                    }
+                    if (file.isDirectory()) {
+                        result &= deleteFile(file);
+                    } else {
+                        result &= file.delete();
+                    }
+                }
+            }
+        }
+        result &= fileToDelete.delete();
+        return result;
+    }
+
+    protected static Properties loadPropertiesFile(URL configPropURL) throws Exception {
+        // Read the properties file.
+        Properties configProps = new Properties();
+        InputStream is = null;
+        try {
+            is = configPropURL.openConnection().getInputStream();
+            configProps.load(is);
+            is.close();
+        }
+        catch (Exception ex) {
+            System.err.println(
+                    "Error loading config properties from " + configPropURL);
+            System.err.println("Main: " + ex);
+            try {
+                if (is != null) is.close();
+            }
+            catch (IOException ex2) {
+                // Nothing we can do.
+            }
+            return null;
+        }
+        return configProps;
+    }
+
+    private static final String DELIM_START = "${";
+    private static final String DELIM_STOP = "}";
+
+    protected static String substVars(String val, String currentKey,
+                                      Map<String, String> cycleMap, Properties configProps)
+            throws IllegalArgumentException {
+        // If there is currently no cycle map, then create
+        // one for detecting cycles for this invocation.
+        if (cycleMap == null) {
+            cycleMap = new HashMap<String, String>();
+        }
+
+        // Put the current key in the cycle map.
+        cycleMap.put(currentKey, currentKey);
+
+        // Assume we have a value that is something like:
+        // "leading ${foo.${bar}} middle ${baz} trailing"
+
+        // Find the first ending '}' variable delimiter, which
+        // will correspond to the first deepest nested variable
+        // placeholder.
+        int stopDelim = val.indexOf(DELIM_STOP);
+
+        // Find the matching starting "${" variable delimiter
+        // by looping until we find a start delimiter that is
+        // greater than the stop delimiter we have found.
+        int startDelim = val.indexOf(DELIM_START);
+        while (stopDelim >= 0) {
+            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
+            if ((idx < 0) || (idx > stopDelim)) {
+                break;
+            } else if (idx < stopDelim) {
+                startDelim = idx;
+            }
+        }
+
+        // If we do not have a start or stop delimiter, then just
+        // return the existing value.
+        if ((startDelim < 0) && (stopDelim < 0)) {
+            return val;
+        }
+        // At this point, we found a stop delimiter without a start,
+        // so throw an exception.
+        else if (((startDelim < 0) || (startDelim > stopDelim))
+                && (stopDelim >= 0)) {
+            throw new IllegalArgumentException(
+                    "stop delimiter with no start delimiter: "
+                            + val);
+        }
+
+        // At this point, we have found a variable placeholder so
+        // we must perform a variable substitution on it.
+        // Using the start and stop delimiter indices, extract
+        // the first, deepest nested variable placeholder.
+        String variable =
+                val.substring(startDelim + DELIM_START.length(), stopDelim);
+
+        // Verify that this is not a recursive variable reference.
+        if (cycleMap.get(variable) != null) {
+            throw new IllegalArgumentException(
+                    "recursive variable reference: " + variable);
+        }
+
+        // Get the value of the deepest nested variable placeholder.
+        // Try to configuration properties first.
+        String substValue = (configProps != null)
+                ? configProps.getProperty(variable, null)
+                : null;
+        if (substValue == null) {
+            // Ignore unknown property values.
+            substValue = System.getProperty(variable, "");
+        }
+
+        // Remove the found variable from the cycle map, since
+        // it may appear more than once in the value and we don't
+        // want such situations to appear as a recursive reference.
+        cycleMap.remove(variable);
+
+        // Append the leading characters, the substituted value of
+        // the variable, and the trailing characters to get the new
+        // value.
+        val = val.substring(0, startDelim)
+                + substValue
+                + val.substring(stopDelim + DELIM_STOP.length(), val.length());
+
+        // Now perform substitution again, since there could still
+        // be substitutions to make.
+        val = substVars(val, currentKey, cycleMap, configProps);
+
+        // Return the value.
+        return val;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/Process.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/Process.java
new file mode 100644
index 0000000..2bd3b36
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/Process.java
@@ -0,0 +1,47 @@
+/*
+ * 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.karaf.jpm;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+/**
+ * Interface representing a process
+ */
+public interface Process extends Serializable {
+
+    /**
+     * Retrieves the PID of the process
+     * @return the pid
+     */
+    int getPid();
+
+    /**
+     * Check if this process is still running
+     * @return <code>true</code> if the process is running
+     * @throws IOException if an error occurs
+     */
+    boolean isRunning() throws IOException;
+
+    /**
+     * Destroy the process.
+     *
+     * @throws IOException
+     */
+    void destroy() throws IOException;
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilder.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilder.java
new file mode 100644
index 0000000..afc4ff8
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilder.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.karaf.jpm;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.*;
+
+/**
+ * Interface used to create new processes.
+ */
+public interface ProcessBuilder {
+
+    /**
+     * Specified the current directory to run the command from
+     *
+     * @param dir the directory to run the command from
+     * @return the ProcessBuilder instance
+     */
+    ProcessBuilder directory(File dir);
+
+    /**
+     * Set the command to execute
+     *
+     * @param command the command to execute
+     * @return the ProcessBuilder instance
+     */
+    ProcessBuilder command(String command);
+
+    /**
+     * Create and start the process
+     *
+     * @return the process that has been started
+     * @throws IOException if the process can not be created
+     */
+    org.apache.karaf.jpm.Process start() throws IOException;
+
+    /**
+     * Attach to an existing process
+     *
+     * @return the process that has been attached
+     * @throws IOException if the process can not be attached to
+     */
+    org.apache.karaf.jpm.Process attach(int pid) throws IOException;
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilderFactory.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilderFactory.java
new file mode 100644
index 0000000..bf8b26f
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilderFactory.java
@@ -0,0 +1,34 @@
+/*
+ * 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.karaf.jpm;
+
+import java.lang.*;
+
+import org.apache.karaf.jpm.impl.ProcessBuilderFactoryImpl;
+
+/**
+ * Factory for process builders.
+ */
+public abstract class ProcessBuilderFactory {
+
+    public static ProcessBuilderFactory newInstance() {
+        return new ProcessBuilderFactoryImpl();
+    }
+
+    public abstract ProcessBuilder newBuilder();
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderFactoryImpl.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
new file mode 100644
index 0000000..041bd02
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
@@ -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.
+ */
+package org.apache.karaf.jpm.impl;
+
+import org.apache.karaf.jpm.ProcessBuilder;
+import org.apache.karaf.jpm.ProcessBuilderFactory;
+
+public class ProcessBuilderFactoryImpl extends ProcessBuilderFactory {
+
+    public ProcessBuilder newBuilder() {
+        return new ProcessBuilderImpl();
+    }
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderImpl.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderImpl.java
new file mode 100644
index 0000000..08f4407
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderImpl.java
@@ -0,0 +1,48 @@
+/*
+ * 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.karaf.jpm.impl;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.karaf.jpm.Process;
+import org.apache.karaf.jpm.ProcessBuilder;
+
+
+public class ProcessBuilderImpl implements ProcessBuilder {
+
+    private File dir;
+    private String command;
+
+    public ProcessBuilder directory(File dir) {
+        this.dir = dir;
+        return this;
+    }
+
+    public ProcessBuilder command(String command) {
+        this.command = command;
+        return this;
+    }
+
+    public Process start() throws IOException {
+        return ProcessImpl.create(dir, command);
+    }
+
+    public Process attach(int pid) throws IOException {
+        return ProcessImpl.attach(pid);
+    }
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessImpl.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessImpl.java
new file mode 100644
index 0000000..6102f27
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessImpl.java
@@ -0,0 +1,150 @@
+/*
+ * 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.karaf.jpm.impl;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.karaf.jpm.Process;
+
+public class ProcessImpl implements Process {
+
+    private int pid;
+    //private File input;
+    //private File output;
+    //private File error;
+
+    public ProcessImpl(int pid/*, File input, File output, File error*/) {
+        this.pid = pid;
+        //this.input = input;
+        //this.output = output;
+        //this.error = error;
+    }
+
+    public int getPid() {
+        return pid;
+    }
+
+    public boolean isRunning() throws IOException {
+        if (ScriptUtils.isWindows()) {
+            Map<String, String> props = new HashMap<String, String>();
+            props.put("${pid}", Integer.toString(pid));
+            int ret = ScriptUtils.execute("running", props);
+            return ret == 0;
+        } else {
+            try {
+                java.lang.Process process = new java.lang.ProcessBuilder("ps", "-p", Integer.toString(pid)).start();
+                BufferedReader r = new BufferedReader(new InputStreamReader(process.getInputStream()));
+                r.readLine(); // skip headers
+                String s = r.readLine();
+                boolean running = s != null && s.length() > 0;
+                int ret = process.waitFor();
+                return running;
+            } catch (InterruptedException e) {
+                throw new InterruptedIOException();
+            }
+        }
+    }
+
+    public void destroy() throws IOException {
+        int ret;
+        if (ScriptUtils.isWindows()) {
+            Map<String, String> props = new HashMap<String, String>();
+            props.put("${pid}", Integer.toString(pid));
+            ret = ScriptUtils.execute("destroy", props);
+        } else {
+            ret = ScriptUtils.executeProcess(new java.lang.ProcessBuilder("kill", "-9", Integer.toString(pid)));
+        }
+        if (ret != 0) {
+            throw new IOException("Unable to destroy process, it may be already terminated");
+        }
+    }
+
+    /*
+    public OutputStream getInputStream() throws FileNotFoundException {
+        return new FileOutputStream(input);
+    }
+
+    public InputStream getOutputStream() throws FileNotFoundException {
+        return new FileInputStream(output);
+    }
+
+    public InputStream getErrorStream() throws FileNotFoundException {
+        return new FileInputStream(error);
+    }
+    */
+
+    public int waitFor() throws InterruptedException {
+        return 0;
+    }
+
+    public int exitValue() {
+        return 0;
+    }
+
+    public static Process create(File dir, String command) throws IOException {
+        //File input = File.createTempFile("jpm.", ".input");
+        //File output = File.createTempFile("jpm.", ".output");
+        //File error = File.createTempFile("jpm.", ".error");
+        File pidFile = File.createTempFile("jpm.", ".pid");
+        try {
+            Map<String, String> props = new HashMap<String, String>();
+            //props.put("${in.file}", input.getCanonicalPath());
+            //props.put("${out.file}", output.getCanonicalPath());
+            //props.put("${err.file}", error.getCanonicalPath());
+            props.put("${pid.file}", pidFile.getCanonicalPath());
+            props.put("${dir}", dir != null ? dir.getCanonicalPath() : "");
+            if (ScriptUtils.isWindows()) {
+                command = command.replaceAll("\"", "\"\"");
+            }
+            props.put("${command}", command);
+            int ret = ScriptUtils.execute("start", props);
+            if (ret != 0) {
+                throw new IOException("Unable to create process (error code: " + ret + ")");
+            }
+            int pid = readPid(pidFile);
+            return new ProcessImpl(pid/*, input, output, error*/);
+        } finally {
+            pidFile.delete();
+        }
+    }
+
+    public static Process attach(int pid) throws IOException {
+        return new ProcessImpl(pid);
+    }
+
+    private static int readPid(File pidFile) throws IOException {
+        InputStream is = new FileInputStream(pidFile);
+        try {
+            BufferedReader r = new BufferedReader(new InputStreamReader(is));
+            String pidString = r.readLine();
+            return Integer.valueOf(pidString);
+        } finally {
+            try {
+                is.close();
+            } catch (IOException e) {}
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ScriptUtils.java b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ScriptUtils.java
new file mode 100644
index 0000000..a99261b
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ScriptUtils.java
@@ -0,0 +1,124 @@
+/*
+ * 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.karaf.jpm.impl;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Map;
+import java.util.Scanner;
+
+public class ScriptUtils {
+
+    public static int execute(String name, Map<String, String> props) throws IOException {
+        File script = File.createTempFile("jpm.", ".script");
+        try {
+            if (isWindows()) {
+                String res = "windows/" + name + ".vbs";
+                ScriptUtils.copyFilteredResource(res, script, props);
+                return executeProcess(new java.lang.ProcessBuilder("cscript",
+                                                                   "/NOLOGO",
+                                                                   "//E:vbs",
+                                                                   script.getCanonicalPath()));
+            } else {
+                String res = "unix/" + name + ".sh";
+                ScriptUtils.copyFilteredResource(res, script, props);
+                return executeProcess(new java.lang.ProcessBuilder("/bin/sh",
+                                                                   script.getCanonicalPath()));
+            }
+        } finally {
+            script.delete();
+        }
+    }
+
+    public static int executeProcess(java.lang.ProcessBuilder builder) throws IOException {
+        try {
+            java.lang.Process process = builder.start();
+            return process.waitFor();
+        } catch (InterruptedException e) {
+            throw new InterruptedIOException();
+        }
+    }
+
+    public static void copyFilteredResource(String resource, File outFile, Map<String, String> props) throws IOException {
+        InputStream is = null;
+        try {
+            is = ScriptUtils.class.getResourceAsStream(resource);
+            // Read it line at a time so that we can use the platform line ending when we write it out.
+            PrintStream out = new PrintStream(new FileOutputStream(outFile));
+            try {
+                Scanner scanner = new Scanner(is);
+                while (scanner.hasNextLine() ) {
+                    String line = scanner.nextLine();
+                    line = filter(line, props);
+                    out.println(line);
+                }
+            } finally {
+                safeClose(out);
+            }
+        } finally {
+            safeClose(is);
+        }
+    }
+
+    private static void safeClose(InputStream is) throws IOException {
+        if (is == null) {
+            return;
+        }
+        try {
+            is.close();
+        } catch (Throwable ignore) {
+        }
+    }
+
+    private static void safeClose(OutputStream is) throws IOException {
+        if (is == null) {
+            return;
+        }
+        try {
+            is.close();
+        } catch (Throwable ignore) {
+        }
+    }
+
+    private static String filter(String line, Map<String, String> props) {
+        for (Map.Entry<String, String> i : props.entrySet()) {
+            int p1 = line.indexOf(i.getKey());
+            if( p1 >= 0 ) {
+                String l1 = line.substring(0, p1);
+                String l2 = line.substring(p1+i.getKey().length());
+                line = l1+i.getValue()+l2;
+            }
+        }
+        return line;
+    }
+
+    private static final boolean windows;
+
+    static {
+        windows = System.getProperty("os.name").toLowerCase().indexOf("windows") != -1;
+    }
+
+    public static boolean isWindows() {
+        return windows;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml b/karaf-2.2.x/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
new file mode 100644
index 0000000..1fb869e
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
@@ -0,0 +1,33 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <bean id="adminService" class="org.apache.karaf.admin.internal.AdminServiceImpl" init-method="init">
+        <property name="storageLocation" value="${karaf.instances}" />
+    </bean>
+
+    <service ref="adminService" interface="org.apache.karaf.admin.AdminService" />
+
+    <!-- Allow the use of system properties -->
+    <ext:property-placeholder />
+
+</blueprint>
diff --git a/karaf-2.2.x/admin/core/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/admin/core/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..fd820e8
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,17 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle is the core implementation of the Karaf admin feature.
+
+    Karaf admin allows you to manage Karaf child instances.
+
+    You can create new Karaf instances, configure attributes, rename instances, stop instances, etc.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[31mManaging child instances\u001B[0m of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf
new file mode 100644
index 0000000..8967cea
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf
@@ -0,0 +1,25 @@
+#!/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.
+#
+################################################################################
+
+KARAF_HOME=${SUBST-KARAF-HOME}
+KARAF_BASE=${SUBST-KARAF-BASE}
+
+export KARAF_BASE
+exec ${KARAF_HOME}/bin/karaf "$*"
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf.bat b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf.bat
new file mode 100644
index 0000000..312b66c
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf.bat
@@ -0,0 +1,25 @@
+@ECHO OFF
+REM =========================================================================
+REM
+REM Licensed to the Apache Software Foundation (ASF) under one or more
+REM contributor license agreements.  See the NOTICE file distributed with
+REM this work for additional information regarding copyright ownership.
+REM The ASF licenses this file to You under the Apache License, Version 2.0
+REM (the "License"); you may not use this file except in compliance with
+REM 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, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+REM
+REM =========================================================================
+
+SETLOCAL
+SET KARAF_HOME=${SUBST-KARAF-HOME}
+SET KARAF_BASE=${SUBST-KARAF-BASE}
+
+%KARAF_HOME%\bin\karaf.bat %*
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start
new file mode 100644
index 0000000..333cba1
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start
@@ -0,0 +1,25 @@
+#!/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.
+#
+################################################################################
+
+KARAF_HOME=${SUBST-KARAF-HOME}
+KARAF_NAME=${SUBST-KARAF-NAME}
+
+exec ${KARAF_HOME}/bin/admin start ${KARAF_NAME} "$@"
+
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start.bat b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start.bat
new file mode 100644
index 0000000..822ed42
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start.bat
@@ -0,0 +1,24 @@
+@ECHO OFF
+REM =========================================================================
+REM 
+REM Licensed to the Apache Software Foundation (ASF) under one or more
+REM contributor license agreements.  See the NOTICE file distributed with
+REM this work for additional information regarding copyright ownership.
+REM The ASF licenses this file to You under the Apache License, Version 2.0
+REM (the "License"); you may not use this file except in compliance with
+REM 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, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+REM 
+REM =========================================================================
+
+SET KARAF_HOME=${SUBST-KARAF-HOME}
+SET KARAF_NAME=${SUBST-KARAF-NAME}
+
+%KARAF_HOME%\bin\admin.bat start %KARAF_NAME%
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop
new file mode 100644
index 0000000..459a488
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop
@@ -0,0 +1,25 @@
+#!/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.
+#
+################################################################################
+
+KARAF_HOME=${SUBST-KARAF-HOME}
+KARAF_NAME=${SUBST-KARAF-NAME}
+
+exec ${KARAF_HOME}/bin/admin stop ${KARAF_NAME} "$@"
+
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop.bat b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop.bat
new file mode 100644
index 0000000..31d92cb
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop.bat
@@ -0,0 +1,24 @@
+@ECHO OFF
+REM =========================================================================
+REM 
+REM Licensed to the Apache Software Foundation (ASF) under one or more
+REM contributor license agreements.  See the NOTICE file distributed with
+REM this work for additional information regarding copyright ownership.
+REM The ASF licenses this file to You under the Apache License, Version 2.0
+REM (the "License"); you may not use this file except in compliance with
+REM 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, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+REM 
+REM =========================================================================
+
+SET KARAF_HOME=${SUBST-KARAF-HOME}
+SET KARAF_NAME=${SUBST-KARAF-NAME}
+
+%KARAF_HOME%\bin\admin.bat stop %KARAF_NAME%
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.management.cfg b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.management.cfg
new file mode 100644
index 0000000..a673ed8
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.management.cfg
@@ -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.
+#
+################################################################################
+
+#
+rmiRegistryPort = ${SUBST-RMI-REGISTRY-PORT}
+rmiServerPort = ${SUBST-RMI-SERVER-PORT}
+jmxRealm = karaf
+serviceUrl = service:jmx:rmi://0.0.0.0:${rmiServerPort}/jndi/rmi://0.0.0.0:${rmiRegistryPort}/karaf-${karaf.name}
+daemon = true
+threaded = true
+objectName = connector:name=rmi
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.shell.cfg b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.shell.cfg
new file mode 100644
index 0000000..7c5ab59
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.shell.cfg
@@ -0,0 +1,24 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+sshPort=${SUBST-SSH-PORT}
+sshHost=0.0.0.0
+sshRealm=karaf
+hostKey=${karaf.base}/etc/host.key
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg
new file mode 100644
index 0000000..cccf2b2
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.ops4j.pax.url.mvn.cfg
@@ -0,0 +1,80 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# If set to true, the following property will not allow any certificate to be used
+# when accessing maven repositories through SSL
+#
+#org.ops4j.pax.url.mvn.certificateCheck=
+
+#
+# Path to the local maven settings file.
+# The repositories defined in this file will be automatically added to the list
+# of default repositories if the 'org.ops4j.pax.url.mvn.repositories' property
+# below is not set.
+# The following locations are checked for the existence of the settings.xml file
+#   * 1. looks for the specified url
+#   * 2. if not found looks for ${user.home}/.m2/settings.xml
+#   * 3. if not found looks for ${maven.home}/conf/settings.xml
+#   * 4. if not found looks for ${M2_HOME}/conf/settings.xml
+#
+#org.ops4j.pax.url.mvn.settings=
+
+#
+# Path to the local maven repository which is used to avoid downloading
+# artifacts when they already exist locally.
+# The value of this property will be extracted from the settings.xml file
+# above, or defaulted to:
+#     System.getProperty( "user.home" ) + "/.m2/repository"
+#
+#org.ops4j.pax.url.mvn.localRepository=
+
+#
+# Comma separated list of repositories scanned when resolving an artifact.
+# Those repositories will be checked before iterating through the
+     below list of repositories and even before the local repository
+# A repository url can be appended with zero or more of the following flags:
+#    @snapshots  : the repository contains snaphots
+#    @noreleases : the repository does not contain any released artifacts
+#
+# The following property value will add the system folder as a repo.
+#
+org.ops4j.pax.url.mvn.defaultRepositories=file:${karaf.home}/${karaf.default.repository}@snapshots,\
+    file:${karaf.base}/${karaf.default.repository}@snapshots
+
+#
+# Comma separated list of repositories scanned when resolving an artifact.
+# The default list includes the following repositories:
+#    http://repo1.maven.org/maven2
+#    http://svn.apache.org/repos/asf/servicemix/m2-repo
+#    http://repository.springsource.com/maven/bundles/release
+#    http://repository.springsource.com/maven/bundles/external
+# To add repositories to the default ones, prepend '+' to the list of repositories
+# to add.
+# A repository url can be appended with zero or more of the following flags:
+#    @snapshots  : the repository contains snaphots
+#    @noreleases : the repository does not contain any released artifacts
+#
+# The following property value will add the system folder as a repo.
+#
+org.ops4j.pax.url.mvn.repositories= \
+    http://repo1.maven.org/maven2, \
+    http://svn.apache.org/repos/asf/servicemix/m2-repo, \
+    http://repository.springsource.com/maven/bundles/release, \
+    http://repository.springsource.com/maven/bundles/external
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/system.properties b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/system.properties
new file mode 100644
index 0000000..d5fc11f
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/system.properties
@@ -0,0 +1,61 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# The properties defined in this file will be made available through system
+# properties at the very beginning of the Karaf's boot process.
+#
+
+
+# Log level when the pax-logging service is not available
+# This level will only be used while the pax-logging service bundle
+# is not fully available.
+# To change log levels, please refer to the org.ops4j.pax.logging.cfg file
+# instead.
+org.ops4j.pax.logging.DefaultServiceLog.level=ERROR
+
+#
+# Name of this karaf instance.
+#
+karaf.name=${SUBST-KARAF-NAME}
+
+#
+# Default repository where bundles will be loaded from before using
+# other maven repositories.  For the full maven configuration, see
+# the org.ops4j.pax.url.mvn.cfg file.
+#
+karaf.default.repository=system
+
+#
+# Location of a shell script that will be run when starting a shell
+# session.  This script can be used to create aliases and define
+# additional commands.
+#
+karaf.shell.init.script=${karaf.home}/etc/shell.init.script
+
+#
+# Set this empty property to avoid errors when validating xml documents.
+#
+xml.catalog.files=
+
+#
+# Suppress the bell in the console when hitting backspace to many times
+# for example
+#
+jline.nobell=true
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/unix/start.sh b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/unix/start.sh
new file mode 100644
index 0000000..1d1d720
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/unix/start.sh
@@ -0,0 +1,29 @@
+#!/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.
+#
+################################################################################
+
+#exec 1>${out.file}
+#exec 2>${err.file}
+exec 1>/dev/null
+exec 2>/dev/null
+if [ "x${dir}" != "x" ]; then
+    cd ${dir}
+fi
+nohup ${command} &
+echo $! > ${pid.file}
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/destroy.vbs b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/destroy.vbs
new file mode 100644
index 0000000..abd60eb
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/destroy.vbs
@@ -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.
+'
+'===============================================================================
+
+Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
+Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessId = ${pid}")
+intRetVal = 1
+For Each objProcess in colProcessList
+    objProcess.Terminate()
+    intRetVal = 0
+Next
+WScript.Quit(intRetVal)
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/running.vbs b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/running.vbs
new file mode 100644
index 0000000..32c65c5
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/running.vbs
@@ -0,0 +1,26 @@
+'===============================================================================
+'
+'    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.
+'
+'===============================================================================
+
+Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
+Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessId = ${pid}")
+intRetVal = 1
+For Each objProcess in colProcessList
+    intRetVal = 0
+Next
+WScript.Quit(intRetVal)
diff --git a/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/start.vbs b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/start.vbs
new file mode 100644
index 0000000..6004c86
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/start.vbs
@@ -0,0 +1,34 @@
+'===============================================================================
+'
+'    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.
+'
+'===============================================================================
+
+Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
+Set objConfig = objWMIService.Get("Win32_ProcessStartup").SpawnInstance_
+objConfig.ShowWindow = SW_HIDE
+objConfig.CreateFlags = 8
+If Len("${dir}") > 0 Then
+    intReturn = objWMIService.Get("Win32_Process").Create("${command}", "${dir}", objConfig, intProcessID)
+Else
+    intReturn = objWMIService.Get("Win32_Process").Create("${command}", Null, objConfig, intProcessID)
+End If
+If intReturn = 0 Then
+    Set objOutputFile = CreateObject("Scripting.fileSystemObject").CreateTextFile("${pid.file}", TRUE)
+    objOutputFile.WriteLine(intProcessID)
+    objOutputFile.Close
+End If
+WScript.Quit(intReturn)
diff --git a/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/admin/InstanceSettingsTest.java b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/admin/InstanceSettingsTest.java
new file mode 100644
index 0000000..a36a6dc
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/admin/InstanceSettingsTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.admin;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import junit.framework.TestCase;
+import org.apache.karaf.admin.InstanceSettings;
+import org.junit.Assert;
+
+public class InstanceSettingsTest extends TestCase {
+    public void testInstanceSettings() {
+        InstanceSettings is =
+            new InstanceSettings(1, 1, 1, null, null, Collections.<String>emptyList(), Arrays.asList("hi"));
+        assertEquals(1, is.getSshPort());
+        assertEquals(1, is.getRmiRegistryPort());
+        assertEquals(1, is.getRmiServerPort());
+        Assert.assertNull(is.getLocation());
+        assertEquals(Arrays.asList("hi"), is.getFeatures());
+        assertEquals(0, is.getFeatureURLs().size());
+    }
+    
+    public void testEqualsHashCode() {
+        testEqualsHashCode(1, 1, 1, "top", "foo", Collections.<String>emptyList(), Arrays.asList("hi"));
+        testEqualsHashCode(0, 0, 0, null, null, null, null);
+    }
+
+    private void testEqualsHashCode(int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, List<String> featureURLs, List<String> features) {
+        InstanceSettings is = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features);
+        InstanceSettings is2 = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features);
+        assertEquals(is, is2);
+        assertEquals(is.hashCode(), is2.hashCode());
+    }
+    
+    public void testEqualsHashCode2() {
+        InstanceSettings is = new InstanceSettings(1, 1, 1,"top", "foo", Collections.<String>emptyList(), Arrays.asList("hi"));
+        Assert.assertFalse(is.equals(null));
+        Assert.assertFalse(is.equals(new Object()));
+        assertEquals(is, is);
+    }
+}
diff --git a/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
new file mode 100644
index 0000000..58a9268
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.karaf.admin.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.InstanceSettings;
+
+public class AdminServiceImplTest extends TestCase {
+
+    public void testHandleFeatures() throws Exception {
+        AdminServiceImpl as = new AdminServiceImpl();
+        
+        File f = File.createTempFile(getName(), ".test");
+        try {
+            Properties p = new Properties();
+            p.put("featuresBoot", "abc,def ");
+            p.put("featuresRepositories", "somescheme://xyz");
+            OutputStream os = new FileOutputStream(f);
+            try {
+                p.store(os, "Test comment");
+            } finally {
+                os.close();
+            }
+            
+            InstanceSettings s = new InstanceSettings(8122, 1122, 44444, null, null, null, Arrays.asList("test"));
+            as.handleFeatures(f, s);
+            
+            Properties p2 = new Properties();
+            InputStream is = new FileInputStream(f);
+            try {
+                p2.load(is);
+            } finally {
+                is.close();
+            }
+            assertEquals(2, p2.size());
+            assertEquals("abc,def,test", p2.get("featuresBoot"));
+            assertEquals("somescheme://xyz", p2.get("featuresRepositories"));
+        } finally {
+            f.delete();
+        }
+    }
+
+    /**
+     * Ensure the admin:create generates all the required configuration files
+     * //TODO: fix this test so it can run in an IDE
+     */
+    public void testConfigurationFiles() throws Exception {
+        AdminServiceImpl service = new AdminServiceImpl();
+        service.setStorageLocation(new File("target/instances/" + System.currentTimeMillis()));
+
+        InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null);
+        Instance instance = service.createInstance(getName(), settings);
+
+        assertFileExists(instance.getLocation(), "etc/config.properties");
+        assertFileExists(instance.getLocation(), "etc/users.properties");
+        assertFileExists(instance.getLocation(), "etc/startup.properties");
+
+        assertFileExists(instance.getLocation(), "etc/java.util.logging.properties");
+        assertFileExists(instance.getLocation(), "etc/org.apache.karaf.features.cfg");
+        assertFileExists(instance.getLocation(), "etc/org.apache.felix.fileinstall-deploy.cfg");
+        assertFileExists(instance.getLocation(), "etc/org.apache.karaf.log.cfg");
+        assertFileExists(instance.getLocation(), "etc/org.apache.karaf.management.cfg");
+        assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.logging.cfg");
+        assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.url.mvn.cfg");
+    }
+
+    /**
+     * <p>
+     * Test the renaming of an existing instance.
+     * </p>
+     */
+    public void testRenameInstance() throws Exception {
+        AdminServiceImpl service = new AdminServiceImpl();
+        service.setStorageLocation(new File("target/instances/" + System.currentTimeMillis()));
+
+        InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null);
+        Instance instance = service.createInstance(getName(), settings);
+
+        service.renameInstance(getName(), getName() + "b");
+        assertNotNull(service.getInstance(getName() + "b"));
+    }
+
+    private void assertFileExists(String path, String name) throws IOException {
+        File file = new File(path, name);
+        assertTrue("Expected " + file.getCanonicalPath() + " to exist",
+                   file.exists());
+    }   
+}
diff --git a/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/jpm/MainTest.java b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/jpm/MainTest.java
new file mode 100644
index 0000000..e7f7c83
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/jpm/MainTest.java
@@ -0,0 +1,24 @@
+/*
+ * 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.karaf.jpm;
+
+public class MainTest {
+
+    public static void main(String[] args) throws Exception {
+        Thread.sleep(Long.parseLong(args[0]));
+    }
+}
diff --git a/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/jpm/ProcessTest.java b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/jpm/ProcessTest.java
new file mode 100644
index 0000000..e724435
--- /dev/null
+++ b/karaf-2.2.x/admin/core/src/test/java/org/apache/karaf/jpm/ProcessTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.karaf.jpm;
+
+import java.io.File;
+import java.net.URI;
+
+import junit.framework.TestCase;
+
+import org.apache.karaf.jpm.impl.ScriptUtils;
+
+public class ProcessTest extends TestCase {
+
+    public void testCreate() throws Exception {
+        String javaPath =
+            new File(System.getProperty("java.home"), ScriptUtils.isWindows() ? "bin\\java.exe" : "bin/java")
+                .getCanonicalPath();
+        System.err.println(javaPath);
+        StringBuilder command = new StringBuilder();
+        command.append(javaPath);
+        command.append(" -Dprop=\"key\"");
+        command.append(" -classpath ");
+        String clRes = getClass().getName().replace('.', '/') + ".class";
+        String str = new URI(getClass().getClassLoader().getResource(clRes).toString()).getPath();
+        str = str.substring(0, str.indexOf(clRes));
+        command.append("\"" + str + "\"");
+        command.append(" ");
+        command.append(MainTest.class.getName());
+        command.append(" ");
+        command.append(60000);
+        System.err.println("Executing: " + command.toString());
+
+        ProcessBuilder builder = ProcessBuilderFactory.newInstance().newBuilder();
+        org.apache.karaf.jpm.Process p = builder.command(command.toString()).start();
+        assertNotNull(p);
+        System.err.println("Process: " + p.getPid());
+        assertNotNull(p.getPid());
+        Thread.currentThread().sleep(1000);
+        System.err.println("Running: " + p.isRunning());
+        assertTrue(p.isRunning());
+        System.err.println("Destroying");
+        p.destroy();
+        Thread.currentThread().sleep(1000);
+        System.err.println("Running: " + p.isRunning());
+        assertFalse(p.isRunning());
+    }
+
+    /*
+     * When the process creation fails, no error is reported by the script
+     * 
+    public void testFailure() throws Exception {
+        ProcessBuilder builder = ProcessBuilderFactory.newInstance().newBuilder();
+        Process p = builder.command("ec").start();
+        fail("An exception should have been thrown");
+    }
+    */
+}
diff --git a/karaf-2.2.x/admin/management/NOTICE b/karaf-2.2.x/admin/management/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/admin/management/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/admin/management/pom.xml b/karaf-2.2.x/admin/management/pom.xml
new file mode 100644
index 0000000..315f2c8
--- /dev/null
+++ b/karaf-2.2.x/admin/management/pom.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.admin</groupId>
+        <artifactId>admin</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.admin.management</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Admin :: Management</name>
+    <description>Provide JMX MBeans related to the Karaf admin feature.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.management</groupId>
+            <artifactId>org.apache.karaf.management.server</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymockclassextension</artifactId>
+            <version>${easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.admin.management.internal;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/AdminServiceMBean.java b/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/AdminServiceMBean.java
new file mode 100644
index 0000000..c943cf5
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/AdminServiceMBean.java
@@ -0,0 +1,50 @@
+/*
+ * 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.karaf.admin.management;
+
+import javax.management.openmbean.TabularData;
+
+public interface AdminServiceMBean {
+
+    String INSTANCE_PID = "Pid";
+    String INSTANCE_NAME = "Name";
+    String INSTANCE_IS_ROOT = "Is Root";
+    String INSTANCE_SSH_PORT = "SSH Port";
+    String INSTANCE_RMI_REGISTRY_PORT = "RMI Registry Port";
+    String INSTANCE_RMI_SERVER_PORT = "RMI Server Port";
+    String INSTANCE_STATE = "State";
+    String INSTANCE_LOCATION = "Location";
+    String INSTANCE_JAVAOPTS = "JavaOpts";
+
+    String[] INSTANCE = {INSTANCE_PID, INSTANCE_NAME, INSTANCE_IS_ROOT, INSTANCE_SSH_PORT, INSTANCE_RMI_REGISTRY_PORT,
+            INSTANCE_RMI_SERVER_PORT, INSTANCE_STATE, INSTANCE_LOCATION, INSTANCE_JAVAOPTS };
+
+    // Operations
+    int createInstance(String name, int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, String features, String featureURLs) throws Exception;
+    void changeSshPort(String name, int port) throws Exception;
+    void changeRmiRegistryPort(String name, int port) throws Exception;
+    void changeRmiServerPort(String name, int port) throws Exception;
+    void changeJavaOpts(String name, String javaopts) throws Exception;
+    void destroyInstance(String name) throws Exception;
+    void startInstance(String name, String opts) throws Exception;
+    void stopInstance(String name) throws Exception;
+    void renameInstance(String originalName, String newName) throws Exception;
+
+    // Attributes
+    TabularData getInstances() throws Exception;
+
+}
diff --git a/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/codec/JmxInstance.java b/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/codec/JmxInstance.java
new file mode 100644
index 0000000..1453399
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/codec/JmxInstance.java
@@ -0,0 +1,130 @@
+/*
+ * 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.karaf.admin.management.codec;
+
+import java.util.List;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
+import org.apache.karaf.admin.management.AdminServiceMBean;
+import org.apache.karaf.admin.Instance;
+
+public class JmxInstance {
+    static final CompositeType INSTANCE;
+    static final TabularType INSTANCE_TABLE;
+
+    static {
+        INSTANCE = createInstanceType();
+        INSTANCE_TABLE = createInstanceTableType();
+    }
+
+    private final CompositeDataSupport data;
+
+    private CompositeData asCompositeData() {
+        return data;
+    }
+
+    public JmxInstance(Instance instance) {
+        try {
+            String[] itemNames = AdminServiceMBean.INSTANCE;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = instance.getPid();
+            itemValues[1] = instance.getName();
+            itemValues[2] = instance.isRoot();
+            itemValues[3] = instance.getSshPort();
+            itemValues[4] = instance.getRmiRegistryPort();
+            itemValues[5] = instance.getRmiServerPort();
+            try {
+                itemValues[6] = instance.getState();
+            } catch (Exception e) {
+                itemValues[6] = "Error";
+            }
+            itemValues[7] = instance.getLocation();
+            itemValues[8] = instance.getJavaOpts();
+
+            data = new CompositeDataSupport(INSTANCE, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot create instance open data", e);
+        }
+    }
+
+    private static CompositeType createInstanceType() {
+        try {
+            String desc = "This type describes Karaf instances";
+            String[] itemNames = AdminServiceMBean.INSTANCE;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] descriptions = new String[itemNames.length];
+
+            itemTypes[0] = SimpleType.INTEGER;
+            descriptions[0] = "The Process ID of the instance or 0 if not running.";
+
+            itemTypes[1] = SimpleType.STRING;
+            descriptions[1] = "The name of the instance.";
+            
+            itemTypes[2] = SimpleType.BOOLEAN;
+            descriptions[2] = "Whether the instance is root.";
+
+            itemTypes[3] = SimpleType.INTEGER;
+            descriptions[3] = "The SSH port that can be used to connect to the instance.";
+
+            itemTypes[4] = SimpleType.INTEGER;
+            descriptions[4] = "The RMI registry port that can be used to manage the instance.";
+
+            itemTypes[5] = SimpleType.INTEGER;
+            descriptions[5] = "The RMI server port that can be used to manage the instance.";
+
+            itemTypes[6] = SimpleType.STRING;
+            descriptions[6] = "The state of the instance.";
+
+            itemTypes[7] = SimpleType.STRING;
+            descriptions[7] = "The location of the instance.";
+
+            itemTypes[8] = SimpleType.STRING;
+            descriptions[8] = "The Java options of the instance.";
+
+            return new CompositeType("Instance", desc, itemNames, descriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build instance type", e);
+        }
+    }
+
+    private static TabularType createInstanceTableType() {
+        try {
+            return new TabularType("Instances", "Table of all Karaf instances", INSTANCE,
+                    new String[] {AdminServiceMBean.INSTANCE_NAME});
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build instance table type", e);
+        }
+    }
+
+    public static TabularData tableFrom(List<JmxInstance> instances) {
+        TabularDataSupport table = new TabularDataSupport(INSTANCE_TABLE);
+        for (JmxInstance instance : instances) {
+            table.put(instance.asCompositeData());
+        }
+        return table;
+    }
+
+}
diff --git a/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImpl.java b/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImpl.java
new file mode 100644
index 0000000..7de359e
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/main/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImpl.java
@@ -0,0 +1,136 @@
+/*
+ * 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.karaf.admin.management.internal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.TabularData;
+
+import org.apache.karaf.admin.management.AdminServiceMBean;
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.InstanceSettings;
+import org.apache.karaf.admin.management.codec.JmxInstance;
+
+public class AdminServiceMBeanImpl extends StandardMBean implements AdminServiceMBean {
+
+    private AdminService adminService;
+
+    public AdminServiceMBeanImpl() throws NotCompliantMBeanException {
+        super(AdminServiceMBean.class);
+    }
+
+    public AdminService getAdminService() {
+        return adminService;
+    }
+
+    public void setAdminService(AdminService adminService) {
+        this.adminService = adminService;
+    }
+
+    public int createInstance(String name, int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts, String features, String featureURLs)
+            throws Exception {
+        if ("".equals(location)) {
+            location = null;
+        }
+        if ("".equals(javaOpts)) {
+            javaOpts = null;
+        }
+
+        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts,
+                parseStringList(featureURLs), parseStringList(features));
+
+        Instance inst = adminService.createInstance(name, settings);
+        if (inst != null) {
+            return inst.getPid();
+        } else {
+            return -1;
+        }
+    }
+
+    public void changeSshPort(String name, int port) throws Exception {
+        getExistingInstance(name).changeSshPort(port);
+    }
+
+    public void changeRmiRegistryPort(String name, int port) throws Exception {
+        getExistingInstance(name).changeRmiRegistryPort(port);
+    }
+
+    public void changeRmiServerPort(String name, int port) throws Exception {
+        getExistingInstance(name).changeRmiServerPort(port);
+    }
+
+    public void changeJavaOpts(String name, String javaOpts) throws Exception {
+        getExistingInstance(name).changeJavaOpts(javaOpts);
+    }
+
+    public void destroyInstance(String name) throws Exception {
+        getExistingInstance(name).destroy();
+    }
+
+    public void startInstance(String name, String opts) throws Exception {
+        getExistingInstance(name).start(opts);
+    }
+
+    public void stopInstance(String name) throws Exception {
+        getExistingInstance(name).stop();
+    }
+
+    public void renameInstance(String originalName, String newName) throws Exception {
+        adminService.renameInstance(originalName, newName);
+    }
+
+    public TabularData getInstances() throws Exception {
+        List<Instance> allInstances = Arrays.asList(adminService.getInstances());
+        List<JmxInstance> instances = new ArrayList<JmxInstance>();
+        for (Instance instance : allInstances) {
+            try {
+                instances.add(new JmxInstance(instance));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        TabularData table = JmxInstance.tableFrom(instances);
+        return table;
+    }
+
+    private Instance getExistingInstance(String name) {
+        Instance i = adminService.getInstance(name);
+        if (i == null) {
+            throw new IllegalArgumentException("Instance '" + name + "' does not exist");
+        }
+        return i;
+    }
+
+    private List<String> parseStringList(String value) {
+        List<String> list = new ArrayList<String>();
+        if (value != null) {
+            for (String el : value.split(",")) {
+                String trimmed = el.trim();
+                if (trimmed.length() == 0) {
+                    continue;
+                }
+                list.add(trimmed);
+            }
+        }
+        return list;
+    }
+}
diff --git a/karaf-2.2.x/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml b/karaf-2.2.x/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
new file mode 100644
index 0000000..31c5e87
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
@@ -0,0 +1,42 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="eager">
+
+    <reference id="adminService" interface="org.apache.karaf.admin.AdminService" />
+
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegister" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer" />
+    </reference>
+
+    <bean id="mbeanImpl" class="org.apache.karaf.admin.management.internal.AdminServiceMBeanImpl">
+        <property name="adminService" ref="adminService" />
+    </bean>
+
+    <bean id="mbeanRegister" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=admin,name=${karaf.name}"
+                    key-ref="mbeanImpl" />
+            </map>
+        </property>
+    </bean>
+
+
+</blueprint>
diff --git a/karaf-2.2.x/admin/management/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/admin/management/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..c183bd4
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,27 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides JMX MBeans related to the Karaf admin feature.
+
+    In particular, an AdminServiceMBean is provided that can be remotely administered using a JMX client (for instance
+    JConsole).
+
+    With this AdminServiceMBean, you have the following operations available:
+    \u001B[36mcreateInstance(name, sshPort, rmiPort, location, javaOpts, features, featureURLs)\u001B[0m Creates a new Karaf instance.
+    \u001B[36mchangeSshPort(name, port)\u001B[0m Changes the SSH port number of an existing Karaf instance.
+    \u001B[36mchangeRmiRegistryPort(name, port)\u001B[0m Changes the RMI registry port number of an existing Karaf instance.
+    \u001B[36mchangeRmiServerPort(name, port)\u001B[0m Changes the RMI server port number of an existing Karaf instance.
+    \u001B[36mchangeJavaOpts(name, javaopts)\u001B[0m Changes the Java options of an existing Karaf instance.
+    \u001B[36mdestroyInstance(name)\u001B[0m Destroys an existing Karaf instance.
+    \u001B[36mstartInstance(name)\u001B[0m Starts an existing Karaf instance.
+    \u001B[36mstopInstance(name)\u001B[0m Stops an existing Karaf instance.
+    \u001B[36mrenameInstance(originalName, newName)\u001B[0m Renames an existing Karaf instance.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[31mRemote Management via JMX\u001B[0m in the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/admin/management/src/test/java/org/apache/karaf/admin/management/codec/JmxInstanceTest.java b/karaf-2.2.x/admin/management/src/test/java/org/apache/karaf/admin/management/codec/JmxInstanceTest.java
new file mode 100644
index 0000000..02145ae
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/test/java/org/apache/karaf/admin/management/codec/JmxInstanceTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.karaf.admin.management.codec;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularType;
+
+import junit.framework.TestCase;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.management.AdminServiceMBean;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+
+public class JmxInstanceTest extends TestCase {
+    public void testJMXInstanceStatics() {
+        CompositeType it = JmxInstance.INSTANCE;
+        Assert.assertEquals(
+            new HashSet<String>(Arrays.asList(AdminServiceMBean.INSTANCE)),
+            it.keySet());
+
+        TabularType tt = JmxInstance.INSTANCE_TABLE;
+        Assert.assertEquals("Instances", tt.getTypeName());
+    }
+
+    public void testJMXInstance() throws Exception {
+        Instance i = EasyMock.createMock(Instance.class);
+        EasyMock.expect(i.getPid()).andReturn(1712);
+        EasyMock.expect(i.getName()).andReturn("MyInstance");
+        EasyMock.expect(i.isRoot()).andReturn(false);
+        EasyMock.expect(i.getSshPort()).andReturn(0);
+        EasyMock.expect(i.getRmiRegistryPort()).andReturn(0);
+        EasyMock.expect(i.getRmiServerPort()).andReturn(0);
+        EasyMock.expect(i.getState()).andThrow(new Exception("gotcha"));
+        EasyMock.expect(i.getLocation()).andReturn("somewhere");
+        EasyMock.expect(i.getJavaOpts()).andReturn("someopts");
+        EasyMock.replay(i);
+        
+        JmxInstance ji = new JmxInstance(i);
+        TabularData td = JmxInstance.tableFrom(Collections.singletonList(ji));        
+        Collection<?> keys = (Collection<?>) td.keySet().iterator().next();
+        Assert.assertEquals("MyInstance", keys.iterator().next());
+        
+        CompositeData cd = td.get(keys.toArray());
+        Assert.assertEquals(1712, cd.get("Pid"));
+        Assert.assertEquals("MyInstance", cd.get("Name"));
+        Assert.assertEquals(false, cd.get("Is Root"));
+        Assert.assertEquals(0, cd.get("SSH Port"));
+        Assert.assertEquals(0, cd.get("RMI Registry Port"));
+        Assert.assertEquals(0, cd.get("RMI Server Port"));
+        Assert.assertEquals("Error", cd.get("State"));
+        Assert.assertEquals("somewhere", cd.get("Location"));
+        Assert.assertEquals("someopts", cd.get("JavaOpts"));
+    }
+
+    public void testJMXInstance2() throws Exception {
+        Instance i = EasyMock.createMock(Instance.class);
+        EasyMock.expect(i.getPid()).andReturn(1712);
+        EasyMock.expect(i.getName()).andReturn("MyInstance");
+        EasyMock.expect(i.isRoot()).andReturn(true);
+        EasyMock.expect(i.getSshPort()).andReturn(0);
+        EasyMock.expect(i.getRmiRegistryPort()).andReturn(0);
+        EasyMock.expect(i.getRmiServerPort()).andReturn(0);
+        EasyMock.expect(i.getState()).andReturn("Started");
+        EasyMock.expect(i.getLocation()).andReturn(null);
+        EasyMock.expect(i.getJavaOpts()).andReturn(null);
+        EasyMock.replay(i);
+        
+        JmxInstance ji = new JmxInstance(i);
+        TabularData td = JmxInstance.tableFrom(Collections.singletonList(ji));        
+        Collection<?> keys = (Collection<?>) td.keySet().iterator().next();
+        Assert.assertEquals("MyInstance", keys.iterator().next());
+        
+        CompositeData cd = td.get(keys.toArray());
+        Assert.assertEquals(1712, cd.get("Pid"));
+        Assert.assertEquals("MyInstance", cd.get("Name"));
+        Assert.assertEquals(true, cd.get("Is Root"));
+        Assert.assertEquals(0, cd.get("SSH Port"));
+        Assert.assertEquals(0, cd.get("RMI Registry Port"));
+        Assert.assertEquals(0, cd.get("RMI Server Port"));
+        Assert.assertEquals("Started", cd.get("State"));
+        Assert.assertNull(cd.get("Location"));
+        Assert.assertNull(cd.get("JavaOpts"));
+    }
+}
diff --git a/karaf-2.2.x/admin/management/src/test/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImplTest.java b/karaf-2.2.x/admin/management/src/test/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
new file mode 100644
index 0000000..1bc4bd2
--- /dev/null
+++ b/karaf-2.2.x/admin/management/src/test/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
@@ -0,0 +1,258 @@
+/*
+ * 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.karaf.admin.management.internal;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularData;
+
+import junit.framework.TestCase;
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.InstanceSettings;
+import org.easymock.EasyMock;
+import org.junit.Assert;
+
+public class AdminServiceMBeanImplTest extends TestCase {
+    public void testCreateInstance() throws Exception {
+        final InstanceSettings is = new InstanceSettings(123, 456, 789, "somewhere", "someopts",
+                Collections.<String>emptyList(), Arrays.asList("webconsole", "funfeat"));
+        
+        final Instance inst = EasyMock.createMock(Instance.class);
+        EasyMock.expect(inst.getPid()).andReturn(42);
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.createInstance("t1", is)).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+        
+        assertEquals(42, ab.createInstance("t1", 123, 456, 789, "somewhere", "someopts", " webconsole,  funfeat", ""));
+    }
+    
+    public void testCreateInstance2() throws Exception {
+        final InstanceSettings is = new InstanceSettings(0, 0, 0, null, null,
+                Collections.<String>emptyList(), Collections.<String>emptyList());
+        
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.createInstance("t1", is)).andReturn(null);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+        
+        assertEquals(-1, ab.createInstance("t1", 0, 0, 0, "", "", "", ""));
+    }
+    
+    public void testGetInstances() throws Exception {       
+        Instance i1 = EasyMock.createMock(Instance.class);
+        EasyMock.expect(i1.getPid()).andReturn(1234);
+        EasyMock.expect(i1.getSshPort()).andReturn(8818);
+        EasyMock.expect(i1.getRmiRegistryPort()).andReturn(1122);
+        EasyMock.expect(i1.getRmiServerPort()).andReturn(44444);
+        EasyMock.expect(i1.getName()).andReturn("i1");
+        EasyMock.expect(i1.isRoot()).andReturn(true);
+        EasyMock.expect(i1.getLocation()).andReturn("somewhere");
+        EasyMock.expect(i1.getJavaOpts()).andReturn("someopts");
+        EasyMock.expect(i1.getState()).andReturn("Stopped");
+        EasyMock.replay(i1);
+        Instance i2 = EasyMock.createNiceMock(Instance.class);
+        EasyMock.expect(i2.getName()).andReturn("i2");
+        EasyMock.replay(i2);
+        
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstances()).andReturn(new Instance [] {i1, i2});
+        EasyMock.replay(as);
+
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        
+        TabularData td = ab.getInstances();
+        Assert.assertEquals(2, td.size());
+        CompositeData cd1 = td.get(new Object [] {"i1"});
+        Assert.assertTrue(cd1.containsValue("i1"));
+        Assert.assertTrue(cd1.containsValue(true));
+        Assert.assertTrue(cd1.containsValue(1234));
+        Assert.assertTrue(cd1.containsValue(8818));
+        Assert.assertTrue(cd1.containsValue(1122));
+        Assert.assertTrue(cd1.containsValue(44444));
+        Assert.assertTrue(cd1.containsValue("somewhere"));
+        Assert.assertTrue(cd1.containsValue("someopts"));
+        Assert.assertTrue(cd1.containsValue("Stopped"));
+
+        CompositeData cd2 = td.get(new Object [] {"i2"});
+        Assert.assertTrue(cd2.containsValue("i2"));
+    }
+    
+    public void testStartInstanceWithJavaOpts() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.start("-x -y -z");
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.startInstance("test instance", "-x -y -z");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testStartInstanceWithNoJavaOpts() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.start(null);
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.startInstance("test instance", null);
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testStopInstance() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.stop();
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.stopInstance("test instance");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testDestroyInstance() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.destroy();
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.destroyInstance("test instance");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testSshChangePort() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.changeSshPort(7788);
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.changeSshPort("test instance", 7788);
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+    
+    public void testRmiRegistryChangePort() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.changeRmiRegistryPort(1123);
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+        
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+        
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+        
+        ab.changeRmiRegistryPort("test instance", 1123);
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testRmiServerChangePort() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.changeRmiServerPort(44444);
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.changeRmiServerPort("test instance", 44444);
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+
+    public void testChangeOptions() throws Exception {
+        Instance inst = EasyMock.createMock(Instance.class);
+        inst.changeJavaOpts("new opts");
+        EasyMock.expectLastCall();
+        EasyMock.replay(inst);
+
+        AdminService as = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(as.getInstance("test instance")).andReturn(inst);
+        EasyMock.replay(as);
+
+        AdminServiceMBeanImpl ab = new AdminServiceMBeanImpl();
+        ab.setAdminService(as);
+        Assert.assertSame(as, ab.getAdminService());
+
+        ab.changeJavaOpts("test instance", "new opts");
+        EasyMock.verify(as);
+        EasyMock.verify(inst);
+    }
+}
diff --git a/karaf-2.2.x/admin/pom.xml b/karaf-2.2.x/admin/pom.xml
new file mode 100644
index 0000000..2802f4a
--- /dev/null
+++ b/karaf-2.2.x/admin/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.admin</groupId>
+    <artifactId>admin</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Admin</name>
+
+    <modules>
+        <module>core</module>
+        <module>command</module>
+        <module>management</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/archetypes/assembly/NOTICE b/karaf-2.2.x/archetypes/assembly/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/archetypes/assembly/pom.xml b/karaf-2.2.x/archetypes/assembly/pom.xml
new file mode 100644
index 0000000..9be568c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>archetypes</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.archetypes</groupId>
+    <artifactId>karaf-assembly-archetype</artifactId>
+    <packaging>maven-archetype</packaging>
+    <name>Apache Karaf :: Archetypes :: Assembly Archetype</name>
+    <description>An archetype for creating a Karaf assembly.</description>
+
+    <properties>
+        <archetype.version>2.2</archetype.version>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>${archetype.version}</version>
+            </extension>
+        </extensions>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>^*^</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>${archetype.version}</version>
+                    <extensions>true</extensions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/assembly/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.2.x/archetypes/assembly/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..9fae87c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,39 @@
+<?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.
+-->
+<archetype-descriptor
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+        name="karaf-assembly-archetype"
+        xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <fileSets>
+        <fileSet filtered="true" encoding="UTF-8">
+            <directory>src/main/descriptors</directory>
+            <includes>
+                <include>**/*.xml</include>
+            </includes>
+        </fileSet>
+        <fileSet filtered="true" encoding="UTF-8">
+            <directory>src/main/filtered-resources</directory>
+            <includes>
+                <include>**/*</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+
+</archetype-descriptor>
diff --git a/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/pom.xml b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..65defb9
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>${groupId}</groupId>
+    <artifactId>${artifactId}</artifactId>
+    <version>${version}</version>
+    <packaging>pom</packaging>
+    <name>${artifactId} Karaf Assembly</name>
+    <description>This project creates a Karaf custom distribution that you can customize to fit your needs.</description>
+
+    <properties>
+        <karaf.version>^project.version^</karaf.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf</artifactId>
+            <version>${karaf.version}</version>
+            <type>zip</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf</artifactId>
+            <version>${karaf.version}</version>
+            <type>tar.gz</type>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/filtered-resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>unpack-unix</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>unpack</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>apache-karaf</artifactId>
+                                    <type>tar.gz</type>
+                                    <outputDirectory>target/dependencies/unix</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>unpack-windows</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>unpack</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>apache-karaf</artifactId>
+                                    <type>zip</type>
+                                    <outputDirectory>target/dependencies/windows</outputDirectory>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>unix-bin</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/unix-bin.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <tarLongFileMode>gnu</tarLongFileMode>
+                            <appendAssemblyId>false</appendAssemblyId>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>unix-windows</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/windows-bin.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <appendAssemblyId>false</appendAssemblyId>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/unix-bin.xml b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/unix-bin.xml
new file mode 100644
index 0000000..bbfa38c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/unix-bin.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly>
+
+    <id>unix-bin</id>
+
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+
+    <fileSets>
+
+        <!-- Karaf runtime -->
+        <fileSet>
+            <directory>target/dependencies/unix/apache-karaf-${karaf.version}</directory>
+            <outputDirectory>/</outputDirectory>
+            <excludes>
+                <exclude>**/demos/**</exclude>
+                <exclude>bin/**</exclude>
+                <exclude>karaf-manual*.*</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Copy over bin/* separately to get the correct file mode -->
+        <fileSet>
+            <directory>target/dependencies/unix/apache-karaf-${karaf.version}</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>bin/admin</include>
+                <include>bin/karaf</include>
+                <include>bin/start</include>
+                <include>bin/stop</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+    </fileSets>
+
+    <files>
+
+        <file>
+            <source>${project.basedir}/target/dependencies/unix/apache-karaf-${karaf.version}/bin/karaf</source>
+            <outputDirectory>/bin</outputDirectory>
+            <destName>custom</destName>
+            <fileMode>0755</fileMode>
+            <lineEnding>unix</lineEnding>
+        </file>
+
+    </files>
+
+</assembly>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/windows-bin.xml b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/windows-bin.xml
new file mode 100644
index 0000000..7787816
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/windows-bin.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly>
+
+    <id>windows-bin</id>
+
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <fileSets>
+
+        <!-- Karaf runtime -->
+        <fileSet>
+            <directory>target/dependencies/windows/apache-karaf-${karaf.version}</directory>
+            <outputDirectory>/</outputDirectory>
+            <excludes>
+                <exclude>**/demos/**</exclude>
+                <exclude>bin/**</exclude>
+                <exclude>karaf-manual*.*</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Copy over bin/* separately to get the correct file mode -->
+        <fileSet>
+            <directory>target/dependencies/windows/apache-karaf-${karaf.version}</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>bin/admin.bat</include>
+                <include>bin/karaf.bat</include>
+                <include>bin/start.bat</include>
+                <include>bin/stop.bat</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+    </fileSets>
+
+    <files>
+
+        <file>
+            <source>${project.basedir}/target/dependencies/windows/apache-karaf-${karaf.version}/bin/karaf.bat</source>
+            <outputDirectory>/bin</outputDirectory>
+            <destName>custom.bat</destName>
+            <fileMode>0755</fileMode>
+            <lineEnding>unix</lineEnding>
+        </file>
+
+    </files>
+
+</assembly>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/filtered-resources/etc/my.bundle.cfg b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/filtered-resources/etc/my.bundle.cfg
new file mode 100644
index 0000000..9208185
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/filtered-resources/etc/my.bundle.cfg
@@ -0,0 +1,2 @@
+# Custom configuration file
+key = value
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/assembly/src/test/resources/projects/assembly/archetype.properties b/karaf-2.2.x/archetypes/assembly/src/test/resources/projects/assembly/archetype.properties
new file mode 100644
index 0000000..9d025b8
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/test/resources/projects/assembly/archetype.properties
@@ -0,0 +1,3 @@
+groupId=archetype.it
+artifactId=assembly
+version=1.0-SNAPSHOT
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/assembly/src/test/resources/projects/assembly/goal.txt b/karaf-2.2.x/archetypes/assembly/src/test/resources/projects/assembly/goal.txt
new file mode 100644
index 0000000..deea798
--- /dev/null
+++ b/karaf-2.2.x/archetypes/assembly/src/test/resources/projects/assembly/goal.txt
@@ -0,0 +1 @@
+clean install verify
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/NOTICE b/karaf-2.2.x/archetypes/blueprint/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/archetypes/blueprint/pom.xml b/karaf-2.2.x/archetypes/blueprint/pom.xml
new file mode 100644
index 0000000..0bf11f1
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>archetypes</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.archetypes</groupId>
+    <artifactId>karaf-blueprint-archetype</artifactId>
+    <packaging>maven-archetype</packaging>
+    <name>Apache Karaf :: Archetypes :: Blueprint Archetype</name>
+    <description>An archetype for creating a simple blueprint bundle.</description>
+
+    <properties>
+        <archetype.version>2.2</archetype.version>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>${archetype.version}</version>
+            </extension>
+        </extensions>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>^*^</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>${archetype.version}</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.2.x/archetypes/blueprint/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..636320e
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,42 @@
+<?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.
+-->
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+                      xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                      name="karaf-blueprint-archetype">
+
+    <requiredProperties>
+        <requiredProperty key="package"/>
+    </requiredProperties>
+
+    <fileSets>
+        <fileSet filtered="true" packaged="true" encoding="UTF-8">
+            <directory>src/main/java</directory>
+            <includes>
+                <include>**/*.java</include>
+            </includes>
+        </fileSet>
+        <fileSet filtered="true" encoding="UTF-8">
+            <directory>src/main/resources</directory>
+            <includes>
+                <include>**/*.xml</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+
+</archetype-descriptor>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/pom.xml b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..4616d78
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>${groupId}</groupId>
+    <artifactId>${artifactId}</artifactId>
+    <version>${version}</version>
+    <packaging>bundle</packaging>
+
+    <name>${artifactId} Blueprint Bundle</name>
+    <description>${artifactId} OSGi blueprint bundle project.</description>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>^felix.plugin.version^</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                    <Bundle-Version>${project.version}</Bundle-Version>
+                    <Export-Package>
+                        ${package}*;version=${project.version}
+                    </Export-Package>
+                    <Import-Package>
+                        *
+                    </Import-Package>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyService.java b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyService.java
new file mode 100644
index 0000000..a3c158e
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyService.java
@@ -0,0 +1,7 @@
+package ${package};
+
+public interface MyService {
+
+    public String echo(String message);
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyServiceImpl.java b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyServiceImpl.java
new file mode 100644
index 0000000..7065926
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyServiceImpl.java
@@ -0,0 +1,9 @@
+package ${package};
+
+public class MyServiceImpl implements MyService {
+
+    public String echo(String message) {
+        return "Echo processed: " + message;
+    }
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/my-service.xml b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/my-service.xml
new file mode 100644
index 0000000..c2b3f83
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/my-service.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <bean id="serviceBean" class="${package}.MyServiceImpl"/>
+
+    <service ref="serviceBean" interface="${package}.MyService"/>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/test/resources/projects/blueprint/archetype.properties b/karaf-2.2.x/archetypes/blueprint/src/test/resources/projects/blueprint/archetype.properties
new file mode 100644
index 0000000..ab76eb4
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/test/resources/projects/blueprint/archetype.properties
@@ -0,0 +1,4 @@
+groupId=archetype.it
+artifactId=blueprint
+version=1.0-SNAPSHOT
+package=org.apache.karaf.archetype.it
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/blueprint/src/test/resources/projects/blueprint/goal.txt b/karaf-2.2.x/archetypes/blueprint/src/test/resources/projects/blueprint/goal.txt
new file mode 100644
index 0000000..deea798
--- /dev/null
+++ b/karaf-2.2.x/archetypes/blueprint/src/test/resources/projects/blueprint/goal.txt
@@ -0,0 +1 @@
+clean install verify
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/bundle/NOTICE b/karaf-2.2.x/archetypes/bundle/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/archetypes/bundle/pom.xml b/karaf-2.2.x/archetypes/bundle/pom.xml
new file mode 100644
index 0000000..adb70f5
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>archetypes</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.archetypes</groupId>
+    <artifactId>karaf-bundle-archetype</artifactId>
+    <packaging>maven-archetype</packaging>
+    <name>Apache Karaf :: Archetypes :: Bundle Archetype</name>
+    <description>A simple bundle archetype.</description>
+
+    <properties>
+        <archetype.version>2.2</archetype.version>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>${archetype.version}</version>
+            </extension>
+        </extensions>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>^*^</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>${archetype.version}</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/bundle/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.2.x/archetypes/bundle/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..5cf9079
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,36 @@
+<?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.
+-->
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+                      xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                      name="karaf-bundle-archetype">
+
+    <requiredProperties>
+        <requiredProperty key="package"/>
+    </requiredProperties>
+
+    <fileSets>
+        <fileSet filtered="true" packaged="true" encoding="UTF-8">
+            <directory>src/main/java</directory>
+            <includes>
+                <include>**/*.java</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+
+</archetype-descriptor>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/bundle/src/main/resources/archetype-resources/pom.xml b/karaf-2.2.x/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..8c54430
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>${groupId}</groupId>
+    <artifactId>${artifactId}</artifactId>
+    <version>${version}</version>
+    <packaging>bundle</packaging>
+
+    <name>${artifactId} Bundle</name>
+    <description>${artifactId} OSGi bundle project.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>^osgi.version^</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>^felix.plugin.version^</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Bundle-Activator>${package}.Activator</Bundle-Activator>
+                        <Export-Package>
+                            ${package}*;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/Activator.java b/karaf-2.2.x/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/Activator.java
new file mode 100644
index 0000000..1324d6e
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/Activator.java
@@ -0,0 +1,16 @@
+package ${package};
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+    public void start(BundleContext context) {
+        System.out.println("Starting the bundle");
+    }
+
+    public void stop(BundleContext context) {
+        System.out.println("Stopping the bundle");
+    }
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/bundle/src/test/resources/projects/bundle/archetype.properties b/karaf-2.2.x/archetypes/bundle/src/test/resources/projects/bundle/archetype.properties
new file mode 100644
index 0000000..3589681
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/src/test/resources/projects/bundle/archetype.properties
@@ -0,0 +1,4 @@
+groupId=archetype.it
+artifactId=bundle
+version=1.0-SNAPSHOT
+package=org.apache.karaf.archetype.it
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/bundle/src/test/resources/projects/bundle/goal.txt b/karaf-2.2.x/archetypes/bundle/src/test/resources/projects/bundle/goal.txt
new file mode 100644
index 0000000..deea798
--- /dev/null
+++ b/karaf-2.2.x/archetypes/bundle/src/test/resources/projects/bundle/goal.txt
@@ -0,0 +1 @@
+clean install verify
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/command/NOTICE b/karaf-2.2.x/archetypes/command/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/archetypes/command/pom.xml b/karaf-2.2.x/archetypes/command/pom.xml
new file mode 100644
index 0000000..fda3d33
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>archetypes</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.archetypes</groupId>
+    <artifactId>karaf-command-archetype</artifactId>
+    <packaging>maven-archetype</packaging>
+    <name>Apache Karaf :: Archetypes :: Command Archetype</name>
+    <description>A Karaf command archetype.</description>
+
+    <properties>
+        <archetype.version>2.2</archetype.version>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>${archetype.version}</version>
+            </extension>
+        </extensions>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>^*^</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>${archetype.version}</version>
+                    <extensions>true</extensions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/archetypes/command/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.2.x/archetypes/command/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..c869b8a
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,53 @@
+<?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.
+-->
+<archetype-descriptor
+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+        name="karaf-command-archetype"
+        xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <requiredProperties>
+        <requiredProperty key="scope"/>
+        <requiredProperty key="command"/>
+        <requiredProperty key="description"/>
+        <requiredProperty key="package"/>
+    </requiredProperties>
+
+    <fileSets>
+        <fileSet filtered="true" packaged="true" encoding="UTF-8">
+            <directory>src/main/java</directory>
+            <includes>
+                <include>**/*.java</include>
+            </includes>
+        </fileSet>
+        <fileSet filtered="true" encoding="UTF-8">
+            <directory>src/main/resources</directory>
+            <includes>
+                <include>**/*.xml</include>
+                <include>**/*.properties</include>
+            </includes>
+        </fileSet>
+        <fileSet filtered="true" packaged="true" encoding="UTF-8">
+            <directory>src/test/java</directory>
+            <includes>
+                <include>**/*.java</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+
+</archetype-descriptor>
diff --git a/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/pom.xml b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..e6646a8
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>${groupId}</groupId>
+    <artifactId>${artifactId}</artifactId>
+    <packaging>bundle</packaging>
+    <version>${version}</version>
+    <name>Apache Karaf :: Shell ${scope} Commands</name>
+    <description>Provides the OSGi ${scope} commands</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+            <version>^project.version^</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>^osgi.version^</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <version>^osgi.version^</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <version>^junit.bundle.version^</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.3.2</version>
+                <inherited>true</inherited>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>^felix.plugin.version^</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>${package}*;version=${project.version}</Export-Package>
+                        <Import-Package>!${project.artifactId}*,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/main/java/__command__.java b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/main/java/__command__.java
new file mode 100644
index 0000000..6982495
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/main/java/__command__.java
@@ -0,0 +1,38 @@
+##---------------------------------------------------------------------------
+##  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.
+##---------------------------------------------------------------------------
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+#set( $cmd =  $command.toLowerCase())
+
+package ${package};
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+
+/**
+ * Displays the last log entries
+ */
+@Command(scope = "${scope}", name = "${cmd}", description = "${description}")
+public class ${command} extends OsgiCommandSupport {
+
+    protected Object doExecute() throws Exception {
+         System.out.println("Executing command ${cmd}");
+         return null;
+    }
+}
diff --git a/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-log.xml b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-log.xml
new file mode 100644
index 0000000..0c6fabf
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-log.xml
@@ -0,0 +1,16 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+#set( $cmd =  $command.toLowerCase())
+<?xml version="1.0" encoding="UTF-8"?>
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="${scope}/${cmd}">
+            <action class="${package}.${command}">
+            </action>
+        </command>
+    </command-bundle>
+</blueprint>
diff --git a/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/test/java/__command__Test.java b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/test/java/__command__Test.java
new file mode 100644
index 0000000..07844ac
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/main/resources/archetype-resources/src/test/java/__command__Test.java
@@ -0,0 +1,47 @@
+##---------------------------------------------------------------------------
+##  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.
+##---------------------------------------------------------------------------
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+
+package ${package};
+
+
+import junit.framework.TestCase;
+
+/**
+ * Test cases for {@link ${command}}
+ */
+@SuppressWarnings("unchecked")
+public class ${command}Test extends TestCase {
+    
+    private ${command} command;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+    
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+    
+	public void testCommand() {
+
+	}
+}
diff --git a/karaf-2.2.x/archetypes/command/src/test/resources/projects/command/archetype.properties b/karaf-2.2.x/archetypes/command/src/test/resources/projects/command/archetype.properties
new file mode 100644
index 0000000..b744b1b
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/test/resources/projects/command/archetype.properties
@@ -0,0 +1,23 @@
+##---------------------------------------------------------------------------
+##  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.
+##---------------------------------------------------------------------------
+version=0.1-SNAPSHOT
+groupId=archetype.it
+artifactId=cmd
+scope=test
+command=cmd
+description=Test Command
+package=org.apache.karaf.archetype.it
diff --git a/karaf-2.2.x/archetypes/command/src/test/resources/projects/command/goal.txt b/karaf-2.2.x/archetypes/command/src/test/resources/projects/command/goal.txt
new file mode 100644
index 0000000..deea798
--- /dev/null
+++ b/karaf-2.2.x/archetypes/command/src/test/resources/projects/command/goal.txt
@@ -0,0 +1 @@
+clean install verify
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/feature/NOTICE b/karaf-2.2.x/archetypes/feature/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/feature/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/archetypes/feature/pom.xml b/karaf-2.2.x/archetypes/feature/pom.xml
new file mode 100644
index 0000000..2dc5774
--- /dev/null
+++ b/karaf-2.2.x/archetypes/feature/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>archetypes</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.archetypes</groupId>
+    <artifactId>karaf-feature-archetype</artifactId>
+    <packaging>maven-archetype</packaging>
+    <name>Apache Karaf :: Archetypes :: Feature Archetype</name>
+    <description>This archetype sets up an empty karaf features project.</description>
+
+    <properties>
+        <archetype.version>2.2</archetype.version>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>${archetype.version}</version>
+            </extension>
+        </extensions>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>^*^</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>${archetype.version}</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/archetypes/feature/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.2.x/archetypes/feature/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..cc2ab74
--- /dev/null
+++ b/karaf-2.2.x/archetypes/feature/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,23 @@
+<?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.
+-->
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+                      xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                      name="karaf-feature-archetype">
+
+</archetype-descriptor>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/feature/src/main/resources/archetype-resources/pom.xml b/karaf-2.2.x/archetypes/feature/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..0e2348e
--- /dev/null
+++ b/karaf-2.2.x/archetypes/feature/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>${groupId}</groupId>
+    <artifactId>${artifactId}</artifactId>
+    <version>${version}</version>
+    <packaging>pom</packaging>
+    <name>${artifactId} feature</name>
+    <description>Create a feature with the defined dependencies set.</description>
+
+    <dependencies>
+        <!-- Put here the artifacts which should be included in the feature -->
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>features-maven-plugin</artifactId>
+                <version>^project.version^</version>
+                <executions>
+                    <execution>
+                        <id>generate-features-file</id>
+                        <goals>
+                            <goal>generate-features-file</goal>
+                        </goals>
+                        <configuration>
+                            <karafVersion>^project.version^</karafVersion>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/feature/src/test/resources/projects/feature/archetype.properties b/karaf-2.2.x/archetypes/feature/src/test/resources/projects/feature/archetype.properties
new file mode 100644
index 0000000..8ad58ad
--- /dev/null
+++ b/karaf-2.2.x/archetypes/feature/src/test/resources/projects/feature/archetype.properties
@@ -0,0 +1,3 @@
+groupId=archetype.it
+artifactId=feature
+version=1.0-SNAPSHOT
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/feature/src/test/resources/projects/feature/goal.txt b/karaf-2.2.x/archetypes/feature/src/test/resources/projects/feature/goal.txt
new file mode 100644
index 0000000..deea798
--- /dev/null
+++ b/karaf-2.2.x/archetypes/feature/src/test/resources/projects/feature/goal.txt
@@ -0,0 +1 @@
+clean install verify
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/kar/NOTICE b/karaf-2.2.x/archetypes/kar/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/archetypes/kar/pom.xml b/karaf-2.2.x/archetypes/kar/pom.xml
new file mode 100644
index 0000000..3920657
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>archetypes</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.archetypes</groupId>
+    <artifactId>karaf-kar-archetype</artifactId>
+    <packaging>maven-archetype</packaging>
+    <name>Apache Karaf :: Archetypes :: Kar Archetype</name>
+    <description>This archetype creates a KAR file from a provided features XML.</description>
+
+    <properties>
+        <archetype.version>2.2</archetype.version>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <extensions>
+            <extension>
+                <groupId>org.apache.maven.archetype</groupId>
+                <artifactId>archetype-packaging</artifactId>
+                <version>${archetype.version}</version>
+            </extension>
+        </extensions>
+
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <delimiters>
+                        <delimiter>^*^</delimiter>
+                    </delimiters>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-archetype-plugin</artifactId>
+            </plugin>
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-archetype-plugin</artifactId>
+                    <version>${archetype.version}</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/archetypes/kar/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.2.x/archetypes/kar/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644
index 0000000..8784fe9
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/src/main/resources/META-INF/maven/archetype-metadata.xml
@@ -0,0 +1,32 @@
+<?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.
+-->
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+                      xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                      name="karaf-kar-archetype">
+
+    <fileSets>
+        <fileSet filtered="true" encoding="UTF-8">
+            <directory>src/main/feature</directory>
+            <includes>
+                <include>feature.xml</include>
+            </includes>
+        </fileSet>
+    </fileSets>
+
+</archetype-descriptor>
diff --git a/karaf-2.2.x/archetypes/kar/src/main/resources/archetype-resources/pom.xml b/karaf-2.2.x/archetypes/kar/src/main/resources/archetype-resources/pom.xml
new file mode 100644
index 0000000..a375429
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/src/main/resources/archetype-resources/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>${groupId}</groupId>
+    <artifactId>${artifactId}</artifactId>
+    <version>${version}</version>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>features-maven-plugin</artifactId>
+                <version>^project.version^</version>
+                <executions>
+                    <execution>
+                        <id>create-kar</id>
+                        <goals>
+                            <goal>create-kar</goal>
+                        </goals>
+                        <configuration>
+                            <featuresFile>${project.basedir}/src/main/feature/feature.xml</featuresFile>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/kar/src/main/resources/archetype-resources/src/main/feature/feature.xml b/karaf-2.2.x/archetypes/kar/src/main/resources/archetype-resources/src/main/feature/feature.xml
new file mode 100644
index 0000000..fcdfa66
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/src/main/resources/archetype-resources/src/main/feature/feature.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<features name="${project.artifactId}-${project.version}">
+    <feature name="${project.artifactId}" description="${project.name}" version="${project.version}" resolver="(obr)">
+        <details>${project.description}</details>
+        <!-- Put here the bundles and configuration files -->
+        <!-- <bundle>mvn:commons-lang/commons-lang/2.6</bundle> -->
+    </feature>
+</features>
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/kar/src/test/resources/projects/kar/archetype.properties b/karaf-2.2.x/archetypes/kar/src/test/resources/projects/kar/archetype.properties
new file mode 100644
index 0000000..b78bcb8
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/src/test/resources/projects/kar/archetype.properties
@@ -0,0 +1,3 @@
+groupId=archetype.it
+artifactId=kar
+version=1.0-SNAPSHOT
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/kar/src/test/resources/projects/kar/goal.txt b/karaf-2.2.x/archetypes/kar/src/test/resources/projects/kar/goal.txt
new file mode 100644
index 0000000..deea798
--- /dev/null
+++ b/karaf-2.2.x/archetypes/kar/src/test/resources/projects/kar/goal.txt
@@ -0,0 +1 @@
+clean install verify
\ No newline at end of file
diff --git a/karaf-2.2.x/archetypes/pom.xml b/karaf-2.2.x/archetypes/pom.xml
new file mode 100644
index 0000000..b93ca23
--- /dev/null
+++ b/karaf-2.2.x/archetypes/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+        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.
+    -->
+    
+    <modelVersion>4.0.0</modelVersion>
+    
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>archetypes</artifactId>
+
+    <name>Apache Karaf :: Archetypes</name>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>assembly</module>
+        <module>blueprint</module>
+        <module>bundle</module>
+        <module>command</module>
+        <module>feature</module>
+        <module>kar</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/.gitignore b/karaf-2.2.x/assemblies/apache-karaf/.gitignore
new file mode 100644
index 0000000..38afe6e
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/.gitignore
@@ -0,0 +1 @@
+!bin
diff --git a/karaf-2.2.x/assemblies/apache-karaf/pom.xml b/karaf-2.2.x/assemblies/apache-karaf/pom.xml
new file mode 100644
index 0000000..a0d0974
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/pom.xml
@@ -0,0 +1,710 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+	    <groupId>org.apache.karaf.assemblies</groupId>
+	    <artifactId>assemblies</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf</groupId>
+    <artifactId>apache-karaf</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Assembly</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+         <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.main</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.exception</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.spring</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.blueprint</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.features</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.kar</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.wrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.command</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.management</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.obr</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.command</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.management</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.command</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.management</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.obr</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.osgi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.log</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.packages</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.commands</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.ssh</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.dev</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.boot</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.modules</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.command</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.management</groupId>
+            <artifactId>org.apache.karaf.management.server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.management.mbeans</groupId>
+            <artifactId>org.apache.karaf.management.mbeans.config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.admin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.branding</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.features</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.gogo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-extender</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-io</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-annotation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.mina</groupId>
+            <artifactId>mina-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.configadmin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.eventadmin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.metatype</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-service</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-mvn</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-wrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sshd</groupId>
+            <artifactId>sshd-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse</groupId>
+            <artifactId>osgi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.framework</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.blueprint</groupId>
+            <artifactId>org.apache.aries.blueprint</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.proxy</groupId>
+            <artifactId>org.apache.aries.proxy</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries</groupId>
+            <artifactId>org.apache.aries.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.jmx</groupId>
+            <artifactId>org.apache.aries.jmx.api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.jmx</groupId>
+            <artifactId>org.apache.aries.jmx.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.jmx</groupId>
+            <artifactId>org.apache.aries.jmx.blueprint</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-servlet_2.5_spec</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-io</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-continuation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-security</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-xml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.asm</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-api</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-spi</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-runtime</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-jetty</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-jsp</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-extender-war</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-extender-whiteboard</artifactId>
+            <optional>true</optional>
+        </dependency>
+         <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-deployer</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/filtered-resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources/extra</directory>
+                <filtering>false</filtering>
+                <excludes>
+                    <exclude>**/*</exclude>
+                </excludes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <useDefaultDelimiters>false</useDefaultDelimiters>
+                    <delimiters>
+                        <delimiter>${*}</delimiter>
+                    </delimiters>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>filter</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>resources</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>org.apache.karaf.main</artifactId>
+                                    <outputDirectory>target/dependencies/lib</outputDirectory>
+                                    <destFileName>karaf.jar</destFileName>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>org.apache.karaf.client</artifactId>
+                                    <outputDirectory>target/dependencies/lib/bin</outputDirectory>
+                                    <destFileName>karaf-client.jar</destFileName>
+                                </artifactItem>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf.jaas</groupId>
+                                    <artifactId>org.apache.karaf.jaas.boot</artifactId>
+                                    <outputDirectory>target/dependencies/lib</outputDirectory>
+                                    <destFileName>karaf-jaas-boot.jar</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-artifacts</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>attach-artifact</goal>
+                        </goals>
+                        <configuration>
+                            <artifacts>
+                                <artifact>
+                                  <file>src/main/resources/extra/jetty.xml</file>
+                                  <type>xml</type>
+                                  <classifier>jettyconfig</classifier>
+                                </artifact>
+                            </artifacts>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>none</phase>
+                    </execution>
+                    <execution>
+                        <id>unix-minimal-bin</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/unix-minimal-bin.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <tarLongFileMode>gnu</tarLongFileMode>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>unix-bin</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/unix-bin.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <appendAssemblyId>false</appendAssemblyId>
+                            <tarLongFileMode>gnu</tarLongFileMode>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>windows-minimal-bin</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/windows-minimal-bin.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <appendAssemblyId>true</appendAssemblyId>
+                            <assemblyId />
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>windows-bin</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/windows-bin.xml</descriptor>
+                            </descriptors>
+                            <finalName>${project.artifactId}-${project.version}</finalName>
+                            <appendAssemblyId>false</appendAssemblyId>
+                            <duplicateBehaviour>skip</duplicateBehaviour>
+                            <assemblyId />
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>unix-src</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/unix-src.xml</descriptor>
+                            </descriptors>
+                            <tarLongFileMode>gnu</tarLongFileMode>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>windows-src</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/descriptors/windows-src.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>features-maven-plugin</artifactId>
+                <version>${project.version}</version>
+                <executions>
+                    <execution>
+                        <id>add-features-to-repo</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>add-features-to-repo</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                              <descriptor>mvn:org.apache.karaf.assemblies.features/standard/${project.version}/xml/features</descriptor>
+                              <descriptor>mvn:org.apache.karaf.assemblies.features/enterprise/${project.version}/xml/features</descriptor>
+                            </descriptors>
+                            <features>
+                                <feature>config</feature>
+                                <feature>ssh</feature>
+                                <feature>management</feature>
+				<feature>wrapper</feature>
+                            </features>
+                            <includeMvnBasedDescriptors>true</includeMvnBasedDescriptors>
+                            <repository>target/features-repo</repository>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>manual</id>
+
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.karaf</groupId>
+                    <artifactId>manual</artifactId>
+                    <type>pdf</type>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.karaf</groupId>
+                    <artifactId>manual</artifactId>
+                    <type>html</type>
+                </dependency>
+            </dependencies>
+
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>copy-manual</id>
+                                <phase>generate-resources</phase>
+                                <goals>
+                                    <goal>copy</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>org.apache.karaf</groupId>
+                                            <artifactId>manual</artifactId>
+                                            <type>pdf</type>
+                                            <outputDirectory>target/dependencies</outputDirectory>
+                                            <destFileName>karaf-manual-${project.version}.pdf</destFileName>
+                                        </artifactItem>
+                                        <artifactItem>
+                                            <groupId>org.apache.karaf</groupId>
+                                            <artifactId>manual</artifactId>
+                                            <type>html</type>
+                                            <outputDirectory>target/dependencies</outputDirectory>
+                                            <destFileName>karaf-manual-${project.version}.html</destFileName>
+                                        </artifactItem>
+                                    </artifactItems>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+
+        <profile>
+            <id>assembly-src</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>unix-src</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>attached</goal>
+                                </goals>
+                                <configuration>
+                                    <descriptors>
+                                        <descriptor>src/main/descriptors/unix-src.xml</descriptor>
+                                    </descriptors>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>windows-src</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>attached</goal>
+                                </goals>
+                                <configuration>
+                                    <descriptors>
+                                        <descriptor>src/main/descriptors/windows-src.xml</descriptor>
+                                    </descriptors>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-bin.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-bin.xml
new file mode 100644
index 0000000..7dd6395
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-bin.xml
@@ -0,0 +1,301 @@
+<?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.
+-->
+<assembly>
+    <id>standard</id>
+    <!-- intentionally left blank -> http://jira.codehaus.org/browse/MASSEMBLY-301 -->
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <fileSets>
+
+        <!-- Copy license and other files from root -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>README</include>
+                <include>RELEASE*</include>
+                <include>LICENSE</include>
+                <include>NOTICE</include>
+            </includes>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+
+        <!-- Copy over everything that needs to get unix line endings -->
+        <fileSet>
+            <directory>src/main/distribution/text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/distribution/unix-text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/bin</directory>
+            <outputDirectory>/bin/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0755</fileMode>
+            <includes>
+                <include>admin</include>
+                <include>shell</include>
+                <include>client</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/etc</directory>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <!-- Copy over the examples -->
+        <fileSet>
+            <directory>target/classes/demos</directory>
+            <outputDirectory>/demos/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>../../demos</directory>
+            <outputDirectory>/demos/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <excludes>
+                <exclude>**/target/**</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Copy over files that should not get the line endings converted -->
+        <fileSet>
+            <directory>src/main/distribution/binary</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <!-- Copy over the files that should not get the line endings converted but need to be chmod to 755 -->
+        <fileSet>
+            <directory>src/main/distribution/unix-binary</directory>
+            <outputDirectory>/</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+        <!-- Copy over the files that need unix line endings and also chmod to 755 -->
+        <fileSet>
+            <directory>src/main/distribution/unix-shell</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+        <!-- Copy over jar files -->
+        <fileSet>
+            <directory>target/dependencies</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>target/features-repo</directory>
+            <outputDirectory>system</outputDirectory>
+        </fileSet>
+    </fileSets>
+
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>/lib/endorsed</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <includes>
+                <include>org.apache.karaf:org.apache.karaf.exception</include>
+            </includes>
+        </dependencySet>
+
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/felix/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.felix:org.apache.felix.configadmin</include>
+                <include>org.apache.felix:org.apache.felix.framework</include>
+                <include>org.apache.felix:org.apache.felix.fileinstall</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/logging/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.logging:pax-logging-api</include>
+                <include>org.ops4j.pax.logging:pax-logging-service</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/url/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.url:pax-url-mvn</include>
+                <include>org.ops4j.pax.url:pax-url-wrap</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/features/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.features:org.apache.karaf.features.core</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.command</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/diagnostic/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.core</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.common</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.command</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/admin/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.admin:org.apache.karaf.admin.core</include>
+                <include>org.apache.karaf.admin:org.apache.karaf.admin.command</include>
+                <include>org.apache.karaf.admin:org.apache.karaf.admin.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/deployer/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.spring</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.blueprint</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.features</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.kar</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.wrap</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.console</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.dev</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.osgi</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.log</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.packages</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.commands</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/jaas/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.config</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.modules</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.command</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/eclipse/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.eclipse:osgi</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/blueprint/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.blueprint:org.apache.aries.blueprint</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/proxy/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.proxy:org.apache.aries.proxy</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries:org.apache.aries.util</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/servicemix/bundles/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.servicemix.bundles:org.apache.servicemix.bundles.asm</include>
+            </includes>
+        </dependencySet>
+    </dependencySets>
+
+</assembly>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-minimal-bin.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-minimal-bin.xml
new file mode 100644
index 0000000..f5138a9
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-minimal-bin.xml
@@ -0,0 +1,299 @@
+<?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.
+-->
+<assembly>
+    <id>minimal</id>
+    <!-- Used as artifact discriminator -->
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <fileSets>
+
+        <!-- Copy license and other files from root -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>README</include>
+                <include>RELEASE*</include>
+                <include>LICENSE</include>
+                <include>NOTICE</include>
+            </includes>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+
+        <!-- Copy over everything that needs to get unix line endings -->
+        <fileSet>
+            <directory>src/main/distribution/text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/distribution/unix-text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/bin</directory>
+            <outputDirectory>/bin/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0755</fileMode>
+            <includes>
+                <include>admin</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/etc</directory>
+            <excludes>
+                <exclude>org.apache.karaf.features.cfg</exclude>
+                <exclude>startup.properties</exclude>
+            </excludes>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+
+        <fileSet>
+            <directory>target/classes/minimal</directory>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+
+        <!-- Copy over files that should not get the line endings converted -->
+        <fileSet>
+            <directory>src/main/distribution/binary</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <!-- Copy over the files that should not get the line endings converted but need to be chmod to 755 -->
+        <fileSet>
+            <directory>src/main/distribution/unix-binary</directory>
+            <outputDirectory>/</outputDirectory>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+        <!-- Copy over the files that need unix line endings and also chmod to 755 -->
+        <fileSet>
+            <directory>src/main/distribution/unix-shell</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+        <!-- Copy over jar files -->
+        <fileSet>
+            <directory>target/dependencies</directory>
+            <excludes>
+                <exclude>*.html</exclude>
+                <exclude>*.pdf</exclude>
+            </excludes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>target/features-repo</directory>
+            <includes>
+            	<include>**/*.xml</include>
+            </includes>
+            <outputDirectory>system</outputDirectory>
+        </fileSet>
+
+    </fileSets>
+
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>/lib/endorsed</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <includes>
+                <include>org.apache.karaf:org.apache.karaf.exception</include>
+            </includes>
+        </dependencySet>
+
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/felix/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.felix:org.apache.felix.configadmin</include>
+                <include>org.apache.felix:org.apache.felix.framework</include>
+                <include>org.apache.felix:org.apache.felix.fileinstall</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/logging/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.logging:pax-logging-api</include>
+                <include>org.ops4j.pax.logging:pax-logging-service</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/url/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.url:pax-url-mvn</include>
+                <include>org.ops4j.pax.url:pax-url-wrap</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/management/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.management:org.apache.karaf.management.server</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/features/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.features:org.apache.karaf.features.core</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.command</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.console</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.dev</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.osgi</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.log</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.config</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.packages</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.commands</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/diagnostic/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.core</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.common</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.command</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/jaas/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.config</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.modules</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.command</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/eclipse/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.eclipse:osgi</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/blueprint/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.blueprint:org.apache.aries.blueprint</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/proxy/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.proxy:org.apache.aries.proxy</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries:org.apache.aries.util</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/servicemix/bundles/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.servicemix.bundles:org.apache.servicemix.bundles.asm</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/jmx/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.jmx:org.apache.aries.jmx.api</include>
+                <include>org.apache.aries.jmx:org.apache.aries.jmx.core</include>
+                <include>org.apache.aries.jmx:org.apache.aries.jmx.blueprint</include>
+            </includes>
+        </dependencySet>
+    </dependencySets>
+</assembly>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-src.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-src.xml
new file mode 100644
index 0000000..a2cf64d
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/unix-src.xml
@@ -0,0 +1,111 @@
+<?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.
+-->
+<assembly>
+    <id>src</id>
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+    <fileSets>
+        <!-- Copy license and other files from root -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>BUILDING</include>
+                <include>README</include>
+                <include>NOTICE</include>
+                <include>LICENSE</include>
+                <include>RELEASE*</include>
+            </includes>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+
+        <!-- Binary Files -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>src</outputDirectory>
+            <includes>
+                <include>**/*.jpeg</include>
+                <include>**/*.jpg</include>
+                <include>**/*.gif</include>
+                <include>**/*.png</include>
+                <include>**/*.exe</include>
+                <include>**/*.dll</include>
+                <include>**/*.jar</include>
+                <include>**/*.so</include>
+                <include>**/*.ks</include>
+                <include>**/*.ts</include>
+                <include>**/*.keystore</include>
+                <include>**/*.bin</include>
+                <include>**/*.jnilib</include>
+                <include>**/*.cert</include>
+                <include>**/*.kar</include>
+                <include>**/*.zip</include>
+                <include>apache-karaf/src/main/release/bin/*/wrapper</include>
+            </includes>
+            <excludes>
+                <exclude>**/eclipse-classes/**</exclude>
+                <exclude>**/target/**</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Text Files -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>src</outputDirectory>
+            <includes>
+                <include>**/*</include>
+            </includes>
+            <excludes>
+                <exclude>**/*.jpeg</exclude>
+                <exclude>**/*.jpg</exclude>
+                <exclude>**/*.gif</exclude>
+                <exclude>**/*.png</exclude>
+                <exclude>**/*.exe</exclude>
+                <exclude>**/*.dll</exclude>
+                <exclude>**/*.jar</exclude>
+                <exclude>**/*.so</exclude>
+                <exclude>**/*.ks</exclude>
+                <exclude>**/*.ts</exclude>
+                <exclude>**/*.keystore</exclude>
+                <exclude>**/*.bin</exclude>
+                <exclude>**/*.jnilib</exclude>
+                <exclude>**/*.cert</exclude>
+                <exclude>apache-karaf/src/main/release/bin/*/wrapper</exclude>
+                <exclude>**/target/**</exclude>
+                <exclude>**/build/**</exclude>
+                <exclude>activemq-data/**</exclude>
+                <exclude>*/activemq-data/**</exclude>
+                <exclude>**/eclipse-classes/**</exclude>
+                <exclude>**/.*</exclude>
+                <exclude>**/.*/**</exclude>
+
+                <exclude>**/surefire*</exclude>
+                <exclude>**/svn-commit*</exclude>
+
+                <exclude>**/*.iml</exclude>
+                <exclude>**/*.ipr</exclude>
+                <exclude>**/*.iws</exclude>
+
+                <exclude>**/cobertura.ser</exclude>
+
+            </excludes>
+            <lineEnding>unix</lineEnding>
+        </fileSet>
+    </fileSets>
+</assembly>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-bin.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-bin.xml
new file mode 100644
index 0000000..ee31a1e
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-bin.xml
@@ -0,0 +1,291 @@
+<?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.
+-->
+<assembly>
+    <id>standard</id>
+    <!-- intentionally left blank -> http://jira.codehaus.org/browse/MASSEMBLY-301 -->
+    <formats>
+        <format>zip</format>
+    </formats>
+    <fileSets>
+        <!-- Copy license and other files from root -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>README</include>
+                <include>RELEASE*</include>
+                <include>LICENSE</include>
+                <include>NOTICE</include>
+            </includes>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+
+        <!-- Copy over everything that needs to get dos line endings -->
+        <fileSet>
+            <directory>src/main/distribution/text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/distribution/windows-text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/bin</directory>
+            <outputDirectory>/bin/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+            <includes>
+                <include>admin.bat</include>
+                <include>shell.bat</include>
+                <include>client.bat</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/etc</directory>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+        <!-- Copy over the examples -->
+        <fileSet>
+            <directory>target/classes/demos</directory>
+            <outputDirectory>/demos/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+
+        <fileSet>
+            <directory>../../demos</directory>
+            <outputDirectory>/demos/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+            <excludes>
+                <exclude>**/target/**</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Copy over files that should not get the line endings converted -->
+        <fileSet>
+            <directory>src/main/distribution/binary</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <!-- Copy over the files that should not get the line endings converted but need to be chmod to 755 -->
+        <fileSet>
+            <directory>src/main/distribution/windows-binary</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <!-- Copy over jar files -->
+        <fileSet>
+            <directory>target/dependencies</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>target/features-repo</directory>
+            <outputDirectory>system</outputDirectory>
+        </fileSet>
+    </fileSets>
+
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>/lib/endorsed</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <includes>
+                <include>org.apache.karaf:org.apache.karaf.exception</include>
+            </includes>
+        </dependencySet>
+
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/felix/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.felix:org.apache.felix.configadmin</include>
+                <include>org.apache.felix:org.apache.felix.framework</include>
+                <include>org.apache.felix:org.apache.felix.fileinstall</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/logging/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.logging:pax-logging-api</include>
+                <include>org.ops4j.pax.logging:pax-logging-service</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/url/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.url:pax-url-mvn</include>
+                <include>org.ops4j.pax.url:pax-url-wrap</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/features/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.features:org.apache.karaf.features.core</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.command</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/diagnostic/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.core</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.common</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.command</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/admin/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.admin:org.apache.karaf.admin.core</include>
+                <include>org.apache.karaf.admin:org.apache.karaf.admin.command</include>
+                <include>org.apache.karaf.admin:org.apache.karaf.admin.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/deployer/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.spring</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.blueprint</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.features</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.kar</include>
+                <include>org.apache.karaf.deployer:org.apache.karaf.deployer.wrap</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.console</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.dev</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.osgi</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.log</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.packages</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.commands</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/jaas/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.config</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.modules</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.command</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/eclipse/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.eclipse:osgi</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/blueprint/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.blueprint:org.apache.aries.blueprint</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/proxy/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.proxy:org.apache.aries.proxy</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries:org.apache.aries.util</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/servicemix/bundles/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.servicemix.bundles:org.apache.servicemix.bundles.asm</include>
+            </includes>
+        </dependencySet>
+    </dependencySets>
+
+</assembly>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-minimal-bin.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-minimal-bin.xml
new file mode 100644
index 0000000..7afc30d
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-minimal-bin.xml
@@ -0,0 +1,291 @@
+<?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.
+-->
+<assembly>
+    <id>minimal</id>
+    <!-- Used as artifact discriminator -->
+    <formats>
+        <format>zip</format>
+    </formats>
+    <fileSets>
+
+        <!-- Copy license and other files from root -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>README</include>
+                <include>RELEASE*</include>
+                <include>LICENSE</include>
+                <include>NOTICE</include>
+            </includes>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+
+        <!-- Copy over everything that needs to get dos line endings -->
+        <fileSet>
+            <directory>src/main/distribution/text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>src/main/distribution/windows-text</directory>
+            <outputDirectory>/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/bin</directory>
+            <outputDirectory>/bin/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+            <includes>
+                <include>admin.bat</include>
+            </includes>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/etc</directory>
+            <excludes>
+                <exclude>org.apache.karaf.features.cfg</exclude>
+                <exclude>startup.properties</exclude>
+            </excludes>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/minimal</directory>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+
+        <!-- Copy over files that should not get the line endings converted -->
+        <fileSet>
+            <directory>src/main/distribution/binary</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <!-- Copy over the files that should not get the line endings converted but need to be chmod to 755 -->
+        <fileSet>
+            <directory>src/main/distribution/windows-binary</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <!-- Copy over jar files -->
+        <fileSet>
+            <directory>target/dependencies</directory>
+            <excludes>
+                <exclude>*.html</exclude>
+                <exclude>*.pdf</exclude>
+            </excludes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>target/features-repo</directory>
+            <includes>
+            	<include>**/*.xml</include>
+            </includes>
+            <outputDirectory>system</outputDirectory>
+        </fileSet>
+
+    </fileSets>
+
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>/lib/endorsed</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <includes>
+                <include>org.apache.karaf:org.apache.karaf.exception</include>
+            </includes>
+        </dependencySet>
+
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/felix/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.felix:org.apache.felix.configadmin</include>
+                <include>org.apache.felix:org.apache.felix.framework</include>
+                <include>org.apache.felix:org.apache.felix.fileinstall</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/logging/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.logging:pax-logging-api</include>
+                <include>org.ops4j.pax.logging:pax-logging-service</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/ops4j/pax/url/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.ops4j.pax.url:pax-url-mvn</include>
+                <include>org.ops4j.pax.url:pax-url-wrap</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/management/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.management:org.apache.karaf.management.server</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/features/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.features:org.apache.karaf.features.core</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.command</include>
+                <include>org.apache.karaf.features:org.apache.karaf.features.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/diagnostic/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.core</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.common</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.command</include>
+                <include>org.apache.karaf.diagnostic:org.apache.karaf.diagnostic.management</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/shell/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.console</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.dev</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.osgi</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.log</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.config</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.packages</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.ssh</include>
+                <include>org.apache.karaf.shell:org.apache.karaf.shell.commands</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/karaf/jaas/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.config</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.modules</include>
+                <include>org.apache.karaf.jaas:org.apache.karaf.jaas.command</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/eclipse/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.eclipse:osgi</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/blueprint/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.blueprint:org.apache.aries.blueprint</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/proxy/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.proxy:org.apache.aries.proxy</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries:org.apache.aries.util</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/servicemix/bundles/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.servicemix.bundles:org.apache.servicemix.bundles.asm</include>
+            </includes>
+        </dependencySet>
+        <dependencySet>
+            <outputDirectory>/system</outputDirectory>
+            <unpack>false</unpack>
+            <useProjectArtifact>false</useProjectArtifact>
+            <outputFileNameMapping>
+                org/apache/aries/jmx/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
+            </outputFileNameMapping>
+            <includes>
+                <include>org.apache.aries.jmx:org.apache.aries.jmx.api</include>
+                <include>org.apache.aries.jmx:org.apache.aries.jmx.core</include>
+                <include>org.apache.aries.jmx:org.apache.aries.jmx.blueprint</include>
+            </includes>
+        </dependencySet>
+
+    </dependencySets>
+
+</assembly>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-src.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-src.xml
new file mode 100644
index 0000000..b032f5d
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/descriptors/windows-src.xml
@@ -0,0 +1,114 @@
+<?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.
+-->
+<assembly>
+    <id>src</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+
+    <fileSets>
+        <!-- Copy license and other files from root -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>BUILDING</include>
+                <include>README</include>
+                <include>NOTICE</include>
+                <include>LICENSE</include>
+                <include>RELEASE*</include>
+            </includes>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+
+        <!-- Binary Files -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>src</outputDirectory>
+            <includes>
+                <include>**/*.jpeg</include>
+                <include>**/*.jpg</include>
+                <include>**/*.gif</include>
+                <include>**/*.png</include>
+                <include>**/*.exe</include>
+                <include>**/*.dll</include>
+                <include>**/*.jar</include>
+                <include>**/*.so</include>
+                <include>**/*.ks</include>
+                <include>**/*.ts</include>
+                <include>**/*.keystore</include>
+                <include>**/*.bin</include>
+                <include>**/*.jnilib</include>
+                <include>**/*.cert</include>
+                <include>**/*.kar</include>
+                <include>**/*.zip</include>
+                <include>apache-karaf/src/main/release/bin/*/wrapper</include>
+            </includes>
+            <excludes>
+                <exclude>**/eclipse-classes/**</exclude>
+                <exclude>**/target/**</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Text Files -->
+        <fileSet>
+            <directory>../..</directory>
+            <outputDirectory>src</outputDirectory>
+            <includes>
+                <include>**/*</include>
+            </includes>
+            <excludes>
+                <exclude>**/*.jpeg</exclude>
+                <exclude>**/*.jpg</exclude>
+                <exclude>**/*.gif</exclude>
+                <exclude>**/*.png</exclude>
+                <exclude>**/*.exe</exclude>
+                <exclude>**/*.dll</exclude>
+                <exclude>**/*.jar</exclude>
+                <exclude>**/*.so</exclude>
+                <exclude>**/*.ks</exclude>
+                <exclude>**/*.ts</exclude>
+                <exclude>**/*.keystore</exclude>
+                <exclude>**/*.bin</exclude>
+                <exclude>**/*.jnilib</exclude>
+                <exclude>**/*.cert</exclude>
+                <exclude>apache-karaf/src/main/release/bin/*/wrapper</exclude>
+
+                <exclude>**/target/**</exclude>
+                <exclude>**/build/**</exclude>
+                <exclude>activemq-data/**</exclude>
+                <exclude>*/activemq-data/**</exclude>
+                <exclude>**/eclipse-classes/**</exclude>
+                <exclude>**/.*</exclude>
+                <exclude>**/.*/**</exclude>
+
+                <exclude>**/surefire*</exclude>
+                <exclude>**/svn-commit*</exclude>
+
+                <exclude>**/*.iml</exclude>
+                <exclude>**/*.ipr</exclude>
+                <exclude>**/*.iws</exclude>
+
+                <exclude>**/cobertura.ser</exclude>
+
+            </excludes>
+            <lineEnding>dos</lineEnding>
+        </fileSet>
+    </fileSets>
+
+</assembly>
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/data/tmp/README b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/data/tmp/README
new file mode 100644
index 0000000..47d6dda
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/data/tmp/README
@@ -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.
+ */
+
+This folder is used for any temporary file
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/deploy/README b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/deploy/README
new file mode 100644
index 0000000..5904fe9
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/deploy/README
@@ -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.
+ */
+
+This folder can be used to deploy artifacts into the OSGi framework.
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/java.util.logging.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/java.util.logging.properties
new file mode 100644
index 0000000..b7b50c5
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/java.util.logging.properties
@@ -0,0 +1,23 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+# Empty java.util.logging.properties to prevent the log to stderr, so that
+# all logs will be delegated to pax logging JUL handler only
+
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg
new file mode 100644
index 0000000..5262eb3
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg
@@ -0,0 +1,22 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+felix.fileinstall.dir     = ${karaf.base}/deploy
+felix.fileinstall.tmpdir  = ${karaf.data}/generated-bundles
+felix.fileinstall.poll    = 1000
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.features.obr.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.features.obr.cfg
new file mode 100644
index 0000000..3e9a1f3
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.features.obr.cfg
@@ -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.
+#
+################################################################################
+
+#
+# This configuration file is used to configure the default values for features OBR resolver
+#
+
+#
+# Defines whether or not the features OBR resolver has to resolve optional imports as well.  The default value is
+# false (do not attempt to resolve optional imports).
+#
+resolveOptionalImports = false
\ No newline at end of file
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.jaas.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.jaas.cfg
new file mode 100644
index 0000000..19f3fa0
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.jaas.cfg
@@ -0,0 +1,61 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# Boolean enabling / disabling encrypted passwords
+#
+encryption.enabled = false
+
+#
+# Encryption Service name
+#   the default one is 'basic'
+#   a more powerful one named 'jasypt' is available
+#       when installing the encryption feature
+#
+encryption.name =
+
+#
+# Encryption prefix
+#
+encryption.prefix = {CRYPT}
+
+#
+# Encryption suffix
+#
+encryption.suffix = {CRYPT}
+
+#
+# Set the encryption algorithm to use in Karaf JAAS login module
+# Supported encryption algorithms follow:
+#   MD2
+#   MD5
+#   SHA-1
+#   SHA-256
+#   SHA-384
+#   SHA-512
+#
+encryption.algorithm = MD5
+
+#
+# Encoding of the encrypted password.
+# Can be:
+#   hexadecimal
+#   base64
+#
+encryption.encoding = hexadecimal
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.log.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.log.cfg
new file mode 100644
index 0000000..340f572
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.log.cfg
@@ -0,0 +1,36 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# This configuration file is used to configure the default values for the log:display
+# and log:display-exception commands.
+#
+
+#
+# The number of log statements to be displayed using log:display. It also defines the number
+# of lines searched for exceptions using log:display exception. You can override this value
+# at runtime using -n in log:display.
+#
+size = 500
+
+#
+# The pattern used to format the log statement when using log:display. This pattern is according
+# to the log4j layout. You can override this parameter at runtime using log:display with -p.
+#
+pattern = %d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.management.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.management.cfg
new file mode 100644
index 0000000..415d82e
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.management.cfg
@@ -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.
+#
+################################################################################
+
+#
+# The properties in this file define the configuration of Apache Karaf's JMX Management
+#
+
+#
+# Port of the registry for the exported RMI service
+#
+rmiRegistryPort = 1099
+
+#
+# Port of the registry for the exported RMI service
+#
+rmiServerPort = 44444
+
+#
+# Name of the JAAS realm used for authentication
+#
+jmxRealm = karaf
+
+#
+# The service URL for the JMXConnectorServer
+#
+serviceUrl = service:jmx:rmi://0.0.0.0:${rmiServerPort}/jndi/rmi://0.0.0.0:${rmiRegistryPort}/karaf-${karaf.name}
+
+#
+# Whether any threads started for the JMXConnectorServer should be started as daemon threads
+#
+daemon = true
+
+#
+# Whether the JMXConnectorServer should be started in a separate thread
+#
+threaded = true
+
+#
+# The ObjectName used to register the JMXConnectorServer
+#
+objectName = connector:name=rmi
+
+#
+# Role name used for JMX access authorization
+# If not set, this defaults to the ${karaf.admin.role} configured in etc/system.properties
+#
+# jmxRole=admin
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.shell.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.shell.cfg
new file mode 100644
index 0000000..202459f
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.shell.cfg
@@ -0,0 +1,45 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# These properties are used to configure Karaf's ssh shell.
+#
+
+#
+# Via sshPort and sshHost you define the address you can login into Karaf.
+#
+sshPort=8101
+sshHost=0.0.0.0
+
+#
+# sshRealm defines which JAAS domain to use for password authentication.
+#
+sshRealm=karaf
+
+#
+# The location of the hostKey file defines where the private/public key of the server
+# is located. If no file is at the defined location it will be ignored.
+#
+hostKey=${karaf.base}/etc/host.key
+
+#
+# Role name used for SSH access authorization
+# If not set, this defaults to the ${karaf.admin.role} configured in etc/system.properties
+#
+# sshRole=admin
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg
new file mode 100644
index 0000000..ca35d6d
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg
@@ -0,0 +1,47 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+# Root logger
+log4j.rootLogger=INFO, out, osgi:*
+log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.RollingFileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+log4j.appender.out.file=${karaf.data}/log/karaf.log
+log4j.appender.out.append=true
+log4j.appender.out.maxFileSize=1MB
+log4j.appender.out.maxBackupIndex=10
+
+# Sift appender
+log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
+log4j.appender.sift.key=bundle.name
+log4j.appender.sift.default=karaf
+log4j.appender.sift.appender=org.apache.log4j.FileAppender
+log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
+log4j.appender.sift.appender.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %m%n
+log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
+log4j.appender.sift.appender.append=true
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg
new file mode 100644
index 0000000..1fca497
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg
@@ -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.
+#
+################################################################################
+
+#
+# If set to true, the following property will not allow any certificate to be used
+# when accessing Maven repositories through SSL
+#
+#org.ops4j.pax.url.mvn.certificateCheck=
+
+#
+# Path to the local Maven settings file.
+# The repositories defined in this file will be automatically added to the list
+# of default repositories if the 'org.ops4j.pax.url.mvn.repositories' property
+# below is not set.
+# The following locations are checked for the existence of the settings.xml file
+#   * 1. looks for the specified url
+#   * 2. if not found looks for ${user.home}/.m2/settings.xml
+#   * 3. if not found looks for ${maven.home}/conf/settings.xml
+#   * 4. if not found looks for ${M2_HOME}/conf/settings.xml
+#
+#org.ops4j.pax.url.mvn.settings=
+
+#
+# Path to the local Maven repository which is used to avoid downloading
+# artifacts when they already exist locally.
+# The value of this property will be extracted from the settings.xml file
+# above, or defaulted to:
+#     System.getProperty( "user.home" ) + "/.m2/repository"
+#
+#org.ops4j.pax.url.mvn.localRepository=
+
+#
+# Default this to false. It's just weird to use undocumented repos
+#
+org.ops4j.pax.url.mvn.useFallbackRepositories=false
+
+#
+# Uncomment if you are behind a web proxy. PAX URL will use the proxy settings
+# from the Maven conf/settings.xml file
+#
+# org.ops4j.pax.url.mvn.proxySupport=true
+
+#
+# Disable aether support by default.  This ensure that the defaultRepositories
+# below will be used
+#
+org.ops4j.pax.url.mvn.disableAether=true
+
+#
+# Comma separated list of repositories scanned when resolving an artifact.
+# Those repositories will be checked before iterating through the
+#    below list of repositories and even before the local repository
+# A repository url can be appended with zero or more of the following flags:
+#    @snapshots  : the repository contains snaphots
+#    @noreleases : the repository does not contain any released artifacts
+#
+# The following property value will add the system folder as a repo.
+#
+org.ops4j.pax.url.mvn.defaultRepositories=file:${karaf.home}/${karaf.default.repository}@snapshots,\
+    file:${karaf.home}/local-repo@snapshots
+
+#
+# Comma separated list of repositories scanned when resolving an artifact.
+# The default list includes the following repositories:
+#    http://repo1.maven.org/maven2
+#    http://repository.apache.org/content/groups/snapshots-group
+#    http://svn.apache.org/repos/asf/servicemix/m2-repo
+#    http://repository.springsource.com/maven/bundles/release
+#    http://repository.springsource.com/maven/bundles/external
+# To add repositories to the default ones, prepend '+' to the list of repositories
+# to add.
+# A repository url can be appended with zero or more of the following flags:
+#    @snapshots  : the repository contains snaphots
+#    @noreleases : the repository does not contain any released artifacts
+#
+org.ops4j.pax.url.mvn.repositories= \
+    http://repo1.maven.org/maven2, \
+    http://repository.apache.org/content/groups/snapshots-group@snapshots@noreleases, \
+    http://svn.apache.org/repos/asf/servicemix/m2-repo, \
+    http://repository.springsource.com/maven/bundles/release, \
+    http://repository.springsource.com/maven/bundles/external, \
+    http://oss.sonatype.org/content/repositories/releases/
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/shell.init.script b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/shell.init.script
new file mode 100644
index 0000000..6bfec61
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/shell.init.script
@@ -0,0 +1,65 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// This script is run each time a shell is created.
+// You can define here closures or variables that will be available
+// in each session.
+//
+ld = { log:display $args } ;
+lde = { log:display-exception $args } ;
+la = { osgi:list -t 0 $args } ;
+cl = { config:list "(service.pid=$args)" } ;
+man = { help $args } ;
+
+// system:* aliases
+system:shutdown = { osgi:shutdown $args } ;
+system:start-level = { osgi:start-level $args } ;
+
+// service:* aliases
+service:list = { ls $args } ;
+
+// bundle:* aliases
+bundle:list = { osgi:list $args } ;
+bundle:install = { osgi:install $args };
+bundle:uninstall = { osgi:uninstall $args } ;
+bundle:start = { osgi:start $args } ;
+bundle:stop = { osgi:stop $args } ;
+bundle:headers = { osgi:headers $args } ;
+bundle:info = { osgi:info $args } ;
+bundle:refresh = { osgi:refresh $args } ;
+bundle:resolve = { osgi:resolve $args } ;
+bundle:restart = { osgi:restart $args } ;
+bundle:start-level = { osgi:start-level $args } ;
+bundle:update = { osgi:update $args } ;
+
+// package:* aliases
+package:export = { packages:exports $args } ;
+package:import = { packages:imports $args } ;
+
+// feature:* aliases
+feature:add-url = { features:addurl $args } ;
+feature:refresh-url = { features:refreshurl $args } ;
+feature:info = { features:info $args } ;
+feature:remove-repository = { features:removerepository $args } ;
+feature:install = { features:install $args } ;
+feature:remove-url = { features:removeurl $args } ;
+feature:list = { features:list $args } ;
+feature:uninstall = { features:uninstall $args } ;
+feature:list-repository = { features:listrepositories $args } ;
+feature:list-url = { features:listurl $args } ;
+feature:list-version = { features:listversions $args } ;
\ No newline at end of file
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/system.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/system.properties
new file mode 100644
index 0000000..197301b
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/system.properties
@@ -0,0 +1,78 @@
+################################################################################
+#
+#    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 properties defined in this file will be made available through system
+# properties at the very beginning of the Karaf's boot process.
+#
+
+
+# Log level when the pax-logging service is not available
+# This level will only be used while the pax-logging service bundle
+# is not fully available.
+# To change log levels, please refer to the org.ops4j.pax.logging.cfg file
+# instead.
+org.ops4j.pax.logging.DefaultServiceLog.level=ERROR
+
+#
+# Name of this Karaf instance.
+#
+karaf.name=root
+
+#
+# Default repository where bundles will be loaded from before using
+# other Maven repositories.  For the full Maven configuration, see
+# the org.ops4j.pax.url.mvn.cfg file.
+#
+karaf.default.repository=system
+
+#
+# Location of a shell script that will be run when starting a shell
+# session.  This script can be used to create aliases and define
+# additional commands.
+#
+karaf.shell.init.script=${karaf.home}/etc/shell.init.script
+
+#
+# Default role name used for console authorization (JMX, SSH and WEB)
+# The syntax is the following:
+#   [classname:]principal
+# where classname is the class name of the principal object
+# (defaults to org.apache.karaf.jaas.modules.RolePrincipal)
+# and principal is the name of the principal of that class
+# (defaults to admin).
+#
+# Note that this value can be overriden using the various ConfigAdmin
+# configurations for JMX, SSH or the WebConsole.
+#
+karaf.admin.role=admin
+
+#
+# Set this empty property to avoid errors when validating xml documents.
+#
+xml.catalog.files=
+
+#
+# Suppress the bell in the console when hitting backspace too many times
+# for example
+#
+jline.nobell=true
+
+# Workaround for KARAF-1117: Jetty will use a JUL logger.
+org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.JavaUtilLog
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/users.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/users.properties
new file mode 100644
index 0000000..25c63e6
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/etc/users.properties
@@ -0,0 +1,30 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# This file contains the valid users who can log into Karaf. Each line have to be of
+# the format:
+#
+# USER=PASSWORD,ROLE1,ROLE2,...
+#
+# All users and roles entered in this file are available after Karaf startup
+# and modifiable via the JAAS command group. These users reside in a JAAS domain
+# with the name "karaf"..
+#
+karaf=karaf,admin
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/README b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/README
new file mode 100644
index 0000000..9eca75a
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/README
@@ -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.
+#
+################################################################################
+
+This directory is the standard Java classpath directory.
+Any jar in this folder will be part of the main classloader used to load Karaf.
+However, in OSGi, classes defined in these jars won't be available to other
+bundles unless one of the org.osgi.framework.system.packages.extra or
+org.osgi.framework.bootdelegation properties in the etc/config.properties file
+is modified to export or delegate the packages.
+Please refer to the OSGi Core Specification for more information on these
+properties and the OSGi classloading mechanism.
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/endorsed/README b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/endorsed/README
new file mode 100644
index 0000000..0665a52
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/endorsed/README
@@ -0,0 +1,23 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+This directory is the Java endorsed directory.
+Any jar in this folder will be used to override classes defined by the JVM.
+For more information, see:
+   http://download.oracle.com/javase/6/docs/technotes/guides/standards/
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/ext/README b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/ext/README
new file mode 100644
index 0000000..09ff822
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/text/lib/ext/README
@@ -0,0 +1,23 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+This directory is the Java extension directory.
+Any jar in this folder will be used as a JVM extension.
+For more information, see
+   http://download.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/karaf b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/karaf
new file mode 100755
index 0000000..6c4189a
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/karaf
@@ -0,0 +1,373 @@
+#!/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.
+#
+
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+
+#
+# Sourcing environment settings for karaf similar to tomcats setenv
+#
+KARAF_SCRIPT="karaf"
+export KARAF_SCRIPT
+if [ -f "$DIRNAME/setenv" ]; then
+  . "$DIRNAME/setenv"
+fi
+
+#
+# Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+#
+if [ "x$JAVA_MIN_MEM" = "x" ]; then
+    JAVA_MIN_MEM=128M
+    export JAVA_MIN_MEM
+fi
+if [ "x$JAVA_MAX_MEM" = "x" ]; then
+    JAVA_MAX_MEM=512M
+    export JAVA_MAX_MEM
+fi
+
+warn() {
+    echo "${PROGNAME}: $*"
+}
+
+die() {
+    warn "$*"
+    exit 1
+}
+
+detectOS() {
+    # OS specific support (must be 'true' or 'false').
+    cygwin=false;
+    darwin=false;
+    aix=false;
+    os400=false;
+    case "`uname`" in
+        CYGWIN*)
+            cygwin=true
+            ;;
+        Darwin*)
+            darwin=true
+            ;;
+        AIX*)
+            aix=true
+            ;;
+        OS400*)
+            os400=true
+            ;;
+    esac
+    # For AIX, set an environment variable
+    if $aix; then
+         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
+         export IBM_JAVA_HEAPDUMP_TEXT=true
+         echo $LDR_CNTRL
+    fi
+}
+
+unlimitFD() {
+    # Use the maximum available, or set MAX_FD != -1 to use that
+    if [ "x$MAX_FD" = "x" ]; then
+        MAX_FD="maximum"
+    fi
+
+    # Increase the maximum file descriptors if we can
+    if [ "$os400" = "false" ] && [ "$cygwin" = "false" ]; then
+        MAX_FD_LIMIT=`ulimit -H -n`
+        if [ "$MAX_FD_LIMIT" != 'unlimited' ]; then 
+            if [ $? -eq 0 ]; then
+                if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then
+                    # use the system max
+                    MAX_FD="$MAX_FD_LIMIT"
+                fi
+
+                ulimit -n $MAX_FD > /dev/null
+                # echo "ulimit -n" `ulimit -n`
+                if [ $? -ne 0 ]; then
+                    warn "Could not set maximum file descriptor limit: $MAX_FD"
+                fi
+            else
+                warn "Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
+            fi
+        fi
+    fi
+}
+
+locateHome() {
+    if [ "x$KARAF_HOME" != "x" ]; then
+        warn "Ignoring predefined value for KARAF_HOME"
+    fi
+
+    # In POSIX shells, CDPATH may cause cd to write to stdout
+    (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+    KARAF_HOME=`cd "$DIRNAME/.."; pwd`
+    if [ ! -d "$KARAF_HOME" ]; then
+        die "KARAF_HOME is not valid: $KARAF_HOME"
+    fi
+}
+
+locateBase() {
+    if [ "x$KARAF_BASE" != "x" ]; then
+        if [ ! -d "$KARAF_BASE" ]; then
+            die "KARAF_BASE is not valid: $KARAF_BASE"
+        fi
+    else
+        KARAF_BASE=$KARAF_HOME
+    fi
+}
+
+locateData() {
+    if [ "x$KARAF_DATA" != "x" ]; then
+        if [ ! -d "$KARAF_DATA" ]; then
+            die "KARAF_DATA is not valid: $KARAF_DATA"
+        fi
+    else
+        KARAF_DATA=$KARAF_BASE/data
+    fi
+}
+
+setupNativePath() {
+    # Support for loading native libraries
+    LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$KARAF_BASE/lib:$KARAF_HOME/lib"
+
+    # For Cygwin, set PATH from LD_LIBRARY_PATH
+    if $cygwin; then
+        LD_LIBRARY_PATH=`cygpath --path --windows "$LD_LIBRARY_PATH"`
+        PATH="$PATH;$LD_LIBRARY_PATH"
+        export PATH
+    fi
+    export LD_LIBRARY_PATH
+}
+
+pathCanonical() {
+    local dst="${1}"
+    while [ -h "${dst}" ] ; do
+        ls=`ls -ld "${dst}"`
+        link=`expr "$ls" : '.*-> \(.*\)$'`
+        if expr "$link" : '/.*' > /dev/null; then
+            dst="$link"
+        else
+            dst="`dirname "${dst}"`/$link"
+        fi
+    done
+    local bas=`basename "${dst}"`
+    local dir=`dirname "${dst}"`
+    if [ "$bas" != "$dir" ]; then
+      dst="`pathCanonical "$dir"`/$bas"
+    fi
+    echo "${dst}" | sed -e 's#//#/#g' -e 's#/./#/#g' -e 's#/[^/]*/../#/#g'
+}
+
+locateJava() {
+    # Setup the Java Virtual Machine
+    if $cygwin ; then
+        [ -n "$JAVA" ] && JAVA=`cygpath --unix "$JAVA"`
+        [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+    fi
+
+	if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
+		JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
+	fi
+    if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then
+        JAVA_HOME=`java-config --jre-home`
+    fi
+    if [ "x$JAVA" = "x" ]; then
+        if [ "x$JAVA_HOME" != "x" ]; then
+            if [ ! -d "$JAVA_HOME" ]; then
+                die "JAVA_HOME is not valid: $JAVA_HOME"
+            fi
+            JAVA="$JAVA_HOME/bin/java"
+        else
+            warn "JAVA_HOME not set; results may vary"
+            JAVA=`type java`
+            JAVA=`expr "$JAVA" : '.*is \(.*\)$'`
+            if [ "x$JAVA" = "x" ]; then
+                die "java command not found"
+            fi
+        fi
+    fi
+    if [ "x$JAVA_HOME" = "x" ]; then
+        JAVA_HOME="$(dirname $(dirname $(pathCanonical "$JAVA")))"
+    fi
+}
+
+detectJVM() {
+   #echo "`$JAVA -version`"
+   # This service should call `java -version`,
+   # read stdout, and look for hints
+   if $JAVA -version 2>&1 | grep "^IBM" ; then
+       JVM_VENDOR="IBM"
+   # on OS/400, java -version does not contain IBM explicitly
+   elif $os400; then
+       JVM_VENDOR="IBM"
+   else
+       JVM_VENDOR="SUN"
+   fi
+   # echo "JVM vendor is $JVM_VENDOR"
+}
+
+setupDebugOptions() {
+    if [ "x$JAVA_OPTS" = "x" ]; then
+        JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+    fi
+    export JAVA_OPTS
+
+    # Set Debug options if enabled
+    if [ "x$KARAF_DEBUG" != "x" ]; then
+        # Use the defaults if JAVA_DEBUG_OPTS was not set
+        if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
+            JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
+        fi
+
+        JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
+        warn "Enabling Java debug options: $JAVA_DEBUG_OPTS"
+    fi
+}
+
+setupDefaults() {
+    DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM "
+
+    #Set the JVM_VENDOR specific JVM flags
+    if [ "$JVM_VENDOR" = "SUN" ]; then
+        #
+        # Check some easily accessible MIN/MAX params for JVM mem usage
+        #
+        if [ "x$JAVA_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:PermSize=$JAVA_PERM_MEM"
+        fi
+        if [ "x$JAVA_MAX_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:MaxPermSize=$JAVA_MAX_PERM_MEM"
+        fi
+        DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote"
+    elif [ "$JVM_VENDOR" = "IBM" ]; then
+        if $os400; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+        elif $aix; then
+            DEFAULT_JAVA_OPTS="-Xverify:none -Xlp $DEFAULT_JAVA_OPTS"
+        else
+            DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS"
+        fi
+    fi
+
+    # Add the jars in the lib dir
+    for file in "$KARAF_HOME"/lib/karaf*.jar
+    do
+        if [ -z "$CLASSPATH" ]; then
+            CLASSPATH="$file"
+        else
+            CLASSPATH="$CLASSPATH:$file"
+        fi
+    done
+    DEFAULT_JAVA_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
+
+    ##
+    ## TODO: Move to conf/profiler/yourkit.{sh|cmd}
+    ##
+    # Uncomment to enable YourKit profiling
+    #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
+}
+
+init() {
+    # Determine if there is special OS handling we must perform
+    detectOS
+
+    # Unlimit the number of file descriptors if possible
+    unlimitFD
+
+    # Locate the Karaf home directory
+    locateHome
+
+    # Locate the Karaf base directory
+    locateBase
+
+    # Locate the Karaf data directory
+    locateData
+
+    # Setup the native library path
+    setupNativePath
+
+    # Locate the Java VM to execute
+    locateJava
+
+    # Determine the JVM vendor
+    detectJVM
+
+    # Setup default options
+    setupDefaults
+
+    # Install debug options
+    setupDebugOptions
+
+}
+
+run() {
+    OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true"
+    MAIN=org.apache.karaf.main.Main
+    while [ "$1" != "" ]; do
+        case $1 in
+            'clean')
+                rm -Rf $KARAF_DATA
+                shift
+                ;;
+            'debug')
+                if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
+                    JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
+                fi
+                JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
+                shift
+                ;;
+            'stop')
+                MAIN=org.apache.karaf.main.Stop
+                shift
+                ;;
+            'console')
+                shift
+                ;;
+            'server')
+                OPTS="-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true"
+                shift
+                ;;
+            'client')
+                OPTS="-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false"
+                shift
+                ;;
+            *)
+                break
+                ;;
+        esac
+    done
+
+    JAVA_ENDORSED_DIRS="${JAVA_HOME}/jre/lib/endorsed:${JAVA_HOME}/lib/endorsed:${KARAF_HOME}/lib/endorsed"
+    JAVA_EXT_DIRS="${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:${KARAF_HOME}/lib/ext"
+    if $cygwin; then
+        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
+        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
+        KARAF_DATA=`cygpath --path --windows "$KARAF_DATA"`
+        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+        JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+        JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+        JAVA_EXT_DIRS=`cygpath --path --windows "$JAVA_EXT_DIRS"`
+    fi
+    cd "$KARAF_BASE"
+    exec "$JAVA" $JAVA_OPTS -Djava.endorsed.dirs="${JAVA_ENDORSED_DIRS}" -Djava.ext.dirs="${JAVA_EXT_DIRS}" -Dkaraf.instances="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Dkaraf.data="$KARAF_DATA" -Djava.io.tmpdir="$KARAF_DATA/tmp" -Djava.util.logging.config.file="$KARAF_BASE/etc/java.util.logging.properties" $KARAF_OPTS $OPTS -classpath "$CLASSPATH" $MAIN "$@"
+}
+
+main() {
+    init
+    run "$@"
+}
+
+main "$@"
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/setenv b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/setenv
new file mode 100755
index 0000000..337d8c0
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/setenv
@@ -0,0 +1,46 @@
+#!/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.
+#
+
+#
+# handle specific scripts; the SCRIPT_NAME is exactly the name of the Karaf
+# script; for example karaf, start, stop, admin, client, ...
+#
+# if [ "$KARAF_SCRIPT" == "SCRIPT_NAME" ]; then
+#   Actions go here...
+# fi
+
+#
+# general settings which should be applied for all scripts go here; please keep
+# in mind that it is possible that scripts might be executed more than once, e.g.
+# in example of the start script where the start script is executed first and the
+# karaf script afterwards.
+#
+
+#
+# The following section shows the possible configuration options for the default 
+# karaf scripts
+#
+# export JAVA_MIN_MEM # Minimum memory for the JVM
+# export JAVA_MAX_MEM # Maximum memory for the JVM
+# export JAVA_PERM_MEM # Minimum perm memory for the JVM
+# export JAVA_MAX_PERM_MEM # Maximum memory for the JVM
+# export KARAF_HOME # Karaf home folder
+# export KARAF_DATA # Karaf data folder
+# export KARAF_BASE # Karaf base folder
+# export KARAF_OPTS # Additional available Karaf options
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/start b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/start
new file mode 100755
index 0000000..12903e6
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/start
@@ -0,0 +1,136 @@
+#!/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.
+#
+
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+
+#
+# Sourcing environment settings for karaf similar to tomcats setenv 
+#
+KARAF_SCRIPT="start"
+export KARAF_SCRIPT
+if [ -f "$DIRNAME/setenv" ]; then
+  . "$DIRNAME/setenv"
+fi
+
+warn() {
+    echo "${PROGNAME}: $*"
+}
+
+die() {
+    warn "$*"
+    exit 1
+}
+
+detectOS() {
+    # OS specific support (must be 'true' or 'false').
+    cygwin=false;
+    darwin=false;
+    aix=false;
+    os400=false;
+    case "`uname`" in
+        CYGWIN*)
+            cygwin=true
+            ;;
+        Darwin*)
+            darwin=true
+            ;;
+        AIX*)
+            aix=true
+            ;;
+        OS400*)
+            os400=true
+            ;;
+    esac
+    # For AIX, set an environment variable
+    if $aix; then
+         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
+         export IBM_JAVA_HEAPDUMP_TEXT=true
+         echo $LDR_CNTRL
+    fi
+}
+
+locateHome() {
+    if [ "x$KARAF_HOME" != "x" ]; then
+        warn "Ignoring predefined value for KARAF_HOME"
+    fi
+
+    # In POSIX shells, CDPATH may cause cd to write to stdout
+    (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+    KARAF_HOME=`cd "$DIRNAME/.."; pwd`
+    if [ ! -d "$KARAF_HOME" ]; then
+        die "KARAF_HOME is not valid: $KARAF_HOME"
+    fi
+}
+
+locateBase() {
+    if [ "x$KARAF_BASE" != "x" ]; then
+        if [ ! -d "$KARAF_BASE" ]; then
+            die "KARAF_BASE is not valid: $KARAF_BASE"
+        fi
+    else
+        KARAF_BASE=$KARAF_HOME
+    fi
+}
+
+locateData() {
+    if [ "x$KARAF_DATA" != "x" ]; then
+        if [ ! -d "$KARAF_DATA" ]; then
+            die "KARAF_DATA is not valid: $KARAF_DATA"
+        fi
+    else
+        KARAF_DATA=$KARAF_BASE/data
+    fi
+}
+
+init() {
+    # Determine if there is special OS handling we must perform
+    detectOS
+
+    # Locate the Karaf home directory
+    locateHome
+
+    # Locate the Karaf base directory
+    locateBase
+
+    # Locate the Karaf data directory
+    locateData
+}
+
+run() {
+    if $cygwin; then
+        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
+        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
+        KARAF_DATA=`cygpath --path --windows "$KARAF_DATA"`
+        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+    fi
+    # Ensure the log directory exists -- we need to have a place to redirect stdout/stderr
+    if [ ! -d "$KARAF_DATA/log" ]; then
+        mkdir -p "$KARAF_DATA/log"
+    fi
+    exec "$KARAF_HOME"/bin/karaf server "$@" >> "$KARAF_DATA/karaf.out" 2>&1 &
+}
+
+main() {
+    init
+    run "$@"
+}
+
+main "$@"
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/stop b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/stop
new file mode 100755
index 0000000..04fdea2
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/stop
@@ -0,0 +1,136 @@
+#!/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.
+#
+
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+
+#
+# Sourcing environment settings for karaf similar to tomcats setenv 
+#
+KARAF_SCRIPT="stop"
+export KARAF_SCRIPT
+if [ -f "$DIRNAME/setenv" ]; then
+  . "$DIRNAME/setenv"
+fi
+
+warn() {
+    echo "${PROGNAME}: $*"
+}
+
+die() {
+    warn "$*"
+    exit 1
+}
+
+detectOS() {
+    # OS specific support (must be 'true' or 'false').
+    cygwin=false;
+    darwin=false;
+    aix=false;
+    os400=false;
+    case "`uname`" in
+        CYGWIN*)
+            cygwin=true
+            ;;
+        Darwin*)
+            darwin=true
+            ;;
+        AIX*)
+            aix=true
+            ;;
+        OS400*)
+            os400=true
+            ;;
+    esac
+    # For AIX, set an environment variable
+    if $aix; then
+         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
+         export IBM_JAVA_HEAPDUMP_TEXT=true
+         echo $LDR_CNTRL
+    fi
+}
+
+locateHome() {
+    if [ "x$KARAF_HOME" != "x" ]; then
+        warn "Ignoring predefined value for KARAF_HOME"
+    fi
+
+    # In POSIX shells, CDPATH may cause cd to write to stdout
+    (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+    KARAF_HOME=`cd "$DIRNAME/.."; pwd`
+    if [ ! -d "$KARAF_HOME" ]; then
+        die "KARAF_HOME is not valid: $KARAF_HOME"
+    fi
+}
+
+locateBase() {
+    if [ "x$KARAF_BASE" != "x" ]; then
+        if [ ! -d "$KARAF_BASE" ]; then
+            die "KARAF_BASE is not valid: $KARAF_BASE"
+        fi
+    else
+        KARAF_BASE=$KARAF_HOME
+    fi
+}
+
+locateData() {
+    if [ "x$KARAF_DATA" != "x" ]; then
+        if [ ! -d "$KARAF_DATA" ]; then
+            die "KARAF_DATA is not valid: $KARAF_DATA"
+        fi
+    else
+        KARAF_DATA=$KARAF_BASE/data
+    fi
+}
+
+init() {
+    # Determine if there is special OS handling we must perform
+    detectOS
+
+    # Locate the Karaf home directory
+    locateHome
+
+    # Locate the Karaf base directory
+    locateBase
+
+    # Locate the Karaf data directory
+    locateData
+}
+
+run() {
+    if $cygwin; then
+        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
+        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
+        KARAF_DATA=`cygpath --path --windows "$KARAF_DATA"`
+        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+    fi
+    # Ensure the log directory exists -- we need to have a place to redirect stdout/stderr
+    if [ ! -d "$KARAF_DATA/log" ]; then
+        mkdir -p "$KARAF_DATA/log"
+    fi
+    exec "$KARAF_HOME"/bin/karaf stop "$@"
+}
+
+main() {
+    init
+    run "$@"
+}
+
+main "$@"
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/karaf.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/karaf.bat
new file mode 100755
index 0000000..548d97b
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/karaf.bat
@@ -0,0 +1,291 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+rem Sourcing environment settings for karaf similar to tomcats setenv
+SET KARAF_SCRIPT="karaf.bat"
+if exist "%DIRNAME%setenv.bat" (
+  call "%DIRNAME%setenv.bat"
+)
+
+rem Check console window title. Set to Karaf by default
+if not "%KARAF_TITLE%" == "" (
+    title %KARAF_TITLE%
+) else (
+    title Karaf
+)
+
+rem Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+if "%JAVA_MIN_MEM%" == "" (
+    set JAVA_MIN_MEM=128M
+)
+if "%JAVA_MAX_MEM%" == "" (
+    set JAVA_MAX_MEM=512M
+)
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: "%KARAF_HOME%"
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: "%KARAF_BASE%"
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set "KARAF_BASE=%KARAF_HOME%"
+)
+
+if not "%KARAF_DATA%" == "" (
+    if not exist "%KARAF_DATA%" (
+        call :warn KARAF_DATA is not valid: "%KARAF_DATA%"
+        goto END
+    )
+)
+if "%KARAF_DATA%" == "" (
+    set "KARAF_DATA=%KARAF_BASE%\data"
+)        
+
+set LOCAL_CLASSPATH=%CLASSPATH%
+set DEFAULT_JAVA_OPTS=-server -Xms%JAVA_MIN_MEM% -Xmx%JAVA_MAX_MEM% -Dderby.system.home="%KARAF_DATA%\derby" -Dderby.storage.fileSyncTransactionLog=true -Dcom.sun.management.jmxremote
+
+rem Check some easily accessible MIN/MAX params for JVM mem usage
+if not "%JAVA_PERM_MEM%" == "" (
+    set DEFAULT_JAVA_OPTS=%DEFAULT_JAVA_OPTS% -XX:PermSize=%JAVA_PERM_MEM%
+)
+if not "%JAVA_MAX_PERM_MEM%" == "" (
+    set DEFAULT_JAVA_OPTS=%DEFAULT_JAVA_OPTS% -XX:MaxPermSize=%JAVA_MAX_PERM_MEM%
+)
+
+set CLASSPATH=%LOCAL_CLASSPATH%;%KARAF_BASE%\conf
+set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
+
+if "%LOCAL_CLASSPATH%" == "" goto :KARAF_CLASSPATH_EMPTY
+    set CLASSPATH=%LOCAL_CLASSPATH%;%KARAF_BASE%\conf
+    goto :KARAF_CLASSPATH_END
+:KARAF_CLASSPATH_EMPTY
+    set CLASSPATH=%KARAF_BASE%\conf
+:KARAF_CLASSPATH_END
+
+rem Setup Karaf Home
+if exist "%KARAF_HOME%\conf\karaf-rc.cmd" call %KARAF_HOME%\conf\karaf-rc.cmd
+if exist "%HOME%\karaf-rc.cmd" call %HOME%\karaf-rc.cmd
+
+rem Support for loading native libraries
+set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
+
+rem Setup the Java Virtual Machine
+if not "%JAVA%" == "" goto :Check_JAVA_END
+    if not "%JAVA_HOME%" == "" goto :TryJDKEnd
+        call :warn JAVA_HOME not set; results may vary
+:TryJRE
+    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment"
+    if not exist __reg1.txt goto :TryJDK
+    type __reg1.txt | find "CurrentVersion" > __reg2.txt
+    if errorlevel 1 goto :TryJDK
+    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JavaTemp=%%~x
+    if errorlevel 1 goto :TryJDK
+    set JavaTemp=%JavaTemp%##
+    set JavaTemp=%JavaTemp:                ##=##%
+    set JavaTemp=%JavaTemp:        ##=##%
+    set JavaTemp=%JavaTemp:    ##=##%
+    set JavaTemp=%JavaTemp:  ##=##%
+    set JavaTemp=%JavaTemp: ##=##%
+    set JavaTemp=%JavaTemp:##=%
+    del __reg1.txt
+    del __reg2.txt
+    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\%JavaTemp%"
+    if not exist __reg1.txt goto :TryJDK
+    type __reg1.txt | find "JavaHome" > __reg2.txt
+    if errorlevel 1 goto :TryJDK
+    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JAVA_HOME=%%~x
+    if errorlevel 1 goto :TryJDK
+    del __reg1.txt
+    del __reg2.txt
+    goto TryJDKEnd
+:TryJDK
+    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit"
+    if not exist __reg1.txt (
+        call :warn Unable to retrieve JAVA_HOME
+        goto END
+    )
+    type __reg1.txt | find "CurrentVersion" > __reg2.txt
+    if errorlevel 1 (
+        call :warn Unable to retrieve JAVA_HOME
+        goto END
+    )
+    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JavaTemp=%%~x
+    if errorlevel 1 (
+        call :warn Unable to retrieve JAVA_HOME
+        goto END
+    )
+    set JavaTemp=%JavaTemp%##
+    set JavaTemp=%JavaTemp:                ##=##%
+    set JavaTemp=%JavaTemp:        ##=##%
+    set JavaTemp=%JavaTemp:    ##=##%
+    set JavaTemp=%JavaTemp:  ##=##%
+    set JavaTemp=%JavaTemp: ##=##%
+    set JavaTemp=%JavaTemp:##=%
+    del __reg1.txt
+    del __reg2.txt
+    start /w regedit /e __reg1.txt "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\%JavaTemp%"
+    if not exist __reg1.txt (
+        call :warn Unable to retrieve JAVA_HOME from JDK
+        goto END
+    )
+    type __reg1.txt | find "JavaHome" > __reg2.txt
+    if errorlevel 1 (
+        call :warn Unable to retrieve JAVA_HOME
+        goto END
+    )
+    for /f "tokens=2 delims==" %%x in (__reg2.txt) do set JAVA_HOME=%%~x
+    if errorlevel 1 (
+        call :warn Unable to retrieve JAVA_HOME
+        goto END
+    )
+    del __reg1.txt
+    del __reg2.txt
+:TryJDKEnd
+    if not exist "%JAVA_HOME%" (
+        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
+        goto END
+    )
+    set JAVA=%JAVA_HOME%\bin\java
+:Check_JAVA_END
+
+if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS%
+
+if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END
+    rem Use the defaults if JAVA_DEBUG_OPTS was not set
+    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
+
+    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
+    call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS%
+:KARAF_DEBUG_END
+
+if "%KARAF_PROFILER%" == "" goto :KARAF_PROFILER_END
+    set KARAF_PROFILER_SCRIPT=%KARAF_HOME%\conf\profiler\%KARAF_PROFILER%.cmd
+
+    if exist "%KARAF_PROFILER_SCRIPT%" goto :KARAF_PROFILER_END
+    call :warn Missing configuration for profiler '%KARAF_PROFILER%': %KARAF_PROFILER_SCRIPT%
+    goto END
+:KARAF_PROFILER_END
+
+rem Setup the classpath
+pushd "%KARAF_HOME%\lib"
+for %%G in (karaf*.jar) do call:APPEND_TO_CLASSPATH %%G
+popd
+goto CLASSPATH_END
+
+: APPEND_TO_CLASSPATH
+set filename=%~1
+set suffix=%filename:~-4%
+if %suffix% equ .jar set CLASSPATH=%CLASSPATH%;%KARAF_HOME%\lib\%filename%
+goto :EOF
+
+:CLASSPATH_END
+
+rem Execute the JVM or the load the profiler
+if "%KARAF_PROFILER%" == "" goto :RUN
+    rem Execute the profiler if it has been configured
+    call :warn Loading profiler script: %KARAF_PROFILER_SCRIPT%
+    call %KARAF_PROFILER_SCRIPT%
+
+:RUN
+    SET OPTS=-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true
+    SET MAIN=org.apache.karaf.main.Main
+    SET SHIFT=false
+
+:RUN_LOOP
+    if "%1" == "stop" goto :EXECUTE_STOP
+    if "%1" == "console" goto :EXECUTE_CONSOLE
+    if "%1" == "server" goto :EXECUTE_SERVER
+    if "%1" == "client" goto :EXECUTE_CLIENT
+    if "%1" == "clean" goto :EXECUTE_CLEAN
+    if "%1" == "debug" goto :EXECUTE_DEBUG
+    goto :EXECUTE
+
+:EXECUTE_STOP
+    SET MAIN=org.apache.karaf.main.Stop
+    shift
+    goto :RUN_LOOP
+
+:EXECUTE_CONSOLE
+    shift
+    goto :RUN_LOOP
+
+:EXECUTE_SERVER
+    SET OPTS=-Dkaraf.startLocalConsole=false -Dkaraf.startRemoteShell=true
+    shift
+    goto :RUN_LOOP
+
+:EXECUTE_CLIENT
+    SET OPTS=-Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=false
+    shift
+    goto :RUN_LOOP
+
+:EXECUTE_CLEAN
+    rmdir /S /Q %KARAF_DATA%
+    shift
+    goto :RUN_LOOP
+
+:EXECUTE_DEBUG
+    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
+    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
+    shift
+    goto :RUN_LOOP
+
+:EXECUTE
+    SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8
+    rem Execute the Java Virtual Machine
+    cd %KARAF_BASE%
+    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Djava.endorsed.dirs="%JAVA_HOME%\jre\lib\endorsed;%JAVA_HOME%\lib\endorsed;%KARAF_HOME%\lib\endorsed" -Djava.ext.dirs="%JAVA_HOME%\jre\lib\ext;%JAVA_HOME%\lib\ext;%KARAF_HOME%\lib\ext" -Dkaraf.instances="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.io.tmpdir="%KARAF_DATA%\tmp" -Dkaraf.data="%KARAF_DATA%" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" %KARAF_OPTS% %MAIN% %ARGS%
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+
+if not "%PAUSE%" == "" pause
+
+:END_NO_PAUSE
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/setenv.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/setenv.bat
new file mode 100644
index 0000000..98142cd
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/setenv.bat
@@ -0,0 +1,57 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+rem
+rem handle specific scripts; the SCRIPT_NAME is exactly the name of the Karaf
+rem script; for example karaf.bat, start.bat, stop.bat, admin.bat, client.bat, ...
+rem
+rem if "%KARAF_SCRIPT%" == "SCRIPT_NAME" (
+rem   Actions go here...
+rem )
+
+rem
+rem general settings which should be applied for all scripts go here; please keep
+rem in mind that it is possible that scripts might be executed more than once, e.g.
+rem in example of the start script where the start script is executed first and the
+rem karaf script afterwards.
+rem
+
+rem
+rem The following section shows the possible configuration options for the default 
+rem karaf scripts
+rem
+rem Window name of the windows console
+rem SET KARAF_TITLE
+rem Minimum memory for the JVM
+rem SET JAVA_MIN_MEM
+rem Maximum memory for the JVM
+rem SET JAVA_MAX_MEM
+rem Minimum perm memory for the JVM
+rem SET JAVA_PERM_MEM
+rem Maximum memory for the JVM
+rem SET JAVA_MAX_PERM_MEM
+rem Karaf home folder
+rem SET KARAF_HOME
+rem Karaf data folder
+rem SET KARAF_DATA
+rem Karaf base folder
+rem SET KARAF_BASE
+rem Additional available Karaf options
+rem SET KARAF_OPTS
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/start.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/start.bat
new file mode 100755
index 0000000..c861a90
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/start.bat
@@ -0,0 +1,81 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+rem Sourcing environment settings for karaf similar to tomcats setenv
+SET KARAF_SCRIPT="start.bat"
+if exist "%DIRNAME%setenv.bat" (
+  call "%DIRNAME%setenv.bat"
+)
+
+rem Check console window title. Set to Karaf by default
+if not "%KARAF_TITLE%" == "" (
+    title %KARAF_TITLE%
+) else (
+    title Karaf
+)
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: "%KARAF_HOME%"
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: "%KARAF_BASE%"
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set "KARAF_BASE=%KARAF_HOME%"
+)
+
+:EXECUTE
+    start "Karaf" /MIN "%KARAF_HOME%\bin\karaf.bat" server %*
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+
+if not "%PAUSE%" == "" pause
+
+:END_NO_PAUSE
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/stop.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/stop.bat
new file mode 100755
index 0000000..69fa4a6
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/stop.bat
@@ -0,0 +1,80 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+rem Sourcing environment settings for karaf similar to tomcats setenv
+SET KARAF_SCRIPT="stop.bat"
+if exist "%DIRNAME%setenv.bat" (
+  call "%DIRNAME%setenv.bat"
+)
+
+rem Check console window title. Set to Karaf by default
+if not "%KARAF_TITLE%" == "" (
+    title %KARAF_TITLE%
+) else (
+    title Karaf
+)
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: "%KARAF_HOME%"
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: "%KARAF_BASE%"
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set "KARAF_BASE=%KARAF_HOME%"
+)
+
+:EXECUTE
+    "%KARAF_HOME%\bin\karaf.bat" stop
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+
+if not "%PAUSE%" == "" pause
+
+:END_NO_PAUSE
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin
new file mode 100644
index 0000000..5a81228
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin
@@ -0,0 +1,335 @@
+#!/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.
+#
+
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+
+#
+# Sourcing environment settings for karaf similar to tomcats setenv
+#
+KARAF_SCRIPT="admin"
+export KARAF_SCRIPT
+if [ -f "$DIRNAME/setenv" ]; then
+  . "$DIRNAME/setenv"
+fi
+
+#
+# Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+#
+if [ "x$JAVA_MIN_MEM" = "x" ]; then
+    JAVA_MIN_MEM=128M
+    export JAVA_MIN_MEM
+fi
+if [ "x$JAVA_MAX_MEM" = "x" ]; then
+    JAVA_MAX_MEM=512M
+    export JAVA_MAX_MEM
+fi
+
+warn() {
+    echo "${PROGNAME}: $*"
+}
+
+die() {
+    warn "$*"
+    exit 1
+}
+
+detectOS() {
+    # OS specific support (must be 'true' or 'false').
+    cygwin=false;
+    darwin=false;
+    aix=false;
+    os400=false;
+    case "`uname`" in
+        CYGWIN*)
+            cygwin=true
+            ;;
+        Darwin*)
+            darwin=true
+            ;;
+        AIX*)
+            aix=true
+            ;;
+        OS400*)
+            os400=true
+            ;;
+    esac
+    # For AIX, set an environment variable
+    if $aix; then
+         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
+         export IBM_JAVA_HEAPDUMP_TEXT=true
+         echo $LDR_CNTRL
+    fi
+}
+
+unlimitFD() {
+    # Use the maximum available, or set MAX_FD != -1 to use that
+    if [ "x$MAX_FD" = "x" ]; then
+        MAX_FD="maximum"
+    fi
+
+    # Increase the maximum file descriptors if we can
+    if [ "$os400" = "false" ] && [ "$cygwin" = "false" ]; then
+        MAX_FD_LIMIT=`ulimit -H -n`
+        if [ "$MAX_FD_LIMIT" != 'unlimited' ]; then 
+            if [ $? -eq 0 ]; then
+                if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then
+                    # use the system max
+                    MAX_FD="$MAX_FD_LIMIT"
+                fi
+
+                ulimit -n $MAX_FD > /dev/null
+                # echo "ulimit -n" `ulimit -n`
+                if [ $? -ne 0 ]; then
+                    warn "Could not set maximum file descriptor limit: $MAX_FD"
+                fi
+            else
+                warn "Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
+            fi
+        fi
+    fi
+}
+
+locateHome() {
+    if [ "x$KARAF_HOME" != "x" ]; then
+        warn "Ignoring predefined value for KARAF_HOME"
+    fi
+
+    # In POSIX shells, CDPATH may cause cd to write to stdout
+    (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+    KARAF_HOME=`cd $DIRNAME/..; pwd`
+    if [ ! -d "$KARAF_HOME" ]; then
+        die "KARAF_HOME is not valid: $KARAF_HOME"
+    fi
+}
+
+locateBase() {
+    if [ "x$KARAF_BASE" != "x" ]; then
+        if [ ! -d "$KARAF_BASE" ]; then
+            die "KARAF_BASE is not valid: $KARAF_BASE"
+        fi
+    else
+        KARAF_BASE=$KARAF_HOME
+    fi
+}
+
+locateData() {
+    if [ "x$KARAF_DATA" != "x" ]; then
+        if [ ! -d "$KARAF_DATA" ]; then
+            die "KARAF_DATA is not valid: $KARAF_DATA"
+        fi
+    else
+        KARAF_DATA=$KARAF_BASE/data
+    fi
+}
+
+setupNativePath() {
+    # Support for loading native libraries
+    LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$KARAF_BASE/lib:$KARAF_HOME/lib"
+
+    # For Cygwin, set PATH from LD_LIBRARY_PATH
+    if $cygwin; then
+        LD_LIBRARY_PATH=`cygpath --path --windows "$LD_LIBRARY_PATH"`
+        PATH="$PATH;$LD_LIBRARY_PATH"
+        export PATH
+    fi
+    export LD_LIBRARY_PATH
+}
+
+pathCanonical() {
+    local dst="${1}"
+    while [ -h "${dst}" ] ; do
+        ls=`ls -ld "${dst}"`
+        link=`expr "$ls" : '.*-> \(.*\)$'`
+        if expr "$link" : '/.*' > /dev/null; then
+            dst="$link"
+        else
+            dst="`dirname "${dst}"`/$link"
+        fi
+    done
+    local bas=`basename "${dst}"`
+    local dir=`dirname "${dst}"`
+    if [ "$bas" != "$dir" ]; then
+        dst="`pathCanonical "$dir"`/$bas"
+    fi
+    echo "${dst}" | sed -e 's#//#/#g' -e 's#/./#/#g' -e 's#/[^/]*/../#/#g'
+}
+
+locateJava() {
+    # Setup the Java Virtual Machine
+    if $cygwin ; then
+        [ -n "$JAVA" ] && JAVA=`cygpath --unix "$JAVA"`
+        [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+    fi
+
+    if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
+        JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
+    fi
+    if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then
+        JAVA_HOME=`java-config --jre-home`
+    fi
+    if [ "x$JAVA" = "x" ]; then
+        if [ "x$JAVA_HOME" != "x" ]; then
+            if [ ! -d "$JAVA_HOME" ]; then
+                die "JAVA_HOME is not valid: $JAVA_HOME"
+            fi
+            JAVA="$JAVA_HOME/bin/java"
+        else
+            warn "JAVA_HOME not set; results may vary"
+            JAVA=`type java`
+            JAVA=`expr "$JAVA" : '.*is \(.*\)$'`
+            if [ "x$JAVA" = "x" ]; then
+                die "java command not found"
+            fi
+        fi
+    fi
+    if [ "x$JAVA_HOME" = "x" ]; then
+        JAVA_HOME="$(dirname $(dirname $(pathCanonical "$JAVA")))"
+    fi
+}
+
+detectJVM() {
+   #echo "`$JAVA -version`"
+   # This service should call `java -version`,
+   # read stdout, and look for hints
+   if $JAVA -version 2>&1 | grep "^IBM" ; then
+       JVM_VENDOR="IBM"
+   # on OS/400, java -version does not contain IBM explicitly
+   elif $os400; then
+       JVM_VENDOR="IBM"
+   else
+       JVM_VENDOR="SUN"
+   fi
+   # echo "JVM vendor is $JVM_VENDOR"
+}
+
+setupDebugOptions() {
+    if [ "x$JAVA_OPTS" = "x" ]; then
+        JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+    fi
+    export JAVA_OPTS
+
+    # Set Debug options if enabled
+    if [ "x$KARAF_DEBUG" != "x" ]; then
+        # Use the defaults if JAVA_DEBUG_OPTS was not set
+        if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
+            JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
+        fi
+
+        JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
+        warn "Enabling Java debug options: $JAVA_DEBUG_OPTS"
+    fi
+}
+
+setupDefaults() {
+    DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM "
+
+    #Set the JVM_VENDOR specific JVM flags
+    if [ "$JVM_VENDOR" = "SUN" ]; then
+        #
+        # Check some easily accessible MIN/MAX params for JVM mem usage
+        #
+        if [ "x$JAVA_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:PermSize=$JAVA_PERM_MEM"
+        fi
+        if [ "x$JAVA_MAX_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:MaxPermSize=$JAVA_MAX_PERM_MEM"
+        fi
+        DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote"
+    elif [ "$JVM_VENDOR" = "IBM" ]; then
+        if $os400; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+        elif $aix; then
+            DEFAULT_JAVA_OPTS="-Xverify:none -Xlp $DEFAULT_JAVA_OPTS"
+        else
+            DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS"
+        fi
+    fi
+
+    # Add the jars in the lib dir
+    for file in $KARAF_HOME/lib/*.jar
+    do
+        if [ -z "$CLASSPATH" ]; then
+            CLASSPATH="$file"
+        else
+            CLASSPATH="$CLASSPATH:$file"
+        fi
+    done
+    DEFAULT_JAVA_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
+
+    ##
+    ## TODO: Move to conf/profiler/yourkit.{sh|cmd}
+    ##
+    # Uncomment to enable YourKit profiling
+    #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
+}
+
+init() {
+    # Determine if there is special OS handling we must perform
+    detectOS
+
+    # Unlimit the number of file descriptors if possible
+    unlimitFD
+
+    # Locate the Karaf home directory
+    locateHome
+
+    # Locate the Karaf base directory
+    locateBase
+
+    # Locate the Karaf data directory
+    locateData
+
+    # Setup the native library path
+    setupNativePath
+
+    # Locate the Java VM to execute
+    locateJava
+
+    # Determine the JVM vendor
+    detectJVM
+
+    # Setup default options
+    setupDefaults
+
+    # Install debug options
+    setupDebugOptions
+
+}
+
+run() {
+
+    CLASSPATH=${KARAF_HOME}/system/org/apache/karaf/admin/org.apache.karaf.admin.command/${project.version}/org.apache.karaf.admin.command-${project.version}.jar:${KARAF_HOME}/system/org/apache/karaf/admin/org.apache.karaf.admin.core/${project.version}/org.apache.karaf.admin.core-${project.version}.jar:${KARAF_HOME}/system/org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar:${KARAF_HOME}/system/org/apache/aries/blueprint/org.apache.aries.blueprint/${aries.blueprint.version}/org.apache.aries.blueprint-${aries.blueprint.version}.jar:${KARAF_HOME}/system/org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar:${KARAF_HOME}/system/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
+
+    if $cygwin; then
+        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
+        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
+        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+    fi
+
+    exec $JAVA $JAVA_OPTS -Dkaraf.instances="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.io.tmpdir="$KARAF_DATA/tmp" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $KARAF_OPTS $OPTS -classpath "$CLASSPATH" org.apache.karaf.admin.main.Execute "$@"
+}
+
+main() {
+    init
+    run "$@"
+}
+
+main "$@"
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin.bat
new file mode 100644
index 0000000..a2de751
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin.bat
@@ -0,0 +1,127 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+rem Sourcing environment settings for karaf similar to tomcats setenv
+SET KARAF_SCRIPT="admin.bat"
+if exist "%DIRNAME%setenv.bat" (
+  call "%DIRNAME%setenv.bat"
+)
+
+rem Check console window title. Set to Karaf by default
+if not "%KARAF_TITLE%" == "" (
+    title %KARAF_TITLE%
+) else (
+    title Karaf
+)
+
+rem Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+if "%JAVA_MIN_MEM%" == "" (
+    set JAVA_MIN_MEM=128M
+)
+if "%JAVA_MAX_MEM%" == "" (
+    set JAVA_MAX_MEM=512M
+)
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: "%KARAF_HOME%"
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: "%KARAF_BASE%"
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set "KARAF_BASE=%KARAF_HOME%"
+)
+
+if not "%KARAF_DATA%" == "" (
+    if not exist "%KARAF_DATA%" (
+        call :warn KARAF_DATA is not valid: "%KARAF_DATA%"
+        goto END
+    )
+)
+if "%KARAF_DATA%" == "" (
+    set "KARAF_DATA=%KARAF_BASE%\data"
+)
+
+set DEFAULT_JAVA_OPTS=
+set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
+
+rem Support for loading native libraries
+set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
+
+rem Setup the Java Virtual Machine
+if not "%JAVA%" == "" goto :Check_JAVA_END
+    set JAVA=java
+    if "%JAVA_HOME%" == "" call :warn JAVA_HOME not set; results may vary
+    if not "%JAVA_HOME%" == "" set JAVA=%JAVA_HOME%\bin\java
+    if not exist "%JAVA_HOME%" (
+        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
+        goto END
+    )
+:Check_JAVA_END
+
+if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS%
+
+if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END
+    rem Use the defaults if JAVA_DEBUG_OPTS was not set
+    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
+    
+    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
+    call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS%
+:KARAF_DEBUG_END
+
+set CLASSPATH=%KARAF_HOME%\system\org\apache\karaf\admin\org.apache.karaf.admin.command\${project.version}\org.apache.karaf.admin.command-${project.version}.jar;%KARAF_HOME%\system\org\apache\karaf\admin\org.apache.karaf.admin.core\${project.version}\org.apache.karaf.admin.core-${project.version}.jar;%KARAF_HOME%\system\org\apache\karaf\shell\org.apache.karaf.shell.console\${project.version}\org.apache.karaf.shell.console-${project.version}.jar;%KARAF_HOME%\system\org\apache\aries\blueprint\org.apache.aries.blueprint\${aries.blueprint.version}\org.apache.aries.blueprint-${aries.blueprint.version}.jar;%KARAF_HOME%\system\org\ops4j\pax\logging\pax-logging-api\${pax.logging.version}\pax-logging-api-${pax.logging.version}.jar;%KARAF_HOME%\system\org\apache\felix\org.apache.felix.framework\${felix.framework.version}\org.apache.felix.framework-${felix.framework.version}.jar
+
+:EXECUTE
+    if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8
+    if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8    
+    rem Execute the Java Virtual Machine
+    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dkaraf.instances="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.io.tmpdir="%KARAF_DATA%\tmp" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" %KARAF_OPTS% org.apache.karaf.admin.main.Execute %ARGS%
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client
new file mode 100644
index 0000000..ccd5ea1
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client
@@ -0,0 +1,329 @@
+#!/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.
+#
+
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+
+#
+# Sourcing environment settings for karaf similar to tomcats setenv
+#
+KARAF_SCRIPT="client"
+export KARAF_SCRIPT
+if [ -f "$DIRNAME/setenv" ]; then
+  . "$DIRNAME/setenv"
+fi
+
+#
+# Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+#
+if [ "x$JAVA_MIN_MEM" = "x" ]; then
+    JAVA_MIN_MEM=128M
+    export JAVA_MIN_MEM
+fi
+if [ "x$JAVA_MAX_MEM" = "x" ]; then
+    JAVA_MAX_MEM=512M
+    export JAVA_MAX_MEM
+fi
+
+warn() {
+    echo "${PROGNAME}: $*"
+}
+
+die() {
+    warn "$*"
+    exit 1
+}
+
+detectOS() {
+    # OS specific support (must be 'true' or 'false').
+    cygwin=false;
+    darwin=false;
+    aix=false;
+    os400=false;
+    case "`uname`" in
+        CYGWIN*)
+            cygwin=true
+            ;;
+        Darwin*)
+            darwin=true
+            ;;
+        AIX*)
+            aix=true
+            ;;
+        OS400*)
+            os400=true
+            ;;
+    esac
+    # For AIX, set an environment variable
+    if $aix; then
+         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
+         export IBM_JAVA_HEAPDUMP_TEXT=true
+         echo $LDR_CNTRL
+    fi
+}
+
+unlimitFD() {
+    # Use the maximum available, or set MAX_FD != -1 to use that
+    if [ "x$MAX_FD" = "x" ]; then
+        MAX_FD="maximum"
+    fi
+
+    # Increase the maximum file descriptors if we can
+    if [ "$os400" = "false" ] && [ "$cygwin" = "false" ]; then
+        MAX_FD_LIMIT=`ulimit -H -n`
+        if [ "$MAX_FD_LIMIT" != 'unlimited' ]; then 
+            if [ $? -eq 0 ]; then
+                if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then
+                    # use the system max
+                    MAX_FD="$MAX_FD_LIMIT"
+                fi
+
+                ulimit -n $MAX_FD > /dev/null
+                # echo "ulimit -n" `ulimit -n`
+                if [ $? -ne 0 ]; then
+                    warn "Could not set maximum file descriptor limit: $MAX_FD"
+                fi
+            else
+                warn "Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
+            fi
+        fi
+    fi
+}
+
+locateHome() {
+    if [ "x$KARAF_HOME" != "x" ]; then
+        warn "Ignoring predefined value for KARAF_HOME"
+    fi
+    
+    # In POSIX shells, CDPATH may cause cd to write to stdout
+    (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+    KARAF_HOME=`cd $DIRNAME/..; pwd`
+    if [ ! -d "$KARAF_HOME" ]; then
+        die "KARAF_HOME is not valid: $KARAF_HOME"
+    fi
+}
+
+locateBase() {
+    if [ "x$KARAF_BASE" != "x" ]; then
+        if [ ! -d "$KARAF_BASE" ]; then
+            die "KARAF_BASE is not valid: $KARAF_BASE"
+        fi
+    else
+        KARAF_BASE=$KARAF_HOME
+    fi
+}
+
+locateData() {
+    if [ "x$KARAF_DATA" != "x" ]; then
+        if [ ! -d "$KARAF_DATA" ]; then
+            die "KARAF_DATA is not valid: $KARAF_DATA"
+        fi
+    else
+        KARAF_DATA=$KARAF_BASE/data
+    fi
+}
+
+setupNativePath() {
+    # Support for loading native libraries
+    LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$KARAF_BASE/lib:$KARAF_HOME/lib"
+
+    # For Cygwin, set PATH from LD_LIBRARY_PATH
+    if $cygwin; then
+        LD_LIBRARY_PATH=`cygpath --path --windows "$LD_LIBRARY_PATH"`
+        PATH="$PATH;$LD_LIBRARY_PATH"
+        export PATH
+    fi
+    export LD_LIBRARY_PATH
+}
+
+pathCanonical() {
+    local dst="${1}"
+    while [ -h "${dst}" ] ; do
+        ls=`ls -ld "${dst}"`
+        link=`expr "$ls" : '.*-> \(.*\)$'`
+        if expr "$link" : '/.*' > /dev/null; then
+            dst="$link"
+        else
+            dst="`dirname "${dst}"`/$link"
+        fi
+    done
+    local bas=`basename "${dst}"`
+    local dir=`dirname "${dst}"`
+    if [ "$bas" != "$dir" ]; then
+        dst="`pathCanonical "$dir"`/$bas"
+    fi
+    echo "${dst}" | sed -e 's#//#/#g' -e 's#/./#/#g' -e 's#/[^/]*/../#/#g'
+}
+
+locateJava() {
+    # Setup the Java Virtual Machine
+    if $cygwin ; then
+        [ -n "$JAVA" ] && JAVA=`cygpath --unix "$JAVA"`
+        [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+    fi
+
+    if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
+        JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
+    fi
+    if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then
+        JAVA_HOME=`java-config --jre-home`
+    fi
+    if [ "x$JAVA" = "x" ]; then
+        if [ "x$JAVA_HOME" != "x" ]; then
+            if [ ! -d "$JAVA_HOME" ]; then
+                die "JAVA_HOME is not valid: $JAVA_HOME"
+            fi
+            JAVA="$JAVA_HOME/bin/java"
+        else
+            warn "JAVA_HOME not set; results may vary"
+            JAVA=`type java`
+            JAVA=`expr "$JAVA" : '.*is \(.*\)$'`
+            if [ "x$JAVA" = "x" ]; then
+                die "java command not found"
+            fi
+        fi
+    fi
+    if [ "x$JAVA_HOME" = "x" ]; then
+        JAVA_HOME="$(dirname $(dirname $(pathCanonical "$JAVA")))"
+    fi
+}
+
+detectJVM() {
+   #echo "`$JAVA -version`"
+   # This service should call `java -version`,
+   # read stdout, and look for hints
+   if $JAVA -version 2>&1 | grep "^IBM" ; then
+       JVM_VENDOR="IBM"
+   # on OS/400, java -version does not contain IBM explicitly
+   elif $os400; then
+       JVM_VENDOR="IBM"
+   else
+       JVM_VENDOR="SUN"
+   fi
+   # echo "JVM vendor is $JVM_VENDOR"
+}
+
+setupDebugOptions() {
+    if [ "x$JAVA_OPTS" = "x" ]; then
+        JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+    fi
+    export JAVA_OPTS
+
+    # Set Debug options if enabled
+    if [ "x$KARAF_DEBUG" != "x" ]; then
+        # Use the defaults if JAVA_DEBUG_OPTS was not set
+        if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
+            JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
+        fi
+
+        JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
+        warn "Enabling Java debug options: $JAVA_DEBUG_OPTS"
+    fi
+}
+
+setupDefaults() {
+    DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM "
+
+    #Set the JVM_VENDOR specific JVM flags
+    if [ "$JVM_VENDOR" = "SUN" ]; then
+        #
+        # Check some easily accessible MIN/MAX params for JVM mem usage
+        #
+        if [ "x$JAVA_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:PermSize=$JAVA_PERM_MEM"
+        fi
+        if [ "x$JAVA_MAX_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:MaxPermSize=$JAVA_MAX_PERM_MEM"
+        fi
+        DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote"
+    elif [ "$JVM_VENDOR" = "IBM" ]; then
+        if $os400; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+        elif $aix; then
+            DEFAULT_JAVA_OPTS="-Xverify:none -Xlp $DEFAULT_JAVA_OPTS"
+        else
+            DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS"
+        fi
+    fi
+
+    # Add the jars in the lib dir
+    CLASSPATH="$KARAF_HOME/lib/bin/karaf-client.jar"
+    CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/sshd/sshd-core/${sshd.version}/sshd-core-${sshd.version}.jar"
+    CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/mina/mina-core/${mina.version}/mina-core-${mina.version}.jar"
+    CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar"
+
+    DEFAULT_JAVA_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
+
+    ##
+    ## TODO: Move to conf/profiler/yourkit.{sh|cmd}
+    ##
+    # Uncomment to enable YourKit profiling
+    #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
+}
+
+init() {
+    # Determine if there is special OS handling we must perform
+    detectOS
+
+    # Unlimit the number of file descriptors if possible
+    unlimitFD
+
+    # Locate the Karaf home directory
+    locateHome
+
+    # Locate the Karaf base directory
+    locateBase
+
+    # Locate the Karaf data directory
+    locateData
+
+    # Setup the native library path
+    setupNativePath
+
+    # Locate the Java VM to execute
+    locateJava
+
+    # Determine the JVM vendor
+    detectJVM
+
+    # Setup default options
+    setupDefaults
+
+    # Install debug options
+    setupDebugOptions
+
+}
+
+run() {
+
+    if $cygwin; then
+        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
+        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
+        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+    fi
+
+    exec $JAVA $JAVA_OPTS -Dkaraf.instances="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.io.tmpdir="$KARAF_DATA/tmp" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $KARAF_OPTS $OPTS -classpath "$CLASSPATH" org.apache.karaf.client.Main "$@"
+}
+
+main() {
+    init
+    run "$@"
+}
+
+main "$@"
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client.bat
new file mode 100644
index 0000000..359ebfa
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client.bat
@@ -0,0 +1,130 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+rem Sourcing environment settings for karaf similar to tomcats setenv
+SET KARAF_SCRIPT="client.bat"
+if exist "%DIRNAME%setenv.bat" (
+  call "%DIRNAME%setenv.bat"
+)
+
+rem Check console window title. Set to Karaf by default
+if not "%KARAF_TITLE%" == "" (
+    title %KARAF_TITLE%
+) else (
+    title Karaf
+)
+
+rem Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+if "%JAVA_MIN_MEM%" == "" (
+    set JAVA_MIN_MEM=128M
+)
+if "%JAVA_MAX_MEM%" == "" (
+    set JAVA_MAX_MEM=512M
+)
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: "%KARAF_HOME%"
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: "%KARAF_BASE%"
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set "KARAF_BASE=%KARAF_HOME%"
+)
+
+if not "%KARAF_DATA%" == "" (
+    if not exist "%KARAF_DATA%" (
+        call :warn KARAF_DATA is not valid: "%KARAF_DATA%"
+        goto END
+    )
+)
+if "%KARAF_DATA%" == "" (
+    set "KARAF_DATA=%KARAF_BASE%\data"
+)
+
+set DEFAULT_JAVA_OPTS=
+set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
+
+rem Support for loading native libraries
+set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
+
+rem Setup the Java Virtual Machine
+if not "%JAVA%" == "" goto :Check_JAVA_END
+    set JAVA=java
+    if "%JAVA_HOME%" == "" call :warn JAVA_HOME not set; results may vary
+    if not "%JAVA_HOME%" == "" set JAVA=%JAVA_HOME%\bin\java
+    if not exist "%JAVA_HOME%" (
+        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
+        goto END
+    )
+:Check_JAVA_END
+
+if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS%
+
+if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END
+    rem Use the defaults if JAVA_DEBUG_OPTS was not set
+    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
+    
+    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
+    call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS%
+:KARAF_DEBUG_END
+
+set CLASSPATH=%KARAF_HOME%\lib\bin\karaf-client.jar
+set CLASSPATH=%CLASSPATH%;%KARAF_HOME%\system\org\apache\sshd\sshd-core\${sshd.version}\sshd-core-${sshd.version}.jar
+set CLASSPATH=%CLASSPATH%;%KARAF_HOME%\system\org\apache\mina\mina-core\${mina.version}\mina-core-${mina.version}.jar
+set CLASSPATH=%CLASSPATH%;%KARAF_HOME%\system\org\apache\karaf\shell\org.apache.karaf.shell.console\${project.version}\org.apache.karaf.shell.console-${project.version}.jar
+
+:EXECUTE
+    if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8 %9
+    if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8 %9
+    rem Execute the Java Virtual Machine
+    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dkaraf.instances="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.io.tmpdir="%KARAF_DATA%\tmp" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" %KARAF_OPTS% org.apache.karaf.client.Main %ARGS%
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell
new file mode 100644
index 0000000..4285d9d
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell
@@ -0,0 +1,327 @@
+#!/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.
+#
+
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+
+#
+# Sourcing environment settings for karaf similar to tomcats setenv
+#
+export KARAF_SCRIPT="shell"
+if [ -e "$DIRNAME/setenv" ]; then
+  . "$DIRNAME/setenv"
+fi
+
+#
+# Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+#
+if [ "x$JAVA_MIN_MEM" = "x" ]; then
+    JAVA_MIN_MEM=128M
+    export JAVA_MIN_MEM
+fi
+if [ "x$JAVA_MAX_MEM" = "x" ]; then
+    JAVA_MAX_MEM=512M
+    export JAVA_MAX_MEM
+fi
+
+warn() {
+    echo "${PROGNAME}: $*"
+}
+
+die() {
+    warn "$*"
+    exit 1
+}
+
+detectOS() {
+    # OS specific support (must be 'true' or 'false').
+    cygwin=false;
+    darwin=false;
+    aix=false;
+    os400=false;
+    case "`uname`" in
+        CYGWIN*)
+            cygwin=true
+            ;;
+        Darwin*)
+            darwin=true
+            ;;
+        AIX*)
+            aix=true
+            ;;
+        OS400*)
+            os400=true
+            ;;
+    esac
+    # For AIX, set an environment variable
+    if $aix; then
+         export LDR_CNTRL=MAXDATA=0xB0000000@DSA
+         export IBM_JAVA_HEAPDUMP_TEXT=true
+         echo $LDR_CNTRL
+    fi
+}
+
+unlimitFD() {
+    # Use the maximum available, or set MAX_FD != -1 to use that
+    if [ "x$MAX_FD" = "x" ]; then
+        MAX_FD="maximum"
+    fi
+
+    # Increase the maximum file descriptors if we can
+    if [ "$os400" = "false" ] && [ "$cygwin" = "false" ]; then
+        MAX_FD_LIMIT=`ulimit -H -n`
+        if [ "$MAX_FD_LIMIT" != 'unlimited' ]; then 
+            if [ $? -eq 0 ]; then
+                if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then
+                    # use the system max
+                    MAX_FD="$MAX_FD_LIMIT"
+                fi
+
+                ulimit -n $MAX_FD > /dev/null
+                # echo "ulimit -n" `ulimit -n`
+                if [ $? -ne 0 ]; then
+                    warn "Could not set maximum file descriptor limit: $MAX_FD"
+                fi
+            else
+                warn "Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
+            fi
+        fi
+    fi
+}
+
+locateHome() {
+    if [ "x$KARAF_HOME" != "x" ]; then
+        warn "Ignoring predefined value for KARAF_HOME"
+    fi
+
+    # In POSIX shells, CDPATH may cause cd to write to stdout
+    (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+    KARAF_HOME=`cd $DIRNAME/..; pwd`
+    if [ ! -d "$KARAF_HOME" ]; then
+        die "KARAF_HOME is not valid: $KARAF_HOME"
+    fi
+}
+
+locateBase() {
+    if [ "x$KARAF_BASE" != "x" ]; then
+        if [ ! -d "$KARAF_BASE" ]; then
+            die "KARAF_BASE is not valid: $KARAF_BASE"
+        fi
+    else
+        KARAF_BASE=$KARAF_HOME
+    fi
+}
+
+locateData() {
+    if [ "x$KARAF_DATA" != "x" ]; then
+        if [ ! -d "$KARAF_DATA" ]; then
+            die "KARAF_DATA is not valid: $KARAF_DATA"
+        fi
+    else
+        KARAF_DATA=$KARAF_BASE/data
+    fi
+}
+
+setupNativePath() {
+    # Support for loading native libraries
+    LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:$KARAF_BASE/lib:$KARAF_HOME/lib"
+
+    # For Cygwin, set PATH from LD_LIBRARY_PATH
+    if $cygwin; then
+        LD_LIBRARY_PATH=`cygpath --path --windows "$LD_LIBRARY_PATH"`
+        PATH="$PATH;$LD_LIBRARY_PATH"
+        export PATH
+    fi
+    export LD_LIBRARY_PATH
+}
+
+pathCanonical() {
+    local dst="${1}"
+    while [ -h "${dst}" ] ; do
+        ls=`ls -ld "${dst}"`
+        link=`expr "$ls" : '.*-> \(.*\)$'`
+        if expr "$link" : '/.*' > /dev/null; then
+            dst="$link"
+        else
+            dst="`dirname "${dst}"`/$link"
+        fi
+    done
+    local bas=`basename "${dst}"`
+    local dir=`dirname "${dst}"`
+    if [ "$bas" != "$dir" ]; then
+        dst="`pathCanonical "$dir"`/$bas"
+    fi
+    echo "${dst}" | sed -e 's#//#/#g' -e 's#/./#/#g' -e 's#/[^/]*/../#/#g'
+}
+
+locateJava() {
+    # Setup the Java Virtual Machine
+    if $cygwin ; then
+        [ -n "$JAVA" ] && JAVA=`cygpath --unix "$JAVA"`
+        [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+    fi
+
+    if [ "x$JAVA_HOME" = "x" ] && [ "$darwin" = "true" ]; then
+        JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
+    fi
+    if [ "x$JAVA" = "x" ] && [ -r /etc/gentoo-release ] ; then
+        JAVA_HOME=`java-config --jre-home`
+    fi
+    if [ "x$JAVA" = "x" ]; then
+        if [ "x$JAVA_HOME" != "x" ]; then
+            if [ ! -d "$JAVA_HOME" ]; then
+                die "JAVA_HOME is not valid: $JAVA_HOME"
+            fi
+            JAVA="$JAVA_HOME/bin/java"
+        else
+            warn "JAVA_HOME not set; results may vary"
+            JAVA=`type java`
+            JAVA=`expr "$JAVA" : '.*is \(.*\)$'`
+            if [ "x$JAVA" = "x" ]; then
+                die "java command not found"
+            fi
+        fi
+    fi
+    if [ "x$JAVA_HOME" = "x" ]; then
+        JAVA_HOME="$(dirname $(dirname $(pathCanonical "$JAVA")))"
+    fi
+}
+
+detectJVM() {
+   #echo "`$JAVA -version`"
+   # This service should call `java -version`,
+   # read stdout, and look for hints
+   if $JAVA -version 2>&1 | grep "^IBM" ; then
+       JVM_VENDOR="IBM"
+   # on OS/400, java -version does not contain IBM explicitly
+   elif $os400; then
+       JVM_VENDOR="IBM"
+   else
+       JVM_VENDOR="SUN"
+   fi
+   # echo "JVM vendor is $JVM_VENDOR"
+}
+
+setupDebugOptions() {
+    if [ "x$JAVA_OPTS" = "x" ]; then
+        JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+    fi
+    export JAVA_OPTS
+
+    # Set Debug options if enabled
+    if [ "x$KARAF_DEBUG" != "x" ]; then
+        # Use the defaults if JAVA_DEBUG_OPTS was not set
+        if [ "x$JAVA_DEBUG_OPTS" = "x" ]; then
+            JAVA_DEBUG_OPTS="$DEFAULT_JAVA_DEBUG_OPTS"
+        fi
+
+        JAVA_OPTS="$JAVA_DEBUG_OPTS $JAVA_OPTS"
+        warn "Enabling Java debug options: $JAVA_DEBUG_OPTS"
+    fi
+}
+
+setupDefaults() {
+    DEFAULT_JAVA_OPTS="-Xms$JAVA_MIN_MEM -Xmx$JAVA_MAX_MEM "
+
+    #Set the JVM_VENDOR specific JVM flags
+    if [ "$JVM_VENDOR" = "SUN" ]; then
+        #
+        # Check some easily accessible MIN/MAX params for JVM mem usage
+        #
+        if [ "x$JAVA_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:PermSize=$JAVA_PERM_MEM"
+        fi
+        if [ "x$JAVA_MAX_PERM_MEM" != "x" ]; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS -XX:MaxPermSize=$JAVA_MAX_PERM_MEM"
+        fi
+        DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote"
+    elif [ "$JVM_VENDOR" = "IBM" ]; then
+        if $os400; then
+            DEFAULT_JAVA_OPTS="$DEFAULT_JAVA_OPTS"
+        elif $aix; then
+            DEFAULT_JAVA_OPTS="-Xverify:none -Xlp $DEFAULT_JAVA_OPTS"
+        else
+            DEFAULT_JAVA_OPTS="-Xverify:none $DEFAULT_JAVA_OPTS"
+        fi
+    fi
+
+    # Setup classpath
+    CLASSPATH="$KARAF_HOME/system/org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar"
+    CLASSPATH="$CLASSPATH:$KARAF_HOME/system/org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar"
+
+    DEFAULT_JAVA_DEBUG_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
+
+    ##
+    ## TODO: Move to conf/profiler/yourkit.{sh|cmd}
+    ##
+    # Uncomment to enable YourKit profiling
+    #DEFAULT_JAVA_DEBUG_OPTS="-Xrunyjpagent"
+}
+
+init() {
+    # Determine if there is special OS handling we must perform
+    detectOS
+
+    # Unlimit the number of file descriptors if possible
+    unlimitFD
+
+    # Locate the Karaf home directory
+    locateHome
+
+    # Locate the Karaf base directory
+    locateBase
+
+    # Locate the Karaf data directory
+    locateData
+
+    # Setup the native library path
+    setupNativePath
+
+    # Locate the Java VM to execute
+    locateJava
+
+    # Determine the JVM vendor
+    detectJVM
+
+    # Setup default options
+    setupDefaults
+
+    # Install debug options
+    setupDebugOptions
+
+}
+
+run() {
+
+    if $cygwin; then
+        KARAF_HOME=`cygpath --path --windows "$KARAF_HOME"`
+        KARAF_BASE=`cygpath --path --windows "$KARAF_BASE"`
+        CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+    fi
+
+    exec $JAVA $JAVA_OPTS -Dkaraf.instances="${KARAF_HOME}/instances" -Dkaraf.home="$KARAF_HOME" -Dkaraf.base="$KARAF_BASE" -Djava.io.tmpdir="$KARAF_DATA/tmp" -Djava.util.logging.config.file=$KARAF_BASE/etc/java.util.logging.properties $KARAF_OPTS $OPTS -classpath "$CLASSPATH" org.apache.karaf.shell.console.Main --classpath="$KARAF_HOME/system" "$@"
+}
+
+main() {
+    init
+    run "$@"
+}
+
+main "$@"
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell.bat b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell.bat
new file mode 100644
index 0000000..a7a32c5
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell.bat
@@ -0,0 +1,128 @@
+@echo off
+rem
+rem
+rem    Licensed to the Apache Software Foundation (ASF) under one or more
+rem    contributor license agreements.  See the NOTICE file distributed with
+rem    this work for additional information regarding copyright ownership.
+rem    The ASF licenses this file to You under the Apache License, Version 2.0
+rem    (the "License"); you may not use this file except in compliance with
+rem    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, software
+rem    distributed under the License is distributed on an "AS IS" BASIS,
+rem    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem    See the License for the specific language governing permissions and
+rem    limitations under the License.
+rem
+
+if not "%ECHO%" == "" echo %ECHO%
+
+setlocal
+set DIRNAME=%~dp0%
+set PROGNAME=%~nx0%
+set ARGS=%*
+
+rem Sourcing environment settings for karaf similar to tomcats setenv
+SET KARAF_SCRIPT="shell.bat"
+if exist "%DIRNAME%setenv.bat" (
+  call "%DIRNAME%setenv.bat"
+)
+
+rem Check console window title. Set to Karaf by default
+if not "%KARAF_TITLE%" == "" (
+    title %KARAF_TITLE%
+) else (
+    title Karaf
+)
+
+rem Check/Set up some easily accessible MIN/MAX params for JVM mem usage
+if "%JAVA_MIN_MEM%" == "" (
+    set JAVA_MIN_MEM=128M
+)
+if "%JAVA_MAX_MEM%" == "" (
+    set JAVA_MAX_MEM=512M
+)
+
+goto BEGIN
+
+:warn
+    echo %PROGNAME%: %*
+goto :EOF
+
+:BEGIN
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+if not "%KARAF_HOME%" == "" (
+    call :warn Ignoring predefined value for KARAF_HOME
+)
+set KARAF_HOME=%DIRNAME%..
+if not exist "%KARAF_HOME%" (
+    call :warn KARAF_HOME is not valid: "%KARAF_HOME%"
+    goto END
+)
+
+if not "%KARAF_BASE%" == "" (
+    if not exist "%KARAF_BASE%" (
+       call :warn KARAF_BASE is not valid: "%KARAF_BASE%"
+       goto END
+    )
+)
+if "%KARAF_BASE%" == "" (
+  set "KARAF_BASE=%KARAF_HOME%"
+)
+
+if not "%KARAF_DATA%" == "" (
+    if not exist "%KARAF_DATA%" (
+        call :warn KARAF_DATA is not valid: "%KARAF_DATA%"
+        goto END
+    )
+)
+if "%KARAF_DATA%" == "" (
+    set "KARAF_DATA=%KARAF_BASE%\data"
+)
+
+set DEFAULT_JAVA_OPTS=
+set DEFAULT_JAVA_DEBUG_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
+
+rem Support for loading native libraries
+set PATH=%PATH%;%KARAF_BASE%\lib;%KARAF_HOME%\lib
+
+rem Setup the Java Virtual Machine
+if not "%JAVA%" == "" goto :Check_JAVA_END
+    set JAVA=java
+    if "%JAVA_HOME%" == "" call :warn JAVA_HOME not set; results may vary
+    if not "%JAVA_HOME%" == "" set JAVA=%JAVA_HOME%\bin\java
+    if not exist "%JAVA_HOME%" (
+        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
+        goto END
+    )
+:Check_JAVA_END
+
+if "%JAVA_OPTS%" == "" set JAVA_OPTS=%DEFAULT_JAVA_OPTS%
+
+if "%KARAF_DEBUG%" == "" goto :KARAF_DEBUG_END
+    rem Use the defaults if JAVA_DEBUG_OPTS was not set
+    if "%JAVA_DEBUG_OPTS%" == "" set JAVA_DEBUG_OPTS=%DEFAULT_JAVA_DEBUG_OPTS%
+    
+    set "JAVA_OPTS=%JAVA_DEBUG_OPTS% %JAVA_OPTS%"
+    call :warn Enabling Java debug options: %JAVA_DEBUG_OPTS%
+:KARAF_DEBUG_END
+
+set CLASSPATH=%KARAF_HOME%\system\org\apache\karaf\shell\org.apache.karaf.shell.console\${project.version}\org.apache.karaf.shell.console-${project.version}.jar
+set CLASSPATH=%CLASSPATH%;%KARAF_HOME%\system\org\ops4j\pax\logging\pax-logging-api\${pax.logging.version}\pax-logging-api-${pax.logging.version}.jar
+
+:EXECUTE
+    if "%SHIFT%" == "true" SET ARGS=%2 %3 %4 %5 %6 %7 %8
+    if not "%SHIFT%" == "true" SET ARGS=%1 %2 %3 %4 %5 %6 %7 %8
+    rem Execute the Java Virtual Machine
+    "%JAVA%" %JAVA_OPTS% %OPTS% -classpath "%CLASSPATH%" -Dkaraf.instances="%KARAF_HOME%\instances" -Dkaraf.home="%KARAF_HOME%" -Dkaraf.base="%KARAF_BASE%" -Djava.io.tmpdir="%KARAF_DATA%\tmp" -Djava.util.logging.config.file="%KARAF_BASE%\etc\java.util.logging.properties" %KARAF_OPTS% org.apache.karaf.shell.console.Main --classpath="%KARAF_HOME%\system" %ARGS%
+
+rem # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+:END
+
+endlocal
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/command/README.txt b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/command/README.txt
new file mode 100644
index 0000000..af21424
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/command/README.txt
@@ -0,0 +1,61 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+EXTEND CONSOLE COMMAND EXAMPLE
+==============================
+
+Purpose
+-------
+Demonstrate how to extend a console command. 
+
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.5 or higher.
+
+   - Apache Maven 2.2.1 or higher.
+
+
+Building and Deploying
+----------------------
+This example will produce a bundle, containing a custom command
+and its command completer.
+
+To build the demo console command invoke the following command:
+
+  mvn install
+
+To deploy the console command invoke the following command on the Karaf
+console: 
+
+  karaf@root> osgi:install -s mvn:org.apache.karaf.demos/org.apache.karaf.demos.command/${pom.version}
+
+Upon successful installation the bundle ID will be presented.
+
+To test the custom command type the following on the Karaf console:
+
+  karaf@root> mycommand:hello 
+  Executing My Command Demo
+  karaf@root>
+
+To test the command completer press tab after typing the first few
+characters of 'mycommand'.
+
+For more information on Extending Karaf Console Commands please visit:
+http://karaf.apache.org/manual/latest-2.2.x/developers-guide/extending-console.html
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/bundle/README.TXT b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/bundle/README.TXT
new file mode 100644
index 0000000..9789247
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/bundle/README.TXT
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+Karaf Bundle EXAMPLE
+====================
+
+Purpose
+-------
+Demonstrate how to build an OSGi Bundle.
+
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.6 or higher.
+
+   - Apache Maven 2.2.1 or higher.
+
+
+Building and Deploying
+----------------------
+This example will produce an OSGi bundle (a special type
+of Java Archive (jar).
+
+To build the demo bundle invoke the following command:
+
+  mvn install
+
+To deploy the newly created bundle you may either directly
+copy the generated my-bundle-1.0.0-SNAPSHOT.jar to the deploy
+directory, or issue the following command on the Karaf
+console:
+
+  karaf@root> osgi:install -s mvn:org.apache.karaf.demos.deployer.bundle/my-bundle/1.0.0-SNAPSHOT
+  Starting the Apache Karaf demo bundle
+  Bundle ID: 51 
+
+Upon installation the bundle was immediately started, printing
+the message in its activator's start method. To further verify
+its successful deployment invoke the following:
+
+  karaf@root> list
+  START LEVEL 100 , List Threshold: 50
+     ID   State         Blueprint      Level  Name
+  [  51] [Active     ] [            ] [   60] Apache Karaf :: Demos :: Deployer :: Bundle (1.0.0.SNAPSHOT)
+
+The bundle may be started or stopped via the start and stop
+commands. A message will be printed to the console each time
+this occurs. 
+
+Note: Using Karaf archetype to generate a bundle project:
+---------------------------------------------------------
+
+The karaf-bundle-archetype creates a Maven skeleton project
+to build an OSGi bundle with Activator (a special callback
+class for bundle start/stop).
+
+On the command line issue the following command to create
+a bundle project:
+
+  mvn archetype:generate \
+      -DarchetypeGroupId=org.apache.karaf.archetypes \ 
+      -DarchetypeArtifactId=karaf-bundle-archetype \ 
+      -DarchetypeVersion=${version} \ 
+      -DgroupId=org.myorg \
+      -DartifactId=my-bundle \ 
+      -Dversion=1.0-SNAPSHOT \ 
+      -Dpackage=org.myorg.package
+
+For more information on using the karaf-bundle-archetype
+please visit: http://karaf.apache.org/manual/latest-2.2.x/developers-guide/archetypes.html
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/feature/README.TXT b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/feature/README.TXT
new file mode 100644
index 0000000..19afc58
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/feature/README.TXT
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+Karaf Feature EXAMPLE
+=====================
+
+Purpose
+-------
+Demonstrate how to build a Feature.
+
+A feature is a useful tool for OSGi developers to 
+specify multiple bundles (and possibly other features)
+into a larger deployment group. In this way a feature
+can be thought of as configuring together components
+into an application. 
+
+Please note that a feature file only specifies resources
+to be deployed together, for a deployable artifact that
+contains all resources please see Apache Karaf Archives. 
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.6 or higher.
+
+   - Apache Maven 2.2.1 or higher.
+
+
+Building and Deploying
+----------------------
+This example will produce a feature xml file. This feature
+picks up one bundle, commons-collections, for deployment. 
+
+To build the demo feature invoke the following command:
+
+  mvn install
+
+To deploy the feature you may copy the feature xml file
+generated in target/classes folder to the Karaf deploy
+folder OR, you may invoke the following commands from 
+the Karaf console:
+
+  karaf@root> features:addurl file:/Path/To/Karaf/demos/deployer/feature/target/classess/feature.xml
+  karaf@root> features:list | grep commons-collections
+  [uninstalled] [0.0.0          ] commons-collections           repo-0   
+  karaf@root> features:install commons-collection
+
+To verify the feature has been succesfully installed issue
+the following command:
+
+  karaf@root> features:list | grep commons-collections
+  [installed  ] [0.0.0          ] commons-collections           repo-0 
+
+To verify the commons-cllections bundle is active invoke:
+
+  karaf@root> list
+  START LEVEL 100 , List Threshold: 50
+     ID   State         Blueprint      Level  Name
+  [  50] [Active     ] [            ] [   60] Commons Collections (3.2.1)
+
+
+Note: Using Karaf archetype to generate a feature project:
+---------------------------------------------------------
+
+The karaf-feature-archetype creates a Maven skeleton project
+that will generate a feature xml file.
+
+On the command line issue the following command to create
+a feature project:
+
+  mvn archetype:generate \
+      -DarchetypeGroupId=org.apache.karaf.archetypes \ 
+      -DarchetypeArtifactId=karaf-feature-archetype \ 
+      -DarchetypeVersion=${version} \ 
+      -DgroupId=org.myorg \
+      -DartifactId=my-feature \ 
+      -Dversion=1.0.0-SNAPSHOT \ 
+      -Dpackage=org.myorg.package
+
+For more information on using the karaf-bundle-archetype
+please visit: http://karaf.apache.org/manual/latest-2.2.x/developers-guide/archetypes.html
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/kar/README.txt b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/kar/README.txt
new file mode 100644
index 0000000..bbf5c82
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/kar/README.txt
@@ -0,0 +1,72 @@
+/* 
+ * 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.
+ */
+
+Karaf Archive (kar)  EXAMPLE
+==============================
+
+Purpose
+-------
+Demonstrate how to create Karaf Archives.
+
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.6 or higher.
+
+   - Apache Maven 2.2.1 or higher.
+
+
+Building and Deploying
+----------------------
+This example will produce a kar, containing a bundle. 
+
+To build the demo kar invoke the following command:
+
+  mvn install
+
+Karaf provides a KAR deployer:
+
+  karaf@root> la | grep -i archive
+  [  15] [Active     ] [Created     ] [   30] Apache Karaf :: Deployer :: Karaf Archive (.kar) (${pom.version})
+
+It's a core deployer (you don't need to install additional features).
+
+To deploy a kar, simply drop the kar into the deploy directory. 
+The KAR Deployer will deploy all the kar content starting from
+the features descriptor.
+
+The KAR Deployer creates a repository dedicated to your kar 
+(in the $/local-repo) and register the features descriptor.
+You can now see your feature available for installation:
+
+  karaf@root> feature:list | grep -i my-kar
+  [installed] [${pom.version}             ] my-kar                        repo-0
+
+Now you can use any commands available on features:
+
+  karaf@root> feature:info my-kar
+  Feature my-kar ${pom.version}
+  Feature has no configuration
+  Feature has no configuration files
+  Feature has no dependencies.
+  Feature contains followed bundles:
+    mvn:commons-collections/commons-collections/3.2.1
+
+For more information on Karaf Archives please visit:
+http://karaf.apache.org/manual/latest-2.2.x/users-guide/kar.html
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/wrap/README.txt b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/wrap/README.txt
new file mode 100644
index 0000000..9b86fe5
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/wrap/README.txt
@@ -0,0 +1,61 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+Creating Bundles for Third Party Dependencies EXAMPLE
+=====================================================
+
+Purpose
+-------
+Demonstrate how to create a wrap bundle for a third
+party dependency.
+
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.6 or higher.
+
+   - Apache Maven 2.2.1 or higher.
+
+
+Building and Deploying
+----------------------
+This example will produce a bundle. 
+
+To build the wrap demo invoke the following command:
+
+  mvn install
+
+In the Maven POM file a shade plugin has been configured
+to take an existing jar and package it as a jar bundle. In
+this case the bundle produced exports the commons lang
+packages.
+
+The generated bundle deploys as per usual syntax:
+
+  karaf@root> osgi:install -s mvn:osgi.commons-lang/osgi.commons-lang/2.4
+
+Once installed you may confirm its operation by invoking
+the following command:
+
+  karaf@root> list | grep -i osgi.commons-lang 
+  [  50] [Active     ] [            ] [   60] Apache Karaf :: Demos :: Deployer :: Wrap Bundle osgi.commons-lang (2.4.0)
+
+For more information on creating bundles for third party 
+dependencies please visit:
+http://karaf.apache.org/manual/latest-2.2.x/developers-guide/creating-bundles.html
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/dump/README.txt b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/dump/README.txt
new file mode 100644
index 0000000..32e9e21
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/dump/README.txt
@@ -0,0 +1,68 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+DUMP PROVIDER EXAMPLE
+======================
+
+Purpose
+-------
+This demo provider creates images in dump destination which contains 
+screenshots from all attached displays.
+
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.5 or higher.
+
+   - Apache Maven 2.2.1 or higher.
+
+
+Building and Deploying
+----------------------
+
+To build the dump provider demo type the following command:
+
+  mvn install
+
+This will create in the target folder dump-${pom.version}.jar.
+
+To install, copy dump-${pom.version}.jar into Karaf's deploy folder.
+
+To execute the demo issue the create-dump command as follows:
+
+  karaf@root> create-dump
+  Diagnostic dump created.
+  karaf@root> 
+
+This will create a time stamped zip folder which contains the
+Karaf log, a list of bundles, threads, features, and a subfolder
+containing screenshots of attached displays.
+
+Unzipping a sample dump file produces:
+
+  unzip 2012-02-06_185732.zip 
+  Archive:  2012-02-06_185732.zip
+  inflating: log/karaf.log           
+  inflating: bundles.txt             
+  inflating: screenshot/display_0.png  
+  inflating: screenshot/display_1.png  
+  inflating: threads.txt             
+  inflating: features.txt
+
+Note: The above system had two displays.
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/web/README.txt b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/web/README.txt
new file mode 100644
index 0000000..ca139f0
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/demos/web/README.txt
@@ -0,0 +1,116 @@
+/*
+ * 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.
+ */
+
+EMBEDDING KARAF IN A WEB APPLICATION
+====================================
+
+Purpose
+-------
+To embed Karaf in a web application.
+
+
+Prerequisites for Running the Example
+-------------------------------------
+You must have the following installed on your machine:
+
+  - JDK 1.5 or higher
+
+  - Maven 2.0.9 or higher
+
+
+Building and Deploying
+----------------------
+You can build and deploy this example in two ways:
+
+- A. Using Jetty: Quick and Easy
+  This option is useful if you want to see the example up and
+  running quickly.
+   
+- B. Using Your Favorite Web Container
+  This option is useful if you want to see Karaf running
+  as a web application inside your favorite web container.
+
+
+A. Using Jetty: Quick and Easy
+------------------------------
+To build the example and deploy to Jetty, complete the
+following steps:
+
+1. In a command prompt/shell, change to the directory
+   that contains this README.txt file.
+
+2. Enter the following Maven command:
+
+     mvn package jetty:run
+
+This Maven command builds the example web application, starts
+Jetty and deploys the web application to Jetty. Once complete,
+you should see the following printed to the console:
+
+[INFO] Started Jetty Server
+[INFO] Starting scanner at interval of 10 seconds.
+
+Running a Client
+----------------
+To test the example, you can use the Apache Karaf client
+to connect to the server and issue a Karaf command. For example,
+try executing the "features:list" command as follows:
+
+1. In a command prompt/shell, change to your product
+   installation directory.
+
+2. Run the following commands:
+
+    Unix:
+        ${KARAF_HOME}/bin/client features:list
+
+    Windows:
+        %KARAF_HOME%\bin\client.bat features:list
+
+    Using JDK:
+        java -jar lib/bin/karaf-client.jar features:list
+
+In this case, you should see output similar to the following:
+
+State         Version       Name       Repository
+[uninstalled] [2.5.6.SEC01] spring     karaf-${project.version}
+[uninstalled] [1.2.0      ] spring-dm  karaf-${project.version}
+[uninstalled] [${pom.version}] wrapper    karaf-${pom.version}
+[uninstalled] [${pom.version}] obr        karaf-${pom.version}
+[uninstalled] [${pom.version}] http       karaf-${pom.version}
+[uninstalled] [${pom.version}] webconsole karaf-${pom.version}
+[installed  ] [${pom.version}] ssh        karaf-${pom.version}
+[installed  ] [${pom.version}] management karaf-${pom.version}
+
+
+B. Using Your Favorite Web Container
+------------------------------------
+You can deploy the web application to your favorite web
+container, by completing the following steps:
+
+1. In a command prompt/shell, change to the directory
+   that contains this README.txt file.
+   
+2. Enter the following command:
+
+     mvn package
+     
+Maven builds the web application, web-${project.version}.war, and
+saves it in the target directory of this example. Deploy this
+WAR file to your favorite web container. Once the application
+is running, you can test it using the Apache Karaf client
+as described in the "Running a Client" section above.
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/config.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/config.properties
new file mode 100644
index 0000000..1deacec
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/config.properties
@@ -0,0 +1,111 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# This file lists Karaf default settings for this particular version of Karaf.
+# For easier maintenance when upgrading Karaf and to better document which
+# default values have changed, it is recommended to place any changes to
+# these values in a custom.properties file in the same folder as this file.
+# Each value specified in custom.properties will override the default value
+# here.
+#
+
+#
+# Properties file inclusions (as a space separated list of relative paths)
+# Included files will override the values specified in this file
+# NB: ${includes} properties files are mandatory, it means that Karaf will not start
+# if the include file is not found
+#
+${includes} = jre.properties custom.properties
+
+#
+# Properties file inclusions (as a space separated list of relative paths)
+# Included files will override the values specified in this file
+# NB: ${optionals} properties files are optionals, it means that Karaf will just
+# display a warning message but the bootstrap will be performed
+#
+# ${optionals} = my.properties
+
+
+#
+# Framework selection properties
+#
+karaf.framework=felix
+
+#
+# Location of the OSGi frameworks
+#
+karaf.framework.equinox=${karaf.default.repository}/org/eclipse/osgi/${equinox.version}/osgi-${equinox.version}.jar
+karaf.framework.felix=${karaf.default.repository}/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
+
+#
+# Framework config properties.
+#
+org.osgi.framework.system.packages=org.osgi.framework; version=1.5.0, \
+ org.osgi.framework.launch; version=1.0.0, \
+ org.osgi.framework.hooks.service; version=1.0.0, \
+ org.osgi.service.packageadmin; version=1.2.0, \
+ org.osgi.service.startlevel; version=1.1.0, \
+ org.osgi.service.url; version=1.0.0, \
+ org.osgi.util.tracker; version=1.4.0, \
+ org.apache.karaf.jaas.boot; version=${karaf.osgi.version}, \
+ org.apache.karaf.version; version=${karaf.osgi.version}, \
+ ${jre-${java.specification.version}}
+
+org.osgi.framework.system.packages.extra=
+
+# javax.transaction is needed to avoid class loader constraint violation when using javax.sql  
+org.osgi.framework.bootdelegation=org.apache.karaf.jaas.boot,sun.*,com.sun.*,javax.transaction,javax.transaction.*
+
+# OSGi Execution Environment
+org.osgi.framework.executionenvironment=J2SE-1.7,JavaSE-1.7,J2SE-1.6,JavaSE-1.6,J2SE-1.5,JavaSE-1.5,J2SE-1.4,JavaSE-1.4,J2SE-1.3,JavaSE-1.3,J2SE-1.2,,JavaSE-1.2,CDC-1.1/Foundation-1.1,CDC-1.0/Foundation-1.0,J2ME,OSGi/Minimum-1.1,OSGi/Minimum-1.0
+
+# Set the parent classloader for the bundle to the classloader that loads the Framework (i.e. everything in lib/*.jar)
+org.osgi.framework.bundle.parent=framework
+
+# To enable the use of the startup.properties file to control the start level:
+karaf.auto.start=startup.properties
+
+org.osgi.framework.startlevel.beginning=100
+karaf.startlevel.bundle=80
+
+karaf.shutdown.port.file=${karaf.data}/port
+
+#
+# FileMonitor properties
+#
+felix.fileinstall.dir    = ${karaf.base}/etc
+felix.fileinstall.filter = .*\\.cfg
+felix.fileinstall.poll   = 1000
+felix.fileinstall.noInitialDelay = true
+felix.fileinstall.log.level = 3
+
+
+#
+# Delay for writing the framework state to disk in equinox
+# must be  >= 1000 and <= 1800000
+#
+eclipse.stateSaveDelayInterval = 1000
+
+#
+# OBR Repository list
+# This property will be modified by the obr:addUrl and obr:removeUrl commands. 
+#
+obr.repository.url = 
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/custom.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/custom.properties
new file mode 100644
index 0000000..fbdb62a
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/custom.properties
@@ -0,0 +1,30 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# All the values specified here will override the default values given
+# in config.properties.
+#
+
+karaf.systemBundlesStartLevel=50
+
+#
+# You can place any customized configuration here.
+#
+
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties
new file mode 100644
index 0000000..dfaa35b
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties
@@ -0,0 +1,472 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# Java platform package export properties.
+#
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.5= \
+ javax.accessibility, \
+ javax.activity, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.6= \
+ javax.accessibility, \
+ javax.activation, \
+ javax.activity, \
+ javax.annotation;version="1.1", \
+ javax.annotation.processing;version="1.1", \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.jws, \
+ javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.bind, \
+ javax.xml.bind.annotation, \
+ javax.xml.bind.annotation.adapters, \
+ javax.xml.bind.attachment, \
+ javax.xml.bind.helpers, \
+ javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.soap, \
+ javax.xml.stream, \
+ javax.xml.stream.events, \
+ javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.ws, \
+ javax.xml.ws.handler, \
+ javax.xml.ws.handler.soap, \
+ javax.xml.ws.http, \
+ javax.xml.ws.soap, \
+ javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.7= \
+ javax.accessibility, \
+ javax.activation, \
+ javax.activity, \
+ javax.annotation;version="1.1", \
+ javax.annotation.processing;version="1.1", \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.jws, \
+ javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.bind, \
+ javax.xml.bind.annotation, \
+ javax.xml.bind.annotation.adapters, \
+ javax.xml.bind.attachment, \
+ javax.xml.bind.helpers, \
+ javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.soap, \
+ javax.xml.stream, \
+ javax.xml.stream.events, \
+ javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.ws, \
+ javax.xml.ws.handler, \
+ javax.xml.ws.handler.soap, \
+ javax.xml.ws.http, \
+ javax.xml.ws.soap, \
+ javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties.cxf b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties.cxf
new file mode 100644
index 0000000..0f425c7
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties.cxf
@@ -0,0 +1,472 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# Java platform package export properties.
+#
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.5= \
+ javax.accessibility, \
+ javax.activity, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.6= \
+ javax.accessibility, \
+# javax.activation, \
+ javax.activity, \
+# javax.annotation;version="1.1", \
+ javax.annotation.processing;version="1.1", \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+# javax.jws, \
+# javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+# javax.xml.bind, \
+# javax.xml.bind.annotation, \
+# javax.xml.bind.annotation.adapters, \
+# javax.xml.bind.attachment, \
+# javax.xml.bind.helpers, \
+# javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+# javax.xml.soap, \
+# javax.xml.stream, \
+# javax.xml.stream.events, \
+# javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+# javax.xml.ws, \
+# javax.xml.ws.handler, \
+# javax.xml.ws.handler.soap, \
+# javax.xml.ws.http, \
+# javax.xml.ws.soap, \
+# javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.7= \
+ javax.accessibility, \
+# javax.activation, \
+ javax.activity, \
+# javax.annotation;version="1.1", \
+ javax.annotation.processing;version="1.1", \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+# javax.jws, \
+# javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+# javax.xml.bind, \
+# javax.xml.bind.annotation, \
+# javax.xml.bind.annotation.adapters, \
+# javax.xml.bind.attachment, \
+# javax.xml.bind.helpers, \
+# javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+# javax.xml.soap, \
+# javax.xml.stream, \
+# javax.xml.stream.events, \
+# javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+# javax.xml.ws, \
+# javax.xml.ws.handler, \
+# javax.xml.ws.handler.soap, \
+# javax.xml.ws.http, \
+# javax.xml.ws.soap, \
+# javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.cfg
new file mode 100644
index 0000000..bec57f7
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.cfg
@@ -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.
+#
+################################################################################
+
+#
+# Comma separated list of features repositories to register by default
+#
+featuresRepositories=mvn:org.apache.karaf.assemblies.features/standard/${project.version}/xml/features,mvn:org.apache.karaf.assemblies.features/enterprise/${project.version}/xml/features
+
+#
+# Comma separated list of features to install at startup
+#
+featuresBoot=config,ssh,management,kar
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.repos.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.repos.cfg
new file mode 100644
index 0000000..eef5a74
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.repos.cfg
@@ -0,0 +1,6 @@
+camel=org.apache.camel.karaf:apache-camel:xml:features:(0,]
+cxf=org.apache.cxf.karaf:apache-cxf:xml:features:(0,]
+activemq=org.apache.activemq:activemq-karaf:xml:features:(0,]
+jclouds=org.jclouds.karaf:jclouds-karaf:xml:features:(0,]
+openejb=org.apache.openejb:openejb-feature:xml:features:(0,]
+wicket=org.ops4j.pax.wicket:features:xml:features:(0,]
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/startup.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/startup.properties
new file mode 100644
index 0000000..74ff5a6
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/etc/startup.properties
@@ -0,0 +1,76 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+# This file allows you to control the start level of each bundle.
+#
+
+#
+# Startup core services like logging
+#
+org/ops4j/pax/url/pax-url-mvn/${pax.url.version}/pax-url-mvn-${pax.url.version}.jar=5
+org/ops4j/pax/url/pax-url-wrap/${pax.url.version}/pax-url-wrap-${pax.url.version}.jar=5
+org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar=8
+org/ops4j/pax/logging/pax-logging-service/${pax.logging.version}/pax-logging-service-${pax.logging.version}.jar=8
+org/apache/felix/org.apache.felix.configadmin/${felix.configadmin.version}/org.apache.felix.configadmin-${felix.configadmin.version}.jar=10
+org/apache/felix/org.apache.felix.fileinstall/${felix.fileinstall.version}/org.apache.felix.fileinstall-${felix.fileinstall.version}.jar=11
+
+#
+# The rest of the services..
+#
+org/apache/servicemix/bundles/org.apache.servicemix.bundles.asm/${asm.bundle.version}/org.apache.servicemix.bundles.asm-${asm.bundle.version}.jar=20
+org/apache/aries/org.apache.aries.util/${aries.util.version}/org.apache.aries.util-${aries.util.version}.jar=20
+org/apache/aries/proxy/org.apache.aries.proxy/${aries.proxy.version}/org.apache.aries.proxy-${aries.proxy.version}.jar=20
+org/apache/aries/blueprint/org.apache.aries.blueprint/${aries.blueprint.version}/org.apache.aries.blueprint-${aries.blueprint.version}.jar=20
+
+org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.osgi/${project.version}/org.apache.karaf.shell.osgi-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.log/${project.version}/org.apache.karaf.shell.log-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.packages/${project.version}/org.apache.karaf.shell.packages-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.commands/${project.version}/org.apache.karaf.shell.commands-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.dev/${project.version}/org.apache.karaf.shell.dev-${project.version}.jar=30
+org/apache/karaf/jaas/org.apache.karaf.jaas.config/${project.version}/org.apache.karaf.jaas.config-${project.version}.jar=30
+org/apache/karaf/jaas/org.apache.karaf.jaas.modules/${project.version}/org.apache.karaf.jaas.modules-${project.version}.jar=30
+org/apache/karaf/jaas/org.apache.karaf.jaas.command/${project.version}/org.apache.karaf.jaas.command-${project.version}.jar=30
+org/apache/karaf/features/org.apache.karaf.features.core/${project.version}/org.apache.karaf.features.core-${project.version}.jar=30
+org/apache/karaf/features/org.apache.karaf.features.command/${project.version}/org.apache.karaf.features.command-${project.version}.jar=30
+org/apache/karaf/features/org.apache.karaf.features.management/${project.version}/org.apache.karaf.features.management-${project.version}.jar=30
+
+org/apache/karaf/diagnostic/org.apache.karaf.diagnostic.core/${project.version}/org.apache.karaf.diagnostic.core-${project.version}.jar=30
+org/apache/karaf/diagnostic/org.apache.karaf.diagnostic.common/${project.version}/org.apache.karaf.diagnostic.common-${project.version}.jar=30
+org/apache/karaf/diagnostic/org.apache.karaf.diagnostic.command/${project.version}/org.apache.karaf.diagnostic.command-${project.version}.jar=30
+org/apache/karaf/diagnostic/org.apache.karaf.diagnostic.management/${project.version}/org.apache.karaf.diagnostic.management-${project.version}.jar=30
+
+org/apache/karaf/management/org.apache.karaf.management.server/${project.version}/org.apache.karaf.management.server-${project.version}.jar=30
+org/apache/aries/jmx/org.apache.aries.jmx.api/${aries.jmx.version}/org.apache.aries.jmx.api-${aries.jmx.version}.jar=30
+org/apache/aries/jmx/org.apache.aries.jmx.core/${aries.jmx.version}/org.apache.aries.jmx.core-${aries.jmx.version}.jar=30
+org/apache/aries/jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}/org.apache.aries.jmx.blueprint-${aries.jmx.version}.jar=30
+
+org/apache/karaf/admin/org.apache.karaf.admin.core/${project.version}/org.apache.karaf.admin.core-${project.version}.jar=30
+org/apache/karaf/admin/org.apache.karaf.admin.command/${project.version}/org.apache.karaf.admin.command-${project.version}.jar=30
+org/apache/karaf/admin/org.apache.karaf.admin.management/${project.version}/org.apache.karaf.admin.management-${project.version}.jar=30
+
+org/apache/mina/mina-core/${mina.version}/mina-core-${mina.version}.jar=30
+org/apache/sshd/sshd-core/${sshd.version}/sshd-core-${sshd.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.ssh/${project.version}/org.apache.karaf.shell.ssh-${project.version}.jar=30
+
+org/apache/karaf/deployer/org.apache.karaf.deployer.spring/${project.version}/org.apache.karaf.deployer.spring-${project.version}.jar=28
+org/apache/karaf/deployer/org.apache.karaf.deployer.blueprint/${project.version}/org.apache.karaf.deployer.blueprint-${project.version}.jar=28
+org/apache/karaf/deployer/org.apache.karaf.deployer.features/${project.version}/org.apache.karaf.deployer.features-${project.version}.jar=30
+org/apache/karaf/deployer/org.apache.karaf.deployer.kar/${project.version}/org.apache.karaf.deployer.kar-${project.version}.jar=30
+org/apache/karaf/deployer/org.apache.karaf.deployer.wrap/${project.version}/org.apache.karaf.deployer.wrap-${project.version}.jar=30
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/org.apache.karaf.features.cfg b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/org.apache.karaf.features.cfg
new file mode 100644
index 0000000..ed41ffd
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/org.apache.karaf.features.cfg
@@ -0,0 +1,29 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# Comma separated list of features repositories to register by default
+#
+#
+featuresRepositories=mvn:org.apache.karaf.assemblies.features/standard/${project.version}/xml/features,mvn:org.apache.karaf.assemblies.features/enterprise/${project.version}/xml/features
+
+#
+# Comma separated list of features to install at startup
+#
+featuresBoot=management
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
new file mode 100644
index 0000000..66ab015
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
@@ -0,0 +1,57 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+# This file allows you to control the start level of each bundle.
+#
+
+#
+# Startup core services like logging
+#
+org/ops4j/pax/url/pax-url-mvn/${pax.url.version}/pax-url-mvn-${pax.url.version}.jar=5
+org/ops4j/pax/url/pax-url-wrap/${pax.url.version}/pax-url-wrap-${pax.url.version}.jar=5
+org/ops4j/pax/logging/pax-logging-api/${pax.logging.version}/pax-logging-api-${pax.logging.version}.jar=8
+org/ops4j/pax/logging/pax-logging-service/${pax.logging.version}/pax-logging-service-${pax.logging.version}.jar=8
+org/apache/felix/org.apache.felix.configadmin/${felix.configadmin.version}/org.apache.felix.configadmin-${felix.configadmin.version}.jar=10
+org/apache/felix/org.apache.felix.fileinstall/${felix.fileinstall.version}/org.apache.felix.fileinstall-${felix.fileinstall.version}.jar=11
+
+#
+# The rest of the services..
+#
+org/apache/servicemix/bundles/org.apache.servicemix.bundles.asm/${asm.bundle.version}/org.apache.servicemix.bundles.asm-${asm.bundle.version}.jar=20
+org/apache/aries/org.apache.aries.util/${aries.util.version}/org.apache.aries.util-${aries.util.version}.jar=20
+org/apache/aries/proxy/org.apache.aries.proxy/${aries.proxy.version}/org.apache.aries.proxy-${aries.proxy.version}.jar=20
+org/apache/aries/blueprint/org.apache.aries.blueprint/${aries.blueprint.version}/org.apache.aries.blueprint-${aries.blueprint.version}.jar=20
+
+org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.osgi/${project.version}/org.apache.karaf.shell.osgi-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.log/${project.version}/org.apache.karaf.shell.log-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.packages/${project.version}/org.apache.karaf.shell.packages-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.commands/${project.version}/org.apache.karaf.shell.commands-${project.version}.jar=30
+org/apache/karaf/shell/org.apache.karaf.shell.dev/${project.version}/org.apache.karaf.shell.dev-${project.version}.jar=30
+org/apache/karaf/jaas/org.apache.karaf.jaas.config/${project.version}/org.apache.karaf.jaas.config-${project.version}.jar=30
+org/apache/karaf/jaas/org.apache.karaf.jaas.modules/${project.version}/org.apache.karaf.jaas.modules-${project.version}.jar=30
+org/apache/karaf/jaas/org.apache.karaf.jaas.command/${project.version}/org.apache.karaf.jaas.command-${project.version}.jar=30
+org/apache/karaf/features/org.apache.karaf.features.core/${project.version}/org.apache.karaf.features.core-${project.version}.jar=30
+org/apache/karaf/features/org.apache.karaf.features.command/${project.version}/org.apache.karaf.features.command-${project.version}.jar=30
+org/apache/karaf/features/org.apache.karaf.features.management/${project.version}/org.apache.karaf.features.management-${project.version}.jar=30
+
+org/apache/karaf/management/org.apache.karaf.management.server/${project.version}/org.apache.karaf.management.server-${project.version}.jar=30
+org/apache/aries/jmx/org.apache.aries.jmx.api/${aries.jmx.version}/org.apache.aries.jmx.api-${aries.jmx.version}.jar=30
+org/apache/aries/jmx/org.apache.aries.jmx.core/${aries.jmx.version}/org.apache.aries.jmx.core-${aries.jmx.version}.jar=30
+org/apache/aries/jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}/org.apache.aries.jmx.blueprint-${aries.jmx.version}.jar=30
diff --git a/karaf-2.2.x/assemblies/apache-karaf/src/main/resources/extra/jetty.xml b/karaf-2.2.x/assemblies/apache-karaf/src/main/resources/extra/jetty.xml
new file mode 100644
index 0000000..e851762
--- /dev/null
+++ b/karaf-2.2.x/assemblies/apache-karaf/src/main/resources/extra/jetty.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//
+DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
+
+<Configure class="org.eclipse.jetty.server.Server">
+
+    <!-- =========================================================== -->
+    <!-- Set connectors                                              -->
+    <!-- =========================================================== -->
+    <!-- One of each type!                                           -->
+    <!-- =========================================================== -->
+
+    <!-- Use this connector for many frequently idle connections
+         and for threadless continuations.
+    -->
+    <Call name="addConnector">
+      <Arg>
+          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
+            <Set name="host"><Property name="jetty.host" /></Set>
+            <Set name="port"><Property name="jetty.port" default="8181"/></Set>
+            <Set name="maxIdleTime">300000</Set>
+            <Set name="Acceptors">2</Set>
+            <Set name="statsOn">false</Set>
+            <Set name="confidentialPort">8443</Set>
+	    <Set name="lowResourcesConnections">20000</Set>
+	    <Set name="lowResourcesMaxIdleTime">5000</Set>
+          </New>
+      </Arg>
+    </Call>
+	
+	<!-- =========================================================== -->
+    <!-- Configure Authentication Realms                             -->
+    <!-- Realms may be configured for the entire server here, or     -->
+    <!-- they can be configured for a specific web app in a context  -->
+    <!-- configuration (see $(jetty.home)/contexts/test.xml for an   -->
+    <!-- example).                                                   -->
+    <!-- =========================================================== -->
+    <Call name="addBean">
+      <Arg>
+        <New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
+		  <Set name="name">karaf</Set>
+          <Set name="loginModuleName">karaf</Set>
+		  <Set name="roleClassNames">
+			<Array type="java.lang.String">
+			  <Item>org.apache.karaf.jaas.modules.RolePrincipal</Item>
+			</Array>
+		  </Set>
+        </New>
+      </Arg>
+    </Call>
+    <Call name="addBean">
+      <Arg>
+        <New class="org.eclipse.jetty.plus.jaas.JAASLoginService">
+                  <Set name="name">default</Set>
+          <Set name="loginModuleName">karaf</Set>
+                  <Set name="roleClassNames">
+                        <Array type="java.lang.String">
+                          <Item>org.apache.karaf.jaas.modules.RolePrincipal</Item>
+                        </Array>
+                  </Set>
+        </New>
+      </Arg>
+    </Call>
+
+</Configure>
diff --git a/karaf-2.2.x/assemblies/features/enterprise/pom.xml b/karaf-2.2.x/assemblies/features/enterprise/pom.xml
new file mode 100644
index 0000000..3d1c023
--- /dev/null
+++ b/karaf-2.2.x/assemblies/features/enterprise/pom.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.assemblies.features</groupId>
+        <artifactId>features</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>enterprise</artifactId>
+    <name>Apache Karaf :: Assemblies :: Features :: Enterprise</name>
+
+    <properties>
+      <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.aries.jndi</groupId>
+            <artifactId>org.apache.aries.jndi.api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.jndi</groupId>
+            <artifactId>org.apache.aries.jndi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.jndi</groupId>
+            <artifactId>org.apache.aries.jndi.url</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>  
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-resources-plugin</artifactId>
+            <configuration>
+              <useDefaultDelimiters>false</useDefaultDelimiters>
+              <delimiters>
+                <delimiter>${*}</delimiter>
+              </delimiters>
+            </configuration>
+            <executions>
+              <execution>
+                <id>filter</id>
+                <phase>generate-resources</phase>
+                <goals>
+                  <goal>resources</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>build-helper-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>attach-artifacts</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>attach-artifact</goal>
+                </goals>
+                <configuration>
+                  <artifacts>
+                    <artifact>
+                      <file>target/classes/features.xml</file>
+                      <type>xml</type>
+                      <classifier>features</classifier>
+                    </artifact>
+                  </artifacts>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+    </build>
+
+</project>
+
diff --git a/karaf-2.2.x/assemblies/features/enterprise/src/main/resources/features.xml b/karaf-2.2.x/assemblies/features/enterprise/src/main/resources/features.xml
new file mode 100644
index 0000000..9c1d9d5
--- /dev/null
+++ b/karaf-2.2.x/assemblies/features/enterprise/src/main/resources/features.xml
@@ -0,0 +1,71 @@
+<?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.
+-->
+
+<features name="karaf-enterprise-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
+
+    <feature name="transaction" description="OSGi Transaction Manager" version="${aries.transaction.version}" resolver="(obr)">
+        <details>The Aries JTA</details>
+        <bundle dependency="true" start-level="30">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/${geronimo.jta-spec.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.blueprint/${aries.transaction.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.manager/${aries.transaction.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.wrappers/${aries.transaction.version}</bundle>
+    </feature>
+
+    <feature name="jpa" description="OSGi Persistence Container" version="${aries.jpa.version}" resolver="(obr)">
+        <bundle dependency="true" start-level="30">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/${geronimo.jta-spec.version}</bundle>
+        <bundle dependency="true" start-level="30">mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/${geronimo.jpa-spec.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries/org.apache.aries.util/${aries.util.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.api/${aries.jpa.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.blueprint.aries/${aries.jpa.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/${aries.jpa.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container.context/${aries.jpa.version}</bundle>
+    </feature>
+
+    <feature name="jndi" description="OSGi Service Registry JNDI access" version="${aries.jndi.version}" resolver="(obr)">
+        <bundle start-level="30">mvn:org.apache.aries/org.apache.aries.util/${aries.util.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.api/${aries.jndi.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.core/${aries.jndi.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.rmi/${aries.jndi.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.url/${aries.jndi.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.legacy.support/${aries.jndi.version}</bundle>
+    </feature>
+
+    <feature name="application-without-isolation" version="${aries.application.version}">
+        <!-- pre-requisites-->
+        <bundle dependency="true" start-level="20">mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/${aries.blueprint.version}</bundle>
+        <bundle dependency="true" start-level="20">mvn:org.apache.aries.proxy/org.apache.aries.proxy/${aries.proxy.version}</bundle>
+        <bundle dependency="true" start-level="20">mvn:org.apache.aries/org.apache.aries.util/${aries.util.version}</bundle>
+        <feature version="${project.version}">obr</feature>
+        <!-- commom -->
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.resolver.obr/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.install/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.api/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.management/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.utils/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.modeller/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.default.local.platform/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.noop.platform.repo/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.noop.postresolve.process/${aries.application.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.deployment.management/${aries.application.version}</bundle>
+        <!-- without isolation -->
+        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.runtime/${aries.application.version}</bundle>
+    </feature>
+
+</features>
diff --git a/karaf-2.2.x/assemblies/features/framework/src/main/filtered-resources/resources/etc/jre.properties.cxf b/karaf-2.2.x/assemblies/features/framework/src/main/filtered-resources/resources/etc/jre.properties.cxf
new file mode 100644
index 0000000..0f425c7
--- /dev/null
+++ b/karaf-2.2.x/assemblies/features/framework/src/main/filtered-resources/resources/etc/jre.properties.cxf
@@ -0,0 +1,472 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# Java platform package export properties.
+#
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.5= \
+ javax.accessibility, \
+ javax.activity, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.6= \
+ javax.accessibility, \
+# javax.activation, \
+ javax.activity, \
+# javax.annotation;version="1.1", \
+ javax.annotation.processing;version="1.1", \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+# javax.jws, \
+# javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+# javax.xml.bind, \
+# javax.xml.bind.annotation, \
+# javax.xml.bind.annotation.adapters, \
+# javax.xml.bind.attachment, \
+# javax.xml.bind.helpers, \
+# javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+# javax.xml.soap, \
+# javax.xml.stream, \
+# javax.xml.stream.events, \
+# javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+# javax.xml.ws, \
+# javax.xml.ws.handler, \
+# javax.xml.ws.handler.soap, \
+# javax.xml.ws.http, \
+# javax.xml.ws.soap, \
+# javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.7= \
+ javax.accessibility, \
+# javax.activation, \
+ javax.activity, \
+# javax.annotation;version="1.1", \
+ javax.annotation.processing;version="1.1", \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+# javax.jws, \
+# javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+# javax.xml.bind, \
+# javax.xml.bind.annotation, \
+# javax.xml.bind.annotation.adapters, \
+# javax.xml.bind.attachment, \
+# javax.xml.bind.helpers, \
+# javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+# javax.xml.soap, \
+# javax.xml.stream, \
+# javax.xml.stream.events, \
+# javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+# javax.xml.ws, \
+# javax.xml.ws.handler, \
+# javax.xml.ws.handler.soap, \
+# javax.xml.ws.http, \
+# javax.xml.ws.soap, \
+# javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
diff --git a/karaf-2.2.x/assemblies/features/pom.xml b/karaf-2.2.x/assemblies/features/pom.xml
new file mode 100644
index 0000000..69e7fd9
--- /dev/null
+++ b/karaf-2.2.x/assemblies/features/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.assemblies</groupId>
+        <artifactId>assemblies</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.assemblies.features</groupId>
+    <artifactId>features</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Assemblies :: Features</name>
+
+    <modules>
+        <module>standard</module>
+        <module>enterprise</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/assemblies/features/standard/pom.xml b/karaf-2.2.x/assemblies/features/standard/pom.xml
new file mode 100644
index 0000000..88eb3e6
--- /dev/null
+++ b/karaf-2.2.x/assemblies/features/standard/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.assemblies.features</groupId>
+        <artifactId>features</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>standard</artifactId>
+    <name>Apache Karaf :: Assemblies :: Features :: Standard</name>
+
+    <properties>
+      <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>  
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-resources-plugin</artifactId>
+            <configuration>
+              <useDefaultDelimiters>false</useDefaultDelimiters>
+              <delimiters>
+                <delimiter>${*}</delimiter>
+              </delimiters>
+            </configuration>
+            <executions>
+              <execution>
+                <id>filter</id>
+                <phase>generate-resources</phase>
+                <goals>
+                  <goal>resources</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>build-helper-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>attach-artifacts</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>attach-artifact</goal>
+                </goals>
+                <configuration>
+                  <artifacts>
+                    <artifact>
+                      <file>target/classes/features.xml</file>
+                      <type>xml</type>
+                      <classifier>features</classifier>
+                    </artifact>
+                  </artifacts>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+    </build>
+
+</project>
+
diff --git a/karaf-2.2.x/assemblies/features/standard/src/main/resources/features.xml b/karaf-2.2.x/assemblies/features/standard/src/main/resources/features.xml
new file mode 100644
index 0000000..772c0d4
--- /dev/null
+++ b/karaf-2.2.x/assemblies/features/standard/src/main/resources/features.xml
@@ -0,0 +1,286 @@
+<?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.
+-->
+<features name="karaf-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
+
+    <feature name="karaf-framework" version="${project.version}" resolver="(obr)">
+        <bundle start-level="5">mvn:org.ops4j.pax.url/pax-url-mvn/${pax.url.version}</bundle>
+        <bundle start-level="5">mvn:org.ops4j.pax.url/pax-url-wrap/${pax.url.version}</bundle>
+        <bundle start-level="8">mvn:org.ops4j.pax.logging/pax-logging-api/${pax.logging.version}</bundle>
+        <bundle start-level="8">mvn:org.ops4j.pax.logging/pax-logging-service/${pax.logging.version}</bundle>
+        <bundle start-level="10">mvn:org.apache.felix/org.apache.felix.configadmin/${felix.configadmin.version}</bundle>
+        <bundle start-level="11">mvn:org.apache.felix/org.apache.felix.fileinstall/${felix.fileinstall.version}</bundle>
+        <bundle start-level="20">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.asm/${asm.bundle.version}</bundle>
+        <bundle start-level="20">mvn:org.apache.aries/org.apache.aries.util/${aries.util.version}</bundle>
+        <bundle start-level="20">mvn:org.apache.aries.proxy/org.apache.aries.proxy/${aries.proxy.version}</bundle>
+        <bundle start-level="20">mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/${aries.blueprint.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.console/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.osgi/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.log/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.packages/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.commands/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.dev/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.config/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.modules/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.command/${project.version}</bundle>
+        <bundle start-level="25">mvn:org.apache.karaf.features/org.apache.karaf.features.core/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.features/org.apache.karaf.features.command/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.features/org.apache.karaf.features.management/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management/org.apache.karaf.management.server/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.api/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.core/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}</bundle>
+    </feature>
+
+    <feature name="spring" version="${spring2.version}" resolver="(obr)">
+        <bundle dependency="true" start-level="30">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/${aopalliance.bundle.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-core/${spring2.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-beans/${spring2.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-aop/${spring2.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-context/${spring2.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-context-support/${spring2.version}</bundle>
+    </feature>
+
+    <feature name="spring-web" version="${spring2.version}" resolver="(obr)">
+    	<feature version="${spring2.version}">spring</feature>
+    	<feature version="${project.version}">http</feature>
+    	<bundle start-level="30">mvn:org.springframework/spring-web/${spring2.version}</bundle>
+		<bundle start-level="30">mvn:org.springframework/spring-webmvc/${spring2.version}</bundle>
+    </feature>
+
+    <feature name="spring" version="${spring.version}" resolver="(obr)">
+        <bundle dependency="true" start-level="30">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/${aopalliance.bundle.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-core/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-asm/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-expression/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-beans/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-aop/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-context/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-context-support/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-aspects" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-aspects/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-dm" version="${spring.osgi.version}" resolver="(obr)">
+        <feature version="[2.5.6,4)">spring</feature>
+        <bundle dependency="true" start-level="30">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.cglib/${cglib.bundle.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework.osgi/spring-osgi-io/${spring.osgi.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework.osgi/spring-osgi-core/${spring.osgi.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework.osgi/spring-osgi-extender/${spring.osgi.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework.osgi/spring-osgi-annotation/${spring.osgi.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.deployer/org.apache.karaf.deployer.spring/${project.version}</bundle>
+    </feature>
+
+    <feature name="spring-dm-web" version="${spring.osgi.version}" resolver="(obr)">
+    	<feature version="${spring.osgi.version}">spring-dm</feature>
+    	<feature version="[2.5.6,4)">spring-web</feature>
+    	<feature version="${project.version}">http</feature>
+		<bundle start-level="30">mvn:org.springframework.osgi/spring-osgi-web/${spring.osgi.version}</bundle>
+    </feature>
+
+    <feature name="spring-instrument" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-instrument/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-jdbc" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring-tx</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-jdbc/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-jms" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring-web</feature>
+        <bundle start-level="10">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/${geronimo.jta-spec.version}</bundle>
+        <bundle start-level="10">mvn:org.apache.geronimo.specs/geronimo-jms_1.1_spec/${geronimo.jms-spec.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-jms/${spring.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-tx/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-struts" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring-web</feature>
+        <bundle dependency="true" start-level="30">mvn:commons-beanutils/commons-beanutils/${commons-beanutils.version}</bundle>
+        <bundle start-level="30">mvn:org.springframework/spring-struts/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-test" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-test/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-orm" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring-jdbc</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-orm/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-oxm" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-oxm/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-tx" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-tx/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-web" version="${spring.version}" resolver="(obr)">
+    	<feature version="${spring.version}">spring</feature>
+    	<feature version="${project.version}">http</feature>
+    	<bundle start-level="30">mvn:org.springframework/spring-web/${spring.version}</bundle>
+		<bundle start-level="30">mvn:org.springframework/spring-webmvc/${spring.version}</bundle>
+    </feature>
+
+    <feature name="spring-web-portlet" version="${spring.version}" resolver="(obr)">
+        <feature version="${spring.version}">spring-web</feature>
+        <bundle start-level="30">mvn:org.springframework/spring-webmvc-portlet/${spring.version}</bundle>
+    </feature>
+
+    <feature name="wrapper" version="${project.version}">
+        <bundle>mvn:org.apache.karaf.shell/org.apache.karaf.shell.wrapper/${project.version}</bundle>
+    </feature>
+
+    <feature name="obr" version="${project.version}">
+        <bundle start-level="30">mvn:org.apache.felix/org.osgi.service.obr/${felix.obr.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.felix/org.apache.felix.bundlerepository/${felix.bundlerepository.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.obr/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.features/org.apache.karaf.features.obr/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.obr/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.url/pax-url-obr/${pax.url.version}</bundle>
+    </feature>
+
+    <feature name="config" version="${project.version}">
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.config/${project.version}</bundle>
+    </feature>
+
+    <feature name="jetty" version="${jetty.version}" resolver="(obr)">
+        <bundle dependency="true" start-level="30">mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.activation-api-1.1/${servicemix.specs.version}</bundle>
+        <bundle dependency="true" start-level="30">mvn:org.apache.geronimo.specs/geronimo-servlet_2.5_spec/${geronimo.servlet.version}</bundle>
+        <bundle dependency="true" start-level="30">mvn:javax.mail/mail/${javax.mail.version}</bundle>
+        <bundle dependency="true" start-level="30">mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/${geronimo.jta-spec.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-util/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-io/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-http/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-client/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-continuation/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-jmx/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-server/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-security/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-servlet/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-servlets/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-xml/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-webapp/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-jndi/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-plus/${jetty.version}</bundle>
+        <bundle start-level="30">mvn:org.eclipse.jetty/jetty-websocket/${jetty.version}</bundle>
+    </feature>
+
+    <feature name="http" version="${project.version}" resolver="(obr)">
+        <configfile finalname="/etc/jetty.xml">mvn:org.apache.karaf/apache-karaf/${project.version}/xml/jettyconfig</configfile>
+        <config name="org.ops4j.pax.web">
+            org.osgi.service.http.port=8181
+            javax.servlet.context.tempdir=${karaf.data}/pax-web-jsp
+            org.ops4j.pax.web.config.file=${karaf.base}/etc/jetty.xml
+        </config>
+        <feature version="[7.0,8.0)">jetty</feature>
+    	<bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-api/${pax.web.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-spi/${pax.web.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-runtime/${pax.web.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-jetty/${pax.web.version}</bundle>
+    </feature>
+
+    <feature name="http-whiteboard" description="Provide HTTP Whiteboard pattern support" version="${project.version}" resolver="(obr)">
+        <feature>http</feature>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-extender-whiteboard/${pax.web.version}</bundle>
+    </feature>
+
+    <feature name="war" version="${project.version}" resolver="(obr)">
+        <config name="org.ops4j.pax.url.war">
+            org.ops4j.pax.url.war.importPaxLoggingPackages=true
+        </config>
+        <feature>http-whiteboard</feature>
+        <bundle start-level='30'>mvn:org.apache.karaf.shell/org.apache.karaf.shell.web/${project.version}</bundle>
+        <bundle start-level='30'>mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.web/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-jsp/${pax.web.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-extender-war/${pax.web.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-deployer/${pax.web.version}</bundle>
+        <bundle start-level="30">mvn:org.ops4j.pax.url/pax-url-war/${pax.url.version}</bundle>
+    </feature>
+
+    <feature name="kar" version="${project.version}">
+        <bundle start-level="30">mvn:org.apache.karaf.deployer/org.apache.karaf.deployer.kar/${project.version}</bundle>
+    </feature>
+
+    <feature name="webconsole-base" version="${project.version}">
+        <config name="org.apache.karaf.webconsole">
+            realm=karaf
+            role=${karaf.admin.role}
+        </config>
+        <feature>http</feature>
+        <bundle start-level="30">mvn:org.apache.felix/org.apache.felix.metatype/${felix.metatype.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.webconsole/org.apache.karaf.webconsole.branding/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.webconsole/org.apache.karaf.webconsole.console/${project.version}</bundle>
+    </feature>
+
+    <feature name="webconsole" version="${project.version}">
+        <feature version="${project.version}">webconsole-base</feature>
+        <bundle start-level="30">mvn:org.apache.karaf.webconsole/org.apache.karaf.webconsole.admin/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.webconsole/org.apache.karaf.webconsole.features/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.webconsole/org.apache.karaf.webconsole.gogo/${project.version}</bundle>
+		<bundle start-level="30">mvn:org.apache.felix/org.apache.felix.webconsole.plugins.event/${felix.eventadmin-plugin.version}</bundle>
+    </feature>
+
+    <feature name="ssh" version="${project.version}">
+        <config name="org.apache.karaf.shell">
+            sshPort=8101
+            sshHost=0.0.0.0
+            sshRealm=karaf
+            hostKey=${karaf.base}/etc/host.key
+        </config>
+        <bundle start-level="30" dependency='true'>mvn:org.apache.mina/mina-core/${mina.version}</bundle>
+        <bundle start-level="30" dependency='true'>mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version}</bundle>
+    </feature>
+
+    <feature name="management" version="${project.version}">
+        <bundle start-level="30">mvn:org.apache.karaf.management/org.apache.karaf.management.server/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.api/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.core/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.system/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.bundles/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.services/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.config/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.log/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.packages/${project.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.dev/${project.version}</bundle>
+    </feature>
+
+    <feature name="eventadmin" version="${project.version}">
+		<bundle start-level='30'>mvn:org.apache.felix/org.apache.felix.eventadmin/${felix.eventadmin.version}</bundle>
+    </feature>
+
+    <feature name="jasypt-encryption" version="${project.version}" resolver="(obr)">
+        <bundle dependency="true" start-level="30">mvn:commons-codec/commons-codec/${commons-codec.version}</bundle>
+        <bundle dependency='true' start-level="30">mvn:commons-lang/commons-lang/${commons-lang.version}</bundle>
+        <bundle dependency='true' start-level="30">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jasypt/${jasypt.bundle.version}</bundle>
+        <bundle start-level="30">mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.jasypt/${project.version}</bundle>
+    </feature>
+
+</features>
diff --git a/karaf-2.2.x/assemblies/pom.xml b/karaf-2.2.x/assemblies/pom.xml
new file mode 100644
index 0000000..9ceb718
--- /dev/null
+++ b/karaf-2.2.x/assemblies/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.assemblies</groupId>
+    <artifactId>assemblies</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Assemblies</name>
+
+    <modules>
+        <module>features</module>
+        <module>apache-karaf</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/client/NOTICE b/karaf-2.2.x/client/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/client/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/client/pom.xml b/karaf-2.2.x/client/pom.xml
new file mode 100644
index 0000000..31e7a5f
--- /dev/null
+++ b/karaf-2.2.x/client/pom.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.client</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Client</name>
+    <description>Karaf client to connect remotely to a running Karaf instance.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.sshd</groupId>
+            <artifactId>sshd-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <_donotcopy>(CVS|.svn|config.properties)</_donotcopy>
+                        <Main-Class>org.apache.karaf.client.Main</Main-Class>
+                        <Bundle-Name>Apache Karaf Shell Client</Bundle-Name>
+                        <Bundle-Description>Shell client bundle for Apache Karaf.</Bundle-Description>
+                        <Private-Package>
+                            org.apache.karaf.client;-split-package:=merge-first,
+                            org.slf4j;-split-package:=merge-first,
+                            org.slf4j.spi;-split-package:=merge-first,
+                            org.slf4j.helpers;-split-package:=merge-first,
+                            org.slf4j.impl;-split-package:=merge-first,
+                            META-INF;-split-package:=merge-first
+                        </Private-Package>
+                        <Import-Package>!*</Import-Package>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <artifactSet>
+                                <includes>
+                                    <include>${project.groupId}:${project.artifactId}</include>
+                                    <include>org.slf4j:slf4j-api</include>
+                                    <include>org.slf4j:slf4j-nop</include>
+                                </includes>
+                            </artifactSet>
+                            <filters>
+                                <filter>
+                                    <artifact>org.slf4j:slf4j-api</artifact>
+                                    <excludes>
+                                        <exclude>org/slf4j/**</exclude>
+                                    </excludes>
+                                </filter>
+                                <filter>
+                                    <artifact>org.slf4j:slf4j-nop</artifact>
+                                    <excludes>
+                                        <exclude>org/slf4j/**</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
+                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+                            <createDependencyReducedPom>true</createDependencyReducedPom>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/client/src/main/java/org/apache/karaf/client/Main.java b/karaf-2.2.x/client/src/main/java/org/apache/karaf/client/Main.java
new file mode 100644
index 0000000..1bdfd40
--- /dev/null
+++ b/karaf-2.2.x/client/src/main/java/org/apache/karaf/client/Main.java
@@ -0,0 +1,149 @@
+/*
+ * 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.karaf.client;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+
+import jline.Terminal;
+import org.apache.karaf.shell.console.jline.TerminalFactory;
+import org.apache.sshd.ClientChannel;
+import org.apache.sshd.ClientSession;
+import org.apache.sshd.SshClient;
+import org.apache.sshd.client.channel.ChannelShell;
+import org.apache.sshd.client.future.ConnectFuture;
+import org.apache.sshd.common.RuntimeSshException;
+
+import org.apache.sshd.common.util.NoCloseInputStream;
+import org.fusesource.jansi.AnsiConsole;
+import org.slf4j.impl.SimpleLogger;
+
+/**
+ * A very simple
+ */
+public class Main {
+
+    public static void main(String[] args) throws Exception {
+        String host = "localhost";
+        int port = 8101;
+        String user = "karaf";
+        String password = "karaf";
+        StringBuilder sb = new StringBuilder();
+        int level = 1;
+        int retryAttempts = 0;
+        int retryDelay = 2;
+
+        for (int i = 0; i < args.length; i++) {
+            if (args[i].charAt(0) == '-') {
+                if (args[i].equals("-a")) {
+                    port = Integer.parseInt(args[++i]);
+                } else if (args[i].equals("-h")) {
+                    host = args[++i];
+                } else if (args[i].equals("-u")) {
+                    user = args[++i];
+                } else if (args[i].equals("-p")) {
+                    password = args[++i];
+                } else if (args[i].equals("-v")) {
+                    level++;
+                } else if (args[i].equals("-r")) {
+                    retryAttempts = Integer.parseInt(args[++i]);
+                } else if (args[i].equals("-d")) {
+                    retryDelay = Integer.parseInt(args[++i]);
+                } else if (args[i].equals("--help")) {
+                    System.out.println("Apache Karaf client");
+                    System.out.println("  -a [port]     specify the port to connect to");
+                    System.out.println("  -h [host]     specify the host to connect to");
+                    System.out.println("  -u [user]     specify the user name");
+                    System.out.println("  -p [password] specify the password");
+                    System.out.println("  --help        shows this help message");
+                    System.out.println("  -v            raise verbosity");
+                    System.out.println("  -r [attempts] retry connection establishment (up to attempts times)");
+                    System.out.println("  -d [delay]    intra-retry delay (defaults to 2 seconds)");
+                    System.out.println("  [commands]    commands to run");
+                    System.out.println("If no commands are specified, the client will be put in an interactive mode");
+                    System.exit(0);
+                } else {
+                    System.err.println("Unknown option: " + args[i]);
+                    System.err.println("Run with --help for usage");
+                    System.exit(1);
+                }
+            } else {
+                sb.append(args[i]);
+                sb.append(' ');
+            }
+        }
+        SimpleLogger.setLevel(level);
+
+        SshClient client = null;
+        Terminal terminal = null;
+        try {
+            client = SshClient.setUpDefaultClient();
+            client.start();
+            int retries = 0;
+            ClientSession session = null;
+            do {
+                ConnectFuture future = client.connect(host, port);
+                future.await();
+                try { 
+                    session = future.getSession();
+                } catch (RuntimeSshException ex) {
+                    if (retries++ < retryAttempts) {
+                        Thread.sleep(retryDelay * 1000);
+                        System.out.println("retrying (attempt " + retries + ") ...");
+                    } else {
+                        throw ex;
+                    }
+                }
+            } while (session == null);
+            if (!session.authPassword(user, password).await().isSuccess()) {
+                throw new Exception("Authentication failure");
+            }
+            ClientChannel channel;
+			if (sb.length() > 0) {
+                channel = session.createChannel("exec", sb.append("\n").toString());
+                channel.setIn(new ByteArrayInputStream(new byte[0]));
+			} else {
+                terminal = new TerminalFactory().getTerminal();
+ 				channel = session.createChannel("shell");
+                channel.setIn(new NoCloseInputStream(System.in));
+                ((ChannelShell) channel).setupSensibleDefaultPty();
+            }
+            channel.setOut(AnsiConsole.wrapOutputStream(System.out));
+            channel.setErr(AnsiConsole.wrapOutputStream(System.err));
+            channel.open();
+            channel.waitFor(ClientChannel.CLOSED, 0);
+        } catch (Throwable t) {
+            if (level > 1) {
+                t.printStackTrace();
+            } else {
+                System.err.println(t.getMessage());
+            }
+            System.exit(1);
+        } finally {
+            try {
+                client.stop();
+            } catch (Throwable t) { }
+            try {
+                if (terminal != null) {
+                    terminal.restore();
+                }
+            } catch (Throwable t) { }
+        }
+        System.exit(0);
+    }
+
+}
diff --git a/karaf-2.2.x/client/src/main/java/org/slf4j/impl/SimpleLogger.java b/karaf-2.2.x/client/src/main/java/org/slf4j/impl/SimpleLogger.java
new file mode 100644
index 0000000..c8126c4
--- /dev/null
+++ b/karaf-2.2.x/client/src/main/java/org/slf4j/impl/SimpleLogger.java
@@ -0,0 +1,242 @@
+/*
+ * 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.slf4j.impl;
+
+import org.slf4j.helpers.MarkerIgnoringBase;
+import org.slf4j.helpers.MessageFormatter;
+
+/**
+ * A simple logger that can be controlled from the ssh client
+ */
+public class SimpleLogger extends MarkerIgnoringBase {
+
+    public static final int ERROR = 0;
+    public static final int WARN = 1;
+    public static final int INFO = 2;
+    public static final int DEBUG = 3;
+    public static final int TRACE = 4;
+
+    private static int level = 0;
+    private static long startTime = System.currentTimeMillis();
+    public static final String LINE_SEPARATOR = System.getProperty("line.separator");
+
+    public static int getLevel() {
+        return level;
+    }
+
+    public static void setLevel(int level) {
+        SimpleLogger.level = level;
+    }
+
+    private String name;
+
+    SimpleLogger(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isTraceEnabled() {
+        return isLogEnabled(TRACE);
+    }
+
+    public void trace(String msg) {
+        log(TRACE, msg);
+    }
+
+    public void trace(String format, Object arg) {
+        log(TRACE, format, arg);
+    }
+
+    public void trace(String format, Object arg1, Object arg2) {
+        log(TRACE, format, arg1, arg2);
+    }
+
+    public void trace(String format, Object[] argArray) {
+        log(TRACE, format, argArray);
+    }
+
+    public void trace(String msg, Throwable t) {
+        log(TRACE, msg, t);
+    }
+
+    public boolean isDebugEnabled() {
+        return isLogEnabled(DEBUG);
+    }
+
+    public void debug(String msg) {
+        log(DEBUG, msg);
+    }
+
+    public void debug(String format, Object arg) {
+		log(DEBUG, format, arg);
+    }
+
+    public void debug(String format, Object arg1, Object arg2) {
+        log(DEBUG, format, arg1, arg2);
+    }
+
+    public void debug(String format, Object[] argArray) {
+		log(DEBUG, format, argArray, null);
+    }
+
+    public void debug(String msg, Throwable t) {
+        log(DEBUG, msg, t);
+    }
+
+    public boolean isInfoEnabled() {
+        return isLogEnabled(INFO);
+    }
+
+    public void info(String msg) {
+		log(INFO, msg);
+    }
+
+    public void info(String format, Object arg) {
+		log(INFO, format, arg);
+    }
+
+    public void info(String format, Object arg1, Object arg2) {
+		log(INFO, format, arg1, arg2);
+    }
+
+    public void info(String format, Object[] argArray) {
+		log(INFO, format, argArray);
+    }
+
+    public void info(String msg, Throwable t) {
+		log(INFO, msg, t);
+    }
+
+    public boolean isWarnEnabled() {
+        return isLogEnabled(WARN);
+    }
+
+    public void warn(String msg) {
+		log(WARN, msg);
+    }
+
+    public void warn(String format, Object arg) {
+        log(WARN, format, arg);
+    }
+
+    public void warn(String format, Object arg1, Object arg2) {
+        log(WARN, format, arg1, arg2);
+    }
+
+    public void warn(String format, Object[] argArray) {
+ 		log(WARN, format, argArray);
+    }
+
+    public void warn(String msg, Throwable t) {
+ 		log(WARN, msg, t);
+    }
+
+    public boolean isErrorEnabled() {
+        return isLogEnabled(ERROR);
+    }
+
+    public void error(String msg) {
+        log(ERROR, msg);
+    }
+
+    public void error(String format, Object arg) {
+		log(ERROR, format, arg);
+    }
+
+    public void error(String format, Object arg1, Object arg2) {
+        log(ERROR, format, arg1, arg2);
+    }
+
+    public void error(String format, Object[] argArray) {
+		log(ERROR, format, argArray);
+    }
+
+    public void error(String msg, Throwable t) {
+		log(ERROR, msg, t);
+    }
+
+	protected boolean isLogEnabled(int level) {
+		return SimpleLogger.level >= level;
+	}
+
+    protected void log(int level, String msg) {
+        if (isLogEnabled(level)) {
+            doLog(level, msg, null);
+        }
+    }
+
+    protected void log(int level, String format, Object arg) {
+        if (isLogEnabled(level)) {
+            String msg = MessageFormatter.format(format, arg).getMessage();
+            doLog(level, msg, null);
+        }
+    }
+
+    protected void log(int level, String format, Object arg1, Object arg2) {
+        if (isLogEnabled(level)) {
+            String msg = MessageFormatter.format(format, arg1, arg2).getMessage();
+            doLog(level, msg, null);
+        }
+    }
+
+    protected void log(int level, String format, Object[] args) {
+        if (isLogEnabled(level)) {
+            String msg = MessageFormatter.format(format, args).getMessage();
+            doLog(level, msg, null);
+        }
+    }
+
+	protected void log(int level, String msg, Throwable t) {
+        if (isLogEnabled(level)) {
+            doLog(level, msg, t);
+        }
+	}
+
+    protected void doLog(int level, String msg, Throwable t) {
+        StringBuffer buf = new StringBuffer();
+        long millis = System.currentTimeMillis();
+        buf.append(millis - startTime);
+        buf.append(" [");
+        buf.append(Thread.currentThread().getName());
+        buf.append("] ");
+        switch (level) {
+            case TRACE:
+                buf.append("TRACE"); break;
+            case DEBUG:
+                buf.append("DEBUG"); break;
+            case INFO:
+                buf.append("INFO"); break;
+            case WARN:
+                buf.append("WARN"); break;
+            case ERROR:
+                buf.append("ERROR"); break;
+        }
+        buf.append(" ");
+        buf.append(name);
+        buf.append(" - ");
+        buf.append(msg);
+        buf.append(LINE_SEPARATOR);
+        System.err.print(buf.toString());
+        if (t != null) {
+            t.printStackTrace(System.err);
+        }
+        System.err.flush();
+    }
+}
diff --git a/karaf-2.2.x/client/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/client/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..17b5cb4
--- /dev/null
+++ b/karaf-2.2.x/client/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,27 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The Karaf client allows for connecting remotely to a running Karaf instance.
+
+    It acts as a SSH client and sends commands to the running Karaf instance. If no commands are provided, the Karaf
+    client displays the Karaf instance shell on which you can interact.
+
+    To start the Karaf client, you can use the following arguments:
+        \u001B[36m-a [port]     specify the port to connect to\u001B[0m
+        \u001B[36m-h [host]     specify the host to connect to\u001B[0m
+        \u001B[36m-u [user]     specify the user name\u001B[0m
+        \u001B[36m-p [password] specify the password\u001B[0m
+        \u001B[36m--help        show help\u001B[0m
+        \u001B[36m-v            raise verbosity\u001B[0m
+        \u001B[36m-r [attempts] retry connection establishment (up to attempts time)\u001B[0m
+        \u001B[36m-d [delay]    intra-retry delay (default is 2 secondes)\u001B[0m
+        \u001B[36m[commands]    commands to run\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[31mUsing remote instances\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/client/src/main/resources/client.login.conf b/karaf-2.2.x/client/src/main/resources/client.login.conf
new file mode 100644
index 0000000..1e190f1
--- /dev/null
+++ b/karaf-2.2.x/client/src/main/resources/client.login.conf
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+
+//
+// $Rev: 580717 $ $Date: 2007-09-30 14:47:55 +0200 (Sun, 30 Sep 2007) $
+//
+
+RshClient {
+    org.apache.geronimo.shell.remote.client.auth.RemoteLoginModule required;
+};
diff --git a/karaf-2.2.x/demos/branding/pom.xml b/karaf-2.2.x/demos/branding/pom.xml
new file mode 100644
index 0000000..e9e4f8e
--- /dev/null
+++ b/karaf-2.2.x/demos/branding/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>demos</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.demos.branding</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Demos :: Branding</name>
+
+    <modules>
+        <module>shell</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/demos/branding/shell/NOTICE b/karaf-2.2.x/demos/branding/shell/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/demos/branding/shell/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/branding/shell/README.txt b/karaf-2.2.x/demos/branding/shell/README.txt
new file mode 100644
index 0000000..0fb69ea
--- /dev/null
+++ b/karaf-2.2.x/demos/branding/shell/README.txt
@@ -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.
+ */
+
+BRANDING SHELL EXAMPLE
+======================
+
+Purpose
+-------
+Demonstrate how to change the shell console branding.
+
+
+Prerequisites for Running this Example
+--------------------------------------
+You must have the following installed on your machine:
+
+   - JDK 1.5 or higher.
+
+   - Apache Maven 2.0.9 or higher.
+
+
+Building and Deploying
+----------------------
+This example will produce a branding jar, containing a branding properties
+file which is used to generate the shell console branding.
+
+To build the demo branding type the following command:
+
+  mvn install
+
+To deploy the branding copy the resulting jar file to karaf/lib folder.
+
+  cp target/org.apache.karaf.demos.branding.shell-${version}.jar $KARAF_HOME/lib
+
+In order for Karaf to pick up the branding jar please edit the
+$KARAF_HOME/etc/custom.properties file to include the following:
+
+  org.osgi.framework.system.packages.extra = \
+    org.apache.karaf.branding; \
+    com.sun.org.apache.xalan.internal.xsltc.trax; \
+    com.sun.org.apache.xerces.internal.dom; \
+    com.sun.org.apache.xerces.internal.jaxp; \
+    com.sun.org.apache.xerces.internal.xni
+
+To see the new branding please restart Karaf:
+
+  cd $KARAF_HOME/bin
+  ./karaf
+
+The shell console should now display the content of the branding
+properties file.
+
+NOTES
+=====
+Most projects automate this process. One such project is Apache Servicemix
+NMR, see its branding and assembly poms for a guide line.
diff --git a/karaf-2.2.x/demos/branding/shell/pom.xml b/karaf-2.2.x/demos/branding/shell/pom.xml
new file mode 100644
index 0000000..b21ce8b
--- /dev/null
+++ b/karaf-2.2.x/demos/branding/shell/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>org.apache.karaf.demos.branding</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.demos.branding.shell</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Demos :: Branding :: Shell</name>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>!*</Private-Package>
+                        <Export-Package>
+                            org.apache.karaf.branding
+                        </Export-Package>
+                    </instructions> 
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project> 
diff --git a/karaf-2.2.x/demos/branding/shell/src/main/resources/org/apache/karaf/branding/branding.properties b/karaf-2.2.x/demos/branding/shell/src/main/resources/org/apache/karaf/branding/branding.properties
new file mode 100644
index 0000000..2f772ae
--- /dev/null
+++ b/karaf-2.2.x/demos/branding/shell/src/main/resources/org/apache/karaf/branding/branding.properties
@@ -0,0 +1,26 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+welcome = \
+\n\
+\u001B[1m  Apache Karaf Re-Branding Demo\u001B[0m (${pom.version})\n\
+\n\
+Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\n\
+   and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\n
+
diff --git a/karaf-2.2.x/demos/command/NOTICE b/karaf-2.2.x/demos/command/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/demos/command/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/command/pom.xml b/karaf-2.2.x/demos/command/pom.xml
new file mode 100644
index 0000000..53f7d44
--- /dev/null
+++ b/karaf-2.2.x/demos/command/pom.xml
@@ -0,0 +1,67 @@
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>demos</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.demos.command</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Demos :: Extend Console Command</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.4</version>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCommand.java b/karaf-2.2.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCommand.java
new file mode 100644
index 0000000..a5227db
--- /dev/null
+++ b/karaf-2.2.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCommand.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.karaf.demos.command;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+@Command(scope = "mycommand", name = "hello", description="Says hello")
+public class MyCommand extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "arg", description = "The command argument", required = false, multiValued = false)
+    String arg = null;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        System.out.println("Executing My Command Demo");
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCompleter.java b/karaf-2.2.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCompleter.java
new file mode 100644
index 0000000..2596cb9
--- /dev/null
+++ b/karaf-2.2.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCompleter.java
@@ -0,0 +1,48 @@
+/*
+ * 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.karaf.demos.command;
+
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.console.Completer;
+
+import java.util.List;
+
+/**
+* <p>
+* My completer.
+* </p>
+*/
+
+public class MyCompleter implements Completer {
+
+    /**
+     * @param buffer it's the beginning string typed by the user
+     * @param cursor it's the position of the cursor
+     * @param candidates the list of completions proposed to the user
+     */
+    public int complete(String buffer, int cursor, List candidates) {
+
+        StringsCompleter delegate = new StringsCompleter();
+        delegate.getStrings().add("one");
+        delegate.getStrings().add("two");
+        delegate.getStrings().add("three");
+        return delegate.complete(buffer, cursor, candidates);
+    }
+}
diff --git a/karaf-2.2.x/demos/command/src/main/resources/OSGI-INF/blueprint/mycommand.xml b/karaf-2.2.x/demos/command/src/main/resources/OSGI-INF/blueprint/mycommand.xml
new file mode 100644
index 0000000..3589797
--- /dev/null
+++ b/karaf-2.2.x/demos/command/src/main/resources/OSGI-INF/blueprint/mycommand.xml
@@ -0,0 +1,35 @@
+<?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.
+
+-->
+
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="mycommand/hello">
+            <action class="org.apache.karaf.demos.command.MyCommand"/>
+            <completers>
+                <ref component-id="myCompleter"/>
+                <null/>
+            </completers>
+        </command>
+    </command-bundle>
+
+    <bean id="myCompleter" class="org.apache.karaf.demos.command.MyCompleter"/>
+
+</blueprint>
diff --git a/karaf-2.2.x/demos/deployer/bundle/NOTICE b/karaf-2.2.x/demos/deployer/bundle/NOTICE
new file mode 100755
index 0000000..13c1292
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/bundle/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/deployer/bundle/pom.xml b/karaf-2.2.x/demos/deployer/bundle/pom.xml
new file mode 100644
index 0000000..c2250d0
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/bundle/pom.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>org.apache.karaf.demos.deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.demos.deployer.bundle</groupId>
+    <artifactId>my-bundle</artifactId>
+    <version>2.2.7</version>
+    <packaging>bundle</packaging>
+
+    <name>Apache Karaf :: Demos :: Deployer :: Bundle</name>
+    <description>Apache Karaf bundle demo.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>4.2.0</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.7</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Bundle-Activator>org.apache.karaf.demos.deployer.bundle.Activator</Bundle-Activator>
+                        <Export-Package>
+                            org.apache.karaf.demos.deployer.bundle*;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/demos/deployer/bundle/src/main/java/org/apache/karaf/demos/deployer/bundle/Activator.java b/karaf-2.2.x/demos/deployer/bundle/src/main/java/org/apache/karaf/demos/deployer/bundle/Activator.java
new file mode 100644
index 0000000..d2847b2
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/bundle/src/main/java/org/apache/karaf/demos/deployer/bundle/Activator.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.karaf.demos.deployer.bundle;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+    public void start(BundleContext context) {
+        System.out.println("Starting the Apache Karaf demo bundle");
+    }
+
+    public void stop(BundleContext context) {
+        System.out.println("Stopping the Apache Karaf demo bundle");
+    }
+
+}
diff --git a/karaf-2.2.x/demos/deployer/feature/NOTICE b/karaf-2.2.x/demos/deployer/feature/NOTICE
new file mode 100755
index 0000000..13c1292
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/feature/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/deployer/feature/pom.xml b/karaf-2.2.x/demos/deployer/feature/pom.xml
new file mode 100644
index 0000000..264ec50
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/feature/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+    
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>org.apache.karaf.demos.deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.demos.deployer.feature</groupId>
+    <artifactId>my-feature</artifactId>
+    <version>2.2.7</version>
+    <packaging>pom</packaging>
+    
+    <name>Apache Karaf :: Demos :: Deployer :: Feature</name>
+    <description>Create a feature with the defined dependencies set.</description>
+
+    <dependencies>
+        <!-- Put here the artifacts which should be included in the feature -->
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>features-maven-plugin</artifactId>
+                <version>2.2.7</version>
+                <executions>
+                    <execution>
+                        <id>generate-features-file</id>
+                        <goals>
+                            <goal>generate-features-file</goal>
+                        </goals>
+                        <configuration>
+                            <karafVersion>${project.version}</karafVersion>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/demos/deployer/kar/NOTICE b/karaf-2.2.x/demos/deployer/kar/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/kar/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/deployer/kar/pom.xml b/karaf-2.2.x/demos/deployer/kar/pom.xml
new file mode 100644
index 0000000..4625343
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/kar/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>org.apache.karaf.demos.deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.demos.deployer.kar</groupId>
+    <artifactId>my-kar</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Demos :: Deployer :: Kar</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.1</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>features-maven-plugin</artifactId>
+                <version>2.2.7</version>
+                <executions>
+                    <execution>
+                        <id>create-kar</id>
+                        <goals>
+                            <goal>create-kar</goal>
+                        </goals>
+                        <configuration>
+                            <featuresFile>src/main/resources/features.xml</featuresFile>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/karaf-2.2.x/demos/deployer/kar/src/main/resources/features.xml b/karaf-2.2.x/demos/deployer/kar/src/main/resources/features.xml
new file mode 100644
index 0000000..9a675c9
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/kar/src/main/resources/features.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<features>
+
+    <feature name="my-kar" version="1.0">
+        <bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
+    </feature>
+
+</features>
diff --git a/karaf-2.2.x/demos/deployer/pom.xml b/karaf-2.2.x/demos/deployer/pom.xml
new file mode 100644
index 0000000..b817184
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>demos</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.demos.deployer</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Demos :: Deployer</name>
+
+    <modules>
+        <module>kar</module>
+        <module>wrap</module>
+        <module>bundle</module>
+        <module>feature</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/demos/deployer/wrap/NOTICE b/karaf-2.2.x/demos/deployer/wrap/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/wrap/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/deployer/wrap/pom.xml b/karaf-2.2.x/demos/deployer/wrap/pom.xml
new file mode 100644
index 0000000..5601b29
--- /dev/null
+++ b/karaf-2.2.x/demos/deployer/wrap/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>org.apache.karaf.demos.deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.demos.deployer.wrap</groupId>
+    <artifactId>osgi.commons-lang</artifactId>
+    <version>2.2.7</version>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Demos :: Deployer :: Wrap Bundle osgi.commons-lang</name>
+    <description>This OSGi bundle simply wraps commons-lang-2.4.jar artifact.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.4</version>
+            <optional>true</optional>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>1.1</version>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <artifactSet>
+                                <excludes>
+                                    <exclude>**</exclude>
+                                </excludes>
+                            </artifactSet>
+                            <filters>
+                                <filter>
+                                    <artifact>commons-lang:commons-lang</artifact>
+                                    <excludes>
+                                        <exclude>**</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+                            <createDependencyReducedPom>true</createDependencyReducedPom>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.7</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>manual</Bundle-SymbolicName>
+                        <Export-Package>*</Export-Package>
+                        <Import-Package />
+                        <_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
+                        <_removeheaders>Ignore-Package,Include-Resource,Private-Package,Embed-Dependency</_removeheaders>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/karaf-2.2.x/demos/dump/NOTICE b/karaf-2.2.x/demos/dump/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/demos/dump/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/dump/pom.xml b/karaf-2.2.x/demos/dump/pom.xml
new file mode 100644
index 0000000..59a16e7
--- /dev/null
+++ b/karaf-2.2.x/demos/dump/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>demos</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>dump</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Demos :: Demo Dump provider</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.karaf.diagnostic.core,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                        <Export-Package>
+                            org.apache.karaf.diagnostic.demo
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/demos/dump/src/main/java/org/apache/karaf/diagnostic/demo/ScreenshotDumpProvider.java b/karaf-2.2.x/demos/dump/src/main/java/org/apache/karaf/diagnostic/demo/ScreenshotDumpProvider.java
new file mode 100644
index 0000000..b8bb7d1
--- /dev/null
+++ b/karaf-2.2.x/demos/dump/src/main/java/org/apache/karaf/diagnostic/demo/ScreenshotDumpProvider.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.karaf.diagnostic.demo;
+
+import java.awt.DisplayMode;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.image.BufferedImage;
+import java.io.OutputStream;
+
+import javax.imageio.ImageIO;
+
+import org.apache.karaf.diagnostic.core.DumpDestination;
+import org.apache.karaf.diagnostic.core.DumpProvider;
+
+/**
+ * This demo provider creates images in dump destination which
+ * contains screenshots from all attached displays.
+ */
+public class ScreenshotDumpProvider implements DumpProvider {
+
+	/**
+	 * {@inheritDoc}
+	 */
+    public void createDump(DumpDestination destination) throws Exception {
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        // get all graphic devices attached to computer
+        GraphicsDevice[] gs = ge.getScreenDevices();
+
+        // create dump entry for each device  
+        for (int i=0; i < gs.length; i++) {
+            DisplayMode mode = gs[i].getDisplayMode();
+            Rectangle bounds = new Rectangle(0, 0, mode.getWidth(), mode.getHeight());
+            BufferedImage screenshot = new Robot(gs[i]).createScreenCapture(bounds);
+
+            // to attach your entry to destination you have to execute this line
+            OutputStream outputStream = destination.add("screenshot/display_" + i + ".png");
+            ImageIO.write(screenshot, "PNG", outputStream);
+
+            outputStream.close();
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/demos/dump/src/main/resources/OSGI-INF/blueprint/screenshot.xml b/karaf-2.2.x/demos/dump/src/main/resources/OSGI-INF/blueprint/screenshot.xml
new file mode 100644
index 0000000..62068d1
--- /dev/null
+++ b/karaf-2.2.x/demos/dump/src/main/resources/OSGI-INF/blueprint/screenshot.xml
@@ -0,0 +1,26 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <bean id="screenshotDump" class="org.apache.karaf.diagnostic.demo.ScreenshotDumpProvider" />
+
+    <service ref="screenshotDump" auto-export="interfaces" />
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/demos/pom.xml b/karaf-2.2.x/demos/pom.xml
new file mode 100644
index 0000000..e232a8a
--- /dev/null
+++ b/karaf-2.2.x/demos/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.demos</groupId>
+    <artifactId>demos</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Demos</name>
+
+    <modules>
+        <module>web</module>
+        <module>branding</module>
+        <module>dump</module>
+        <module>command</module>
+        <module>deployer</module>
+  </modules>
+
+</project>
diff --git a/karaf-2.2.x/demos/web/NOTICE b/karaf-2.2.x/demos/web/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/demos/web/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/demos/web/pom.xml b/karaf-2.2.x/demos/web/pom.xml
new file mode 100644
index 0000000..4e134b5
--- /dev/null
+++ b/karaf-2.2.x/demos/web/pom.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.demos</groupId>
+        <artifactId>demos</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>web</artifactId>
+    <packaging>war</packaging>
+    <name>Apache Karaf :: Demos :: Web</name>
+
+    <properties>
+        <jetty.port>8080</jetty.port>
+        <maven-jetty-plugin.version>6.1.26</maven-jetty-plugin.version>
+        <geronimo.servlet.version>1.1.2</geronimo.servlet.version>
+
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.main</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.boot</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf</artifactId>
+            <type>zip</type>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-servlet_2.5_spec</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <warSourceDirectory>src/main/webapp/</warSourceDirectory>
+                    <webResources>
+                        <resource>
+                            <directory>target/karaf</directory>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.mortbay.jetty</groupId>
+                <artifactId>maven-jetty-plugin</artifactId>
+                <version>${maven-jetty-plugin.version}</version>
+                <configuration>
+                    <connectors>
+                        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
+                            <port>${jetty.port}</port>
+                            <maxIdleTime>60000</maxIdleTime>
+                        </connector>
+                    </connectors>
+                    <systemProperties>
+                        <!-- enable easy connection to JConsole -->
+                        <systemProperty>
+                            <name>com.sun.management.jmxremote</name>
+                            <value />
+                        </systemProperty>
+                    </systemProperties>
+                    <scanIntervalSeconds>10</scanIntervalSeconds>
+                    <webAppSourceDirectory>${project.build.directory}/${project.build.finalName}</webAppSourceDirectory>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>unpack-unix</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>unpack</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>apache-karaf</artifactId>
+                                    <type>zip</type>
+                                    <overWrite>true</overWrite>
+                                    <outputDirectory>${project.build.directory}/karaf/WEB-INF</outputDirectory>
+                                    <excludes>**/lib/*,**/*.txt,**/bin/*,**/demos/**,**/lib,**/bin,**/demos</excludes>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-karaf</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <tasks>
+                                <move todir="${project.build.directory}/karaf/WEB-INF/karaf">
+                                    <fileset dir="${project.build.directory}/karaf/WEB-INF/apache-karaf-${project.version}" />
+                                </move>
+                            </tasks>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/demos/web/src/main/java/org/apache/karaf/web/WebAppListener.java b/karaf-2.2.x/demos/web/src/main/java/org/apache/karaf/web/WebAppListener.java
new file mode 100644
index 0000000..50441e4
--- /dev/null
+++ b/karaf-2.2.x/demos/web/src/main/java/org/apache/karaf/web/WebAppListener.java
@@ -0,0 +1,62 @@
+/*
+ * 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.karaf.web;
+
+import java.io.File;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.apache.karaf.main.Main;
+
+public class WebAppListener implements ServletContextListener {
+
+	private Main main;
+
+	public void contextInitialized(ServletContextEvent sce) {
+		try {
+			System.err.println("contextInitialized");
+			String root = new File(sce.getServletContext().getRealPath("/") + "/WEB-INF/karaf").getAbsolutePath();
+			System.err.println("Root: " + root);
+			System.setProperty("karaf.home", root);
+            System.setProperty("karaf.base", root);
+            System.setProperty("karaf.data", root + "/data");
+            System.setProperty("karaf.history", root + "/data/history.txt");
+            System.setProperty("karaf.instances", root + "/instances");
+			System.setProperty("karaf.startLocalConsole", "false");
+			System.setProperty("karaf.startRemoteShell", "true");
+            System.setProperty("karaf.lock", "false");
+			main = new Main(new String[0]);
+            main.launch();
+		} catch (Exception e) {
+			main = null;
+			e.printStackTrace();
+		}
+	}
+
+	public void contextDestroyed(ServletContextEvent sce) {
+		try {
+			System.err.println("contextDestroyed");
+			if (main != null) {
+                main.destroy();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/karaf-2.2.x/demos/web/src/main/webapp/WEB-INF/web.xml b/karaf-2.2.x/demos/web/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..b78af46
--- /dev/null
+++ b/karaf-2.2.x/demos/web/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,36 @@
+<?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.
+-->
+
+<web-app version="2.4"
+         xmlns="http://java.sun.com/xml/ns/j2ee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
+                             http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+  <description>Karaf Embedded Example</description>
+  <display-name>Karaf Embedded Example</display-name>
+
+  <listener>
+    <listener-class>org.apache.karaf.web.WebAppListener</listener-class>
+  </listener>
+
+  <welcome-file-list>
+    <welcome-file>index.jsp</welcome-file>
+  </welcome-file-list>
+		
+</web-app>
diff --git a/karaf-2.2.x/demos/web/src/main/webapp/index.jsp b/karaf-2.2.x/demos/web/src/main/webapp/index.jsp
new file mode 100644
index 0000000..812d187
--- /dev/null
+++ b/karaf-2.2.x/demos/web/src/main/webapp/index.jsp
@@ -0,0 +1,34 @@
+<%--
+    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>
+<title>Apache Karaf</title>
+</head>
+<body>
+
+<h2>Welcome!</h2>
+
+<p>
+Welcome to Apache Karaf web application demo
+</p>
+
+<p>
+You can find more information about Karaf on the <a href="http://karaf.apache.org/">Apache Karaf Site</a>
+</p>
+</body>
+</html>
+	
diff --git a/karaf-2.2.x/deployer/blueprint/NOTICE b/karaf-2.2.x/deployer/blueprint/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/deployer/blueprint/pom.xml b/karaf-2.2.x/deployer/blueprint/pom.xml
new file mode 100644
index 0000000..3002ba5
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/pom.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.deployer</groupId>
+        <artifactId>deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.deployer.blueprint</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Deployer :: Blueprint</name>
+    <description>This deployer transforms a plain blueprint xml file to a deployable bundle</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <!-- Set the blueprint.graceperiod flag to false to allow the bundle to start
+                             See the blueprint config file -->
+                        <Bundle-SymbolicName>${project.artifactId};blueprint.graceperiod:=false</Bundle-SymbolicName>
+                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.deployer.blueprint;-split-package:=merge-first,
+                            org.apache.karaf.util;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java b/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
new file mode 100644
index 0000000..5a9c6ec
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.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.karaf.deployer.blueprint;
+
+import java.io.File;
+import java.net.URL;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+
+import org.apache.felix.fileinstall.ArtifactUrlTransformer;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.SAXException;
+
+/**
+ * A deployment listener that listens for spring xml applications
+ * and creates bundles for these.
+ */
+public class BlueprintDeploymentListener implements ArtifactUrlTransformer {
+
+    private final Logger logger = LoggerFactory.getLogger(BlueprintDeploymentListener.class);
+
+    private DocumentBuilderFactory dbf;
+
+    public boolean canHandle(File artifact) {
+        try {
+            if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
+                Document doc = parse(artifact);
+                String name = doc.getDocumentElement().getLocalName();
+                String uri  = doc.getDocumentElement().getNamespaceURI();
+                if ("blueprint".equals(name) && "http://www.osgi.org/xmlns/blueprint/v1.0.0".equals(uri)) {
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            logger.error("Unable to parse deployed file " + artifact.getAbsolutePath(), e);
+        }
+        return false;
+    }
+
+    public URL transform(URL artifact) {
+        try {
+            return new URL("blueprint", null, artifact.toString());
+        } catch (Exception e) {
+            logger.error("Unable to build blueprint application bundle", e);
+            return null;
+        }
+    }
+
+    protected Document parse(File artifact) throws Exception {
+        if (dbf == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+        }
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        db.setErrorHandler(new ErrorHandler() {
+            public void warning(SAXParseException exception) throws SAXException {
+            }
+            public void error(SAXParseException exception) throws SAXException {
+            }
+            public void fatalError(SAXParseException exception) throws SAXException {
+                throw exception;
+            }
+        });
+        return db.parse(artifact);
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java b/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
new file mode 100644
index 0000000..eabdbb9
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
@@ -0,0 +1,192 @@
+/**
+ *
+ * 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.karaf.deployer.blueprint;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.karaf.util.DeployerUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.osgi.framework.Constants;
+
+public class BlueprintTransformer {
+
+    static Transformer transformer;
+    static DocumentBuilderFactory dbf;
+    static TransformerFactory tf;
+
+
+    public static void transform(URL url, OutputStream os) throws Exception {
+        // Build dom document
+        Document doc = parse(url);
+        // Heuristicly retrieve name and version
+        String name = url.getPath();
+        int idx = name.lastIndexOf('/');
+        if (idx >= 0) {
+            name = name.substring(idx + 1);
+        }
+        String[] str = DeployerUtils.extractNameVersionType(name);
+        // Create manifest
+        Manifest m = new Manifest();
+        m.getMainAttributes().putValue("Manifest-Version", "2");
+        m.getMainAttributes().putValue(Constants.BUNDLE_MANIFESTVERSION, "2");
+        m.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, str[0]);
+        m.getMainAttributes().putValue(Constants.BUNDLE_VERSION, str[1]);
+        String importPkgs = getImportPackages(analyze(new DOMSource(doc)));
+        if (importPkgs != null && importPkgs.length() > 0) {
+            m.getMainAttributes().putValue(Constants.IMPORT_PACKAGE, importPkgs);
+        }
+        m.getMainAttributes().putValue(Constants.DYNAMICIMPORT_PACKAGE, "*");
+        // Extract manifest entries from the DOM
+        NodeList l = doc.getElementsByTagName("manifest");
+        if (l != null) {
+            for (int i = 0; i < l.getLength(); i++) {
+                Element e = (Element) l.item(i);
+                String text = e.getTextContent();
+                Properties props = new Properties();
+                props.load(new ByteArrayInputStream(text.trim().getBytes()));
+                Enumeration en = props.propertyNames();
+                while (en.hasMoreElements()) {
+                    String k = (String) en.nextElement();
+                    String v = props.getProperty(k);
+                    m.getMainAttributes().putValue(k, v);
+                }
+                e.getParentNode().removeChild(e);
+            }
+        }
+
+        JarOutputStream out = new JarOutputStream(os);
+        ZipEntry e = new ZipEntry(JarFile.MANIFEST_NAME);
+        out.putNextEntry(e);
+        m.write(out);
+        out.closeEntry();
+        e = new ZipEntry("OSGI-INF/");
+        out.putNextEntry(e);
+        e = new ZipEntry("OSGI-INF/blueprint/");
+        out.putNextEntry(e);
+        out.closeEntry();
+        e = new ZipEntry("OSGI-INF/blueprint/" + name);
+        out.putNextEntry(e);
+        // Copy the new DOM
+        if (tf == null) {
+            tf = TransformerFactory.newInstance();
+        }
+        tf.newTransformer().transform(new DOMSource(doc), new StreamResult(out));
+        out.closeEntry();
+        out.close();
+    }
+
+    public static Set<String> analyze(Source source) throws Exception {
+        if (transformer == null) {
+            if (tf == null) {
+                tf = TransformerFactory.newInstance();
+            }
+            Source s = new StreamSource(BlueprintTransformer.class.getResourceAsStream("extract.xsl"));
+            transformer = tf.newTransformer(s);
+        }
+
+        Set<String> refers = new TreeSet<String>();
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        Result r = new StreamResult(bout);
+        transformer.transform(source, r);
+
+        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+        bout.close();
+
+        BufferedReader br = new BufferedReader(new InputStreamReader(bin));
+
+        String line = br.readLine();
+        while (line != null) {
+            line = line.trim();
+            if (line.length() > 0) {
+                String parts[] = line.split("\\s*,\\s*");
+                for (int i = 0; i < parts.length; i++) {
+                    int n = parts[i].lastIndexOf('.');
+                    if (n > 0) {
+                        String pkg = parts[i].substring(0, n);
+                        if (!pkg.startsWith("java.")) {
+                            refers.add(pkg);
+                        }
+                    }
+                }
+            }
+            line = br.readLine();
+        }
+        br.close();
+        return refers;
+    }
+
+    protected static String getImportPackages(Set<String> packages) {
+        StringBuilder sb = new StringBuilder();
+        for (String pkg : packages) {
+            if (sb.length() > 0) {
+                sb.append(",");
+            }
+            sb.append(pkg);
+        }
+        return sb.toString();
+    }
+
+    protected static Document parse(URL url) throws Exception {
+        if (dbf == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+        }
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(url.toString());
+    }
+
+    protected static void copyInputStream(InputStream in, OutputStream out) throws Exception {
+        byte[] buffer = new byte[4096];
+        int len = in.read(buffer);
+        while (len >= 0) {
+            out.write(buffer, 0, len);
+            len = in.read(buffer);
+        }
+    }
+}
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java b/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
new file mode 100644
index 0000000..452f4cb
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
@@ -0,0 +1,93 @@
+/**
+ *
+ * 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.karaf.deployer.blueprint;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.osgi.service.url.AbstractURLStreamHandlerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A URL handler that will transform a JBI artifact to an OSGi bundle
+ * on the fly.  Needs to be registered in the OSGi registry.
+ */
+public class BlueprintURLHandler extends AbstractURLStreamHandlerService {
+
+	private final Logger logger = LoggerFactory.getLogger(BlueprintURLHandler.class);
+
+	private static String SYNTAX = "blueprint: bp-xml-uri";
+
+	private URL blueprintXmlURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+	public URLConnection openConnection(URL url) throws IOException {
+		if (url.getPath() == null || url.getPath().trim().length() == 0) {
+			throw new MalformedURLException ("Path cannot be null or empty. Syntax: " + SYNTAX );
+		}
+		blueprintXmlURL = new URL(url.getPath());
+
+		logger.debug("Blueprint xml URL is: [" + blueprintXmlURL + "]");
+		return new Connection(url);
+	}
+	
+	public URL getBlueprintXmlURL() {
+		return blueprintXmlURL;
+	}
+
+    public class Connection extends URLConnection {
+
+        public Connection(URL url) {
+            super(url);
+        }
+
+        @Override
+        public void connect() throws IOException {
+        }
+
+        @Override
+        public InputStream getInputStream() throws IOException {
+            try {
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                BlueprintTransformer.transform(blueprintXmlURL, os);
+                os.close();
+                return new ByteArrayInputStream(os.toByteArray());
+            } catch (Exception e) {
+                logger.error("Error opening blueprint xml url", e);
+                throw (IOException) new IOException("Error opening blueprint xml url").initCause(e);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml b/karaf-2.2.x/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml
new file mode 100644
index 0000000..172548e
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml
@@ -0,0 +1,40 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <service id="blueprintUrlHandler" interface="org.osgi.service.url.URLStreamHandlerService">
+        <service-properties>
+            <entry key="url.handler.protocol" value="blueprint"/>
+        </service-properties>
+        <bean class="org.apache.karaf.deployer.blueprint.BlueprintURLHandler"/>
+    </service>
+
+    <bean id="blueprintDeploymentListener" class="org.apache.karaf.deployer.blueprint.BlueprintDeploymentListener"/>
+
+    <!-- Force a reference to the url handler above from the osgi registry to (try to) make sure
+         the url handler is registered inside the framework.  Else we can run into timing issues
+         where fileinstall will use the featureDeploymentListener before the url can be actually
+         used.  In order to not block the bundle, the blueprint.graceperiod=false flag must be
+         set on the SymbolicName osgi header -->
+    <reference id="blueprintUrlHandlerRef" interface="org.osgi.service.url.URLStreamHandlerService" filter="url.handler.protocol=blueprint" />
+
+    <service ref="blueprintDeploymentListener" auto-export="interfaces" depends-on="blueprintDeploymentListener" />
+
+</blueprint>
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/deployer/blueprint/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..6b8c192
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The blueprint deployer allows you to drop Blueprint XML files directly in the deploy directory.
+
+    Karaf will load the Blueprint descriptor and transform it into a deployable bundle.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[31mDeployer\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/blueprint-deployer-1.0.0.xsd b/karaf-2.2.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/blueprint-deployer-1.0.0.xsd
new file mode 100644
index 0000000..81adc3c
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/blueprint-deployer-1.0.0.xsd
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault='qualified'
+           targetNamespace='http://karaf.apache.org/xmlns/deployer/blueprint/v1.0.0'
+           xmlns:xs='http://www.w3.org/2001/XMLSchema'>
+
+    <xs:element name="manifest">
+        <xs:complexType mixed="true">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+The content of this element will be read using the syntax of the java util Properties
+class (http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html) and will
+override any generated manifest entry.
+                ]]></xs:documentation>
+            </xs:annotation>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
diff --git a/karaf-2.2.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/extract.xsl b/karaf-2.2.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/extract.xsl
new file mode 100644
index 0000000..eb44e25
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/extract.xsl
@@ -0,0 +1,60 @@
+<?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.
+
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+	<xsl:output method="text" />
+
+	<xsl:template match="/">
+
+		<!-- Match all attributes that holds a class or a comma delimited 
+		     list of classes and print them -->
+
+		<xsl:for-each select="
+				//bp:bean/@class 
+			|	//bp:service/@interface 
+			|   //bp:service/bp:interfaces/bp:value/text()
+ 			|	//bp:reference/@interface
+			|	//bp:reference-list/@interface
+		">
+			<xsl:value-of select="." />
+			<xsl:text>
+			</xsl:text>
+		</xsl:for-each>
+
+		<xsl:for-each select="
+				//bp:bean/bp:argument/@type
+		    |	//bp:list/@value-type 
+    		|	//bp:set/@value-type 
+    		|	//bp:array/@value-type 
+			|   //bp:map/@key-type
+			|   //bp:map/@value-type
+		">
+		    <xsl:choose>
+		        <xsl:when test="contains(., '[')"><xsl:value-of select="substring-before(., '[')"/></xsl:when>
+		        <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
+			</xsl:choose>
+			<xsl:text>
+			</xsl:text>
+		</xsl:for-each>
+
+	</xsl:template>
+
+
+</xsl:stylesheet>
+
diff --git a/karaf-2.2.x/deployer/blueprint/src/test/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java b/karaf-2.2.x/deployer/blueprint/src/test/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java
new file mode 100644
index 0000000..942dbe8
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/test/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.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.karaf.deployer.blueprint;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.jar.JarInputStream;
+import javax.xml.transform.dom.DOMSource;
+
+import junit.framework.TestCase;
+
+public class BlueprintDeploymentListenerTest extends TestCase {
+
+    public void testPackagesExtraction() throws Exception {
+        BlueprintDeploymentListener l = new BlueprintDeploymentListener();
+        File f = new File(getClass().getClassLoader().getResource("test.xml").toURI());
+        Set<String> pkgs = BlueprintTransformer.analyze(new DOMSource(BlueprintTransformer.parse(f.toURL())));
+        assertNotNull(pkgs);
+        assertEquals(1, pkgs.size());
+        Iterator<String> it = pkgs.iterator();
+        assertEquals("org.apache.aries.blueprint.sample", it.next());
+    }
+
+    public void testCustomManifest() throws Exception {
+        File f = File.createTempFile("smx", ".jar");
+        try {
+            OutputStream os = new FileOutputStream(f);
+            BlueprintTransformer.transform(getClass().getClassLoader().getResource("test.xml"), os);
+            os.close();
+            InputStream is = new FileInputStream(f);
+            JarInputStream jar = new JarInputStream(is);
+            jar.getManifest().write(System.err);
+            is.close();
+        } finally {
+            f.delete();
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/blueprint/src/test/resources/test.xml b/karaf-2.2.x/deployer/blueprint/src/test/resources/test.xml
new file mode 100644
index 0000000..158e125
--- /dev/null
+++ b/karaf-2.2.x/deployer/blueprint/src/test/resources/test.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+
+    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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+           default-availability="optional">
+
+    <type-converters>
+        <bean id="converter1" class="org.apache.aries.blueprint.sample.DateTypeConverter">
+            <property name="format" value="yyyy.MM.dd"/>
+        </bean>
+        <bean id="converter2" class="org.apache.aries.blueprint.sample.CurrencyTypeConverter"/>
+
+        <cm:property-placeholder id="property-placeholder" persistent-id="blueprint-sample">
+            <cm:default-properties>
+                <cm:property name="key.b" value="-1"/>
+            </cm:default-properties>
+        </cm:property-placeholder>
+    </type-converters>
+
+    <bean id="foo" class="org.apache.aries.blueprint.sample.Foo" init-method="init" destroy-method="destroy">
+        <property name="a" value="5" />
+        <property name="b" value="${key.b}" />
+        <property name="bar" ref="bar" />
+        <property name="currency">
+              <value>PLN</value>
+        </property>
+        <property name="date">
+              <value>2009.04.17</value>
+        </property>
+    </bean>
+
+    <bean id="bar" class="org.apache.aries.blueprint.sample.Bar">
+        <property name="value"><value>Hello FooBar</value></property>
+        <property name="context" ref="bundleContext"/>
+        <property name="list">
+            <list>
+                <value>a list element</value>
+                <value type = "java.lang.Integer">5</value>
+            </list>
+        </property>
+    </bean>
+
+    <service ref="foo" auto-export="all-classes">
+        <service-properties>
+            <entry key="key" value="value"/>
+        </service-properties>
+        <registration-listener ref="fooRegistrationListener"
+                               registration-method="serviceRegistered"
+                               unregistration-method="serviceUnregistered"/>
+    </service>
+
+    <bean id="fooRegistrationListener" class="org.apache.aries.blueprint.sample.FooRegistrationListener"/>
+
+    <reference id="ref" interface="org.apache.aries.blueprint.sample.Foo">
+    </reference>
+
+    <reference id="ref2" interface="org.apache.aries.blueprint.sample.InterfaceA" timeout="100">
+        <reference-listener bind-method="bind" unbind-method="unbind" ref="bindingListener" />
+    </reference>
+
+    <bean id="bindingListener" class="org.apache.aries.blueprint.sample.BindingListener"/>
+
+    <reference-list id="ref-list" interface="org.apache.aries.blueprint.sample.InterfaceA">
+        <reference-listener bind-method="bind" unbind-method="unbind" ref="listBindingListener" />
+    </reference-list>
+
+    <bean id="listBindingListener" class="org.apache.aries.blueprint.sample.BindingListener"/>
+
+</blueprint>
+
diff --git a/karaf-2.2.x/deployer/features/NOTICE b/karaf-2.2.x/deployer/features/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/deployer/features/pom.xml b/karaf-2.2.x/deployer/features/pom.xml
new file mode 100644
index 0000000..2185849
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/pom.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.deployer</groupId>
+        <artifactId>deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.deployer.features</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Deployer :: Features</name>
+    <description>This deployer can deploy features descriptor on the fly</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <!-- Set the blueprint.graceperiod flag to false to allow the bundle to start
+                             See the blueprint config file -->
+                        <Bundle-SymbolicName>${project.artifactId};blueprint.graceperiod:=false</Bundle-SymbolicName>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.deployer.features;-split-package:=merge-first,
+                            org.apache.karaf.util;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java b/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
new file mode 100644
index 0000000..57766aa
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
@@ -0,0 +1,255 @@
+/*
+ * 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.karaf.deployer.features;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.*;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.karaf.features.internal.FeatureImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+
+import org.apache.felix.fileinstall.ArtifactUrlTransformer;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+/**
+ * A deployment listener able to hot deploy a feature descriptor
+ */
+public class FeatureDeploymentListener implements ArtifactUrlTransformer, BundleListener {
+
+    public static final String FEATURE_PATH = "org.apache.karaf.shell.features";
+
+    private final Logger logger = LoggerFactory.getLogger(FeatureDeploymentListener.class);
+
+    private DocumentBuilderFactory dbf;
+    private FeaturesService featuresService;
+    private BundleContext bundleContext;
+
+    public void setFeaturesService(FeaturesService featuresService) {
+        this.featuresService = featuresService;
+    }
+
+    public FeaturesService getFeaturesService() {
+        return featuresService;
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void init() throws Exception {
+        bundleContext.addBundleListener(this);
+        for (Bundle bundle : bundleContext.getBundles()) {
+            if (bundle.getState() == Bundle.RESOLVED || bundle.getState() == Bundle.STARTING
+                    || bundle.getState() == Bundle.ACTIVE)
+            bundleChanged(new BundleEvent(BundleEvent.RESOLVED, bundle));
+        }
+    }
+
+    public void destroy() throws Exception {
+        bundleContext.removeBundleListener(this);
+    }
+
+    public boolean canHandle(File artifact) {
+        try {
+            if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
+                Document doc = parse(artifact);
+                String name = doc.getDocumentElement().getLocalName();
+                String uri  = doc.getDocumentElement().getNamespaceURI();
+                if ("features".equals(name) && (uri == null || "".equals(uri)  || "http://karaf.apache.org/xmlns/features/v1.0.0".equalsIgnoreCase(uri))) {
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            logger.error("Unable to parse deployed file " + artifact.getAbsolutePath(), e);
+        }
+        return false;
+    }
+
+    public URL transform(URL artifact) {
+        // We can't really install the feature right now and just return nothing.
+        // We would not be aware of the fact that the bundle has been uninstalled
+        // and therefore require the feature to be uninstalled.
+        // So instead, create a fake bundle with the file inside, which will be listened by
+        // this deployer: installation / uninstallation of the feature will be done
+        // while the bundle is installed / uninstalled.
+        try {
+            return new URL("feature", null, artifact.toString());
+        } catch (Exception e) {
+            logger.error("Unable to build feature bundle", e);
+            return null;
+        }
+    }
+
+    public void bundleChanged(BundleEvent bundleEvent) {
+            Bundle bundle = bundleEvent.getBundle();
+            if (bundleEvent.getType() == BundleEvent.RESOLVED) {
+                try {
+                    List<URL> urls = new ArrayList<URL>();
+                    Enumeration featuresUrlEnumeration = bundle.findEntries("/META-INF/" + FEATURE_PATH + "/", "*.xml", false);
+                    while (featuresUrlEnumeration != null && featuresUrlEnumeration.hasMoreElements()) {
+                        URL url = (URL) featuresUrlEnumeration.nextElement();
+                        try {
+                            featuresService.addRepository(url.toURI());
+                            for (Repository repo : featuresService.listRepositories()) {
+                                if (repo.getURI().equals(url.toURI())) {
+                                    Set<Feature> features = new HashSet<Feature>(Arrays.asList(repo.getFeatures()));
+                                    Set<Feature> autoInstallFeatures = new HashSet<Feature>();
+                                    for(Feature feature:features) {
+                                        if(feature.getInstall().equals(Feature.DEFAULT_INSTALL_MODE)){
+                                            autoInstallFeatures.add(feature);
+                                        }
+                                    }
+                                    featuresService.installFeatures(autoInstallFeatures, EnumSet.noneOf(FeaturesService.Option.class));
+                                }
+                            }
+                            urls.add(url);
+                        } catch (Exception e) {
+                            logger.error("Unable to install features", e);
+                        }
+                    }
+                    synchronized (this) {
+                        File file = bundleContext.getDataFile("FeatureDeploymentListener.cfg");
+                        if (file != null) {
+                            Properties props = new Properties();
+                            if (file.exists()) {
+                                InputStream input = new FileInputStream(file);
+                                try {
+                                    props.load(input);
+                                } finally {
+                                    input.close();
+                                }
+                            }
+                            String prefix = bundle.getSymbolicName() + "-" + bundle.getVersion();
+                            props.put(prefix + ".count", Integer.toString(urls.size()));
+                            for (int i = 0; i < urls.size(); i++) {
+                                props.put(prefix + ".url." + i, urls.get(i).toExternalForm());
+                            }
+                            OutputStream output = new FileOutputStream(file);
+                            try {
+                                props.store(output, null);
+                            } finally {
+                                output.close();
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    logger.error("Unable to install deployed features for bundle: " + bundle.getSymbolicName() + " - " + bundle.getVersion(), e);
+                }
+            } else if (bundleEvent.getType() == BundleEvent.UNINSTALLED) {
+                try {
+                    synchronized (this) {
+                        File file = bundleContext.getDataFile("FeatureDeploymentListener.cfg");
+                        if (file != null) {
+                            Properties props = new Properties();
+                            if (file.exists()) {
+                                InputStream input = new FileInputStream(file);
+                                try {
+                                    props.load(input);
+                                } finally {
+                                    input.close();
+                                }
+                            }
+                            String prefix = bundle.getSymbolicName() + "-" + bundle.getVersion();
+                            String countStr = (String) props.get(prefix + ".count");
+                            if (countStr != null) {
+                                int count = Integer.parseInt(countStr);
+                                for (int i = 0; i < count; i++) {
+                                    URL url = new URL((String) props.get(prefix + ".url." + i));
+                                    for (Repository repo : featuresService.listRepositories()) {
+                                        try {
+                                            if (repo.getURI().equals(url.toURI())) {
+                                                for (Feature f : repo.getFeatures()) {
+                                                    try {
+                                                        featuresService.uninstallFeature(f.getName(), f.getVersion());
+                                                    } catch (Exception e) {
+                                                        logger.error("Unable to uninstall feature: " + f.getName(), e);
+                                                    }
+                                                }
+                                            }
+                                        } catch (Exception e) {
+                                            logger.error("Unable to uninstall features: " + url, e);
+                                        }
+                                    }
+                                    try {
+                                        featuresService.removeRepository(url.toURI());
+                                    } catch (URISyntaxException e) {
+                                        logger.error("Unable to remove repository: " + url, e);
+                                    }
+                                }
+                            }
+                            for (Iterator<Object> it = props.keySet().iterator(); it.hasNext();) {
+                                if (it.next().toString().startsWith(prefix + ".")) {
+                                    it.remove();
+                                }
+                            }
+                            OutputStream output = new FileOutputStream(file);
+                            try {
+                                props.store(output, null);
+                            } finally {
+                                output.close();
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    logger.error("Unable to uninstall deployed features for bundle: " + bundle.getSymbolicName() + " - " + bundle.getVersion(), e);
+                }
+            }
+    }
+
+    protected Document parse(File artifact) throws Exception {
+        if (dbf == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+        }
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        db.setErrorHandler(new ErrorHandler() {
+            public void warning(SAXParseException exception) throws SAXException {
+            }
+            public void error(SAXParseException exception) throws SAXException {
+            }
+            public void fatalError(SAXParseException exception) throws SAXException {
+                throw exception;
+            }
+        });
+        return db.parse(artifact);
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureTransformer.java b/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureTransformer.java
new file mode 100644
index 0000000..898b70d
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureTransformer.java
@@ -0,0 +1,84 @@
+/**
+ *
+ * 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.karaf.deployer.features;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+
+import org.apache.karaf.util.DeployerUtils;
+import org.osgi.framework.Constants;
+
+/**
+ * Transform a feature descriptor into an osgi bundle
+ */
+public class FeatureTransformer {
+
+    public static void transform(URL url, OutputStream os) throws Exception {
+        // Heuristicly retrieve name and version
+        String name = url.getPath();
+        int idx = name.lastIndexOf('/');
+        if (idx >= 0) {
+            name = name.substring(idx + 1);
+        }
+        String[] str = DeployerUtils.extractNameVersionType(name);
+        // Create manifest
+        Manifest m = new Manifest();
+        m.getMainAttributes().putValue("Manifest-Version", "2");
+        m.getMainAttributes().putValue(Constants.BUNDLE_MANIFESTVERSION, "2");
+        m.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, str[0]);
+        m.getMainAttributes().putValue(Constants.BUNDLE_VERSION, str[1]);
+        // Put content
+        JarOutputStream out = new JarOutputStream(os);
+        ZipEntry e = new ZipEntry(JarFile.MANIFEST_NAME);
+        out.putNextEntry(e);
+        m.write(out);
+        out.closeEntry();
+        e = new ZipEntry("META-INF/");
+        out.putNextEntry(e);
+        e = new ZipEntry("META-INF/" + FeatureDeploymentListener.FEATURE_PATH + "/");
+        out.putNextEntry(e);
+        out.closeEntry();
+        e = new ZipEntry("META-INF/" + FeatureDeploymentListener.FEATURE_PATH + "/" + name);
+        out.putNextEntry(e);
+        InputStream fis = url.openStream();
+        try {
+            copyInputStream(fis, out);
+        } finally {
+            fis.close();
+        }
+        out.closeEntry();
+        out.close();
+        os.close();
+    }
+
+    private static void copyInputStream(InputStream in, OutputStream out) throws IOException {
+        byte[] buffer = new byte[8192];
+        int len = in.read(buffer);
+        while (len >= 0) {
+            out.write(buffer, 0, len);
+            len = in.read(buffer);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureURLHandler.java b/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureURLHandler.java
new file mode 100644
index 0000000..20608b3
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureURLHandler.java
@@ -0,0 +1,89 @@
+/*
+ * 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.karaf.deployer.features;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.osgi.service.url.AbstractURLStreamHandlerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * URL handler for features
+ */
+public class FeatureURLHandler extends AbstractURLStreamHandlerService {
+
+    private final Logger logger = LoggerFactory.getLogger(FeatureURLHandler.class);
+
+    private static String SYNTAX = "feature: xml-uri";
+
+    private URL featureXmlURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws java.io.IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+    public URLConnection openConnection(URL url) throws IOException {
+        if (url.getPath() == null || url.getPath().trim().length() == 0) {
+            throw new MalformedURLException("Path cannot be null or empty. Syntax: " + SYNTAX );
+        }
+        featureXmlURL = new URL(url.getPath());
+
+        logger.debug("Features xml URL is: [" + featureXmlURL + "]");
+        return new Connection(url);
+    }
+
+    public URL getFeatureXmlURL() {
+        return featureXmlURL;
+    }
+
+    public class Connection extends URLConnection {
+
+        public Connection(URL url) {
+            super(url);
+        }
+
+        @Override
+        public void connect() throws IOException {
+        }
+
+        @Override
+        public InputStream getInputStream() throws IOException {
+            try {
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                FeatureTransformer.transform(featureXmlURL, os);
+                os.close();
+                return new ByteArrayInputStream(os.toByteArray());
+            } catch (Exception e) {
+                logger.error("Error opening features xml url", e);
+                throw (IOException) new IOException("Error opening features xml url").initCause(e);
+            }
+        }
+    }
+
+
+}
diff --git a/karaf-2.2.x/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml b/karaf-2.2.x/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml
new file mode 100644
index 0000000..2ecc8ae
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml
@@ -0,0 +1,47 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           default-activation="lazy">
+
+    <service id="featureUrlHandler" interface="org.osgi.service.url.URLStreamHandlerService">
+    	<service-properties>
+            <entry key="url.handler.protocol" value="feature"/>
+        </service-properties>
+        <bean class="org.apache.karaf.deployer.features.FeatureURLHandler"/>
+    </service>
+
+    <bean id="featureDeploymentListener" class="org.apache.karaf.deployer.features.FeatureDeploymentListener"
+          init-method="init" destroy-method="destroy" activation="lazy">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="featuresService">
+            <reference interface="org.apache.karaf.features.FeaturesService"/>
+        </property>
+    </bean>
+
+    <!-- Force a reference to the url handler above from the osgi registry to (try to) make sure
+         the url handler is registered inside the framework.  Else we can run into timing issues
+         where fileinstall will use the featureDeploymentListener before the url can be actually
+         used.  In order to not block the bundle, the blueprint.graceperiod=false flag must be
+         set on the SymbolicName osgi header -->
+    <reference id="featureUrlHandlerRef" interface="org.osgi.service.url.URLStreamHandlerService" filter="url.handler.protocol=feature" />
+
+    <service ref="featureDeploymentListener" auto-export="interfaces" depends-on="featureUrlHandlerRef"/>
+
+</blueprint>
diff --git a/karaf-2.2.x/deployer/features/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/deployer/features/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..d23030b
--- /dev/null
+++ b/karaf-2.2.x/deployer/features/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The features deployer allow you to drop directly a XML features descriptor in the Karaf deploy directory.
+
+    Karaf will resolve and deploy all features and bundles contained in this features descriptor.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[31mDeployer\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/NOTICE b/karaf-2.2.x/deployer/kar/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/deployer/kar/pom.xml b/karaf-2.2.x/deployer/kar/pom.xml
new file mode 100644
index 0000000..5807471
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/pom.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.deployer</groupId>
+        <artifactId>deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.deployer.kar</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Deployer :: Karaf Archive (.kar)</name>
+    <description>This deployer can deploy .kar archives on the fly</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <!-- Set the blueprint.graceperiod flag to false to allow the bundle to start
+                             See the blueprint config file -->
+                        <Bundle-SymbolicName>${project.artifactId};blueprint.graceperiod:=false</Bundle-SymbolicName>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.deployer.kar;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java b/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java
new file mode 100644
index 0000000..ec187a5
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java
@@ -0,0 +1,343 @@
+/*
+ * 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.karaf.deployer.kar;
+
+import org.apache.felix.fileinstall.ArtifactInstaller;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class KarArtifactInstaller implements ArtifactInstaller {
+
+    public static final String FEATURES_CLASSIFIER = "features";
+	private final Logger logger = LoggerFactory.getLogger(KarArtifactInstaller.class);
+
+	private static final String KAR_SUFFIX = ".kar";
+	private static final String ZIP_SUFFIX = ".zip";
+
+    private String base = "./";
+	private String localRepoPath = "./target/local-repo";
+
+	private String timestampPath;
+
+	private DocumentBuilderFactory dbf;
+
+	private FeaturesService featuresService;
+
+	public void init() {
+		dbf = DocumentBuilderFactory.newInstance();
+		dbf.setNamespaceAware(true);
+
+		timestampPath = localRepoPath + File.separator + ".timestamps";
+		if (new File(timestampPath).mkdirs()) {
+			logger.warn("Unable to create directory for Karaf Archive timestamps. Results may vary...");
+		}
+
+        logger.info("Karaf archives will be extracted to {}", localRepoPath);
+		logger.info("Timestamps for Karaf archives will be extracted to {}", timestampPath);
+	}
+
+	public void destroy() {
+		logger.info("Karaf archive installer destroyed.");
+	}
+
+
+	public void install(File file) throws Exception {
+		// Check to see if this file has already been extracted. For example, on restart of Karaf,
+		// we don't necessarily want to re-extract all the Karaf Archives!
+		//
+		if (alreadyExtracted(file)) {
+			logger.info("Ignoring '{}'; timestamp indicates it's already been deployed.", file);
+			return;
+		}
+
+        logger.info("Installing KAR file {}", file);
+
+		ZipFile zipFile = new ZipFile(file);
+
+        List<URI> featuresRepositoriesInKar = new ArrayList<URI>();
+
+        Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zipFile.entries();
+		while (entries.hasMoreElements()) {
+			ZipEntry entry = entries.nextElement();
+
+            String repoEntryName = getRepoEntryName(entry);
+
+			if (repoEntryName != null) {
+                File extract = extract(zipFile, entry, repoEntryName, localRepoPath);
+                if (isFeaturesRepository(extract)) {
+                    addToFeaturesRepositories(extract.toURI());
+                    featuresRepositoriesInKar.add(extract.toURI());
+                }
+			}
+            if (entry.getName().startsWith("resource")) {
+                String resourceEntryName = entry.getName().substring("resource/".length());
+                extract(zipFile, entry, resourceEntryName, base);
+            }
+		}
+
+        installFeatures(featuresRepositoriesInKar);
+
+		zipFile.close();
+
+		updateTimestamp(file);
+	}
+
+    private void installFeatures(List<URI> featuresRepositories) {
+        for (Repository repository : featuresService.listRepositories()) {
+            for (URI karFeatureRepoUri : featuresRepositories) {
+                if (repository.getURI().equals(karFeatureRepoUri)) {
+                    try {
+                        for (Feature feature : repository.getFeatures()) {
+                            try {
+                                featuresService.installFeature(feature, EnumSet.noneOf(FeaturesService.Option.class));
+                            } catch (Exception e) {
+                                logger.warn("Unable to install Kar feature {}", feature.getName() + "/" + feature.getVersion(), e);
+                            }
+                        }
+                    } catch (Exception e) {
+                        logger.warn("Can't get features for KAR {}", karFeatureRepoUri, e);
+                    }
+                }
+            }
+        }
+    }
+
+    private File extract(ZipFile zipFile, ZipEntry entry, String repoEntryName, String base) throws IOException {
+        File extract;
+        if (entry.isDirectory()) {
+            extract = new File(base + File.separator + repoEntryName);
+            logger.debug("Creating directory '{}'", extract.getName());
+            extract.mkdirs();
+        } else {
+            extract = new File(base + File.separator + repoEntryName);
+            extract.getParentFile().mkdirs();
+
+            InputStream in = zipFile.getInputStream(entry);
+            FileOutputStream out = new FileOutputStream(extract);
+
+            byte[] buffer = new byte[8192];
+            int count = in.read(buffer);
+            int totalBytes = 0;
+            while (count >= 0) {
+                out.write(buffer, 0, count);
+                totalBytes += count;
+                count = in.read(buffer);
+            }
+
+            logger.debug("Extracted {} bytes to {}", totalBytes, extract);
+
+            in.close();
+            out.flush();
+            out.close();
+        }
+        return extract;
+    }
+
+    private String getRepoEntryName(ZipEntry entry) {
+        String entryName = entry.getName();
+        if (entryName.startsWith("repository")) {
+            return entryName.substring("repository/".length());
+        }
+        if (entryName.startsWith("META-INF") || entryName.startsWith("resources")) {
+            return null;
+
+        }
+        return entryName;
+    }
+
+    public void uninstall(File file) throws Exception {
+        File timestamp = getArchiveTimestampFile(file);
+        if (timestamp.exists()) {
+            logger.debug("Removing the timestamp file");
+            timestamp.delete();
+        }
+		logger.warn("Karaf archive '{}' has been removed; however, its feature URLs have not been deregistered, and its bundles are still available in '{}'.", file, localRepoPath);
+	}
+
+	public void update(File file) throws Exception {
+		logger.warn("Karaf archive '{}' has been updated; redeploying.", file);
+		install(file);
+	}
+
+	protected void updateTimestamp(File karafArchive) throws Exception {
+		File timestamp = getArchiveTimestampFile(karafArchive);
+
+		if (timestamp.exists()) {
+            logger.debug("Deleting old timestamp file '{}'", timestamp);
+
+			if (!timestamp.delete()) {
+				throw new Exception("Unable to delete archive timestamp '" + timestamp + "'");
+			}
+		}
+
+		logger.debug("Creating timestamp file '{}'", timestamp);
+		timestamp.createNewFile();
+	}
+
+	protected boolean alreadyExtracted(File karafArchive) {
+		File timestamp = getArchiveTimestampFile(karafArchive);
+		if (timestamp.exists()) {
+			return timestamp.lastModified() >= karafArchive.lastModified();
+		}
+		return false;
+	}
+
+	protected File getArchiveTimestampFile(File karafArchive) {
+        File timestampDir = new File(new File(localRepoPath), ".timestamps");
+        if (!timestampDir.exists()) {
+            timestampDir.mkdirs();
+        }
+		return new File(timestampDir, karafArchive.getName());
+	}
+
+	protected boolean isFeaturesRepository(File artifact)  {
+        try {
+			if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
+			    Document doc = parse(artifact);
+			    String name = doc.getDocumentElement().getLocalName();
+			    String uri  = doc.getDocumentElement().getNamespaceURI();
+			    if ("features".equals(name) && (uri == null || "".equals(uri) || uri.startsWith("http://karaf.apache.org/xmlns/features/v"))) {
+			        return true;
+			    }
+			}
+		} catch (Exception e) {
+            logger.debug("File '{}' is not a features file.", artifact.getName(), e);
+		}
+		return false;
+	}
+
+    protected Document parse(File artifact) throws Exception {
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        db.setErrorHandler(new ErrorHandler() {
+            public void warning(SAXParseException exception) throws SAXException {
+            }
+            public void error(SAXParseException exception) throws SAXException {
+            }
+            public void fatalError(SAXParseException exception) throws SAXException {
+                throw exception;
+            }
+        });
+        return db.parse(artifact);
+    }
+
+	private void addToFeaturesRepositories(URI uri)  {
+        // URI mvnUri = pathToMvnUri(path);
+		try {
+            featuresService.removeRepository(uri);
+			featuresService.addRepository(uri);
+            logger.info("Added feature repository '{}'.", uri);
+		} catch (Exception e) {
+			logger.warn("Unable to add repository '{}'", uri, e);
+		}
+	}
+
+    static URI pathToMvnUri(String path) {
+        String[] bits = path.split("/");
+        String classifier = FEATURES_CLASSIFIER;
+        String artifactType = "xml";
+        String version = bits[bits.length - 2];
+        String artifactId = bits[bits.length - 3];
+        StringBuilder buf = new StringBuilder("mvn:");
+        for (int i = 0; i < bits.length - 3; i++) {
+            buf.append(bits[i]);
+            if (i < bits.length - 4) {
+                buf.append(".");
+            }
+        }
+        buf.append("/").append(artifactId).append("/").append(version).append("/").append(artifactType).append("/").append(classifier);
+        URI mvnUri = URI.create(buf.toString());
+        return mvnUri;
+    }
+
+    public boolean canHandle(File file) {
+		// If the file ends with .kar, then we can handle it!
+		//
+		if (file.isFile() && file.getName().endsWith(KAR_SUFFIX)) {
+			logger.info("Found a .kar file to deploy.");
+			return true;
+		}
+		// Otherwise, check to see if it's a zip file containing a META-INF/KARAF.MF manifest.
+		//
+		else if (file.isFile() && file.getName().endsWith(ZIP_SUFFIX)) {
+			logger.debug("Found a .zip file to deploy; checking contents to see if it's a Karaf archive.");
+			try {
+				if (new ZipFile(file).getEntry("META-INF/KARAF.MF") != null) {
+					logger.info("Found a Karaf archive with .zip prefix; will deploy.");
+					return true;
+				}
+			} catch (Exception e) {
+				logger.warn("Problem extracting zip file '{}'; ignoring.", file.getName(), e);
+			}
+		}
+
+		return false;
+	}
+
+	public boolean deleteLocalRepository() {
+		return deleteDirectory(new File(localRepoPath));
+	}
+
+	private boolean deleteDirectory(File path) {
+		if (path.exists()) {
+			File[] files = path.listFiles();
+			for (int i = 0; i < files.length; i++) {
+				if (files[i].isDirectory()) {
+					deleteDirectory(files[i]);
+				} else {
+					files[i].delete();
+				}
+			}
+		}
+		return (path.delete());
+	}
+
+    public void setBasePath(String base) {
+        this.base = base;
+    }
+
+    public void setLocalRepoPath(String localRepoPath) {
+		this.localRepoPath = localRepoPath;
+	}
+
+	public void setFeaturesService(FeaturesService featuresService) {
+		this.featuresService = featuresService;
+	}
+
+}
diff --git a/karaf-2.2.x/deployer/kar/src/main/resources/OSGI-INF/blueprint/kar-deployer.xml b/karaf-2.2.x/deployer/kar/src/main/resources/OSGI-INF/blueprint/kar-deployer.xml
new file mode 100644
index 0000000..ca94ec3
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/main/resources/OSGI-INF/blueprint/kar-deployer.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.
+	-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+	xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+	default-activation="lazy">
+
+	<ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" />
+	
+	<bean id="karArtifactInstaller" class="org.apache.karaf.deployer.kar.KarArtifactInstaller"
+		init-method="init" destroy-method="destroy" activation="lazy">
+			<property name="basePath" value="$[karaf.base]"/>
+            <property name="localRepoPath" value="$[karaf.base]/system"/>
+	        <property name="featuresService">
+	            <reference interface="org.apache.karaf.features.FeaturesService"/>
+	        </property>
+	</bean>
+			
+	<service id="karArtifactInstallerService" 
+		ref="karArtifactInstaller"
+		auto-export="interfaces"/>
+
+</blueprint>
diff --git a/karaf-2.2.x/deployer/kar/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/deployer/kar/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..f6f9a72
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,16 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The Karaf KAR is an archive (similar to JAR) containing a set of bundles jar files and features descriptors.
+
+    Karaf deployer explodes the KAR archive and deploy the features descriptors and bundles.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDeployer\u001B[0m section of the Karaf User Guide.
+    \u001B[36mKAR\u001B[0m section of the Karaf Developer Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/src/test/java/org/apache/karaf/deployer/kar/KarArtifactInstallerTest.java b/karaf-2.2.x/deployer/kar/src/test/java/org/apache/karaf/deployer/kar/KarArtifactInstallerTest.java
new file mode 100644
index 0000000..48cb7ae
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/java/org/apache/karaf/deployer/kar/KarArtifactInstallerTest.java
@@ -0,0 +1,218 @@
+/*
+ * 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.karaf.deployer.kar;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.net.URI;
+
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class KarArtifactInstallerTest {
+	private KarArtifactInstaller karArtifactInstaller;
+	private FeaturesService featuresService;
+
+	private URI goodKarFile;
+	private URI zipFileWithKarafManifest;
+	private URI zipFileWithoutKarafManifest;
+	private URI badZipFile;
+	
+	@Before
+	public void setUp() throws Exception {
+		featuresService = createMock(FeaturesService.class);
+
+		karArtifactInstaller = new KarArtifactInstaller();
+
+		karArtifactInstaller.setFeaturesService(featuresService);
+		karArtifactInstaller.setBasePath("./target");
+		karArtifactInstaller.setLocalRepoPath("./target/local-repo");
+
+		karArtifactInstaller.init();
+		
+		goodKarFile = getClass().getClassLoader().getResource("goodKarFile.kar").toURI();
+		zipFileWithKarafManifest = getClass().getClassLoader().getResource("karFileAsZip.zip").toURI();
+		zipFileWithoutKarafManifest = getClass().getClassLoader().getResource("karFileAsZipNoManifest.zip").toURI();
+		badZipFile = getClass().getClassLoader().getResource("badZipFile.zip").toURI();
+	}
+	
+	@After
+	public void destroy() throws Exception { 
+		karArtifactInstaller.destroy();
+		karArtifactInstaller.deleteLocalRepository();
+	}
+	
+	
+	
+	@Test
+	public void shouldHandleKarFile() throws Exception {
+		assertTrue(karArtifactInstaller.canHandle(new File(goodKarFile)));
+	}
+	
+	@Test
+	public void shouldHandleZipFileWithKarafManifest() throws Exception {
+		assertTrue(karArtifactInstaller.canHandle(new File(zipFileWithKarafManifest)));
+	}
+
+	@Test
+	public void shouldIgnoreZipFileWithoutKarafManifest() throws Exception { 		
+		assertFalse(karArtifactInstaller.canHandle(new File(zipFileWithoutKarafManifest)));
+	}
+
+	@Test
+	public void shouldIgnoreBadZipFile() throws Exception { 		
+		assertFalse(karArtifactInstaller.canHandle(new File(badZipFile)));
+	}
+
+	@Test 
+	public void shouldRecognizeGoodFeaturesFile() throws Exception
+	{
+		File goodFeaturesXml = new File(new URI(getClass().getClassLoader().getResource("goodKarFile/org/foo/goodFeaturesXml.xml").getFile()).getPath());
+		Assert.assertTrue(karArtifactInstaller.isFeaturesRepository(goodFeaturesXml));
+	}
+	
+	@Test 
+	public void shouldRejectNonFeaturesXMLFile() throws Exception
+	{
+		File goodFeaturesXml = new File(getClass().getClassLoader().getResource("badFeaturesXml.xml").toURI());
+		Assert.assertFalse(karArtifactInstaller.isFeaturesRepository(goodFeaturesXml));
+	}
+	
+	
+	@Test 
+	public void shouldRejectMalformedXMLFile() throws Exception
+	{
+		File malformedXml = new File(getClass().getClassLoader().getResource("malformedXml.xml").toURI());
+		Assert.assertFalse(karArtifactInstaller.isFeaturesRepository(malformedXml));
+	}
+	
+	@Test
+	public void shouldExtractAndRegisterFeaturesFromKar() throws Exception { 
+		// Setup expectations on the features service
+        featuresService.removeRepository( (URI) EasyMock.anyObject() );
+        expect(featuresService.listRepositories()).andReturn(new Repository[0]);
+		featuresService.addRepository((URI) EasyMock.anyObject());
+		EasyMock.replay(featuresService);
+		
+		// Test
+		//
+		File goodKarFile = new File(new URI(getClass().getClassLoader().getResource("goodKarFile.kar").getFile()).getPath());
+		karArtifactInstaller.install(goodKarFile);
+		
+		// Verify expectations.
+		//
+		EasyMock.verify(featuresService);
+	}
+	
+	@Test
+	public void shouldLogAndNotThrowExceptionIfCannotAddToFeaturesRepository() throws Exception { 
+		// Setup expectations on the features service
+        featuresService.removeRepository( (URI) EasyMock.anyObject() );
+		expect(featuresService.listRepositories()).andReturn(new Repository[0]);
+        featuresService.addRepository((URI) EasyMock.anyObject());
+		EasyMock.expectLastCall().andThrow(new Exception("Unable to add to repository."));
+		EasyMock.replay(featuresService);
+		
+		// Test
+		//
+		File goodKarFile = new File(new URI(getClass().getClassLoader().getResource("goodKarFile.kar").getFile()).getPath());
+		karArtifactInstaller.install(goodKarFile);
+		
+		// Verify expectations.
+		//
+		EasyMock.verify(featuresService);
+	}	
+	
+	@Test
+	public void shouldIgnoreUpdateIfFileHasNotChanged() throws Exception { 
+		// Setup expectations on the features service: the addRepository 
+		// should only be added once, as the update command should be ignored! 
+		//
+        featuresService.removeRepository( (URI) EasyMock.anyObject() );
+        expect(featuresService.listRepositories()).andReturn(new Repository[0]);
+		featuresService.addRepository((URI) EasyMock.anyObject());
+		EasyMock.replay(featuresService);
+		
+		// Test
+		//
+		File goodKarFile = new File(new URI(getClass().getClassLoader().getResource("goodKarFile.kar").getFile()).getPath());
+		karArtifactInstaller.install(goodKarFile);
+		karArtifactInstaller.update(goodKarFile);
+		
+		// Verify expectations.
+		//
+		EasyMock.verify(featuresService);
+	}		
+	
+	@Test
+	public void shouldExtractAndRegisterFeaturesFromZip() throws Exception { 
+		// Setup expectations on the features service
+        featuresService.removeRepository( (URI) EasyMock.anyObject() );
+        expect(featuresService.listRepositories()).andReturn(new Repository[0]);
+		featuresService.addRepository((URI) EasyMock.anyObject());
+		EasyMock.replay(featuresService);
+		
+		// Test
+		//
+		File karFileAsZip = new File(new URI(getClass().getClassLoader().getResource("karFileAsZip.zip").getFile()).getPath());
+		karArtifactInstaller.install(karFileAsZip);
+		
+		// Verify expectations.
+		//
+		EasyMock.verify(featuresService);
+	}
+	
+	@Test (expected = java.io.IOException.class) 
+	public void shouldThrowExceptionIfFileDoesNotExist() throws Exception
+	{
+		File nonExistantFile = new File("DoesNotExist");
+		karArtifactInstaller.install(nonExistantFile);
+	}	
+	
+	@Test
+	public void uninstallShouldDoNothing() throws Exception
+	{
+		EasyMock.replay(featuresService);
+		
+		// Test
+		//
+		File karFileAsZip = new File(getClass().getClassLoader().getResource("karFileAsZip.zip").getFile());
+		karArtifactInstaller.uninstall(karFileAsZip);
+		
+		// Verify expectations.
+		//
+		EasyMock.verify(featuresService);
+	}
+
+    @Test
+    public void testPathToMvnUri() throws Exception {
+        URI uri = KarArtifactInstaller.pathToMvnUri("org/apache/geronimo/features/org.apache.geronimo.transaction.kar/3.1.1-SNAPSHOT/org.apache.geronimo.transaction.kar-3.1.1-SNAPSHOT-features.xml");
+        assert "mvn:org.apache.geronimo.features/org.apache.geronimo.transaction.kar/3.1.1-SNAPSHOT/xml/features".equals(uri.toString());
+    }
+			
+}
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/badFeaturesXml.xml b/karaf-2.2.x/deployer/kar/src/test/resources/badFeaturesXml.xml
new file mode 100644
index 0000000..48a3465
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/badFeaturesXml.xml
@@ -0,0 +1 @@
+<message>This is not a features file!</message>
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/badZipFile.zip b/karaf-2.2.x/deployer/kar/src/test/resources/badZipFile.zip
new file mode 100644
index 0000000..b158994
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/badZipFile.zip
@@ -0,0 +1 @@
+This is *not* a well formed .kar file :(
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/goodKarFile.kar b/karaf-2.2.x/deployer/kar/src/test/resources/goodKarFile.kar
new file mode 100644
index 0000000..18abf7d
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/goodKarFile.kar
Binary files differ
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/goodKarFile/org/foo/goodFeaturesXml.xml b/karaf-2.2.x/deployer/kar/src/test/resources/goodKarFile/org/foo/goodFeaturesXml.xml
new file mode 100644
index 0000000..1fb5e1f
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/goodKarFile/org/foo/goodFeaturesXml.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<features name="goodFeaturesRepo">
+  <feature name='goodFeature' version='1.0.0'>
+  </feature>
+ </features>
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZip.zip b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZip.zip
new file mode 100644
index 0000000..af29c3b
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZip.zip
Binary files differ
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZip/org/foo/goodFeaturesXml.xml b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZip/org/foo/goodFeaturesXml.xml
new file mode 100644
index 0000000..4c8127a
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZip/org/foo/goodFeaturesXml.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<features>
+  <feature name='goodFeature' version='1.0.0'>
+  </feature>
+ </features>
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZipNoManifest.zip b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZipNoManifest.zip
new file mode 100644
index 0000000..d4ced05
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZipNoManifest.zip
Binary files differ
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZipNoManifest/org/foo/goodFeaturesXml.xml b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZipNoManifest/org/foo/goodFeaturesXml.xml
new file mode 100644
index 0000000..4c8127a
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/karFileAsZipNoManifest/org/foo/goodFeaturesXml.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<features>
+  <feature name='goodFeature' version='1.0.0'>
+  </feature>
+ </features>
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/log4j.properties b/karaf-2.2.x/deployer/kar/src/test/resources/log4j.properties
new file mode 100644
index 0000000..80f857b
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/log4j.properties
@@ -0,0 +1,8 @@
+log4j.rootLogger=DEBUG, stdout
+
+#The logging properties used during tests..
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%-5p %-30.30c{1} - %m%n
+log4j.appender.stdout.threshold=DEBUG
diff --git a/karaf-2.2.x/deployer/kar/src/test/resources/malformedXml.xml b/karaf-2.2.x/deployer/kar/src/test/resources/malformedXml.xml
new file mode 100644
index 0000000..9a84cc3
--- /dev/null
+++ b/karaf-2.2.x/deployer/kar/src/test/resources/malformedXml.xml
@@ -0,0 +1 @@
+<This is malformed XML.
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/pom.xml b/karaf-2.2.x/deployer/pom.xml
new file mode 100644
index 0000000..1c7dc8b
--- /dev/null
+++ b/karaf-2.2.x/deployer/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.deployer</groupId>
+    <artifactId>deployer</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Deployer</name>
+
+    <modules>
+        <module>spring</module>
+        <module>blueprint</module>
+        <module>features</module>
+        <module>kar</module>
+        <module>wrap</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/deployer/spring/NOTICE b/karaf-2.2.x/deployer/spring/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/deployer/spring/pom.xml b/karaf-2.2.x/deployer/spring/pom.xml
new file mode 100644
index 0000000..66f8eea
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.deployer</groupId>
+        <artifactId>deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.deployer.spring</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Deployer :: Spring</name>
+    <description>This deployer transforms a plain spring xml file to a deployable bundle</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <!-- Set the blueprint.graceperiod flag to false to allow the bundle to start
+                             See the blueprint config file -->
+                        <Bundle-SymbolicName>${project.artifactId};blueprint.graceperiod:=false</Bundle-SymbolicName>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.deployer.spring;-split-package:=merge-first,
+                            org.apache.karaf.util;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java b/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
new file mode 100644
index 0000000..a332029
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.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.karaf.deployer.spring;
+
+import java.io.File;
+import java.net.URL;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+
+import org.apache.felix.fileinstall.ArtifactUrlTransformer;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.SAXException;
+
+/**
+ * A deployment listener that listens for spring xml applications
+ * and creates bundles for these.
+ */
+public class SpringDeploymentListener implements ArtifactUrlTransformer {
+
+    private final Logger logger = LoggerFactory.getLogger(SpringDeploymentListener.class);
+
+    private DocumentBuilderFactory dbf;
+
+    public boolean canHandle(File artifact) {
+        try {
+            if (artifact.isFile() && artifact.getName().endsWith(".xml")) {
+                Document doc = parse(artifact);
+                String name = doc.getDocumentElement().getLocalName();
+                String uri  = doc.getDocumentElement().getNamespaceURI();
+                if ("beans".equals(name) && "http://www.springframework.org/schema/beans".equals(uri)) {
+                    return true;
+                }
+            }
+        } catch (Exception e) {
+            logger.error("Unable to parse deployed file " + artifact.getAbsolutePath(), e);
+        }
+        return false;
+    }
+
+    public URL transform(URL artifact) {
+        try {
+            return new URL("spring", null, artifact.toString());
+        } catch (Exception e) {
+            logger.error("Unable to build spring application bundle", e);
+            return null;
+        }
+    }
+
+    protected Document parse(File artifact) throws Exception {
+        if (dbf == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+        }
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        db.setErrorHandler(new ErrorHandler() {
+            public void warning(SAXParseException exception) throws SAXException {
+            }
+            public void error(SAXParseException exception) throws SAXException {
+            }
+            public void fatalError(SAXParseException exception) throws SAXException {
+                throw exception;
+            }
+        });
+        return db.parse(artifact);
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java b/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
new file mode 100644
index 0000000..0d95453
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
@@ -0,0 +1,193 @@
+/**
+ *
+ * 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.karaf.deployer.spring;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.karaf.util.DeployerUtils;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import org.osgi.framework.Constants;
+
+public class SpringTransformer {
+
+    static Transformer transformer;
+    static DocumentBuilderFactory dbf;
+    static TransformerFactory tf;
+
+
+    public static void transform(URL url, OutputStream os) throws Exception {
+        // Build dom document
+        Document doc = parse(url);
+        // Heuristicly retrieve name and version
+        String name = url.getPath();
+        int idx = name.lastIndexOf('/');
+        if (idx >= 0) {
+            name = name.substring(idx + 1);
+        }
+        String[] str = DeployerUtils.extractNameVersionType(name);
+        // Create manifest
+        Manifest m = new Manifest();
+        m.getMainAttributes().putValue("Manifest-Version", "2");
+        m.getMainAttributes().putValue(Constants.BUNDLE_MANIFESTVERSION, "2");
+        m.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, str[0]);
+        m.getMainAttributes().putValue(Constants.BUNDLE_VERSION, str[1]);
+        m.getMainAttributes().putValue("Spring-Context", "*;publish-context:=false;create-asynchronously:=true");
+        String importPkgs = getImportPackages(analyze(new DOMSource(doc)));
+        if (importPkgs != null && importPkgs.length() > 0) {
+            m.getMainAttributes().putValue(Constants.IMPORT_PACKAGE, importPkgs);
+        }
+        m.getMainAttributes().putValue(Constants.DYNAMICIMPORT_PACKAGE, "*");
+        // Extract manifest entries from the DOM
+        NodeList l = doc.getElementsByTagName("manifest");
+        if (l != null) {
+            for (int i = 0; i < l.getLength(); i++) {
+                Element e = (Element) l.item(i);
+                String text = e.getTextContent();
+                Properties props = new Properties();
+                props.load(new ByteArrayInputStream(text.trim().getBytes()));
+                Enumeration en = props.propertyNames();
+                while (en.hasMoreElements()) {
+                    String k = (String) en.nextElement();
+                    String v = props.getProperty(k);
+                    m.getMainAttributes().putValue(k, v);
+                }
+                e.getParentNode().removeChild(e);
+            }
+        }
+
+        JarOutputStream out = new JarOutputStream(os);
+        ZipEntry e = new ZipEntry(JarFile.MANIFEST_NAME);
+        out.putNextEntry(e);
+        m.write(out);
+        out.closeEntry();
+        e = new ZipEntry("META-INF/");
+        out.putNextEntry(e);
+        e = new ZipEntry("META-INF/spring/");
+        out.putNextEntry(e);
+        out.closeEntry();
+        e = new ZipEntry("META-INF/spring/" + name);
+        out.putNextEntry(e);
+        // Copy the new DOM
+        if (tf == null) {
+            tf = TransformerFactory.newInstance();
+        }
+        tf.newTransformer().transform(new DOMSource(doc), new StreamResult(out));
+        out.closeEntry();
+        out.close();
+    }
+
+    public static Set<String> analyze(Source source) throws Exception {
+        if (transformer == null) {
+            if (tf == null) {
+                tf = TransformerFactory.newInstance();
+            }
+            Source s = new StreamSource(SpringTransformer.class.getResourceAsStream("extract.xsl"));
+            transformer = tf.newTransformer(s);
+        }
+
+        Set<String> refers = new TreeSet<String>();
+
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        Result r = new StreamResult(bout);
+        transformer.transform(source, r);
+
+        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+        bout.close();
+
+        BufferedReader br = new BufferedReader(new InputStreamReader(bin));
+
+        String line = br.readLine();
+        while (line != null) {
+            line = line.trim();
+            if (line.length() > 0) {
+                String parts[] = line.split("\\s*,\\s*");
+                for (int i = 0; i < parts.length; i++) {
+                    int n = parts[i].lastIndexOf('.');
+                    if (n > 0) {
+                        String pkg = parts[i].substring(0, n);
+                        if (!pkg.startsWith("java.")) {
+                            refers.add(parts[i].substring(0, n));
+                        }
+                    }
+                }
+            }
+            line = br.readLine();
+        }
+        br.close();
+        return refers;
+    }
+
+    protected static String getImportPackages(Set<String> packages) {
+        StringBuilder sb = new StringBuilder();
+        for (String pkg : packages) {
+            if (sb.length() > 0) {
+                sb.append(",");
+            }
+            sb.append(pkg);
+        }
+        return sb.toString();
+    }
+
+    protected static Document parse(URL url) throws Exception {
+        if (dbf == null) {
+            dbf = DocumentBuilderFactory.newInstance();
+            dbf.setNamespaceAware(true);
+        }
+        DocumentBuilder db = dbf.newDocumentBuilder();
+        return db.parse(url.toString());
+    }
+
+    protected static void copyInputStream(InputStream in, OutputStream out) throws Exception {
+        byte[] buffer = new byte[4096];
+        int len = in.read(buffer);
+        while (len >= 0) {
+            out.write(buffer, 0, len);
+            len = in.read(buffer);
+        }
+    }
+}
diff --git a/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java b/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
new file mode 100644
index 0000000..d471123
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
@@ -0,0 +1,93 @@
+/**
+ *
+ * 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.karaf.deployer.spring;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.osgi.service.url.AbstractURLStreamHandlerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A URL handler that will transform a JBI artifact to an OSGi bundle
+ * on the fly.  Needs to be registered in the OSGi registry.
+ */
+public class SpringURLHandler extends AbstractURLStreamHandlerService {
+
+	private final Logger logger = LoggerFactory.getLogger(SpringURLHandler.class);
+
+	private static String SYNTAX = "spring: spring-xml-uri";
+
+	private URL springXmlURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+	public URLConnection openConnection(URL url) throws IOException {
+		if (url.getPath() == null || url.getPath().trim().length() == 0) {
+			throw new MalformedURLException ("Path cannot be null or empty. Syntax: " + SYNTAX );
+		}
+		springXmlURL = new URL(url.getPath());
+
+		logger.debug("Spring xml URL is: [" + springXmlURL + "]");
+		return new Connection(url);
+	}
+	
+	public URL getSpringXmlURL() {
+		return springXmlURL;
+	}
+
+    public class Connection extends URLConnection {
+
+        public Connection(URL url) {
+            super(url);
+        }
+
+        @Override
+        public void connect() throws IOException {
+        }
+
+        @Override
+        public InputStream getInputStream() throws IOException {
+            try {
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                SpringTransformer.transform(springXmlURL, os);
+                os.close();
+                return new ByteArrayInputStream(os.toByteArray());
+            } catch (Exception e) {
+                logger.error("Error opening Spring xml url", e);
+                throw (IOException) new IOException("Error opening Spring xml url").initCause(e);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml b/karaf-2.2.x/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml
new file mode 100644
index 0000000..b061629
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml
@@ -0,0 +1,40 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <service id="springUrlHandler" interface="org.osgi.service.url.URLStreamHandlerService">
+    	<service-properties>
+            <entry key="url.handler.protocol" value="spring"/>
+        </service-properties>
+        <bean class="org.apache.karaf.deployer.spring.SpringURLHandler"/>
+    </service>
+
+    <bean id="springDeploymentListener" class="org.apache.karaf.deployer.spring.SpringDeploymentListener"/>
+
+    <!-- Force a reference to the url handler above from the osgi registry to (try to) make sure
+         the url handler is registered inside the framework.  Else we can run into timing issues
+         where fileinstall will use the featureDeploymentListener before the url can be actually
+         used.  In order to not block the bundle, the blueprint.graceperiod=false flag must be
+         set on the SymbolicName osgi header -->
+    <reference id="springUrlHandlerRef" interface="org.osgi.service.url.URLStreamHandlerService" filter="url.handler.protocol=spring" />
+
+    <service ref="springDeploymentListener" auto-export="interfaces" depends-on="springDeploymentListener" />
+
+</blueprint>
diff --git a/karaf-2.2.x/deployer/spring/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/deployer/spring/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..278f120
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The spring deployer allows you to drop Spring file directly in the Karaf deploy directory.
+
+    Karaf supports "classic" Spring or spring-dm configuration files.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDeployer\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/extract.xsl b/karaf-2.2.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/extract.xsl
new file mode 100644
index 0000000..4b06b69
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/extract.xsl
@@ -0,0 +1,79 @@
+<?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.
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:beans="http://www.springframework.org/schema/beans"
+                xmlns:aop="http://www.springframework.org/schema/aop"
+                xmlns:context="http://www.springframework.org/schema/context"
+                xmlns:jee="http://www.springframework.org/schema/jee"
+                xmlns:jms="http://www.springframework.org/schema/jms"
+                xmlns:lang="http://www.springframework.org/schema/lang"
+                xmlns:osgi-compendium="http://www.springframework.org/schema/osgi-compendium"
+                xmlns:osgi="http://www.springframework.org/schema/osgi"
+                xmlns:tool="http://www.springframework.org/schema/tool"
+                xmlns:tx="http://www.springframework.org/schema/tx"
+                xmlns:util="http://www.springframework.org/schema/util"
+                xmlns:webflow-config="http://www.springframework.org/schema/webflow-config">
+    
+    <xsl:output method="text" />
+
+	<xsl:template match="/">
+
+		<!-- Match all attributes that holds a class or a comma delimited
+		     list of classes and print them -->
+
+		<xsl:for-each select="
+				//beans:bean/@class
+			|	//beans:*/@value-type
+ 			|	//aop:*/@implement-interface
+			|	//aop:*/@default-impl
+			|	//context:load-time-weaver/@weaver-class
+			|	//jee:jndi-lookup/@expected-type
+			|	//jee:jndi-lookup/@proxy-interface
+			| 	//jee:remote-slsb/@ejbType
+			|	//jee:*/@business-interface
+			|	//lang:*/@script-interfaces
+			|	//osgi:*/@interface
+			|	//util:list/@list-class
+			|	//util:set/@set-class
+			|	//util:map/@map-class
+			|	//webflow-config:*/@class
+		">
+			<xsl:value-of select="." />
+			<xsl:text>
+			</xsl:text>
+		</xsl:for-each>
+
+		<!-- This seems some magic to get extra imports? -->
+
+		<xsl:for-each select="//beans:bean[@class='org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean'
+				or @class='org.springframework.osgi.service.importer.support.OsgiServiceProxyFactoryBean']">
+			<xsl:for-each select="beans:property[@name='interfaces']">
+				<xsl:value-of select="@value" />
+				<xsl:text>
+				</xsl:text>
+			</xsl:for-each>
+		</xsl:for-each>
+
+	</xsl:template>
+
+
+</xsl:stylesheet>
+
diff --git a/karaf-2.2.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/spring-deployer-1.0.0.xsd b/karaf-2.2.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/spring-deployer-1.0.0.xsd
new file mode 100644
index 0000000..1e800a5
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/spring-deployer-1.0.0.xsd
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault='qualified'
+           targetNamespace='http://karaf.apache.org/xmlns/deployer/spring/v1.0.0'
+           xmlns:xs='http://www.w3.org/2001/XMLSchema'>
+
+    <xs:element name="manifest">
+        <xs:complexType mixed="true">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+The content of this element will be read using the syntax of the java util Properties
+class (http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html) and will
+override any generated manifest entry.
+                ]]></xs:documentation>
+            </xs:annotation>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
diff --git a/karaf-2.2.x/deployer/spring/src/test/java/org/apache/karaf/deployer/spring/SpringDeploymentListenerTest.java b/karaf-2.2.x/deployer/spring/src/test/java/org/apache/karaf/deployer/spring/SpringDeploymentListenerTest.java
new file mode 100644
index 0000000..3b567e1
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/test/java/org/apache/karaf/deployer/spring/SpringDeploymentListenerTest.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.karaf.deployer.spring;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.jar.JarInputStream;
+import javax.xml.transform.dom.DOMSource;
+
+import junit.framework.TestCase;
+
+public class SpringDeploymentListenerTest extends TestCase {
+
+    public void testPackagesExtraction() throws Exception {
+        SpringDeploymentListener l = new SpringDeploymentListener();
+        File f = new File(getClass().getClassLoader().getResource("test.xml").toURI());
+        Set<String> pkgs = SpringTransformer.analyze(new DOMSource(SpringTransformer.parse(f.toURL())));
+        assertNotNull(pkgs);
+        assertEquals(2, pkgs.size());
+        Iterator<String> it = pkgs.iterator();
+        assertEquals("org.apache.karaf.deployer.spring", it.next());
+        assertEquals("org.osgi.service.url", it.next());
+    }
+
+    public void testCustomManifest() throws Exception {
+        File f = File.createTempFile("smx", ".jar");
+        try {
+            OutputStream os = new FileOutputStream(f);
+            SpringTransformer.transform(getClass().getClassLoader().getResource("test.xml"), os);
+            os.close();
+            InputStream is = new FileInputStream(f);
+            JarInputStream jar = new JarInputStream(is);
+            jar.getManifest().write(System.err);
+            is.close();
+        } finally {
+            f.delete();
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/spring/src/test/resources/test.xml b/karaf-2.2.x/deployer/spring/src/test/resources/test.xml
new file mode 100644
index 0000000..03d0abc
--- /dev/null
+++ b/karaf-2.2.x/deployer/spring/src/test/resources/test.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:osgi="http://www.springframework.org/schema/osgi"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+  http://www.springframework.org/schema/beans
+  http://www.springframework.org/schema/beans/spring-beans.xsd
+  http://www.springframework.org/schema/util
+  http://www.springframework.org/schema/util/spring-util.xsd
+  http://www.springframework.org/schema/osgi
+  http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+    <manifest xmlns="http://karaf.apache.org/xmlns/deployer/spring/v1.0.0">
+        RequireBundle=org.osgi
+        Header=value
+    </manifest>
+
+    <bean id="springDeploymentListener" class="org.apache.karaf.deployer.spring.SpringDeploymentListener">
+
+    </bean>
+
+    <osgi:service ref="springDeploymentListener">
+        <osgi:interfaces>
+            <value>org.apache.karaf.deployer.filemonitor.DeploymentListener</value>
+        </osgi:interfaces>
+    </osgi:service>
+
+    <bean id="springHandler" class="org.apache.karaf.deployer.spring.SpringURLHandler" />
+
+    <osgi:service ref="springHandler" interface="org.osgi.service.url.URLStreamHandlerService">
+    	<osgi:service-properties>
+            <entry key="url.handler.protocol" value="spring"/>
+        </osgi:service-properties>
+    </osgi:service>
+
+    <bean id="uri" class="java.net.URI">
+        <constructor-arg value="urn:resource"/>
+    </bean>
+
+</beans>
diff --git a/karaf-2.2.x/deployer/wrap/NOTICE b/karaf-2.2.x/deployer/wrap/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/deployer/wrap/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/deployer/wrap/pom.xml b/karaf-2.2.x/deployer/wrap/pom.xml
new file mode 100644
index 0000000..e4eb7ea
--- /dev/null
+++ b/karaf-2.2.x/deployer/wrap/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.deployer</groupId>
+        <artifactId>deployer</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.deployer.wrap</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Deployer :: Wrap Non OSGi Jar</name>
+    <description>This deployer transforms non OSGi jar files to a deployable bundle.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.deployer.wrap;-split-package:=merge-first,
+                            org.apache.karaf.util;-split-package:=merge-first
+                        </Private-Package>
+                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/WrapDeploymentListener.java b/karaf-2.2.x/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/WrapDeploymentListener.java
new file mode 100644
index 0000000..7e0840f
--- /dev/null
+++ b/karaf-2.2.x/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/WrapDeploymentListener.java
@@ -0,0 +1,70 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.deployer.wrap;
+
+import java.io.File;
+import java.net.URL;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.apache.felix.fileinstall.ArtifactUrlTransformer;
+import org.apache.karaf.util.DeployerUtils;
+
+/**
+ * A deployment listener that listens for non OSGi jar deployements.
+ */
+public class WrapDeploymentListener implements ArtifactUrlTransformer {
+
+    public boolean canHandle(File artifact) {
+        try {
+            // only handle .jar files
+            if (!artifact.getPath().endsWith(".jar")) {
+                return false;
+            }
+            JarFile jar = new JarFile(artifact);
+            try {
+                // only handle non OSGi jar
+                Manifest manifest = jar.getManifest();
+                if (manifest != null &&
+                    manifest.getMainAttributes().getValue(new Attributes.Name("Bundle-SymbolicName")) != null &&
+                    manifest.getMainAttributes().getValue(new Attributes.Name("Bundle-Version")) != null) {
+                    return false;
+                }
+                return true;
+            } finally {
+                jar.close();
+            }
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public URL transform(URL artifact) throws Exception {
+        try
+        {
+            String path = artifact.getPath();
+            String name = path.substring( path.lastIndexOf('/') + 1);
+            String[] nv = DeployerUtils.extractNameVersionType( name );
+            return new URL("wrap", null, artifact.toExternalForm() + "$Bundle-SymbolicName=" + nv[0] + "&Bundle-Version=" + nv[1]);
+        } catch (Exception e) {
+            return new URL("wrap", null, artifact.toExternalForm());
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/deployer/wrap/src/main/resources/OSGI-INF/blueprint/wrap-deployer.xml b/karaf-2.2.x/deployer/wrap/src/main/resources/OSGI-INF/blueprint/wrap-deployer.xml
new file mode 100644
index 0000000..c5295a5
--- /dev/null
+++ b/karaf-2.2.x/deployer/wrap/src/main/resources/OSGI-INF/blueprint/wrap-deployer.xml
@@ -0,0 +1,30 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           default-activation="lazy">
+
+    <bean id="wrapDeploymentListener" class="org.apache.karaf.deployer.wrap.WrapDeploymentListener"/>
+
+    <reference id="wrapUrlHandlerRef" interface="org.osgi.service.url.URLStreamHandlerService" filter="url.handler.protocol=wrap"/>
+
+    <service ref="wrapDeploymentListener" auto-export="interfaces" depends-on="wrapDeploymentListener" ranking="-1"/>
+
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/deployer/wrap/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/deployer/wrap/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..c19e194
--- /dev/null
+++ b/karaf-2.2.x/deployer/wrap/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,16 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The wrap deployer allows you to drop non-OSGi jar files into the Karaf deploy directory.
+
+    Karaf will transform the jar files into a deployable OSGi bundle, including creation of the Export-Package and
+    Import-Package statement.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDeployer\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/diagnostic/command/NOTICE b/karaf-2.2.x/diagnostic/command/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/command/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/diagnostic/command/pom.xml b/karaf-2.2.x/diagnostic/command/pom.xml
new file mode 100644
index 0000000..a96487f
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/command/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.diagnostic</groupId>
+        <artifactId>diagnostic</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.diagnostic.command</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Diagnostic :: Command</name>
+    <description>This bundle provides Karaf diagnostic shell commands.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/diagnostic/command/src/main/java/org/apache/karaf/diagnostic/command/DumpCommand.java b/karaf-2.2.x/diagnostic/command/src/main/java/org/apache/karaf/diagnostic/command/DumpCommand.java
new file mode 100644
index 0000000..88ec298
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/command/src/main/java/org/apache/karaf/diagnostic/command/DumpCommand.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.karaf.diagnostic.command;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.diagnostic.core.DumpDestination;
+import org.apache.karaf.diagnostic.core.DumpProvider;
+import org.apache.karaf.diagnostic.core.common.DirectoryDumpDestination;
+import org.apache.karaf.diagnostic.core.common.ZipDumpDestination;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+/**
+ * Command to create dump from shell.
+ */
+@Command(scope = "dev", name = "create-dump", description = "Creates zip archive with diagnostic info.")
+public class DumpCommand extends OsgiCommandSupport {
+
+    /**
+     * Registered dump providers.
+     */
+    private List<DumpProvider> providers = new LinkedList<DumpProvider>();
+
+    /**
+     * Output format of the filename if not defined otherwise
+     */
+    private SimpleDateFormat dumpFormat = new SimpleDateFormat("yyyy-MM-dd_HHmmss");
+
+    /**
+     * Directory switch.
+     */
+    @Option(name = "-d", aliases = "--directory", description = "Creates dump in directory in place of a ZIP archive")
+    boolean directory;
+
+    /**
+     * Name of created directory or archive.
+     */
+    @Argument(name = "name", description = "Name of created zip or directory", required = false)
+    String fileName;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        DumpDestination destination;
+
+        if (providers.isEmpty()) {
+            session.getConsole().println("Unable to create dump. No providers were found");
+            return null;
+        }
+
+        // create default file name if none provided
+        if (fileName == null || fileName.trim().length() == 0) {
+            fileName = dumpFormat.format(new Date());
+            if (!directory) {
+                fileName += ".zip";
+            }
+        }
+        File target = new File(fileName);
+
+        // if directory switch is on, create dump in directory
+        if (directory) {
+            destination = new DirectoryDumpDestination(target);
+        } else {
+            destination = new ZipDumpDestination(target);
+        }
+
+        for (DumpProvider provider : providers) {
+            provider.createDump(destination);
+        }
+        destination.save();
+        session.getConsole().println("Diagnostic dump created.");
+
+        return null;
+    }
+
+    /**
+     * Sets dump providers to use.
+     * 
+     * @param providers Providers.
+     */
+    public void setProviders(List<DumpProvider> providers) {
+        this.providers = providers;
+    }
+}
diff --git a/karaf-2.2.x/diagnostic/command/src/main/resources/OSGI-INF/blueprint/shell-diagnostic.xml b/karaf-2.2.x/diagnostic/command/src/main/resources/OSGI-INF/blueprint/shell-diagnostic.xml
new file mode 100644
index 0000000..b14434f
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/command/src/main/resources/OSGI-INF/blueprint/shell-diagnostic.xml
@@ -0,0 +1,35 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="dev/create-dump">
+            <action class="org.apache.karaf.diagnostic.command.DumpCommand">
+                <property name="providers" ref="providers"/>
+            </action>
+        </command>
+    </command-bundle>
+
+
+    <reference-list id="providers" interface="org.apache.karaf.diagnostic.core.DumpProvider"
+        availability="optional">
+    </reference-list>
+
+</blueprint>
diff --git a/karaf-2.2.x/diagnostic/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/diagnostic/command/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..615e359
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/command/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,16 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides the Karaf shell commands for the Karaf diagnostic.
+
+    The current provided command is:
+    - \u001B[36mdev:create-dump\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/diagnostic/common/NOTICE b/karaf-2.2.x/diagnostic/common/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/diagnostic/common/pom.xml b/karaf-2.2.x/diagnostic/common/pom.xml
new file mode 100644
index 0000000..e5b25ea
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.diagnostic</groupId>
+        <artifactId>diagnostic</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.diagnostic.common</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Diagnostic :: Common</name>
+    <description>Common provider for the Karaf diagnostic.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/BundleDumpProvider.java b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/BundleDumpProvider.java
new file mode 100644
index 0000000..6f72aeb
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/BundleDumpProvider.java
@@ -0,0 +1,85 @@
+/*
+ * 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.karaf.diagnostic.common;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.karaf.diagnostic.core.common.TextDumpProvider;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Dump provider which produces file named bundles.txt with list of
+ * installed bundles and it's state.
+ */
+public class BundleDumpProvider extends TextDumpProvider {
+
+    /**
+     * Static map with state mask to string representation.
+     */
+    private static Map<Integer, String> stateMap = new HashMap<Integer, String>();
+
+    /**
+     * Map bundle states to string representation.
+     */
+    static {
+        stateMap.put(0x00000001, "UNINSTALLED");
+        stateMap.put(0x00000002, "INSTALLED");
+        stateMap.put(0x00000004, "RESOLVED");
+        stateMap.put(0x00000008, "STARTING");
+        stateMap.put(0x00000010, "STOPPING");
+        stateMap.put(0x00000020, "ACTIVE");
+    }
+
+    /**
+     * Bundle context.
+     */
+    private BundleContext bundleContext;
+
+    /**
+     * Creates new bundle information file.
+     *  
+     * @param context Bundle context to access framework state.
+     */
+    public BundleDumpProvider(BundleContext context) {
+        super("bundles.txt");
+        this.bundleContext = context;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void writeDump(OutputStreamWriter writer) throws IOException {
+        // get bundle states
+        Bundle[] bundles = bundleContext.getBundles();
+
+        writer.write("Number of installed bundles " + bundles.length + "\n");
+
+        // create file header
+        writer.write("Id\tSymbolic name\tState\n");
+        for (Bundle bundle : bundles) {
+            // write row :)
+            writer.write(bundle.getBundleId() + "\t" + bundle.getSymbolicName()
+                + "\t" + stateMap.get(bundle.getState()) + "\n");
+        }
+
+        writer.flush();
+    }
+
+}
diff --git a/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/FeaturesDumpProvider.java b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/FeaturesDumpProvider.java
new file mode 100644
index 0000000..408057c
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/FeaturesDumpProvider.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.karaf.diagnostic.common;
+
+import java.io.OutputStreamWriter;
+
+import org.apache.karaf.diagnostic.core.common.TextDumpProvider;
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+/**
+ * Dump provider which add file named features.txt with informations
+ * about installed features and repositories.
+ */
+public class FeaturesDumpProvider extends TextDumpProvider {
+
+    /**
+     * Feature service.
+     */
+    private final FeaturesService features;
+
+    /**
+     * Creates new dump entry witch contains information about
+     * karaf features.
+     * 
+     * @param features Feature service.
+     */
+    public FeaturesDumpProvider(FeaturesService features) {
+        super("features.txt");
+        this.features = features;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    protected void writeDump(OutputStreamWriter outputStreamWriter) throws Exception {
+        // creates header
+        outputStreamWriter.write("Repositories:\n");
+
+        // list repositories
+        for (Repository repo : features.listRepositories()) {
+            outputStreamWriter.write(repo.getURI() + " (" + repo.getName() + ")\n");
+        }
+
+        // list features
+        outputStreamWriter.write("\nfeatures:\n");
+        for (Feature feature : features.listFeatures()) {
+            outputStreamWriter.write(feature.getName() + " " + feature.getVersion());
+            outputStreamWriter.write(" installed: " + features.isInstalled(feature));
+            outputStreamWriter.write("\nBundles:\n");
+            for (BundleInfo bundle : feature.getBundles()) {
+                outputStreamWriter.write("\t" + bundle.getLocation());
+                if (bundle.getStartLevel() != 0) {
+                    outputStreamWriter.write(" start level " + bundle.getStartLevel());
+                }
+                outputStreamWriter.write("\n\n");
+            }
+        }
+
+        // flush & close stream
+        outputStreamWriter.close();
+    }
+
+}
diff --git a/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/LogDumpProvider.java b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/LogDumpProvider.java
new file mode 100644
index 0000000..3ce7abe
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/LogDumpProvider.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.karaf.diagnostic.common;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+import org.apache.karaf.diagnostic.core.DumpDestination;
+import org.apache.karaf.diagnostic.core.DumpProvider;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Dump provider which copies log files from data/log directory to
+ * destination.
+ */
+public class LogDumpProvider implements DumpProvider {
+
+    private BundleContext bundleContext;
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /**
+     * Attach log entries from directory.
+     */
+    public void createDump(DumpDestination destination) throws Exception {
+        // get the ConfigAdmin service
+        ServiceReference ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
+        if (ref == null) {
+            return;
+        }
+
+        // get the PAX Logging configuration
+        ConfigurationAdmin configurationAdmin = (ConfigurationAdmin) bundleContext.getService(ref);
+        try {
+            Configuration configuration = configurationAdmin.getConfiguration("org.ops4j.pax.logging");
+
+            // get the ".file" Pax Logging Properties
+            Dictionary dictionary = configuration.getProperties();
+            for (Enumeration e = dictionary.keys(); e.hasMoreElements(); ) {
+                String property = (String) e.nextElement();
+                if (property.endsWith(".file")) {
+                    // it's a file appender, get the log file location
+                    String location = (String) dictionary.get(property);
+                    File file = new File(location);
+                    if (file.exists()) {
+                        FileInputStream inputStream = new FileInputStream(file);
+                        OutputStream outputStream = destination.add("log/" + file.getName());
+                        copy(inputStream, outputStream);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            bundleContext.ungetService(ref);
+        }
+    }
+
+    /**
+     * Rewrites data from input stream to output stream. This code is very common
+     * but we would avoid additional dependencies in diagnostic stuff.
+     *
+     * @param inputStream  Source stream.
+     * @param outputStream Destination stream.
+     * @throws IOException When IO operation fails.
+     */
+    private void copy(InputStream inputStream, OutputStream outputStream) throws IOException {
+        byte[] buffer = new byte[4096];
+        int n = 0;
+        while (-1 != (n = inputStream.read(buffer))) {
+            outputStream.write(buffer, 0, n);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
new file mode 100644
index 0000000..bc1c8c0
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.karaf.diagnostic.common;
+
+import java.io.OutputStreamWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+
+import org.apache.karaf.diagnostic.core.common.TextDumpProvider;
+
+/**
+ * Provider which dumps thread info to file named threads.txt.
+ */
+public class ThreadDumpProvider extends TextDumpProvider {
+
+    /**
+     * Creates new dump entry which contains information about threads.
+     */
+    public ThreadDumpProvider() {
+        super("threads.txt");
+    }
+
+    @Override
+    protected void writeDump(OutputStreamWriter outputStream) throws Exception {
+        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
+
+        outputStream.write("Number of threads: " + threadMXBean.getThreadCount() + "\n");
+
+        for (ThreadInfo threadInfo : threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds(), Integer.MAX_VALUE)) {
+            outputStream.write(threadInfo.toString() + "\n\n");
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/diagnostic/common/src/main/resources/OSGI-INF/blueprint/diagnostic-services.xml b/karaf-2.2.x/diagnostic/common/src/main/resources/OSGI-INF/blueprint/diagnostic-services.xml
new file mode 100644
index 0000000..809c1bb
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/src/main/resources/OSGI-INF/blueprint/diagnostic-services.xml
@@ -0,0 +1,43 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <bean id="features" class="org.apache.karaf.diagnostic.common.FeaturesDumpProvider">
+        <argument>
+            <reference interface="org.apache.karaf.features.FeaturesService"
+                availability="optional" />
+        </argument>
+    </bean>
+    <service ref="features" auto-export="interfaces" />
+
+    <bean id="logs" class="org.apache.karaf.diagnostic.common.LogDumpProvider">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+    <service ref="logs" auto-export="interfaces" />
+
+    <bean id="bundles" class="org.apache.karaf.diagnostic.common.BundleDumpProvider">
+        <argument ref="blueprintBundleContext" />
+    </bean>
+    <service ref="bundles" auto-export="interfaces" />
+
+    <bean id="threads" class="org.apache.karaf.diagnostic.common.ThreadDumpProvider" />
+    <service ref="threads" auto-export="interfaces" />
+
+</blueprint>
diff --git a/karaf-2.2.x/diagnostic/common/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/diagnostic/common/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..697f53d
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/common/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,19 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The diagnostic common bundle provides diagnostic services.
+
+    The diagnostic services cover dump on:
+    - features
+    - logs
+    - bundles
+    - threads
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/diagnostic/core/NOTICE b/karaf-2.2.x/diagnostic/core/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/diagnostic/core/pom.xml b/karaf-2.2.x/diagnostic/core/pom.xml
new file mode 100644
index 0000000..e68bd2e
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.diagnostic</groupId>
+        <artifactId>diagnostic</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Diagnostic :: Core</name>
+    <description>Core implementation using Karaf diagnostic using the diagnostic common services</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                        	${project.artifactId};version=${project.version},
+                        	${project.artifactId}.common;version=${project.version};-noimport:=true,
+                       	</Export-Package>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpDestination.java b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpDestination.java
new file mode 100644
index 0000000..39c4edc
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpDestination.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.karaf.diagnostic.core;
+
+import java.io.OutputStream;
+
+/**
+ * Destination for created dumps.
+ */
+public interface DumpDestination {
+
+    /**
+     * Creates new entry in dump destination.
+     * 
+     * Destination does not close returned output stream by default, dump
+     * provider should do this after completing write operation.
+     * 
+     * @param name Name of file in destination.
+     * @return Output stream ready to write.
+     * @throws Exception When entry cannot be added.
+     */
+    OutputStream add(String name) throws Exception;
+
+    /**
+     * Complete creation of the dump.
+     */
+    void save() throws Exception;
+
+}
diff --git a/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpProvider.java b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpProvider.java
new file mode 100644
index 0000000..ec7724c
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpProvider.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.karaf.diagnostic.core;
+
+/**
+ * Interface which represents instance of tool which can provide dump
+ * information.
+ */
+public interface DumpProvider {
+
+    /**
+     * Creates dump in given entry.
+     */
+    void createDump(DumpDestination destination) throws Exception;
+
+}
diff --git a/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ClosingEntryOutputStreamWrapper.java b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ClosingEntryOutputStreamWrapper.java
new file mode 100644
index 0000000..0c4f9db
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ClosingEntryOutputStreamWrapper.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.karaf.diagnostic.core.common;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * Output stream which closes entry instead closing whole stream.
+ */
+public class ClosingEntryOutputStreamWrapper extends OutputStream {
+
+    /**
+     * Wrapped ZIP output stream. 
+     */
+    private ZipOutputStream outputStream;
+
+    /**
+     * Creates new OutputStream.
+     * 
+     * @param outputStream Wrapped output stream.
+     */
+    public ClosingEntryOutputStreamWrapper(ZipOutputStream outputStream) {
+        this.outputStream = outputStream;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void write(int b) throws IOException {
+        outputStream.write(b);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void write(byte[] b) throws IOException {
+        outputStream.write(b);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void write(byte[] b, int off, int len)
+        throws IOException {
+        outputStream.write(b, off, len);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void close() throws IOException {
+        // close entry instead of closing zip stream.
+        outputStream.closeEntry();
+    }
+
+}
diff --git a/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/DirectoryDumpDestination.java b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/DirectoryDumpDestination.java
new file mode 100644
index 0000000..37ae72e
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/DirectoryDumpDestination.java
@@ -0,0 +1,55 @@
+/*
+ * 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.karaf.diagnostic.core.common;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+
+import org.apache.karaf.diagnostic.core.DumpDestination;
+
+/**
+ * Class which packages dumps to given directory.
+ */
+public class DirectoryDumpDestination implements DumpDestination {
+
+	/**
+	 * Directory where dump files will be created.
+	 */
+	private File directory;
+
+	public DirectoryDumpDestination(File file) {
+		this.directory = file;
+
+		if (!file.exists()) {
+			file.mkdirs();
+		} 
+	}
+
+	public OutputStream add(String name) throws Exception {
+		File destination = new File(directory, name);
+		if (name.contains("/") || name.contains("\\")) {
+			// if name contains slashes we need to create sub directory
+			destination.getParentFile().mkdirs();
+		}
+		return new FileOutputStream(destination);
+	}
+
+	public void save() throws Exception {
+		// do nothing, all should be written to output streams
+	}
+	
+}
diff --git a/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/TextDumpProvider.java b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/TextDumpProvider.java
new file mode 100644
index 0000000..2faafdc
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/TextDumpProvider.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.karaf.diagnostic.core.common;
+
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
+import org.apache.karaf.diagnostic.core.DumpDestination;
+import org.apache.karaf.diagnostic.core.DumpProvider;
+
+/**
+ * Base class for dump providers which writes text to destination.
+ */
+public abstract class TextDumpProvider implements DumpProvider {
+
+    /**
+     * Name of the file.
+     */
+    private final String name;
+
+    /**
+     * Creates new dump provider.
+     * 
+     * @param name Name of the file.
+     */
+    protected TextDumpProvider(String name) {
+        this.name = name;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public final void createDump(DumpDestination destination) throws Exception {
+        OutputStream outputStream = destination.add(name);
+        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
+        try {
+            writeDump(outputStreamWriter);
+        } finally {
+            outputStreamWriter.close();
+            outputStream.close();
+        }
+    }
+
+    /**
+     * This method should create output.
+     * 
+     * @param outputStreamWriter Stream which points to file specified in constructor.
+     * @throws Exception If any problem occur.
+     */
+    protected abstract void writeDump(OutputStreamWriter outputStreamWriter) throws Exception;
+
+}
diff --git a/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ZipDumpDestination.java b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ZipDumpDestination.java
new file mode 100644
index 0000000..bafd38d
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ZipDumpDestination.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.karaf.diagnostic.core.common;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.karaf.diagnostic.core.DumpDestination;
+
+/**
+ * Class which packages dumps to ZIP archive.
+ */
+public class ZipDumpDestination implements DumpDestination {
+
+    /**
+     * Destination streem.
+     */
+    private ZipOutputStream outputStream;
+
+    /**
+     * Creates new dump in given directory.
+     * 
+     * @param directory Target directory.
+     * @param name Name of the archive.
+     */
+    public ZipDumpDestination(File directory, String name) {
+        this(new File(directory, name));
+    }
+
+    /**
+     * Creates new dump in given file (zip archive). 
+     * 
+     * @param file Destination file.
+     */
+    public ZipDumpDestination(File file) {
+        try {
+            outputStream = new ZipOutputStream(new FileOutputStream(
+                file));
+        } catch (FileNotFoundException e) {
+            // sometimes this can occur, but we simply re throw and let 
+            // caller handle exception
+            throw new RuntimeException("Unable to create dump destination", e);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public OutputStream add(String name) throws Exception {
+        ZipEntry zipEntry = new ZipEntry(name);
+        outputStream.putNextEntry(zipEntry);
+        return new ClosingEntryOutputStreamWrapper(outputStream);
+    }
+
+    /**
+     * Closes archive handle.
+     */
+    public void save() throws Exception {
+        outputStream.close();
+    }
+
+}
diff --git a/karaf-2.2.x/diagnostic/core/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/diagnostic/core/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..d8a62f2
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/core/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The diagnostic core bundle is the diagnostic core implementation.
+
+    It's used by the diagnostic commands bundle and is responsible of the dump generation (features, logs, bundles, threads).
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/diagnostic/management/NOTICE b/karaf-2.2.x/diagnostic/management/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/management/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/diagnostic/management/pom.xml b/karaf-2.2.x/diagnostic/management/pom.xml
new file mode 100644
index 0000000..7f1cdae
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/management/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.diagnostic</groupId>
+        <artifactId>diagnostic</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.diagnostic.management</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Diagnostic :: Management</name>
+    <description>Expose diagnostic MBeans via JMX.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.diagnostic</groupId>
+            <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.management</groupId>
+            <artifactId>org.apache.karaf.management.server</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>
+                            ${project.artifactId}*;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.diagnostic.management.internal;-split-package:=merge-first
+                        </Private-Package>
+                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/DiagnosticDumpMBean.java b/karaf-2.2.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/DiagnosticDumpMBean.java
new file mode 100644
index 0000000..46384b7
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/DiagnosticDumpMBean.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.karaf.diagnostic.management;
+
+/**
+ * Diagnostic MBean which allows to create dumps over JMX.
+ */
+public interface DiagnosticDumpMBean {
+
+    /**
+     * Creates dump over JMX.
+     * 
+     * @param name Name of the dump.
+     * @throws Exception In case of any problems.
+     */
+    void createDump(String name) throws Exception;
+
+    /**
+     * Create dump with directory switch and name.
+     * 
+     * @param directory Should dump be created in directory.
+     * @param name Name of the dump.
+     * @throws Exception In case of any problems.
+     */
+    void createDump(boolean directory, String name) throws Exception;
+
+}
diff --git a/karaf-2.2.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/internal/DiagnosticDumpMBeanImpl.java b/karaf-2.2.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/internal/DiagnosticDumpMBeanImpl.java
new file mode 100644
index 0000000..aa850b1
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/internal/DiagnosticDumpMBeanImpl.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.diagnostic.management.internal;
+
+import java.io.File;
+import java.util.List;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+
+import org.apache.karaf.diagnostic.core.DumpDestination;
+import org.apache.karaf.diagnostic.core.DumpProvider;
+import org.apache.karaf.diagnostic.core.common.DirectoryDumpDestination;
+import org.apache.karaf.diagnostic.core.common.ZipDumpDestination;
+import org.apache.karaf.diagnostic.management.DiagnosticDumpMBean;
+
+/**
+ * Implementation of diagnostic mbean.
+ */
+public class DiagnosticDumpMBeanImpl extends StandardMBean implements 
+    DiagnosticDumpMBean {
+
+    /**
+     * Dump providers.
+     */
+    private List<DumpProvider> providers;
+
+    /**
+     * Creates new diagnostic mbean.
+     * 
+     * @throws NotCompliantMBeanException
+     */
+    public DiagnosticDumpMBeanImpl() throws NotCompliantMBeanException {
+        super(DiagnosticDumpMBean.class);
+    }
+
+    /**
+     * Creates dump witch given name
+     * 
+     * @param name Name of the dump.
+     */
+    public void createDump(String name) throws Exception {
+        createDump(false, name);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void createDump(boolean directory, String name) throws Exception {
+        File target = new File(name);
+
+        DumpDestination destination;
+        if (directory) {
+            destination = new DirectoryDumpDestination(target);
+        } else {
+            destination = new ZipDumpDestination(target);
+        }
+
+        for (DumpProvider provider : providers) {
+            provider.createDump(destination);
+        }
+
+        destination.save();
+    }
+
+    /**
+     * Sets dump providers.
+     * 
+     * @param providers Dump providers. 
+     */
+    public void setProviders(List<DumpProvider> providers) {
+        this.providers = providers;
+    }
+
+}
diff --git a/karaf-2.2.x/diagnostic/management/src/main/resources/OSGI-INF/blueprint/diagnostic-management.xml b/karaf-2.2.x/diagnostic/management/src/main/resources/OSGI-INF/blueprint/diagnostic-management.xml
new file mode 100644
index 0000000..ab70576
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/management/src/main/resources/OSGI-INF/blueprint/diagnostic-management.xml
@@ -0,0 +1,42 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="eager">
+
+    <reference-list id="providers" availability="optional"
+        interface="org.apache.karaf.diagnostic.core.DumpProvider" />
+
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegister" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer" />
+    </reference>
+
+    <bean id="mbeanImpl" class="org.apache.karaf.diagnostic.management.internal.DiagnosticDumpMBeanImpl">
+        <property name="providers" ref="providers" />
+    </bean>
+
+    <bean id="mbeanRegister" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=diagnostic,name=${karaf.name}"
+                    key-ref="mbeanImpl" />
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
diff --git a/karaf-2.2.x/diagnostic/management/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/diagnostic/management/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..b17e412
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/management/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,16 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The diagnostic management bundle exposes Diagnostic MBeans that you can use with any JMX client (for instance JConsole).
+
+    The provided DiagnosticDumpMBean exposes the following operation:
+    \u001B[36mcreateDump()\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/diagnostic/pom.xml b/karaf-2.2.x/diagnostic/pom.xml
new file mode 100644
index 0000000..f2ce85b
--- /dev/null
+++ b/karaf-2.2.x/diagnostic/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.diagnostic</groupId>
+    <artifactId>diagnostic</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Diagnostic</name>
+
+    <modules>
+        <module>core</module>
+        <module>command</module>
+        <module>management</module>
+        <module>common</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/etc/appended-resources/supplemental-models.xml b/karaf-2.2.x/etc/appended-resources/supplemental-models.xml
new file mode 100644
index 0000000..383f61d
--- /dev/null
+++ b/karaf-2.2.x/etc/appended-resources/supplemental-models.xml
@@ -0,0 +1,1349 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<supplementalDataModels>
+  <supplement>
+    <project>
+      <groupId>com.sun.xml.bind</groupId>
+      <artifactId>jaxb-impl</artifactId>
+      <name>Sun JAXB Reference Implementation Runtime</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>com.sun.xml.bind</groupId>
+      <artifactId>jaxb-xjc</artifactId>
+      <name>Sun JAXB Reference Implementation Tools</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>com.sun.xml.messaging.saaj</groupId>
+      <artifactId>saaj-impl</artifactId>
+      <name>Sun SAAJ Reference Implementation</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>javax.xml.soap</groupId>
+      <artifactId>saaj-api</artifactId>
+      <name>Sun SAAJ API</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.neethi</groupId>
+      <artifactId>neethi</artifactId>
+      <name>Neethi</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>javax.xml.ws</groupId>
+      <artifactId>jaxws-api</artifactId>
+      <name>Java API for XML-Based Web Services (JAX-WS API)</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>javax.xml.bind</groupId>
+      <artifactId>jaxb-api</artifactId>
+      <name>Java Architecture for XML Binding (JAXB API)</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>javax.xml</groupId>
+      <artifactId>jaxb-api</artifactId>
+      <name>Java Architecture for XML Binding (JAXB API)</name>
+      <organization>
+        <name>Sun Microsystems</name>
+        <url>http://www.sun.com/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0</name>
+          <url>http://www.sun.com/cddl/cddl.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>xalan</groupId>
+      <artifactId>xalan</artifactId>
+      <name>Apache Xalan-Java</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>net.java.dev.stax-utils</groupId>
+      <artifactId>stax-utils</artifactId>
+      <name>StAX Utilities</name>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>wss4j</groupId>
+      <artifactId>wss4j</artifactId>
+      <name>Apache WSS4J</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>jdom</groupId>
+      <artifactId>jdom</artifactId>
+      <name>JDOM</name>
+      <organization>
+        <name>jdom.org</name>
+        <url>http://www.jdom.org</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>Modified Apache Software License</name>
+          <url>licenses/jdom.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>xml-security</groupId>
+      <artifactId>xmlsec</artifactId>
+      <name>XML Security</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>xml-apis</groupId>
+      <artifactId>xml-apis</artifactId>
+      <name>XML APIs</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>bouncycastle</groupId>
+      <artifactId>bcprov-jdk14</artifactId>
+      <name>Bouncy Castle Crypto APIs for Java</name>
+      <organization>
+        <name>The Legion of the Bouncy Castle</name>
+        <url>http://www.bouncycastle.org</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>Bouncy Castle License</name>
+          <url>http://www.bouncycastle.org/licence.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>ant</groupId>
+      <artifactId>ant</artifactId>
+      <name>Apache Ant</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>ant</groupId>
+      <artifactId>ant-nodeps</artifactId>
+      <name>Apache Ant (nodeps)</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.codehaus.jettison</groupId>
+      <artifactId>jettison</artifactId>
+      <name>Jettison</name>
+      <organization>
+        <name>Envoi Solutions LLC</name>
+        <url>http://www.envoisolutions.com</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://jettison.codehaus.org/License</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.mina</groupId>
+      <artifactId>mina-core</artifactId>
+      <name>Apache MINA Core API</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.mina</groupId>
+      <artifactId>mina-filter-ssl</artifactId>
+      <name>Apache MINA SSL Filter</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <name>Apache Commons Codec</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-collections</groupId>
+      <artifactId>commons-collections</artifactId>
+      <name>Apache Commons Collections</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-dbcp</groupId>
+      <artifactId>commons-dbcp</artifactId>
+      <name>Apache Commons DBCP</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-jexl</groupId>
+      <artifactId>commons-jexl</artifactId>
+      <name>Apache Commons JEXL</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <name>Apache Commons Logging</name>
+      <url>http://commons.apache.org/logging</url>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging-api</artifactId>
+      <name>Apache Commons Logging Api</name>
+      <url>http://commons.apache.org/logging</url>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-pool</groupId>
+      <artifactId>commons-pool</artifactId>
+      <name>Apache Commons Pool</name>
+      <url>http://commons.apache.org/pool</url>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-vfs</groupId>
+      <artifactId>commons-vfs</artifactId>
+      <name>Apache Commons VFS</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <name>Apache Commons Codec</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.aries.blueprint</groupId>
+      <artifactId>org.apache.aries.blueprint</artifactId>
+      <name>Apache Aries Blueprint</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.activemq</groupId>
+      <artifactId>activemq-core</artifactId>
+      <name>ActiveMQ :: Core</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-core</artifactId>
+      <name>Camel :: Core</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.xbean</groupId>
+      <artifactId>xbean-classloader</artifactId>
+      <name>XBean :: Classloader</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.xbean</groupId>
+      <artifactId>xbean-finder</artifactId>
+      <name>XBean :: Classpath Resource Finder</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.xbean</groupId>
+      <artifactId>xbean-naming</artifactId>
+      <name>XBean :: Naming</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.xbean</groupId>
+      <artifactId>xbean-reflect</artifactId>
+      <name>XBean :: Reflect</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.xbean</groupId>
+      <artifactId>xbean-spring</artifactId>
+      <name>XBean :: Spring</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <name>SLF4J API Module</name>
+      <organization>
+        <name>QOS.ch</name>
+        <url>http://www.qos.ch</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>MIT style</name>
+          <url>http://www.slf4j.org/license.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-jdk14</artifactId>
+      <name>SLF4J JDK14 Binding</name>
+      <organization>
+        <name>QOS.ch</name>
+        <url>http://www.qos.ch</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>MIT style</name>
+          <url>http://www.slf4j.org/license.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <name>Log4j</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.components</groupId>
+      <artifactId>geronimo-connector</artifactId>
+      <name>Apache Geronimo TxManager :: Connector</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.components</groupId>
+      <artifactId>geronimo-transaction</artifactId>
+      <name>Apache Geronimo TxManager :: Transaction</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.springframework.osgi</groupId>
+      <artifactId>spring-osgi-core</artifactId>
+      <name>Spring OSGi Core</name>
+      <url>http://www.springframework.org/osgi/</url>
+      <organization>
+        <name>Spring Framework</name>
+        <url>http://www.springframework.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.springframework.osgi</groupId>
+      <artifactId>spring-osgi-extender</artifactId>
+      <name>Spring OSGi Extender</name>
+      <url>http://www.springframework.org/osgi/</url>
+      <organization>
+        <name>Spring Framework</name>
+        <url>http://www.springframework.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.springframework.osgi</groupId>
+      <artifactId>spring-osgi-io</artifactId>
+      <name>Spring OSGi IO</name>
+      <url>http://www.springframework.org/osgi/</url>
+      <organization>
+        <name>Spring Framework</name>
+        <url>http://www.springframework.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.springframework.osgi</groupId>
+      <artifactId>spring-osgi-annotation</artifactId>
+      <name>Spring OSGi Annotations</name>
+      <url>http://www.springframework.org/osgi/</url>
+      <organization>
+        <name>Spring Framework</name>
+        <url>http://www.springframework.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.objectweb.howl</groupId>
+      <artifactId>howl</artifactId>
+      <name>Howl Logger</name>
+      <url>http://howl.objectweb.org/</url>
+      <organization>
+        <name>ObjectWeb</name>
+        <url>http://www.objectweb.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The BSD License</name>
+          <url>http://howl.objectweb.org/license.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-classworlds</artifactId>
+      <name>Plexus Classworlds</name>
+      <url>http://plexus.codehaus.org/plexus-classworlds/</url>
+      <organization>
+        <name>Codehaus</name>
+        <url>http://www.codehaus.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>com.thoughtworks.xstream</groupId>
+      <artifactId>xstream</artifactId>
+      <name>XStream Core</name>
+      <url>http://xstream.codehaus.org/</url>
+      <organization>
+        <name>Codehaus</name>
+        <url>http://www.codehaus.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The BSD License</name>
+          <url>http://xstream.codehaus.com/license.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.servicemix.specs</groupId>
+      <artifactId>org.apache.servicemix.specs.activation-api-1.1</artifactId>
+      <name>Apache ServiceMix Specs :: Activation 1.1</name>
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
+      <name>Apache Geronimo Specs :: J2EE Connector 1.5</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-j2ee-management_1.1_spec</artifactId>
+      <name>Apache Geronimo Specs :: J2EE Management 1.1</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-javamail_1.4_spec</artifactId>
+      <name>Apache Geronimo Specs :: JavaMail 1.4</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jms_1.1_spec</artifactId>
+      <name>Apache Geronimo Specs :: JMS 1.1</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-jta_1.1_spec</artifactId>
+      <name>Apache Geronimo Specs :: JTA 1.1</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-saaj_1.3_spec</artifactId>
+      <name>Apache Geronimo Specs :: SAAJ 1.3</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-servlet_2.5_spec</artifactId>
+      <name>Apache Geronimo Specs :: Servlet 2.5</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+ <supplement>
+    <project>
+      <groupId>org.apache.geronimo.specs</groupId>
+      <artifactId>geronimo-stax-api_1.0_spec</artifactId>
+      <name>Apache Geronimo Specs :: Stax API 1.0</name> 
+      <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+      </organization>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>jline</groupId>
+      <artifactId>jline</artifactId>
+      <name>JLine</name>
+      <url>http://jline.sourceforge.net</url>
+      <organization>
+        <name>JLine</name>
+        <url>http://jline.sourceforge.net</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The BSD License</name>
+          <url>http://jline.sourceforge.net/license.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty</artifactId>
+      <name>Jetty Server</name>
+      <url>http://jetty.mortbay.org/</url>
+      <organization>
+	    <name>Mort Bay Consulting</name>
+	    <url>http://www.mortbay.com</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.mortbay.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <name>Jetty Utilities</name>
+      <url>http://jetty.mortbay.org/</url>
+      <organization>
+	    <name>Mort Bay Consulting</name>
+	    <url>http://www.mortbay.com</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.base</groupId>
+      <artifactId>ops4j-base-lang</artifactId>
+      <name>OPS4J Base - Lang</name>
+      <url>http://www.ops4j.org/projects/base/ops4j-base-lang</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.base</groupId>
+      <artifactId>ops4j-base-util-collections</artifactId>
+      <name>OPS4J Base - Util - Collections</name>
+      <url>http://www.ops4j.org/projects/base/ops4j-base-util-collections</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.base</groupId>
+      <artifactId>ops4j-base-util-xml</artifactId>
+      <name>OPS4J Base - Util - XML</name>
+      <url>http://www.ops4j.org/projects/base/ops4j-base-util-xml</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.logging</groupId>
+      <artifactId>pax-logging-api</artifactId>
+      <name>OPS4J - Pax Logging API</name>
+      <url>http://www.ops4j.org/projects/pax/logging/pax-logging-api</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.logging</groupId>
+      <artifactId>pax-logging-service</artifactId>
+      <name>OPS4J - Pax Logging Service</name>
+      <url>http://www.ops4j.org/projects/pax/logging/pax-logging-service</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.swissbox</groupId>
+      <artifactId>pax-swissbox-core</artifactId>
+      <name>OPS4J Pax Swissbox - OSGi Core</name>
+      <url>http://www.ops4j.org/projects/pax/swissbox/pax-swissbox-core</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.swissbox</groupId>
+      <artifactId>pax-swissbox-extender</artifactId>
+      <name>OPS4J Pax Swissbox - Extender</name>
+      <url>http://www.ops4j.org/projects/pax/swissbox/pax-swissbox-extender</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.swissbox</groupId>
+      <artifactId>pax-swissbox-lifecycle</artifactId>
+      <name>OPS4J Pax Swissbox - Lifecycle</name>
+      <url>http://www.ops4j.org/projects/pax/swissbox/pax-swissbox-lifecycle</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.swissbox</groupId>
+      <artifactId>pax-swissbox-optional-jcl</artifactId>
+      <name>OPS4J Pax Swissbox - Optional JCL</name>
+      <url>http://www.ops4j.org/projects/pax/swissbox/pax-swissbox-optional-jcl</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.swissbox</groupId>
+      <artifactId>pax-swissbox-tracker</artifactId>
+      <name>OPS4J Pax Swissbox - Tracker</name>
+      <url>http://www.ops4j.org/projects/pax/swissbox/pax-swissbox-tracker</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.url</groupId>
+      <artifactId>pax-url-mvn</artifactId>
+      <name>OPS4J Pax Url - mvn:</name>
+      <url>http://www.ops4j.org/projects/pax/url/pax-url-mvn</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.url</groupId>
+      <artifactId>pax-url-war</artifactId>
+      <name>OPS4J Pax Url - war:</name>
+      <url>http://www.ops4j.org/projects/pax/url/pax-url-war</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.web</groupId>
+      <artifactId>pax-web-bundle</artifactId>
+      <name>OPS4J Pax Web - Web Container</name>
+      <url>http://www.ops4j.org/projects/pax/web/pax-web-bundle</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.web</groupId>
+      <artifactId>pax-web-jsp</artifactId>
+      <name>OPS4J Pax Web - JSP</name>
+      <url>http://www.ops4j.org/projects/pax/web/pax-web-jsp</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.web-extender</groupId>
+      <artifactId>pax-web-ex-war</artifactId>
+      <name>OPS4J Pax Web Extender - WAR</name>
+      <url>http://www.ops4j.org/projects/pax/web-extender/pax-web-ex-war</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.ops4j.pax.web-extender</groupId>
+      <artifactId>pax-web-ex-whiteboard</artifactId>
+      <name>OPS4J Pax Web Extender - Whiteboard</name>
+      <url>http://www.ops4j.org/projects/pax/web-extender/pax-web-ex-whiteboard</url>
+	  <organization>
+	    <name>OPS4J - Open Participation Software for Java</name>
+	    <url>http://www.ops4j.org/</url>
+	  </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.impl.bundle.jmx</artifactId>
+      <name>JMX management for OSGi (RI snapshot)</name>
+      <organization>
+        <name>OSGi Alliance</name>
+        <url>http://www.osgi.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.fusesource.jansi</groupId>
+      <artifactId>jansi</artifactId>
+      <name>jansi</name>
+      <organization>
+        <name>FUSE Source</name>
+        <url>http://www.fusesource.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>The Apache Software License, Version 2.0</name>
+          <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>org.eclipse</groupId>
+      <artifactId>osgi</artifactId>
+      <name>Equinox Framework</name>
+      <organization>
+        <name>Eclipse Foundation</name>
+        <url>http://www.eclipse.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>Eclipse Public License, Version 1.0</name>
+          <url>http://www.eclipse.org/legal/epl-v10.html</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>xmlpull</groupId>
+      <artifactId>xmlpull</artifactId>
+      <name>XML Pull Parsing API</name>
+      <organization>
+        <name>Eclipse Foundation</name>
+        <url>http://www.eclipse.org/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>Public Domain</name>
+          <url>http://www.xmlpull.org/v1/download/unpacked/LICENSE.txt</url>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+  <supplement>
+    <project>
+      <groupId>aopalliance</groupId>
+      <artifactId>aopalliance</artifactId>
+      <name>XML Pull Parsing API</name>
+      <organization>
+        <name>AOP Alliance</name>
+        <url>http://aopalliance.sourceforge.net/</url>
+      </organization>
+      <licenses>
+        <license>
+          <name>Public Domain</name>
+        </license>
+      </licenses>
+    </project>
+  </supplement>
+</supplementalDataModels>
diff --git a/karaf-2.2.x/exception/NOTICE b/karaf-2.2.x/exception/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/exception/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/exception/pom.xml b/karaf-2.2.x/exception/pom.xml
new file mode 100644
index 0000000..7ec1fc2
--- /dev/null
+++ b/karaf-2.2.x/exception/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.exception</artifactId>
+    <name>Apache Karaf :: Exception</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+</project>
diff --git a/karaf-2.2.x/exception/src/main/java/java/lang/Exception.java b/karaf-2.2.x/exception/src/main/java/java/lang/Exception.java
new file mode 100644
index 0000000..2be5593
--- /dev/null
+++ b/karaf-2.2.x/exception/src/main/java/java/lang/Exception.java
@@ -0,0 +1,114 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package java.lang;
+
+
+/**
+ * {@code Exception} is the superclass of all classes that represent recoverable
+ * exceptions. When exceptions are thrown, they may be caught by application
+ * code.
+ *
+ * @see Throwable
+ * @see Error
+ * @see RuntimeException
+ */
+public class Exception extends Throwable {
+    private static final long serialVersionUID = -3387516993124229948L;
+
+    private transient Class[] classContext = SecurityManagerEx.getInstance().getThrowableContext(this);
+
+    /**
+     * Constructs a new {@code Exception} that includes the current stack trace.
+     */
+    public Exception() {
+        super();
+    }
+
+    /**
+     * Constructs a new {@code Exception} with the current stack trace and the
+     * specified detail message.
+     *
+     * @param detailMessage
+     *            the detail message for this exception.
+     */
+    public Exception(String detailMessage) {
+        super(detailMessage);
+    }
+
+    /**
+     * Constructs a new {@code Exception} with the current stack trace, the
+     * specified detail message and the specified cause.
+     *
+     * @param detailMessage
+     *            the detail message for this exception.
+     * @param throwable
+     *            the cause of this exception.
+     */
+    public Exception(String detailMessage, Throwable throwable) {
+        super(detailMessage, throwable);
+    }
+
+    /**
+     * Constructs a new {@code Exception} with the current stack trace and the
+     * specified cause.
+     *
+     * @param throwable
+     *            the cause of this exception.
+     */
+    public Exception(Throwable throwable) {
+        super(throwable);
+    }
+
+    public Class[] getClassContext() {
+        return classContext;
+    }
+
+    private static class SecurityManagerEx extends SecurityManager
+    {
+
+        private static SecurityManagerEx sm;
+
+        public static SecurityManagerEx getInstance() {
+            // No synchronized block because we don't really care
+            // if multiple instances are created at some point
+            if (sm == null) {
+                sm = new SecurityManagerEx();
+            }
+            return sm;
+        }
+
+        public Class[] getThrowableContext(Throwable t) {
+            try {
+                Class[] context = getClassContext();
+                int nb = 0;
+                for (;;) {
+                    if (context[context.length - 1 - nb] == t.getClass()) {
+                        break;
+                    }
+                    nb++;
+                }
+                Class[] nc = new Class[nb];
+                System.arraycopy(context, context.length - nb, nc, 0, nb);
+                return nc;
+            } catch (Exception e) {
+                return null;
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/NOTICE b/karaf-2.2.x/features/command/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/features/command/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/features/command/pom.xml b/karaf-2.2.x/features/command/pom.xml
new file mode 100644
index 0000000..aa3ae09
--- /dev/null
+++ b/karaf-2.2.x/features/command/pom.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.features</groupId>
+        <artifactId>features</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.features.command</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Features :: Command</name>
+    <description>This bundle provides the Karaf shell commands to manipulate features.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.obr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            !*
+						</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/AddUrlCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/AddUrlCommand.java
new file mode 100644
index 0000000..476f654
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/AddUrlCommand.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.karaf.features.command;
+
+import java.net.URI;
+import java.util.List;
+
+import org.apache.karaf.features.FeaturesService;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "features", name = "addUrl", description = "Adds a list of repository URLs to the features service.")
+public class AddUrlCommand extends FeaturesCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "One or more repository URLs separated by whitespaces", required = true, multiValued = true)
+    List<String> urls;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        for (String url : urls) {
+            try {
+                admin.addRepository(new URI(url));
+            } catch (Exception e) {
+                System.out.println("Could not add Feature Repository:\n" + e );
+                System.out.println("Please verify that the feature repository URL is correct and that your network connection works fine.");
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/Artifact.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/Artifact.java
new file mode 100644
index 0000000..da7d6aa
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/Artifact.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.karaf.features.command;
+
+import java.net.URI;
+
+/**
+ * Simple abstraction of a maven artifact to avoid external deps
+ */
+public class Artifact {
+    String groupId;
+    String artifactId;
+    String version;
+    String extension;
+    String classifier;
+    
+    public Artifact(String coords) {
+        String[] coordsAr = coords.split(":");
+        this.groupId = coordsAr[0];
+        this.artifactId = coordsAr[1];
+        this.version = coordsAr[4];
+        this.extension = coordsAr[2];
+        this.classifier = coordsAr[3];
+    }
+    
+    public Artifact(String coords, String version) {
+        this(coords);
+        this.version = version;
+    }
+    
+    public URI getPaxUrlForArtifact(String version) {
+        String uriSt = "mvn:" + this.groupId + "/" + this.artifactId + "/" + version + "/" + this.extension + "/" + this.classifier;
+        try {
+            return new URI(uriSt);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ChooseUrlCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ChooseUrlCommand.java
new file mode 100644
index 0000000..a92837b
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ChooseUrlCommand.java
@@ -0,0 +1,62 @@
+/*
+ * 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.karaf.features.command;
+
+import java.net.URI;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * Concatenate and print files and/or URLs.
+ *
+ * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
+ */
+@Command(scope = "feature", name = "chooseurl", description = "Add a repository url for well known features")
+public class ChooseUrlCommand extends AbstractAction {
+
+    @Argument(index = 0, name = "", description = "", required = true, multiValued = false)
+    private String name;
+    
+    @Argument(index = 1, name = "", description = "", required = false, multiValued = false)
+    private String version;
+    
+    private FeatureFinder featureFinder;
+    private FeaturesService featuresService;
+    
+    public void setFeatureFinder(FeatureFinder featureFinder) {
+        this.featureFinder = featureFinder;
+    }
+
+    public void setFeaturesService(FeaturesService featuresService) {
+        this.featuresService = featuresService;
+    }
+
+    protected Object doExecute() throws Exception {
+        String effectiveVersion = (version == null) ? "LATEST" : version;
+        URI uri = featureFinder.getUriFor(name, effectiveVersion);
+        if (uri == null) {
+            throw new RuntimeException("No feature found for name " + name + " and version " + version);
+        }
+        System.out.println("adding feature url " + uri);
+        featuresService.addRepository(uri);
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/FeatureFinder.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/FeatureFinder.java
new file mode 100644
index 0000000..9cd3647
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/FeatureFinder.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features.command;
+
+import java.net.URI;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+
+public class FeatureFinder implements ManagedService {
+    Map<String, String> nameToArtifactMap = new HashMap<String, String>();
+    public String[] getNames() {
+        return nameToArtifactMap.keySet().toArray(new String[] {});
+    }
+
+    public URI getUriFor(String name, String version) {
+        String coords = nameToArtifactMap.get(name);
+        if (coords == null) {
+            return null;
+        }
+        Artifact artifact = new Artifact(coords);
+        return artifact.getPaxUrlForArtifact(version);
+    }
+
+    @SuppressWarnings("rawtypes")
+    public void updated(Dictionary properties) throws ConfigurationException {
+        if (properties != null) {
+            nameToArtifactMap.clear();
+            Enumeration keys = properties.keys();
+            while (keys.hasMoreElements()) {
+                String key = (String)keys.nextElement();
+                if (!"felix.fileinstall.filename".equals(key) && !"service.pid".equals(key)) {
+                    nameToArtifactMap.put(key, (String)properties.get(key));
+                }
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/FeaturesCommandSupport.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/FeaturesCommandSupport.java
new file mode 100644
index 0000000..5e4a33c
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/FeaturesCommandSupport.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features.command;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.features.FeaturesService;
+import org.osgi.framework.ServiceReference;
+
+public abstract class FeaturesCommandSupport extends OsgiCommandSupport {
+
+    protected Object doExecute() throws Exception {
+        // Get repository admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(FeaturesService.class.getName());
+        if (ref == null) {
+            System.out.println("FeaturesService service is unavailable.");
+            return null;
+        }
+        try {
+            FeaturesService admin = (FeaturesService) getBundleContext().getService(ref);
+            if (admin == null) {
+                System.out.println("FeaturesService service is unavailable.");
+                return null;
+            }
+
+            doExecute(admin);
+        }
+        finally {
+            getBundleContext().ungetService(ref);
+        }
+        return null;
+    }
+
+    protected abstract void doExecute(FeaturesService admin) throws Exception;
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java
new file mode 100644
index 0000000..e1210aa
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java
@@ -0,0 +1,207 @@
+/*
+ * 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.karaf.features.command;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.ConfigFileInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+
+/**
+ * Utility command to display info about features.
+ */
+@Command(scope = "features", name = "info", description = "Shows information about selected feature.")
+public class InfoFeatureCommand extends FeaturesCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "The name of the feature", required = true, multiValued = false)
+    private String name;
+
+    @Argument(index = 1, name = "version", description = "The version of the feature", required = false, multiValued = false)
+    private String version;
+
+    @Option(name = "-c", aliases={"--configuration"}, description="Display configuration info", required = false, multiValued = false)
+    private boolean config;
+
+    @Option(name = "-d", aliases={"--dependency"}, description="Display dependencies info", required = false, multiValued = false)
+    private boolean dependency;
+
+    @Option(name = "-b", aliases={"--bundle"}, description="Display bundles info", required = false, multiValued = false)
+    private boolean bundle;
+
+    @Option(name = "-t", aliases={"--tree"}, description="Display feature tree", required = false, multiValued = false)
+    private boolean tree;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        Feature feature = null;
+
+        if (version != null && version.length() > 0) {
+            feature = admin.getFeature(name, version);
+        } else {
+            feature = admin.getFeature(name);
+        }
+
+        if (feature == null) {
+            System.out.println("Feature not found");
+            return;
+        }
+
+        // default behavior
+        if (!config && !dependency && !bundle) {
+            config = true;
+            dependency = true;
+            bundle = true;
+        }
+
+        System.out.println("Description of " + feature.getName() + " " + feature.getVersion() + " feature");
+        System.out.println("----------------------------------------------------------------");
+        if(feature.getDetails() != null && feature.getDetails().length() >0) {
+           System.out.print(feature.getDetails());
+           System.out.println("----------------------------------------------------------------");
+        }
+        if (config) {
+            displayConfigInformation(feature);
+            displayConfigFileInformation(feature);
+        }
+
+        if (dependency) {
+            displayDependencyInformation(feature);
+        }
+
+        if (bundle) {
+            displayBundleInformation(feature);
+        }
+
+        if (tree) {
+            if (config || dependency || bundle) {
+                System.out.println("\nFeature tree");
+            }
+
+            int unresolved = displayFeatureTree(admin, feature, 0, false);
+            if (unresolved > 0) {
+                System.out.println("Tree contains " + unresolved + " unresolved dependencies");
+                System.out.println(" * means that node declares dependency but the dependant feature is not available.");
+            }
+        }
+    }
+
+    private void displayBundleInformation(Feature feature) {
+        List<BundleInfo> bundleInfos = feature.getBundles();
+        if (bundleInfos.isEmpty()) {
+            System.out.println("Feature has no bundles.");
+        } else {
+            System.out.println("Feature contains followed bundles:");
+            for (BundleInfo featureBundle : bundleInfos) {
+                int startLevel = featureBundle.getStartLevel();
+                StringBuilder sb = new StringBuilder();
+                sb.append(" ").append(featureBundle.getLocation());
+                if(startLevel > 0) {
+                    sb.append(" start-level=").append(startLevel);
+                }
+                System.out.println(sb.toString());
+            }
+        }
+    }
+
+    private void displayDependencyInformation(Feature feature) {
+        List<Feature> dependencies = feature.getDependencies();
+        if (dependencies.isEmpty()) {
+            System.out.println("Feature has no dependencies.");
+        } else {
+            System.out.println("Feature depends on:");
+            for (Feature featureDependency : dependencies) {
+                System.out.println("  " + featureDependency.getName() + " " + featureDependency.getVersion());
+            }
+        }
+    }
+
+    private void displayConfigInformation(Feature feature) {
+        Map<String, Map<String, String>> configurations = feature.getConfigurations();
+        if (configurations.isEmpty()) {
+            System.out.println("Feature has no configuration");
+        } else {
+            System.out.println("Feature configuration:");
+            for (String name : configurations.keySet()) {
+                System.out.println("  " + name);
+            }
+        }
+    }
+    
+    private void displayConfigFileInformation(Feature feature) {
+    	List<ConfigFileInfo> configurationFiles = feature.getConfigurationFiles();
+    	if (configurationFiles.isEmpty()) {
+    		System.out.println("Feature has no configuration files");
+    	} else {
+    		System.out.println("Feature configuration files: ");
+    		for (ConfigFileInfo configFileInfo : configurationFiles) {
+				System.out.println("  " + configFileInfo.getFinalname());
+			}
+    	}    	
+    }
+
+
+    private int displayFeatureTree(FeaturesService admin, Feature feature, int level, boolean last) throws Exception {
+        int unresolved = 0;
+        String prefix = repeat("   ", level);
+
+        Feature resolved = resolveFeature(admin, feature);
+        if (resolved != null) {
+            System.out.println(prefix + " " + resolved.getName() + " " + resolved.getVersion());
+        } else {
+            System.out.println(prefix + " " + feature.getName() + " " + feature.getVersion() + " *");
+            unresolved++;
+        }
+
+        if (bundle) {
+            List<BundleInfo> bundles = resolved != null ? resolved.getBundles() : feature.getBundles();
+            for (int i = 0, j = bundles.size(); i < j; i++) {
+                System.out.println(prefix + " " + (i+1 == j ? "\\" : "+") + " " + bundles.get(i).getLocation());
+            }
+        }
+        List<Feature> dependencies = resolved != null ? resolved.getDependencies() : feature.getDependencies();
+        for (int i = 0, j = dependencies.size(); i < j; i++) {
+            Feature toDisplay = resolveFeature(admin, dependencies.get(i));
+            if (toDisplay == null) {
+                toDisplay = dependencies.get(i);
+            }
+            unresolved += displayFeatureTree(admin, toDisplay, level+1, i + 1 == j);
+        }
+
+        return unresolved;
+    }
+
+    private Feature resolveFeature(FeaturesService admin, Feature feature) throws Exception {
+        return admin.getFeature(feature.getName(), feature.getVersion());
+    }
+
+    private static String repeat(String string, int times) {
+        if (times <= 0) {
+            return "";
+        }
+        else if (times % 2 == 0) {
+            return repeat(string+string, times/2);
+        }
+        else {
+           return string + repeat(string+string, times/2);
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/InstallFeatureCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/InstallFeatureCommand.java
new file mode 100644
index 0000000..6120071
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/InstallFeatureCommand.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features.command;
+
+import java.util.EnumSet;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "features", name = "install", description = "Installs a feature with the specified name and version.")
+public class InstallFeatureCommand extends FeaturesCommandSupport {
+
+    private static String DEFAULT_VERSION = "0.0.0";
+
+    @Argument(index = 0, name = "feature", description = "The name and version of the features to install. A feature id looks like name/version. The version is optional.", required = true, multiValued = true)
+    List<String> features;
+    @Option(name = "-c", aliases = "--no-clean", description = "Do not uninstall bundles on failure", required = false, multiValued = false)
+    boolean noClean;
+    @Option(name = "-r", aliases = "--no-auto-refresh", description = "Do not automatically refresh bundles", required = false, multiValued = false)
+    boolean noRefresh;
+    @Option(name = "-v", aliases = "--verbose", description = "Explain what is being done", required = false, multiValued = false)
+    boolean verbose;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        for (String feature : features) {
+            String[] split = feature.split("/");
+            String name = split[0];
+            String version = null;
+            if (split.length == 2) {
+                version = split[1];
+            }
+    	    if (version == null || version.length() == 0) {
+                version = DEFAULT_VERSION;
+    	    }
+            EnumSet<FeaturesService.Option> options = EnumSet.of(FeaturesService.Option.PrintBundlesToRefresh);
+            if (noRefresh) {
+                options.add(FeaturesService.Option.NoAutoRefreshBundles);
+            }
+            if (noClean) {
+                options.add(FeaturesService.Option.NoCleanIfFailure);
+            }
+            if (verbose) {
+                options.add(FeaturesService.Option.Verbose);
+            }
+            admin.installFeature(name, version, options);
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeatureVersionsCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeatureVersionsCommand.java
new file mode 100644
index 0000000..47440f4
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeatureVersionsCommand.java
@@ -0,0 +1,116 @@
+/*
+ * 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.karaf.features.command;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+@Command(scope = "features", name = "listVersions", description = "Lists all versions of a feature available from the currently available repositories.")
+public class ListFeatureVersionsCommand extends FeaturesCommandSupport {
+
+	@Argument(index = 0, name = "feature", description = "Name of feature.", required = true, multiValued = false)
+	String feature;
+
+    private static final String VERSION = "Version";
+    private static final String REPOSITORY = "Repository";
+    private static final String REPOSITORY_URL = "Repository URL";
+
+    private class VersionInRepository { 
+    	public String version;
+    	public Repository repository;
+    }
+    
+    protected void doExecute(FeaturesService admin) throws Exception {
+
+        List<VersionInRepository> versionsInRepositories = new ArrayList<VersionInRepository>();
+        
+        for (Repository r : Arrays.asList(admin.listRepositories())) {
+            for (Feature f : r.getFeatures()) {
+
+                if (f.getName().equals(feature)) { 
+                	VersionInRepository versionInRepository = new VersionInRepository();
+                	versionInRepository.repository = r;
+                	versionInRepository.version = f.getVersion();
+                	versionsInRepositories.add(versionInRepository);
+                }
+            }
+        }
+
+    	
+        if (versionsInRepositories.size() == 0) {
+            System.out.println("No versions available for features '" + feature + "'");
+            return;
+        }
+
+        // Print column headers.
+        int maxVersionSize = VERSION.length();
+        for (VersionInRepository vir : versionsInRepositories) {
+            maxVersionSize = Math.max(maxVersionSize, vir.version.length());
+        }
+        int maxRepositorySize = REPOSITORY.length();
+        for (VersionInRepository vir : versionsInRepositories) {
+        	maxRepositorySize = Math.max(maxRepositorySize, vir.repository.getName().length());
+        }
+        
+        StringBuilder sb = new StringBuilder();
+        sb.append(VERSION).append("   ");
+        for (int i = VERSION.length(); i < maxVersionSize; i++) {
+            sb.append(" ");
+        }
+        sb.append(REPOSITORY).append(" ");
+        for (int i = REPOSITORY.length(); i < maxRepositorySize; i++) {
+            sb.append(" ");
+        }
+        sb.append(" ");
+        sb.append(REPOSITORY_URL);
+        System.out.println(sb.toString());
+
+        // Print the version data.
+        for (VersionInRepository vir : versionsInRepositories) {
+
+            sb.setLength(0);
+
+
+            sb.append("[");
+            String str = vir.version;
+            sb.append(str);
+            for (int i = str.length(); i < maxVersionSize; i++) {
+                sb.append(" ");
+            }
+            sb.append("] ");
+
+            str = vir.repository.getName();
+            sb.append(str);
+            for (int i = str.length(); i < maxRepositorySize; i++) {
+                sb.append(" ");
+            }
+
+            sb.append(" ");
+            sb.append(vir.repository.getURI());
+            System.out.println(sb.toString());
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeaturesCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeaturesCommand.java
new file mode 100644
index 0000000..b38cee8
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeaturesCommand.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.karaf.features.command;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Command(scope = "features", name = "list", description = "Lists all existing features available from the defined repositories.")
+public class ListFeaturesCommand extends FeaturesCommandSupport {
+
+    @Option(name = "-i", aliases = {"--installed"}, description = "Display a list of all installed features only", required = false, multiValued = false)
+    boolean installed;
+
+    private static final String STATE = "State";
+    private static final String INSTALLED = "installed  ";
+    private static final String UNINSTALLED = "uninstalled";
+
+    private static final String VERSION = "Version";
+    private static final String NAME = "Name";
+    private static final String REPOSITORY = "Repository";
+    private static final String DESCRIPTION = "Description";
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+
+        // Get the feature data to print.
+        List<Feature> features = new ArrayList<Feature>();
+        List<Repository> repositories = new ArrayList<Repository>();
+        for (Repository r : Arrays.asList(admin.listRepositories())) {
+            for (Feature f : r.getFeatures()) {
+                if (installed && !admin.isInstalled(f)) {
+                    continue;
+                }
+                features.add(f);
+                repositories.add(r);
+            }
+        }
+        if (features.size() == 0) {
+            if (installed) {
+                System.out.println("No features installed.");
+            } else {
+                System.out.println("No features available.");
+            }
+            return;
+        }
+
+        // Print column headers.
+        int maxVersionSize = VERSION.length();
+        for (Feature f : features) {
+            maxVersionSize = Math.max(maxVersionSize, f.getVersion().length());
+        }
+        int maxNameSize = NAME.length();
+        for (Feature f : features) {
+            maxNameSize = Math.max(maxNameSize, f.getName().length());
+        }
+        int maxRepositorySize = REPOSITORY.length();
+        for (Repository repository:repositories) {
+                maxRepositorySize = Math.max(maxRepositorySize,  repository.getName().length());
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append(STATE).append("         ").append(VERSION).append("   ");
+        for (int i = VERSION.length(); i < maxVersionSize; i++) {
+            sb.append(" ");
+        }
+        sb.append(NAME).append(" ");
+        for (int i = NAME.length(); i < maxNameSize; i++) {
+            sb.append(" ");
+        }
+        sb.append(REPOSITORY).append(" ");
+
+        for (int i = REPOSITORY.length(); i < maxRepositorySize; i++) {
+            sb.append(" ");
+        }
+        sb.append(DESCRIPTION);
+        System.out.println(sb.toString());
+
+        // Print the feature data.
+        boolean needsLegend = false;
+        for (Feature f : features) {
+
+            sb.setLength(0);
+            sb.append("[");
+            if (admin.isInstalled(f)) {
+                sb.append(INSTALLED);
+            } else {
+                sb.append(UNINSTALLED);
+            }
+
+            sb.append("] [");
+            String str = f.getVersion();
+            sb.append(str);
+            for (int i = str.length(); i < maxVersionSize; i++) {
+                sb.append(" ");
+            }
+            sb.append("] ");
+
+            str = f.getName();
+            sb.append(str);
+            for (int i = str.length(); i < maxNameSize; i++) {
+                sb.append(" ");
+            }
+
+            sb.append(" ");
+            String name = repositories.get(0).getName();
+            sb.append(name);
+            repositories.remove(0);
+            
+            if (name.charAt(name.length() - 1) == '*') {
+                needsLegend = true;
+            }
+
+            for (int i = name.length(); i < maxRepositorySize; i++) {
+                sb.append(" ");
+            }
+
+            sb.append(" ");
+            String description = "";
+            if(f.getDescription() != null) {
+            description = f.getDescription();
+            }
+            sb.append(description);
+
+            System.out.println(sb.toString());            
+        }
+
+        if (needsLegend) {
+            System.out.println("* Installed via deploy directory");
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListRepositoriesCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListRepositoriesCommand.java
new file mode 100644
index 0000000..022473b
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListRepositoriesCommand.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.karaf.features.command;
+
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+
+@Command(scope = "features", name = "listRepositories", description = "Displays a list of all defined repositories.")
+public class ListRepositoriesCommand extends FeaturesCommandSupport {
+
+	private static final String REPOSITORY = "Repository";
+	private static final String REPOSITORY_URL = "Repository URL";
+
+	@Option(name = "-u", description = "Display repository URLs.", required = false, multiValued = false)
+    boolean showUrl;
+
+    
+	
+    protected void doExecute(FeaturesService admin) throws Exception {
+    	
+        StringBuffer sb = null;      
+
+        Repository[] repos = admin.listRepositories();
+          
+    	int maxRepositorySize = REPOSITORY.length();    	
+        int maxRepositoryUrlSize = REPOSITORY_URL.length();
+        for (Repository r : repos) { 
+        	maxRepositorySize = Math.max(maxRepositorySize, r.getName().length());
+        	maxRepositoryUrlSize = Math.max(maxRepositoryUrlSize, r.getURI().toString().length());
+        }
+        
+        if ((repos != null) && (repos.length > 0)) {
+            // Prepare the header
+            sb = new StringBuffer();        
+            append(sb, REPOSITORY, maxRepositorySize + 2);
+            if (showUrl) { 
+            	append(sb, REPOSITORY_URL, maxRepositoryUrlSize + 2);   
+            }
+            System.out.println(sb.toString());
+            
+
+        	for (int i = 0; i < repos.length; i++) {
+            	sb = new StringBuffer();        
+                append(sb, repos[i].getName(), maxRepositorySize + 2);
+                if (showUrl) { 
+                	append(sb, repos[i].getURI().toString(), maxRepositoryUrlSize + 2); 
+                }
+            	System.out.println(sb.toString());
+            }
+        } else {
+            System.out.println("No repositories available.");
+        }
+    }
+    
+    private void append(StringBuffer sb, String s, int width) { 
+    	sb.append(s);
+    	for (int i = s.length(); i < width; i++) { 
+    		sb.append(" ");
+    	}
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListUrlCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListUrlCommand.java
new file mode 100644
index 0000000..63c16e2
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/ListUrlCommand.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.karaf.features.command;
+
+import java.net.URI;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+/**
+ * Command which lists feature URLs.
+ * 
+ */
+@Command(scope = "features", name = "listUrl", description = "Displays a list of all defined repository URLs.")
+public class ListUrlCommand extends FeaturesCommandSupport {
+
+    @Option(name = "-v", aliases = "-validate", description = "Validate current version of descriptors", required = false, multiValued = false)
+    boolean validation = false;
+
+    @Option(name = "-vo", aliases = "-verbose", description = "Shows validation output", required = false, multiValued = false)
+    boolean verbose = false;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        Repository[] repos = admin.listRepositories();
+
+        String header;
+        if (validation) {
+            header = " Loaded   Now valid   URI ";
+        } else {
+            header = " Loaded   URI ";
+        }
+
+        System.out.println(header);
+
+        String verboseOutput = "";
+
+        if ((repos != null) && (repos.length > 0)) {
+            for (int i = 0; i < repos.length; i++) {
+                URI uri = repos[i].getURI();
+
+                String line = "";
+                line += repos[i].isValid() ? "  true " : "  false";
+
+                try {
+                    admin.validateRepository(uri);
+                    // append valid flag if validation mode is tuned on
+                    line += !validation ? "" : "     true   ";
+                } catch (Exception e) {
+                    line += !validation ? "" : "     false  ";
+                    verboseOutput += uri + ":" + e.getMessage() + "\n";
+                }
+
+                System.out.println(line + "   " + uri);
+            }
+
+            if (verbose) {
+                System.out.println("Validation output:\n" + verboseOutput);
+            }
+        } else {
+            System.out.println("No repository URLs are set.");
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RefreshUrlCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RefreshUrlCommand.java
new file mode 100644
index 0000000..94adbf7
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RefreshUrlCommand.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.karaf.features.command;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+@Command(scope = "features", name = "refreshUrl", description = "Reloads the list of available features from the repositories.")
+public class RefreshUrlCommand extends FeaturesCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "Repository URLs to reload (leave empty for all)", required = false, multiValued = true)
+    List<String> urls;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        if (urls == null || urls.isEmpty()) {
+            urls = new ArrayList<String>();
+            for (Repository repo : admin.listRepositories()) {
+                urls.add(repo.getURI().toString());
+            }
+        }
+        for (String strUri : urls) {
+            try {
+                URI uri = new URI(strUri);
+                admin.removeRepository(uri);
+                admin.addRepository(uri);
+            } catch (Exception e) {
+                System.out.println("Could not refresh Feature Repository:\n" + e.getMessage() );
+                //get chance to restore previous, fix for KARAF-4
+                admin.restoreRepository(new URI(strUri));
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveRepositoryCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveRepositoryCommand.java
new file mode 100644
index 0000000..efb6c71
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveRepositoryCommand.java
@@ -0,0 +1,47 @@
+/*
+ * 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.karaf.features.command;
+
+import java.net.URI;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+@Command(scope = "features", name = "removeRepository", description = "Removes the specified repository features service.")
+public class RemoveRepositoryCommand extends FeaturesCommandSupport {
+
+    @Argument(index = 0, name = "repository", description = "Name of the repository to remove.", required = true, multiValued = false)
+    private String repository;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+    	URI uri = null;
+    	for (Repository r :admin.listRepositories()) {
+    		if (r.getName().equals(repository)) {
+    			uri = r.getURI();
+    			break;
+    		}
+    	}
+
+    	if (uri == null) {
+    		System.out.println("Repository '" + repository + "' not found.") ;
+    	} else {
+    		admin.removeRepository(uri);
+    	}
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveUrlCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveUrlCommand.java
new file mode 100644
index 0000000..e68d73c
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveUrlCommand.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.karaf.features.command;
+
+import java.net.URI;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.features.FeaturesService;
+
+@Command(scope = "features", name = "removeUrl", description = "Removes the given list of repository URLs from the features service.")
+public class RemoveUrlCommand extends FeaturesCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "One or more repository URLs separated by whitespaces", required = true, multiValued = true)
+    List<String> urls;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        for (String url : urls) {
+            admin.removeRepository(new URI(url));
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
new file mode 100644
index 0000000..0399046
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
@@ -0,0 +1,47 @@
+/*
+ * 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.karaf.features.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.features.FeaturesService;
+
+import java.util.List;
+
+@Command(scope = "features", name = "uninstall", description = "Uninstalls a feature with the specified name and version.")
+public class UninstallFeatureCommand extends FeaturesCommandSupport {
+
+    @Argument(index = 0, name = "features", description = "The name and version of the features to uninstall. A feature id looks like name/version. The version is optional.", required = true, multiValued = true)
+    List<String> features;
+
+    protected void doExecute(FeaturesService admin) throws Exception {
+        // iterate in the provided feature
+        for (String feature : features) {
+            String[] split = feature.split("/");
+            String name = split[0];
+            String version = null;
+            if (split.length == 2) {
+                version = split[1];
+            }
+    	    if (version != null && version.length() > 0) {
+    		    admin.uninstallFeature(name, version);
+    	    } else {
+    		    admin.uninstallFeature(name );
+    	    }
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AllFeatureCompleter.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AllFeatureCompleter.java
new file mode 100644
index 0000000..cbb2cbd
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AllFeatureCompleter.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.features.command.completers;
+
+import org.apache.karaf.features.Feature;
+
+/**
+ * {@link jline.Completor} for available features.
+ */
+public class AllFeatureCompleter extends FeatureCompleterSupport {
+
+    @Override
+    protected boolean acceptsFeature(Feature feature) {
+        return true;
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AvailableFeatureCompleter.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AvailableFeatureCompleter.java
new file mode 100644
index 0000000..7345799
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AvailableFeatureCompleter.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.features.command.completers;
+
+import org.apache.karaf.features.Feature;
+
+/**
+ * {@link jline.Completor} for features not installed yet.
+ */
+public class AvailableFeatureCompleter extends FeatureCompleterSupport {
+
+    @Override
+    protected boolean acceptsFeature(Feature feature) {
+        return !featuresService.isInstalled(feature);
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureCompleterSupport.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureCompleterSupport.java
new file mode 100644
index 0000000..891779e
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureCompleterSupport.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features.command.completers;
+
+import java.util.List;
+
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+
+/**
+ * Base completer for feature commands.
+ */
+public abstract class FeatureCompleterSupport implements Completer {
+
+    /**
+     * Feature service.
+     */
+    protected FeaturesService featuresService;
+
+    public void setFeaturesService(FeaturesService featuresService) {
+        this.featuresService = featuresService;
+    }
+
+    public int complete(final String buffer, final int cursor, final List candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+        try {
+            for (Feature feature : featuresService.listFeatures()) {
+                if (acceptsFeature(feature)) {
+                    delegate.getStrings().add(feature.getName());
+                }
+            }
+        } catch (Exception e) {
+            // Ignore
+        }
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+    /**
+     * Method for filtering features.
+     *
+     * @param feature The feature.
+     * @return True if feature should be available in completer.
+     */
+    protected abstract boolean acceptsFeature(Feature feature);
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepoNameCompleter.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepoNameCompleter.java
new file mode 100644
index 0000000..0c12ec7
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepoNameCompleter.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.features.command.completers;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.karaf.features.command.FeatureFinder;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+
+public class FeatureRepoNameCompleter implements Completer {
+
+    FeatureFinder featureFinder;
+
+    public void setFeatureFinder(FeatureFinder featureFinder) {
+        this.featureFinder = featureFinder;
+    }
+
+    public int complete(final String buffer, final int cursor, @SuppressWarnings("rawtypes") final List candidates) {
+        StringsCompleter delegate = new StringsCompleter(Arrays.asList(featureFinder.getNames()));
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryCompleter.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryCompleter.java
new file mode 100644
index 0000000..f734e75
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryCompleter.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.karaf.features.command.completers;
+
+import java.util.List;
+
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+
+/**
+ * {@link jline.Completor} for Feature Repository URLs.
+ *
+ * Displays a list of currently installed Feature repositories.
+ *
+ */
+
+public class FeatureRepositoryCompleter implements Completer {
+
+    private FeaturesService featuresService;
+
+    public void setFeaturesService(FeaturesService featuresService) {
+        this.featuresService = featuresService;
+    }
+
+    public int complete(final String buffer, final int cursor, final List candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+        try {
+            for (Repository repository : featuresService.listRepositories()) {
+                delegate.getStrings().add(repository.getURI().toString());
+            }
+        } catch (Exception e) {
+            // Ignore
+        }
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryNameCompleter.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryNameCompleter.java
new file mode 100644
index 0000000..43fe803
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryNameCompleter.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.karaf.features.command.completers;
+
+import java.util.List;
+
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+
+/**
+ * {@link jline.Completor} for Feature Repository URLs.
+ *
+ * Displays a list of currently installed Feature repositories.
+ *
+ */
+
+public class FeatureRepositoryNameCompleter implements Completer {
+
+    private FeaturesService featuresService;
+
+    public void setFeaturesService(FeaturesService featuresService) {
+        this.featuresService = featuresService;
+    }
+
+    public int complete(final String buffer, final int cursor, final List candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+        try {
+            for (Repository repository : featuresService.listRepositories()) {
+                delegate.getStrings().add(repository.getName());
+            }
+        } catch (Exception e) {
+            // Ignore
+        }
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/InstalledFeatureCompleter.java b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/InstalledFeatureCompleter.java
new file mode 100644
index 0000000..6f900d3
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/java/org/apache/karaf/features/command/completers/InstalledFeatureCompleter.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.features.command.completers;
+
+import org.apache.karaf.features.Feature;
+
+/**
+ * {@link jline.Completor} for installed features.
+ */
+public class InstalledFeatureCompleter extends FeatureCompleterSupport {
+
+    @Override
+    protected boolean acceptsFeature(Feature feature) {
+        return featuresService.isInstalled(feature);
+    }
+
+}
diff --git a/karaf-2.2.x/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml b/karaf-2.2.x/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml
new file mode 100644
index 0000000..603bde0
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml
@@ -0,0 +1,123 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="features/addUrl">
+            <action class="org.apache.karaf.features.command.AddUrlCommand"/>
+        </command>
+        <command name="features/listUrl">
+            <action class="org.apache.karaf.features.command.ListUrlCommand"/>
+        </command>
+        <command name="features/listRepositories">
+            <action class="org.apache.karaf.features.command.ListRepositoriesCommand"/>
+        </command>
+        <command name="features/removeUrl">
+            <action class="org.apache.karaf.features.command.RemoveUrlCommand"/>
+            <completers>
+                <ref component-id="featureUrlCompleter" />
+            </completers>
+        </command>
+        <command name="features/removeRepository">
+             <action class="org.apache.karaf.features.command.RemoveRepositoryCommand"/>
+             <completers>
+                 <ref component-id="featureRepositoryNameCompleter" />
+             </completers>
+         </command>
+        <command name="features/refreshUrl">
+            <action class="org.apache.karaf.features.command.RefreshUrlCommand"/>
+            <completers>
+                <ref component-id="featureUrlCompleter" />
+            </completers>
+        </command>
+        <command name="features/install">
+            <action class="org.apache.karaf.features.command.InstallFeatureCommand"/>
+            <completers>
+                <ref component-id="uninstalledFeatureCompleter" />
+            </completers>
+        </command>
+        <command name="features/uninstall">
+            <action class="org.apache.karaf.features.command.UninstallFeatureCommand"/>
+            <completers>
+                <ref component-id="installedFeatureCompleter" />
+            </completers>
+        </command>
+        <command name="features/list">
+            <action class="org.apache.karaf.features.command.ListFeaturesCommand"/>
+        </command>
+        <command name="features/listVersions">
+            <action class="org.apache.karaf.features.command.ListFeatureVersionsCommand"/>
+            <completers>
+                <ref component-id="allFeatureCompleter" />
+            </completers>
+        </command>
+        <command name="features/info">
+            <action class="org.apache.karaf.features.command.InfoFeatureCommand"/>
+            <completers>
+                <ref component-id="allFeatureCompleter" />
+            </completers>
+        </command>
+        <command name="features/chooseurl">
+            <action class="org.apache.karaf.features.command.ChooseUrlCommand">
+                <property name="featureFinder" ref="featureFinder" />
+                <property name="featuresService" ref="featuresService" />
+            </action>
+            <completers>
+                <ref component-id="featureRepoCompleter" />
+            </completers>
+        </command>
+    </command-bundle>
+
+    <bean id="featureRepoCompleter" class="org.apache.karaf.features.command.completers.FeatureRepoNameCompleter">
+        <property name="featureFinder" ref="featureFinder" />
+    </bean>
+
+    <bean id="featureFinder" class="org.apache.karaf.features.command.FeatureFinder">
+    </bean> 
+
+    <service ref="featureFinder" interface="org.osgi.service.cm.ManagedService" >
+        <service-properties>
+            <entry key="service.pid" value="org.apache.karaf.features.repos" />
+        </service-properties>
+    </service>
+
+    <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService" />
+
+    <bean id="uninstalledFeatureCompleter" class="org.apache.karaf.features.command.completers.AvailableFeatureCompleter">
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+
+    <bean id="installedFeatureCompleter" class="org.apache.karaf.features.command.completers.InstalledFeatureCompleter">
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+
+    <bean id="allFeatureCompleter" class="org.apache.karaf.features.command.completers.AllFeatureCompleter">
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+
+    <bean id="featureUrlCompleter" class="org.apache.karaf.features.command.completers.FeatureRepositoryCompleter">
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+    
+    <bean id="featureRepositoryNameCompleter" class="org.apache.karaf.features.command.completers.FeatureRepositoryNameCompleter">
+        <property name="featuresService" ref="featuresService"/>
+    </bean>
+
+</blueprint>
diff --git a/karaf-2.2.x/features/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/features/command/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..671f894
--- /dev/null
+++ b/karaf-2.2.x/features/command/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,26 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides the Karaf shell commands to manipulate features.
+
+    The following commands are available:
+    \u001B[36mfeatures:addUrl\u001B[0m Adds a list of repository URLs to the features service.
+    \u001B[36mfeatures:info\u001B[0m Shows information about selected information.
+    \u001B[36mfeatures:install\u001B[0m Installs a feature with the specified name and version.
+    \u001B[36mfeatures:list\u001B[0m Lists all existing features available from the defined repositories.
+    \u001B[36mfeatures:listVersions\u001B[0m Lists all versions of a feature available from the currently available repositories.
+    \u001B[36mfeatures:listRepositories\u001B[0m Displays a list of all defined repositories.
+    \u001B[36mfeatures:listUrl\u001B[0m Displays a list of all defined repository URLs.
+    \u001B[36mfeatures:refreshUrl\u001B[0m Reloads the list of available features from the repositories.
+    \u001B[36mfeatures:removeRepository\u001B[0m Removes the specified repository features service.
+    \u001B[36mfeatures:removeUrl\u001B[0m Removes the given list of repository URLs from the features service.
+    \u001B[36mfeatures:uninstall\u001B[0m Uninstalls a feature with the specified name and version.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m and \u001B[36mProvisioning\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/features/core/NOTICE b/karaf-2.2.x/features/core/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/features/core/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/features/core/pom.xml b/karaf-2.2.x/features/core/pom.xml
new file mode 100644
index 0000000..808a36f
--- /dev/null
+++ b/karaf-2.2.x/features/core/pom.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.features</groupId>
+        <artifactId>features</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.features.core</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Features :: Core</name>
+    <description>This bundle is the core implementation of the Karaf features support.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.obr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>org.apache.karaf.features;version=${project.version}</Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.features,
+                            org.osgi.service.event*;resolution:=optional,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.features.internal;-split-package:=merge-first,
+                            org.apache.felix.utils.version;-split-package:=merge-first,
+                            org.apache.felix.utils.manifest;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java
new file mode 100644
index 0000000..97a541f
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java
@@ -0,0 +1,32 @@
+/*
+ * 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.karaf.features;
+
+/**
+ * A bundle info holds info about a Bundle.
+ */
+public interface BundleInfo {
+
+	String getLocation();
+	
+    int getStartLevel();
+    
+    boolean isStart();
+
+    boolean isDependency();
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/ConfigFileInfo.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/ConfigFileInfo.java
new file mode 100644
index 0000000..960fb31
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/ConfigFileInfo.java
@@ -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.
+ */
+package org.apache.karaf.features;
+
+public interface ConfigFileInfo {
+	
+	String getLocation();
+	
+	String getFinalname();
+	
+	boolean isOverride();
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/EventConstants.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/EventConstants.java
new file mode 100644
index 0000000..f83f185
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/EventConstants.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.features;
+
+/**
+ * Constants for EventAdmin events
+ */
+public final class EventConstants {
+
+    public static final String TYPE = "type";
+    public static final String EVENT = "event";
+    public static final String TIMESTAMP = "timestamp";
+
+    public static final String FEATURE_NAME = "name";
+    public static final String FEATURE_VERSION = "version";
+
+    public static final String REPOSITORY_NAME = "name";
+    public static final String REPOSITORY_URI = "uri";
+
+    public static final String TOPIC_EVENTS = "org/apache/karaf/features";
+    public static final String TOPIC_FEATURES_INSTALLED = TOPIC_EVENTS + "/features/INSTALLED";
+    public static final String TOPIC_FEATURES_UNINSTALLED = TOPIC_EVENTS + "/features/UNINSTALLED";
+    public static final String TOPIC_REPOSITORY_ADDED = TOPIC_EVENTS + "/repositories/ADDED";
+    public static final String TOPIC_REPOSITORY_REMOVED = TOPIC_EVENTS + "/repositories/REMOVED";
+
+    private EventConstants() {
+        // non-instantiable class
+    }
+
+
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Feature.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Feature.java
new file mode 100644
index 0000000..b87bc97
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Feature.java
@@ -0,0 +1,50 @@
+/*
+ * 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.karaf.features;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A feature is a list of bundles associated identified by its name.
+ */
+public interface Feature {
+
+    public static String DEFAULT_INSTALL_MODE = "auto";
+
+    String getId();
+
+    String getName();
+
+    String getDescription();
+
+    String getDetails();
+
+    String getVersion();
+
+    String getResolver();
+
+    String getInstall();
+
+    List<Feature> getDependencies();
+
+    List<BundleInfo> getBundles();
+
+    Map<String, Map<String, String>> getConfigurations();
+
+    List<ConfigFileInfo> getConfigurationFiles();
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeatureEvent.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeatureEvent.java
new file mode 100644
index 0000000..516c988
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeatureEvent.java
@@ -0,0 +1,50 @@
+/*
+ * 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.karaf.features;
+
+import java.util.EventObject;
+
+public class FeatureEvent extends EventObject {
+
+    public static enum EventType {
+        FeatureInstalled,
+        FeatureUninstalled
+    }
+
+    private final EventType type;
+    private final Feature feature;
+    private final boolean replay;
+
+    public FeatureEvent(Feature feature, EventType type, boolean replay) {
+        super(feature);
+        this.type = type;
+        this.feature = feature;
+        this.replay = replay;
+    }
+
+    public EventType getType() {
+        return type;
+    }
+
+    public Feature getFeature() {
+        return feature;
+    }
+
+    public boolean isReplay() {
+        return replay;
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeaturesListener.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeaturesListener.java
new file mode 100644
index 0000000..69f68c6
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeaturesListener.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.karaf.features;
+
+public interface FeaturesListener {
+
+    void featureEvent(FeatureEvent event);
+
+    void repositoryEvent(RepositoryEvent event);
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
new file mode 100644
index 0000000..46fc06e
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/FeaturesService.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.karaf.features;
+
+import java.net.URI;
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * The service managing features repositories.
+ */
+public interface FeaturesService {
+
+    enum Option {
+        NoCleanIfFailure,
+        PrintBundlesToRefresh,
+        NoAutoRefreshBundles,
+        ContinueBatchOnFailure,
+        Verbose
+    }
+
+    /**
+     * Validate repository contents.
+     * 
+     * @param uri Repository uri.
+     * @throws Exception When validation fails.
+     */
+    void validateRepository(URI uri) throws Exception;
+
+    void addRepository(URI url) throws Exception;
+
+    void removeRepository(URI url);
+    
+    void restoreRepository(URI url) throws Exception;
+
+    Repository[] listRepositories();
+
+    void installFeature(String name) throws Exception;
+    
+    void installFeature(String name, String version) throws Exception;
+
+    void installFeature(String name, String version, EnumSet<Option> options) throws Exception;
+
+    void installFeature(Feature f, EnumSet<Option> options) throws Exception;
+
+    void installFeatures(Set<Feature> features, EnumSet<Option> options) throws Exception;
+
+    void uninstallFeature(String name) throws Exception;
+    
+    void uninstallFeature(String name, String version) throws Exception;
+
+    Feature[] listFeatures() throws Exception;
+
+    Feature[] listInstalledFeatures();
+
+    boolean isInstalled(Feature f);
+
+    Feature getFeature(String name, String version) throws Exception;
+
+    Feature getFeature(String name) throws Exception;
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Repository.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Repository.java
new file mode 100644
index 0000000..6ee96da
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Repository.java
@@ -0,0 +1,36 @@
+/*
+ * 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.karaf.features;
+
+import java.net.URI;
+
+/**
+ * A repository of features.
+ */
+public interface Repository {
+
+    String getName();
+
+    URI getURI();
+
+    URI[] getRepositories() throws Exception;
+
+    Feature[] getFeatures() throws Exception;
+    
+    boolean isValid();
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/RepositoryEvent.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/RepositoryEvent.java
new file mode 100644
index 0000000..68f287b
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/RepositoryEvent.java
@@ -0,0 +1,50 @@
+/*
+ * 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.karaf.features;
+
+import java.util.EventObject;
+
+public class RepositoryEvent extends EventObject {
+
+    public static enum EventType {
+        RepositoryAdded,
+        RepositoryRemoved,
+    }
+
+    private final EventType type;
+    private final Repository repository;
+    private final boolean replay;
+
+    public RepositoryEvent(Repository repository, EventType type, boolean replay) {
+        super(repository);
+        this.type = type;
+        this.repository = repository;
+        this.replay = replay;
+    }
+
+    public EventType getType() {
+        return type;
+    }
+
+    public Repository getRepository() {
+        return repository;
+    }
+
+    public boolean isReplay() {
+        return replay;
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Resolver.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Resolver.java
new file mode 100644
index 0000000..d2fa941
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/Resolver.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.karaf.features;
+
+import java.util.List;
+
+public interface Resolver {
+
+    List<BundleInfo> resolve(Feature feature) throws Exception;
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java
new file mode 100644
index 0000000..0486e14
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java
@@ -0,0 +1,95 @@
+/*
+ * 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.karaf.features.internal;
+
+import org.apache.karaf.features.BundleInfo;
+
+/**
+ * A holder of bundle info
+ */
+public class BundleInfoImpl implements BundleInfo {
+
+    private int startLevel;
+    private String location;
+    private boolean start;
+    private boolean dependency;
+
+
+    public BundleInfoImpl() {
+    }
+
+    public BundleInfoImpl(String location) {
+    	this.location = location;
+    }
+
+
+    public BundleInfoImpl(String location, boolean start) {
+    	this.location = location;
+        this.start = start;
+    }
+
+    public BundleInfoImpl(String location, int startLevel) {
+    	this.location = location;
+        this.startLevel = startLevel;
+    }
+
+    public BundleInfoImpl(String location, int startLevel, boolean start) {
+    	this.location = location;
+        this.startLevel = startLevel;
+        this.start = start;
+    }
+
+    public BundleInfoImpl(String location, int startLevel, boolean start, boolean dependency) {
+        this.location = location;
+        this.startLevel = startLevel;
+        this.start = start;
+        this.dependency = dependency;
+    }
+
+    public void setStartLevel(Integer startLevel) {
+    	this.startLevel = startLevel;
+    }
+
+    public int getStartLevel() {
+		return this.startLevel;
+	}
+
+	public void setName(String location) {
+		this.location = location;
+	}
+
+	public String getLocation() {
+		return this.location;
+	}
+
+	public void setStart(boolean start) {
+		this.start = start;
+	}
+
+	public boolean isStart() {
+		return start;
+	}
+
+    public void setDependency(boolean dependency) {
+        this.dependency = dependency;
+    }
+
+    public boolean isDependency() {
+        return dependency;
+    }
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/ConfigFileInfoImpl.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/ConfigFileInfoImpl.java
new file mode 100644
index 0000000..fc5b8f5
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/ConfigFileInfoImpl.java
@@ -0,0 +1,45 @@
+/*
+ * 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.karaf.features.internal;
+
+import org.apache.karaf.features.ConfigFileInfo;
+
+public class ConfigFileInfoImpl implements ConfigFileInfo {
+
+	private String location;
+	private String finalname;
+	private boolean override;
+
+	public ConfigFileInfoImpl(String location, String finalname, boolean override) {
+		this.location = location;
+		this.finalname = finalname;
+		this.override = override;
+	}
+
+	public String getLocation() {
+		return location;
+	}
+
+	public String getFinalname() {
+		return finalname;
+	}
+	
+	public boolean isOverride() {
+		return override;
+	}
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/EventAdminListener.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/EventAdminListener.java
new file mode 100644
index 0000000..de2eb4c
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/EventAdminListener.java
@@ -0,0 +1,92 @@
+/*
+ * 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.karaf.features.internal;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.karaf.features.EventConstants;
+import org.apache.karaf.features.FeatureEvent;
+import org.apache.karaf.features.FeaturesListener;
+import org.apache.karaf.features.RepositoryEvent;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * A listener to publish events to EventAdmin
+ */
+public class EventAdminListener implements FeaturesListener {
+
+    private final ServiceTracker tracker;
+
+    public EventAdminListener(BundleContext context) {
+        tracker = new ServiceTracker(context, EventAdmin.class.getName(), null);
+        tracker.open();
+    }
+
+    public void featureEvent(FeatureEvent event) {
+        EventAdmin eventAdmin = (EventAdmin) tracker.getService();
+        if (eventAdmin == null) {
+            return;
+        }
+        Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put(EventConstants.TYPE, event.getType());
+        props.put(EventConstants.EVENT, event);
+        props.put(EventConstants.TIMESTAMP, System.currentTimeMillis());
+        props.put(EventConstants.FEATURE_NAME, event.getFeature().getName());
+        props.put(EventConstants.FEATURE_VERSION, event.getFeature().getVersion());
+        String topic;
+        switch (event.getType()) {
+            case FeatureInstalled:
+                topic = EventConstants.TOPIC_FEATURES_INSTALLED;
+                break;
+            case FeatureUninstalled:
+                topic = EventConstants.TOPIC_FEATURES_UNINSTALLED;
+                break;
+            default:
+                throw new IllegalStateException("Unknown features event type: " + event.getType());
+        }
+        eventAdmin.postEvent(new Event(topic, props));
+    }
+
+    public void repositoryEvent(RepositoryEvent event) {
+        EventAdmin eventAdmin = (EventAdmin) tracker.getService();
+        if (eventAdmin == null) {
+            return;
+        }
+        Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put(EventConstants.TYPE, event.getType());
+        props.put(EventConstants.EVENT, event);
+        props.put(EventConstants.TIMESTAMP, System.currentTimeMillis());
+        props.put(EventConstants.REPOSITORY_NAME, event.getRepository().getName());
+        props.put(EventConstants.REPOSITORY_URI, event.getRepository().getURI().toString());
+        String topic;
+        switch (event.getType()) {
+            case RepositoryAdded:
+                topic = EventConstants.TOPIC_REPOSITORY_ADDED;
+                break;
+            case RepositoryRemoved:
+                topic = EventConstants.TOPIC_REPOSITORY_REMOVED;
+                break;
+            default:
+                throw new IllegalStateException("Unknown repository event type: " + event.getType());
+        }
+        eventAdmin.postEvent(new Event(topic, props));
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
new file mode 100644
index 0000000..a4b4259
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
@@ -0,0 +1,175 @@
+/*
+ * 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.karaf.features.internal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.ConfigFileInfo;
+import org.apache.karaf.features.Feature;
+
+/**
+ * A feature
+ */
+public class FeatureImpl implements Feature {
+
+    private String id;
+    private String name;
+    private String description;
+    private String details;
+    private String version;
+    private String resolver;
+    private String install = DEFAULT_INSTALL_MODE;
+    private List<Feature> dependencies = new ArrayList<Feature>();
+    private List<BundleInfo> bundles = new ArrayList<BundleInfo>();
+    private Map<String, Map<String,String>> configs = new HashMap<String, Map<String,String>>();
+    private List<ConfigFileInfo> configurationFiles = new ArrayList<ConfigFileInfo>();
+    public static String SPLIT_FOR_NAME_AND_VERSION = "_split_for_name_and_version_";
+    public static String DEFAULT_VERSION = "0.0.0";
+    public static String VERSION_PREFIX = "version=";
+
+    public FeatureImpl() {
+    }
+
+    public FeatureImpl(String name) {
+        this(name, DEFAULT_VERSION);
+    }
+    
+    public FeatureImpl(String name, String version) {
+    	this.name = name;
+    	this.version = version;
+        this.id = name + "-" + version;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDetails() {
+        return details;
+    }
+
+    public void setDetails(String details) {
+        this.details = details;
+    }
+
+    public String getVersion() {
+		return version;
+	}
+    
+	public void setVersion(String version) {
+		this.version = version;
+	}
+
+    public String getResolver() {
+        return resolver;
+    }
+
+    public void setResolver(String resolver) {
+        this.resolver = resolver;
+    }
+
+    public String getInstall() {
+        return install;
+    }
+
+    public void setInstall(String install) {
+        this.install = install;
+    }
+
+    public List<Feature> getDependencies() {
+        return dependencies;
+    }
+
+    public List<BundleInfo> getBundles() {
+        return bundles;
+    }
+
+    public Map<String, Map<String, String>> getConfigurations() {
+        return configs;
+    }
+    
+	public List<ConfigFileInfo> getConfigurationFiles() {
+		return configurationFiles;
+	}
+    public void addDependency(Feature dependency) {
+        dependencies.add(dependency);
+    }
+
+    public void addBundle(BundleInfo bundle) {
+        bundles.add(bundle);
+    }
+
+    public void addConfig(String name, Map<String,String> properties) {
+        configs.put(name, properties);
+    }
+    
+    public void addConfigurationFile(ConfigFileInfo configurationFileInfo) {
+    	configurationFiles.add(configurationFileInfo);
+    }
+
+    public String toString() {
+    	String ret = getName() + SPLIT_FOR_NAME_AND_VERSION + getVersion();
+    	return ret;
+    }
+    
+    public static Feature valueOf(String str) {
+    	if (str.indexOf(SPLIT_FOR_NAME_AND_VERSION) >= 0) {
+    		String strName = str.substring(0, str.indexOf(SPLIT_FOR_NAME_AND_VERSION));
+        	String strVersion = str.substring(str.indexOf(SPLIT_FOR_NAME_AND_VERSION) 
+        			+ SPLIT_FOR_NAME_AND_VERSION.length(), str.length());
+        	return new FeatureImpl(strName, strVersion);
+    	} else {
+    		return new FeatureImpl(str);
+    	}
+    			
+    	
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        FeatureImpl feature = (FeatureImpl) o;
+
+        if (!name.equals(feature.name)) return false;
+        if (!version.equals(feature.version)) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result = name.hashCode();
+        result = 31 * result + version.hashCode();
+        return result;
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java
new file mode 100644
index 0000000..811937e
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.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.karaf.features.internal;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URLConnection;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Schema;
+import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
+import org.w3c.dom.Document;
+
+/**
+ * Utility class which fires XML Schema validation.
+ */
+public class FeatureValidationUtil {
+
+    /**
+     * Runs schema validation.
+     * 
+     * @param uri Uri to validate.
+     * @throws Exception When validation fails.
+     */
+    public static void validate(URI uri) throws Exception {
+        URLConnection conn = uri.toURL().openConnection();
+        conn.setDefaultUseCaches(false);
+
+        InputStream stream = conn.getInputStream();
+
+        // load document and check the root element for namespace declaration
+        DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
+        dFactory.setNamespaceAware(true);
+        Document doc = dFactory.newDocumentBuilder().parse(stream);
+
+        if (doc.getDocumentElement().getNamespaceURI() == null) {
+            return;
+        }
+
+        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+        // root element has namespace - we can use schema validation
+        Schema schema = factory.newSchema(new StreamSource(FeatureValidationUtil.class
+            .getResourceAsStream("/org/apache/karaf/features/karaf-features-1.0.0.xsd")));
+
+        // create schema by reading it from an XSD file:
+        Validator validator = schema.newValidator();
+
+        try {
+            validator.validate(new DOMSource(doc));
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Unable to validate " + uri, e);
+        }        
+    }
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
new file mode 100644
index 0000000..dc84fc4
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
@@ -0,0 +1,1277 @@
+/*
+ * 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.karaf.features.internal;
+
+import static java.lang.String.format;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Parser;
+import org.apache.felix.utils.version.VersionRange;
+import org.apache.felix.utils.version.VersionTable;
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.ConfigFileInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeatureEvent;
+import org.apache.karaf.features.FeaturesListener;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.features.RepositoryEvent;
+import org.apache.karaf.features.Resolver;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.service.startlevel.StartLevel;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.lang.String.format;
+
+/**
+ * The Features service implementation.
+ * Adding a repository url will load the features contained in this repository and
+ * create dummy sub shells.  When invoked, these commands will prompt the user for
+ * installing the needed bundles.
+ *
+ */
+public class FeaturesServiceImpl implements FeaturesService, FrameworkListener {
+
+    public static final String CONFIG_KEY = "org.apache.karaf.features.configKey";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(FeaturesServiceImpl.class);
+
+    private BundleContext bundleContext;
+    private ConfigurationAdmin configAdmin;
+    private PackageAdmin packageAdmin;
+    private StartLevel startLevel;
+    private long resolverTimeout = 5000;
+    private Set<URI> uris;
+    private Map<URI, RepositoryImpl> repositories = new HashMap<URI, RepositoryImpl>();
+    private Map<String, Map<String, Feature>> features;
+    private Map<Feature, Set<Long>> installed = new HashMap<Feature, Set<Long>>();
+    private String boot;
+    private boolean bootFeaturesInstalled;
+    private List<FeaturesListener> listeners = new CopyOnWriteArrayList<FeaturesListener>();
+    private ThreadLocal<Repository> repo = new ThreadLocal<Repository>();
+    private EventAdminListener eventAdminListener;
+    private final Object refreshLock = new Object();
+    private long refreshTimeout = 5000;
+
+    public FeaturesServiceImpl() {
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public ConfigurationAdmin getConfigAdmin() {
+        return configAdmin;
+    }
+
+    public void setConfigAdmin(ConfigurationAdmin configAdmin) {
+        this.configAdmin = configAdmin;
+    }
+
+    public PackageAdmin getPackageAdmin() {
+        return packageAdmin;
+    }
+
+    public void setPackageAdmin(PackageAdmin packageAdmin) {
+        this.packageAdmin = packageAdmin;
+    }
+
+    public StartLevel getStartLevel() {
+        return startLevel;
+    }
+
+    public void setStartLevel(StartLevel startLevel) {
+        this.startLevel = startLevel;
+    }
+
+    public long getResolverTimeout() {
+        return resolverTimeout;
+    }
+
+    public void setResolverTimeout(long resolverTimeout) {
+        this.resolverTimeout = resolverTimeout;
+    }
+
+    public long getRefreshTimeout() {
+        return refreshTimeout;
+    }
+
+    public void setRefreshTimeout(long refreshTimeout) {
+        this.refreshTimeout = refreshTimeout;
+    }
+
+    public void registerListener(FeaturesListener listener) {
+        listeners.add(listener);
+        for (Repository repository : listRepositories()) {
+            listener.repositoryEvent(new RepositoryEvent(repository, RepositoryEvent.EventType.RepositoryAdded, true));
+        }
+        for (Feature feature : listInstalledFeatures()) {
+            listener.featureEvent(new FeatureEvent(feature, FeatureEvent.EventType.FeatureInstalled, true));
+        }
+    }
+
+    public void unregisterListener(FeaturesListener listener) {
+        listeners.remove(listener);
+    }
+
+    public void setUrls(String uris) throws URISyntaxException {
+        String[] s = uris.split(",");
+        this.uris = new HashSet<URI>();
+        for (String value : s) {
+            this.uris.add(new URI(value));
+        }
+    }
+
+    public void setBoot(String boot) {
+        this.boot = boot;
+    }
+
+    /**
+     * Validate repository.
+     */
+    public void validateRepository(URI uri) throws Exception {
+        FeatureValidationUtil.validate(uri);
+    }
+
+    public void addRepository(URI uri) throws Exception {
+        if (!repositories.containsKey(uri)) {
+            internalAddRepository(uri);
+            saveState();
+        }
+    }
+
+    protected RepositoryImpl internalAddRepository(URI uri) throws Exception {
+        validateRepository(uri);
+        RepositoryImpl repo = null;
+        repo = new RepositoryImpl(uri);
+        repositories.put(uri, repo);
+        repo.load();
+        if (repo.getName() == null) {
+            LOGGER.warn("Feature repository doesn't have a name. The name will be mandatory in the next Karaf version.");
+        }
+        callListeners(new RepositoryEvent(repo, RepositoryEvent.EventType.RepositoryAdded, false));
+        features = null;
+        return repo;
+        
+    }
+
+    public void removeRepository(URI uri) {
+        if (repositories.containsKey(uri)) {
+            internalRemoveRepository(uri);
+            saveState();
+        }
+    }
+
+    public void internalRemoveRepository(URI uri) {
+        Repository repo = repositories.remove(uri);
+        this.repo.set(repo);
+        callListeners(new RepositoryEvent(repo, RepositoryEvent.EventType.RepositoryRemoved, false));
+        features = null;
+    }
+    
+    public void restoreRepository(URI uri) throws Exception {
+    	repositories.put(uri, (RepositoryImpl)repo.get());
+    	callListeners(new RepositoryEvent(repo.get(), RepositoryEvent.EventType.RepositoryAdded, false));
+        features = null;
+    }
+
+    public Repository[] listRepositories() {
+        Collection<RepositoryImpl> repos = repositories.values();
+        return repos.toArray(new Repository[repos.size()]);
+    }
+
+    public void installAllFeatures(URI uri) throws Exception {
+        RepositoryImpl repo = internalAddRepository(uri);
+        for (Feature f : repo.getFeatures()) {
+            installFeature(f.getName(), f.getVersion());
+        }
+        internalRemoveRepository(uri);            
+    }
+
+    public void uninstallAllFeatures(URI uri) throws Exception {
+        RepositoryImpl repo = internalAddRepository(uri);
+        for (Feature f : repo.getFeatures()) {
+            uninstallFeature(f.getName(), f.getVersion());
+        }
+        internalRemoveRepository(uri);            
+    }
+
+    public void installFeature(String name) throws Exception {
+    	installFeature(name, FeatureImpl.DEFAULT_VERSION);
+    }
+
+    public void installFeature(String name, String version) throws Exception {
+        installFeature(name, version, EnumSet.noneOf(Option.class));
+    }
+
+    public void installFeature(String name, String version, EnumSet<Option> options) throws Exception {
+        Feature f = getFeature(name, version);
+        if (f == null) {
+            throw new Exception("No feature named '" + name
+            		+ "' with version '" + version + "' available");
+        }
+        installFeature(f, options);
+    }
+
+    public void installFeature(Feature f, EnumSet<Option> options) throws Exception {
+        installFeatures(Collections.singleton(f), options);
+    }
+
+    public void installFeatures(Set<Feature> features, EnumSet<Option> options) throws Exception {
+        InstallationState state = new InstallationState();
+        InstallationState failure = new InstallationState();
+        boolean verbose = options.contains(FeaturesService.Option.Verbose);
+        try {
+            // Install everything
+            for (Feature f : features) {
+                InstallationState s = new InstallationState();
+            	try {
+                    doInstallFeature(s, f, verbose);
+                    state.bundleInfos.putAll(s.bundleInfos);
+                    state.bundles.addAll(s.bundles);
+                    state.features.putAll(s.features);
+                    state.installed.addAll(s.installed);
+            	} catch (Exception e) {
+                    failure.bundles.addAll(s.bundles);
+                    failure.features.putAll(s.features);
+                    failure.installed.addAll(s.installed);
+                    if (options.contains(Option.ContinueBatchOnFailure)) {
+                        LOGGER.warn("Error when installing feature {}: {}", f.getName(), e);
+                    } else {
+                        throw e;
+                    }
+            	}
+            }
+            // Find bundles to refresh
+            boolean print = options.contains(Option.PrintBundlesToRefresh);
+            boolean refresh = !options.contains(Option.NoAutoRefreshBundles);
+            if (print || refresh) {
+                Set<Bundle> bundlesToRefresh = findBundlesToRefresh(state);
+                StringBuilder sb = new StringBuilder();
+                for (Bundle b : bundlesToRefresh) {
+                    if (sb.length() > 0) {
+                        sb.append(", ");
+                    }
+                    sb.append(b.getSymbolicName()).append(" (").append(b.getBundleId()).append(")");
+                }
+                LOGGER.debug("Bundles to refresh: {}", sb.toString());
+                if (!bundlesToRefresh.isEmpty()) {
+                    if (print) {
+                        if (refresh) {
+                            System.out.println("Refreshing bundles " + sb.toString());
+                        } else {
+                            System.out.println("The following bundles may need to be refreshed: " + sb.toString());
+                        }
+                    }
+                    if (refresh) {
+                        LOGGER.debug("Refreshing bundles: {}", sb.toString());
+                        refreshPackages(bundlesToRefresh.toArray(new Bundle[bundlesToRefresh.size()]));
+                    }
+                }
+            }
+            // Start all bundles
+            for (Bundle b : state.bundles) {
+                // do not start fragment bundles
+                Dictionary d = b.getHeaders();
+                String fragmentHostHeader = (String) d.get(Constants.FRAGMENT_HOST);
+                if (fragmentHostHeader == null || fragmentHostHeader.trim().length() == 0) {
+                    // do not start bundles that are persistently stopped
+                    if (state.installed.contains(b)
+                            || (b.getState() != Bundle.STARTING && b.getState() != Bundle.ACTIVE
+                                    && getStartLevel().isBundlePersistentlyStarted(b))) {
+                    	// do no start bundles when user request it
+                    	Long bundleId = b.getBundleId();
+                    	BundleInfo bundleInfo = state.bundleInfos.get(bundleId);
+                        if (bundleInfo == null || bundleInfo.isStart()) {
+	                        try {
+	                            b.start();
+	                        } catch (BundleException be) {
+	                            String msg = format("Could not start bundle %s in feature(s) %s: %s", b.getLocation(), getFeaturesContainingBundleList(b), be.getMessage());
+	                            throw new Exception(msg, be);
+	                        }
+                    	}
+                    }
+                }
+            }
+            // Clean up for batch
+            if (!options.contains(Option.NoCleanIfFailure)) {
+                failure.installed.removeAll(state.bundles);
+                for (Bundle b : failure.installed) {
+                    try {
+                        b.uninstall();
+                    } catch (Exception e2) {
+                        // Ignore
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // cleanup on error
+            if (!options.contains(Option.NoCleanIfFailure)) {
+                // Uninstall everything
+                for (Bundle b : state.installed) {
+                    try {
+                        b.uninstall();
+                    } catch (Exception e2) {
+                        // Ignore
+                    }
+                }
+                for (Bundle b : failure.installed) {
+                    try {
+                        b.uninstall();
+                    } catch (Exception e2) {
+                        // Ignore
+                    }
+                }
+            } else {
+                // Force start of bundles so that they are flagged as persistently started
+                for (Bundle b : state.installed) {
+                    try {
+                        b.start();
+                    } catch (Exception e2) {
+                        // Ignore
+                    }
+                }
+            }
+            // rethrow exception
+            throw e;
+        }
+        for (Feature f : features) {
+            callListeners(new FeatureEvent(f, FeatureEvent.EventType.FeatureInstalled, false));
+        }
+        for (Map.Entry<Feature, Set<Long>> e : state.features.entrySet()) {
+            installed.put(e.getKey(), e.getValue());
+        }
+        saveState();
+    }
+
+    protected static class InstallationState {
+        final Set<Bundle> installed = new HashSet<Bundle>();
+        final List<Bundle> bundles = new ArrayList<Bundle>();
+        final Map<Long, BundleInfo> bundleInfos = new HashMap<Long, BundleInfo>();
+        final Map<Feature, Set<Long>> features = new HashMap<Feature, Set<Long>>();
+    }
+
+    protected void doInstallFeature(InstallationState state, Feature feature, boolean verbose) throws Exception {
+        LOGGER.debug("Installing feature " + feature.getName() + " " + feature.getVersion());
+        if (verbose) {
+            System.out.println("Installing feature " + feature.getName() + " " + feature.getVersion());
+        }
+        for (Feature dependency : feature.getDependencies()) {
+            VersionRange range = FeatureImpl.DEFAULT_VERSION.equals(dependency.getVersion())
+                        ? VersionRange.ANY_VERSION : new VersionRange(dependency.getVersion(), true, true);
+            Feature fi = null;
+            for (Feature f : installed.keySet()) {
+                if (f.getName().equals(dependency.getName())) {
+                    Version v = VersionTable.getVersion(f.getVersion());
+                    if (range.contains(v)) {
+                        if (fi == null || VersionTable.getVersion(fi.getVersion()).compareTo(v) < 0) {
+                            fi = f;
+                        }
+                    }
+                }
+            }
+            if (fi == null) {
+                Map<String, Feature> avail = getFeatures().get(dependency.getName());
+                if (avail != null) {
+                    for (Feature f : avail.values()) {
+                        Version v = VersionTable.getVersion(f.getVersion());
+                        if (range.contains(v)) {
+                            if (fi == null || VersionTable.getVersion(fi.getVersion()).compareTo(v) < 0) {
+                                fi = f;
+                            }
+                        }
+                    }
+                }
+            }
+            if (fi == null) {
+                throw new Exception("No feature named '" + dependency.getName()
+                        + "' with version '" + dependency.getVersion() + "' available");
+            }
+            doInstallFeature(state, fi, verbose);
+        }
+        for (String config : feature.getConfigurations().keySet()) {
+            Dictionary<String,String> props = new Hashtable<String, String>(feature.getConfigurations().get(config));
+            String[] pid = parsePid(config);
+            Configuration cfg = findExistingConfiguration(configAdmin, pid[0], pid[1]);
+            if (cfg == null) {
+                cfg = createConfiguration(configAdmin, pid[0], pid[1]);
+                String key = createConfigurationKey(pid[0], pid[1]);
+                props.put(CONFIG_KEY, key);
+                if (cfg.getBundleLocation() != null) {
+                    cfg.setBundleLocation(null);
+                }
+                cfg.update(props);
+            }
+        }
+        for (ConfigFileInfo configFile : feature.getConfigurationFiles()) {
+        	installConfigurationFile(configFile.getLocation(), 
+        			configFile.getFinalname(), configFile.isOverride(), verbose);
+        }
+        Set<Long> bundles = new TreeSet<Long>();
+        for (BundleInfo bInfo : resolve(feature)) {
+            Bundle b = installBundleIfNeeded(state, bInfo, verbose);
+            bundles.add(b.getBundleId());
+            state.bundleInfos.put(b.getBundleId(), bInfo);
+        }
+        state.features.put(feature, bundles);
+    }
+
+    private String createConfigurationKey(String pid, String factoryPid) {
+        return factoryPid == null ? pid : pid + "-" + factoryPid;
+    }
+
+    protected List<BundleInfo> resolve(Feature feature) throws Exception {
+        String resolver = feature.getResolver();
+        // If no resolver is specified, we expect a list of uris
+        if (resolver == null || resolver.length() == 0) {
+        	return feature.getBundles();
+        }
+        boolean optional = false;
+        if (resolver.startsWith("(") && resolver.endsWith(")")) {
+            resolver = resolver.substring(1, resolver.length() - 1);
+            optional = true;
+        }
+        // Else, find the resolver
+        String filter = "(&(" + Constants.OBJECTCLASS + "=" + Resolver.class.getName() + ")(name=" + resolver + "))";
+        ServiceTracker tracker = new ServiceTracker(bundleContext, FrameworkUtil.createFilter(filter), null);
+        tracker.open();
+        try {
+            if (optional) {
+                Resolver r = (Resolver) tracker.getService();
+                if (r != null) {
+                    return r.resolve(feature);
+                } else {
+                    LOGGER.debug("Optional resolver '" + resolver + "' not found, using the default resolver");
+                    return feature.getBundles();
+                }
+            } else {
+                Resolver r = (Resolver) tracker.waitForService(resolverTimeout);
+                if (r == null) {
+                    throw new Exception("Unable to find required resolver '" + resolver + "'");
+                }
+                return r.resolve(feature);
+            }
+        } finally {
+            tracker.close();
+        }
+    }
+
+    protected Set<Bundle> findBundlesToRefresh(InstallationState state) {
+        Set<Bundle> bundles = new HashSet<Bundle>();
+        bundles.addAll(findBundlesWithOptionalPackagesToRefresh(state));
+        bundles.addAll(findBundlesWithFramentsToRefresh(state));
+        return bundles;
+    }
+
+    protected Set<Bundle> findBundlesWithFramentsToRefresh(InstallationState state) {
+        Set<Bundle> bundles = new HashSet<Bundle>();
+        Set<Bundle> oldBundles = new HashSet<Bundle>(state.bundles);
+        oldBundles.removeAll(state.installed);
+        if (!oldBundles.isEmpty()) {
+            for (Bundle b : state.installed) {
+                String hostHeader = (String) b.getHeaders().get(Constants.FRAGMENT_HOST);
+                if (hostHeader != null) {
+                    Clause[] clauses = Parser.parseHeader(hostHeader);
+                    if (clauses != null && clauses.length > 0) {
+                        Clause path = clauses[0];
+                        for (Bundle hostBundle : oldBundles) {
+                            if (hostBundle.getSymbolicName().equals(path.getName())) {
+                                String ver = path.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
+                                if (ver != null) {
+                                    VersionRange v = VersionRange.parseVersionRange(ver);
+                                    if (v.contains(hostBundle.getVersion())) {
+                                        bundles.add(hostBundle);
+                                    }
+                                } else {
+                                    bundles.add(hostBundle);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return bundles;
+    }
+
+    protected Set<Bundle> findBundlesWithOptionalPackagesToRefresh(InstallationState state) {
+        // First pass: include all bundles contained in these features
+        Set<Bundle> bundles = new HashSet<Bundle>(state.bundles);
+        bundles.removeAll(state.installed);
+        if (bundles.isEmpty()) {
+            return bundles;
+        }
+        // Second pass: for each bundle, check if there is any unresolved optional package that could be resolved
+        Map<Bundle, List<Clause>> imports = new HashMap<Bundle, List<Clause>>();
+        for (Iterator<Bundle> it = bundles.iterator(); it.hasNext();) {
+            Bundle b = it.next();
+            String importsStr = (String) b.getHeaders().get(Constants.IMPORT_PACKAGE);
+            List<Clause> importsList = getOptionalImports(importsStr);
+            if (importsList.isEmpty()) {
+                it.remove();
+            } else {
+                imports.put(b, importsList);
+            }
+        }
+        if (bundles.isEmpty()) {
+            return bundles;
+        }
+        // Third pass: compute a list of packages that are exported by our bundles and see if
+        //             some exported packages can be wired to the optional imports
+        List<Clause> exports = new ArrayList<Clause>();
+        for (Bundle b : state.installed) {
+            String exportsStr = (String) b.getHeaders().get(Constants.EXPORT_PACKAGE);
+            if (exportsStr != null) {
+                Clause[] exportsList = Parser.parseHeader(exportsStr);
+                exports.addAll(Arrays.asList(exportsList));
+            }
+        }
+        for (Iterator<Bundle> it = bundles.iterator(); it.hasNext();) {
+            Bundle b = it.next();
+            List<Clause> importsList = imports.get(b);
+            for (Iterator<Clause> itpi = importsList.iterator(); itpi.hasNext();) {
+                Clause pi = itpi.next();
+                boolean matching = false;
+                for (Clause pe : exports) {
+                    if (pi.getName().equals(pe.getName())) {
+                        String evStr = pe.getAttribute(Constants.VERSION_ATTRIBUTE);
+                        String ivStr = pi.getAttribute(Constants.VERSION_ATTRIBUTE);
+                        Version exported = evStr != null ? Version.parseVersion(evStr) : Version.emptyVersion;
+                        VersionRange imported = ivStr != null ? VersionRange.parseVersionRange(ivStr) : VersionRange.ANY_VERSION;
+                        if (imported.contains(exported)) {
+                            matching = true;
+                            break;
+                        }
+                    }
+                }
+                if (!matching) {
+                    itpi.remove();
+                }
+            }
+            if (importsList.isEmpty()) {
+                it.remove();
+            } else {
+                LOGGER.debug("Refeshing bundle {} ({}) to solve the following optional imports", b.getSymbolicName(), b.getBundleId());
+                for (Clause p : importsList) {
+                    LOGGER.debug("    {}", p);
+                }
+
+            }
+        }
+        return bundles;
+    }
+
+    /*
+     * Get the list of optional imports from an OSGi Import-Package string
+     */
+    protected List<Clause> getOptionalImports(String importsStr) {
+        Clause[] imports = Parser.parseHeader(importsStr);
+        List<Clause> result = new LinkedList<Clause>();
+        for (int i = 0; i < imports.length; i++) {
+            String resolution = imports[i].getDirective(Constants.RESOLUTION_DIRECTIVE);
+            if (Constants.RESOLUTION_OPTIONAL.equals(resolution)) {
+                result.add(imports[i]);
+            }
+        }
+        return result;
+    }
+
+    protected Bundle installBundleIfNeeded(InstallationState state, BundleInfo bundleInfo, boolean verbose) throws IOException, BundleException {
+        InputStream is;
+        String bundleLocation = bundleInfo.getLocation();
+        LOGGER.debug("Checking " + bundleLocation);
+        try {
+            is = new BufferedInputStream(new URL(bundleLocation).openStream());
+        } catch (RuntimeException e) {
+            LOGGER.error(e.getMessage());
+            throw e;
+        }
+        try {
+            is.mark(256 * 1024);
+            JarInputStream jar = new JarInputStream(is);
+            Manifest m = jar.getManifest();
+            if(m == null) {
+                throw new BundleException("Manifest not present in the first entry of the zip " + bundleLocation);
+            }
+            String sn = m.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
+            if (sn == null) {
+                throw new BundleException("Jar is not a bundle, no Bundle-SymbolicName " + bundleLocation);
+            }
+            // remove attributes from the symbolic name (like ;blueprint.graceperiod:=false suffix)
+            int attributeIndexSep = sn.indexOf(';');
+            if (attributeIndexSep != -1) {
+                sn = sn.substring(0, attributeIndexSep);
+            }
+            String vStr = m.getMainAttributes().getValue(Constants.BUNDLE_VERSION);
+            Version v = vStr == null ? Version.emptyVersion : Version.parseVersion(vStr);
+            for (Bundle b : bundleContext.getBundles()) {
+                if (b.getSymbolicName() != null && b.getSymbolicName().equals(sn)) {
+                    vStr = (String) b.getHeaders().get(Constants.BUNDLE_VERSION);
+                    Version bv = vStr == null ? Version.emptyVersion : Version.parseVersion(vStr);
+                    if (v.equals(bv)) {
+                        LOGGER.debug("Found installed bundle: " + b);
+                        if (verbose) {
+                            System.out.println("Found installed bundle: " + b);
+                        }
+                        state.bundles.add(b);
+                        return b;
+                    }
+                }
+            }
+            try {
+                is.reset();
+            } catch (IOException e) {
+                is.close();
+                is = new BufferedInputStream(new URL(bundleLocation).openStream());
+            }
+            LOGGER.debug("Installing bundle " + bundleLocation);
+            if (verbose) {
+                System.out.println("Installing bundle " + bundleLocation);
+            }
+            Bundle b = getBundleContext().installBundle(bundleLocation, is);
+            
+            // Define the startLevel for the bundle when defined
+            int ibsl = bundleInfo.getStartLevel();
+            if (ibsl > 0) {
+                getStartLevel().setBundleStartLevel(b, ibsl);
+            }
+
+            state.bundles.add(b);
+            state.installed.add(b);
+            return b;
+        } finally {
+            is.close();
+        }
+    }
+    
+    public void installConfigurationFile(String fileLocation, String finalname, boolean override, boolean verbose) throws IOException {
+    	LOGGER.debug("Checking configuration file " + fileLocation);
+        if (verbose) {
+            System.out.println("Checking configuration file " + fileLocation);
+        }
+    	
+    	String basePath = System.getProperty("karaf.base");
+    	
+    	if (finalname.indexOf("${") != -1) {
+    		//remove any placeholder or variable part, this is not valid.
+    		int marker = finalname.indexOf("}");
+    		finalname = finalname.substring(marker+1);
+    	}
+    	
+    	finalname = basePath + File.separator + finalname;
+    	
+    	File file = new File(finalname); 
+    	if (file.exists() && !override) {
+    		LOGGER.debug("configFile already exist, don't override it");
+    		return;
+    	}
+
+        InputStream is = null;
+        FileOutputStream fop = null;
+        try {
+            is = new BufferedInputStream(new URL(fileLocation).openStream());
+            
+            if (!file.exists()) {
+                File parentFile = file.getParentFile();
+                if (parentFile != null) {
+                    parentFile.mkdirs();
+                }
+                file.createNewFile();
+            }
+
+            fop = new FileOutputStream(file);
+        
+            int bytesRead = 0;
+            byte[] buffer = new byte[1024];
+            
+            while ((bytesRead = is.read(buffer)) != -1) {
+                fop.write(buffer, 0, bytesRead);
+            }
+        } catch (RuntimeException e) {
+            LOGGER.error(e.getMessage());
+            throw e;
+        } catch (MalformedURLException e) {
+        	LOGGER.error(e.getMessage());
+            throw e;
+		} finally {
+			if (is != null)
+				is.close();
+            if (fop != null) {
+			    fop.flush();
+			    fop.close();
+            }
+		}
+            
+    }
+
+    public void uninstallFeature(String name) throws Exception {
+        List<String> versions = new ArrayList<String>();
+        for (Feature f : installed.keySet()) {
+            if (name.equals(f.getName())) {
+                versions.add(f.getVersion());
+            }
+        }
+        if (versions.size() == 0) {
+            throw new Exception("Feature named '" + name + "' is not installed");
+        } else if (versions.size() > 1) {
+            StringBuilder sb = new StringBuilder();
+            sb.append("Feature named '").append(name).append("' has multiple versions installed (");
+            for (int i = 0; i < versions.size(); i++) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+                sb.append(versions.get(i));
+            }
+            sb.append("). Please specify the version to uninstall.");
+            throw new Exception(sb.toString());
+        }
+        uninstallFeature(name, versions.get(0));
+    }
+    
+    public void uninstallFeature(String name, String version) throws Exception {
+    	Feature feature = getFeature(name, version);
+        if (feature == null || !installed.containsKey(feature)) {
+            throw new Exception("Feature named '" + name 
+            		+ "' with version '" + version + "' is not installed");
+        }
+        // Grab all the bundles installed by this feature
+        // and remove all those who will still be in use.
+        // This gives this list of bundles to uninstall.
+        Set<Long> bundles = installed.remove(feature);
+        for (Set<Long> b : installed.values()) {
+            bundles.removeAll(b);
+        }
+        for (long bundleId : bundles) {
+            Bundle b = getBundleContext().getBundle(bundleId);
+            if (b != null) {
+                b.uninstall();
+            }
+        }
+        refreshPackages(null);
+        callListeners(new FeatureEvent(feature, FeatureEvent.EventType.FeatureUninstalled, false));
+        saveState();
+    }
+
+    public Feature[] listFeatures() throws Exception {
+        Collection<Feature> features = new ArrayList<Feature>();
+        for (Map<String, Feature> featureWithDifferentVersion : getFeatures().values()) {
+			for (Feature f : featureWithDifferentVersion.values()) {
+                features.add(f);
+            }
+        }
+        return features.toArray(new Feature[features.size()]);
+    }
+
+    public Feature[] listInstalledFeatures() {
+        Set<Feature> result = installed.keySet();
+        return result.toArray(new Feature[result.size()]);
+    }
+
+    public boolean isInstalled(Feature f) {
+        return installed.containsKey(f);
+    }
+
+    public Feature getFeature(String name) throws Exception {
+        return getFeature(name, FeatureImpl.DEFAULT_VERSION);
+    }
+
+    public Feature getFeature(String name, String version) throws Exception {
+        if (version != null) {
+            version = version.trim();
+        }
+        Map<String, Feature> versions = getFeatures().get(name);
+        if (versions == null || versions.isEmpty()) {
+            return null;
+        } else {
+            Feature feature = versions.get(version);
+            if (feature == null) {
+                if (FeatureImpl.DEFAULT_VERSION.equals(version)) {
+                    Version latest = new Version(cleanupVersion(version));
+                    for (String available : versions.keySet()) {
+                        Version availableVersion = new Version(cleanupVersion(available));
+                        if (availableVersion.compareTo(latest) > 0) {
+                            feature = versions.get(available);
+                            latest = availableVersion;
+                        }
+                    }
+                } else {
+                    Version latest = new Version(cleanupVersion(FeatureImpl.DEFAULT_VERSION));
+                    VersionRange versionRange = new VersionRange(version, true, true);
+                    for (String available : versions.keySet()) {
+                        Version availableVersion = new Version(cleanupVersion(available));
+                        if (availableVersion.compareTo(latest) > 0 && versionRange.contains(availableVersion)) {
+                            feature = versions.get(available);
+                            latest = availableVersion;
+                        }
+                    }
+                }
+            }
+            return feature;
+        }
+    }
+
+    protected Map<String, Map<String, Feature>> getFeatures() throws Exception {
+        if (features == null) {
+        	//the outer map's key is feature name, the inner map's key is feature version       
+            Map<String, Map<String, Feature>> map = new HashMap<String, Map<String, Feature>>();
+            // Two phase load:
+            // * first load dependent repositories
+            for (;;) {
+                boolean newRepo = false;
+                for (Repository repo : listRepositories()) {
+                    for (URI uri : repo.getRepositories()) {
+                        if (!repositories.containsKey(uri)) {
+                            internalAddRepository(uri);
+                            newRepo = true;
+                        }
+                    }
+                }
+                if (!newRepo) {
+                    break;
+                }
+            }
+            // * then load all features
+            for (Repository repo : repositories.values()) {
+                for (Feature f : repo.getFeatures()) {
+                	if (map.get(f.getName()) == null) {
+                		Map<String, Feature> versionMap = new HashMap<String, Feature>();
+                		versionMap.put(f.getVersion(), f);
+                		map.put(f.getName(), versionMap);
+                	} else {
+                		map.get(f.getName()).put(f.getVersion(), f);
+                	}
+                }
+            }
+            features = map;
+        }
+        return features;
+    }
+
+    public void start() throws Exception {
+        // Register FrameworkEventListener
+        bundleContext.addFrameworkListener(this);
+        // Register EventAdmin listener
+        EventAdminListener listener = null;
+        try {
+            getClass().getClassLoader().loadClass("org.osgi.service.event.EventAdmin");
+            listener = new EventAdminListener(bundleContext);
+        } catch (Throwable t) {
+            // Ignore, if the EventAdmin package is not available, just don't use it
+            LOGGER.debug("EventAdmin package is not available, just don't use it");
+        }
+        this.eventAdminListener = listener;
+        // Load State
+        if (!loadState()) {
+            if (uris != null) {
+                for (URI uri : uris) {
+                    try {
+                    	internalAddRepository(uri);
+                    } catch (Exception e) {
+                        LOGGER.warn(format("Unable to add features repository %s at startup", uri), e);    
+                    }
+                }
+            }
+            saveState();
+        }
+        // Install boot features
+        if (boot != null && !bootFeaturesInstalled) {
+            new Thread() {
+                public void run() {
+                    // splitting the features
+                    String[] list = boot.split(",");
+                    Set<Feature> features = new LinkedHashSet<Feature>();
+                    for (String f : list) {
+                        f = f.trim();
+                        if (f.length() > 0) {
+                            String featureVersion = null;
+
+                            // first we split the parts of the feature string to gain access to the version info
+                            // if specified
+                            String[] parts = f.split(";");
+                            String featureName = parts[0];
+                            for (String part : parts) {
+                                // if the part starts with "version=" it contains the version info
+                                if (part.startsWith(FeatureImpl.VERSION_PREFIX)) {
+                                    featureVersion = part.substring(FeatureImpl.VERSION_PREFIX.length());
+                                }
+                            }
+
+                            if (featureVersion == null) {
+                                // no version specified - use default version
+                                featureVersion = FeatureImpl.DEFAULT_VERSION;
+                            }
+
+                            try {
+                                // try to grab specific feature version
+                                Feature feature = getFeature(featureName, featureVersion);
+                                if (feature != null) {
+                                    features.add(feature);
+                                } else {
+                                    LOGGER.error("Error installing boot feature " + f + ": feature not found");
+                                }
+                            } catch (Exception e) {
+                                LOGGER.error("Error installing boot feature " + f, e);
+                            }
+                        }
+                    }
+                    try {
+                        installFeatures(features, EnumSet.of(Option.NoCleanIfFailure, Option.ContinueBatchOnFailure));
+                    } catch (Exception e) {
+                        LOGGER.error("Error installing boot features", e);
+                    }
+                    bootFeaturesInstalled = true;
+                    saveState();
+                }
+            }.start();
+        }
+    }
+
+    public void stop() throws Exception {
+        bundleContext.removeFrameworkListener(this);
+        uris = new HashSet<URI>(repositories.keySet());
+        while (!repositories.isEmpty()) {
+            internalRemoveRepository(repositories.keySet().iterator().next());
+        }
+    }
+
+    public void frameworkEvent(FrameworkEvent event) {
+        if (event.getType() == FrameworkEvent.PACKAGES_REFRESHED) {
+            synchronized (refreshLock) {
+                refreshLock.notifyAll();
+            }
+        }
+    }
+
+    protected void refreshPackages(Bundle[] bundles) throws InterruptedException {
+        if (getPackageAdmin() != null) {
+            synchronized (refreshLock) {
+                getPackageAdmin().refreshPackages(bundles);
+                refreshLock.wait(refreshTimeout);
+            }
+        }
+    }
+
+    protected String[] parsePid(String pid) {
+        int n = pid.indexOf('-');
+        if (n > 0) {
+            String factoryPid = pid.substring(n + 1);
+            pid = pid.substring(0, n);
+            return new String[]{pid, factoryPid};
+        } else {
+            return new String[]{pid, null};
+        }
+    }
+
+    protected Configuration createConfiguration(ConfigurationAdmin configurationAdmin,
+                                                String pid, String factoryPid) throws IOException, InvalidSyntaxException {
+        if (factoryPid != null) {
+            return configurationAdmin.createFactoryConfiguration(pid, null);
+        } else {
+            return configurationAdmin.getConfiguration(pid, null);
+        }
+    }
+
+    protected Configuration findExistingConfiguration(ConfigurationAdmin configurationAdmin,
+                                                      String pid, String factoryPid) throws IOException, InvalidSyntaxException {
+        String filter;
+        if (factoryPid == null) {
+            filter = "(" + Constants.SERVICE_PID + "=" + pid + ")";
+        } else {
+            String key = createConfigurationKey(pid, factoryPid);
+            filter = "(" + CONFIG_KEY + "=" + key + ")";
+        }
+        Configuration[] configurations = configurationAdmin.listConfigurations(filter);
+        if (configurations != null && configurations.length > 0) {
+            return configurations[0];
+        }
+        return null;
+    }
+
+    protected void saveState() {
+        try {
+            File file = bundleContext.getDataFile("FeaturesServiceState.properties");
+            Properties props = new Properties();
+            saveSet(props, "repositories.", repositories.keySet());
+            saveMap(props, "features.", installed);
+            props.put("bootFeaturesInstalled", Boolean.toString(bootFeaturesInstalled));
+            OutputStream os = new FileOutputStream(file);
+            try {
+                props.store(new FileOutputStream(file), "FeaturesService State");
+            } finally {
+                os.close();
+            }
+        } catch (Exception e) {
+            LOGGER.error("Error persisting FeaturesService state", e);
+        }
+    }
+
+    protected boolean loadState() {
+        try {
+            File file = bundleContext.getDataFile("FeaturesServiceState.properties");
+            if (!file.exists()) {
+                return false;
+            }
+            Properties props = new Properties();
+            InputStream is = new FileInputStream(file);
+            try {
+                props.load(is);
+            } finally {
+                is.close();
+            }
+            Set<URI> repositories = loadSet(props, "repositories.");
+            for (URI repo : repositories) {
+            	try {
+            		internalAddRepository(repo);
+            	} catch (Exception e) {
+            		LOGGER.warn(format("Unable to add features repository %s at startup", repo), e);
+            	}
+            }
+            installed = loadMap(props, "features.");
+            for (Feature f : installed.keySet()) {
+                callListeners(new FeatureEvent(f, FeatureEvent.EventType.FeatureInstalled, true));
+            }
+            bootFeaturesInstalled = Boolean.parseBoolean((String) props.get("bootFeaturesInstalled"));
+            return true;
+        } catch (Exception e) {
+            LOGGER.error("Error loading FeaturesService state", e);
+        }
+        return false;
+    }
+
+    protected void saveSet(Properties props, String prefix, Set<URI> set) {
+        List<URI> l = new ArrayList<URI>(set);
+        props.clear();
+        props.put(prefix + "count", Integer.toString(l.size()));
+        for (int i = 0; i < l.size(); i++) {
+            props.put(prefix + "item." + i, l.get(i).toString());
+        }
+    }
+
+    protected Set<URI> loadSet(Properties props, String prefix) {
+        Set<URI> l = new HashSet<URI>();
+        String countStr = (String) props.get(prefix + "count");
+        if (countStr != null) {
+            int count = Integer.parseInt(countStr);
+            for (int i = 0; i < count; i++) {
+                l.add(URI.create((String) props.get(prefix + "item." + i)));
+            }
+        }
+        return l;
+    }
+
+    protected void saveMap(Properties props, String prefix, Map<Feature, Set<Long>> map) {
+        for (Map.Entry<Feature, Set<Long>> entry : map.entrySet()) {
+            Feature key = entry.getKey();
+            String val = createValue(entry.getValue());
+            props.put(prefix + key.toString(), val);
+        }
+    }
+
+    protected Map<Feature, Set<Long>> loadMap(Properties props, String prefix) {
+        Map<Feature, Set<Long>> map = new HashMap<Feature, Set<Long>>();
+        for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            if (key.startsWith(prefix)) {
+                String val = (String) props.get(key);
+                Set<Long> set = readValue(val);
+                map.put(FeatureImpl.valueOf(key.substring(prefix.length())), set);
+            }
+        }
+        return map;
+    }
+
+    protected String createValue(Set<Long> set) {
+        StringBuilder sb = new StringBuilder();
+        for (long i : set) {
+            if (sb.length() > 0) {
+                sb.append(",");
+            }
+            sb.append(i);
+        }
+        return sb.toString();
+    }
+
+    protected Set<Long> readValue(String val) {
+        Set<Long> set = new HashSet<Long>();
+        if (val != null && val.length() != 0) {
+        	for (String str : val.split(",")) {
+        		set.add(Long.parseLong(str));
+        	}
+        }
+        return set;
+    }
+
+    protected void callListeners(FeatureEvent event) {
+        if (eventAdminListener != null) {
+            eventAdminListener.featureEvent(event);
+        }
+        for (FeaturesListener listener : listeners) {
+            listener.featureEvent(event);
+        }
+    }
+
+    protected void callListeners(RepositoryEvent event) {
+        if (eventAdminListener != null) {
+            eventAdminListener.repositoryEvent(event);
+        }
+        for (FeaturesListener listener : listeners) {
+            listener.repositoryEvent(event);
+        }
+    }
+
+    static Pattern fuzzyVersion  = Pattern.compile("(\\d+)(\\.(\\d+)(\\.(\\d+))?)?([^a-zA-Z0-9](.*))?",
+                                                   Pattern.DOTALL);
+    static Pattern fuzzyModifier = Pattern.compile("(\\d+[.-])*(.*)",
+                                                   Pattern.DOTALL);
+
+    /**
+     * Clean up version parameters. Other builders use more fuzzy definitions of
+     * the version syntax. This method cleans up such a version to match an OSGi
+     * version.
+     *
+     * @param version
+     * @return
+     */
+    static public String cleanupVersion(String version) {
+        Matcher m = fuzzyVersion.matcher(version);
+        if (m.matches()) {
+            StringBuffer result = new StringBuffer();
+            String d1 = m.group(1);
+            String d2 = m.group(3);
+            String d3 = m.group(5);
+            String qualifier = m.group(7);
+
+            if (d1 != null) {
+                result.append(d1);
+                if (d2 != null) {
+                    result.append(".");
+                    result.append(d2);
+                    if (d3 != null) {
+                        result.append(".");
+                        result.append(d3);
+                        if (qualifier != null) {
+                            result.append(".");
+                            cleanupModifier(result, qualifier);
+                        }
+                    } else if (qualifier != null) {
+                        result.append(".0.");
+                        cleanupModifier(result, qualifier);
+                    }
+                } else if (qualifier != null) {
+                    result.append(".0.0.");
+                    cleanupModifier(result, qualifier);
+                }
+                return result.toString();
+            }
+        }
+        return version;
+    }
+
+    static void cleanupModifier(StringBuffer result, String modifier) {
+        Matcher m = fuzzyModifier.matcher(modifier);
+        if (m.matches())
+            modifier = m.group(2);
+
+        for (int i = 0; i < modifier.length(); i++) {
+            char c = modifier.charAt(i);
+            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')
+                    || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')
+                result.append(c);
+        }
+    }
+
+    public Set<Feature> getFeaturesContainingBundle (Bundle bundle) throws Exception {
+        Set<Feature> features = new HashSet<Feature>();
+        for (Map<String, Feature> featureMap : this.getFeatures().values()) {
+            for (Feature f : featureMap.values()) {
+                for (BundleInfo bi : f.getBundles()) {
+                    if (bi.getLocation().equals(bundle.getLocation())) {
+                        features.add(f);
+                        break;
+                    }
+                }
+            }
+        }
+        return features;
+    }
+
+    private String getFeaturesContainingBundleList(Bundle bundle) throws Exception {
+        Set<Feature> features = getFeaturesContainingBundle(bundle);
+        StringBuilder buffer = new StringBuilder();
+        Iterator<Feature> iter = features.iterator();
+        while (iter.hasNext()) {
+            Feature feature= iter.next();
+            buffer.append(feature.getId());
+            if (iter.hasNext()) {
+                buffer.append(", ");
+            }
+        }
+        return buffer.toString();
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
new file mode 100644
index 0000000..982de6e
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
@@ -0,0 +1,264 @@
+/*
+ * 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.karaf.features.internal;
+
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLConnection;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * The repository implementation.
+ */
+public class RepositoryImpl implements Repository {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryImpl.class);
+    private int unnamedRepoId = 0;
+    private String name;
+    private URI uri;
+    private List<Feature> features;
+    private List<URI> repositories;
+    private boolean valid;
+
+    public RepositoryImpl(URI uri) {
+        this.uri = uri;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public URI getURI() {
+        return uri;
+    }
+
+    public URI[] getRepositories() throws Exception {
+        if (repositories == null) {
+            load();
+        }
+        return repositories.toArray(new URI[repositories.size()]);
+    }
+
+    public Feature[] getFeatures() throws Exception {
+        if (features == null) {
+            load();
+        }
+        return features.toArray(new Feature[features.size()]);
+    }
+
+    public void load() throws IOException {
+        try {
+            valid = true;
+            repositories = new ArrayList<URI>();
+            features = new ArrayList<Feature>();
+            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+            URLConnection conn = uri.toURL().openConnection();
+            conn.setDefaultUseCaches(false);
+            Document doc = factory.newDocumentBuilder().parse(conn.getInputStream());
+            String temp = doc.getDocumentElement().getAttribute("name");
+            if ("".equals(temp)) {
+                name = "repo-" + String.valueOf(unnamedRepoId++);
+            } else {
+                name = temp;
+            }
+            if (uri.toString().startsWith("bundle")) {
+                name += "*";
+            }
+
+            NodeList nodes = doc.getDocumentElement().getChildNodes();
+            for (int i = 0; i < nodes.getLength(); i++) {
+                Node node = nodes.item(i);
+                if (!(node instanceof Element)) {
+                    continue;
+                }
+                if ("repository".equals(node.getNodeName())) {
+                    Element e = (Element) nodes.item(i);
+                    try {
+                        URI newrepo = new URI(e.getTextContent().trim());
+                        repositories.add(newrepo);
+                    } catch (URISyntaxException ex) {
+                        LOGGER.error("Could not load feature repository: " + ex.getMessage() + " in feature repository " + uri);
+                    }
+                } else if ("feature".equals(node.getNodeName())) {
+                    Element e = (Element) nodes.item(i);
+                    String name = e.getAttribute("name");
+                    String version = e.getAttribute("version");
+                    String allBundleInfeatureStartLevel = e.getAttribute("start-level");
+                    int absl = 0;
+                    // Check start level
+                    if (allBundleInfeatureStartLevel != null && allBundleInfeatureStartLevel.length() > 0) {
+                        try {
+                            absl = Integer.parseInt(allBundleInfeatureStartLevel);
+                        } catch (Exception ex) {
+                            LOGGER.error("The start-level is not an int value for the feature : " + name);
+                        }
+                    }
+                    
+                    FeatureImpl f;
+                    if (version != null && version.length() > 0) {
+                        f = new FeatureImpl(name, version);
+                    } else {
+                        f = new FeatureImpl(name);
+                    }
+
+                    String resolver = e.getAttribute("resolver");
+                    if (resolver != null && resolver.length() > 0) {
+                        f.setResolver(resolver);
+                    }
+
+                    String install = e.getAttribute("install");
+                    if (install != null && install.length() > 0) {
+                        f.setInstall(install);
+                    }
+
+                    String description = e.getAttribute("description");
+                    if (description != null && description.length() > 0) {
+                        f.setDescription(description);
+                    }
+
+                    NodeList detailsNodes = e.getElementsByTagName("details");
+                    StringBuffer detailsBuffer = new StringBuffer();
+                    for (int j = 0; j < detailsNodes.getLength(); j++) {
+                        Element b = (Element) detailsNodes.item(j);
+                        String detail = b.getTextContent().trim();
+                        detailsBuffer.append(detail).append("\n");
+                    }
+                    String details = detailsBuffer.toString();
+                    if (details != null && details.length() > 0)
+                        f.setDetails(details);
+
+                    NodeList featureNodes = e.getElementsByTagName("feature");
+                    for (int j = 0; j < featureNodes.getLength(); j++) {
+                        Element b = (Element) featureNodes.item(j);
+                        String dependencyFeatureVersion = b.getAttribute("version");
+                        if (dependencyFeatureVersion != null && dependencyFeatureVersion.length() > 0) {
+                            f.addDependency(new FeatureImpl(b.getTextContent(), dependencyFeatureVersion));
+                        } else {
+                            f.addDependency(new FeatureImpl(b.getTextContent()));
+                        }
+                    }
+                    NodeList configNodes = e.getElementsByTagName("config");
+                    for (int j = 0; j < configNodes.getLength(); j++) {
+                        Element c = (Element) configNodes.item(j);
+                        String cfgName = c.getAttribute("name");
+                        String data = c.getTextContent();
+                        Properties properties = new Properties();
+                        properties.load(new ByteArrayInputStream(data.getBytes()));
+                        interpolation(properties);
+                        Map<String, String> hashtable = new Hashtable<String, String>();
+                        for (Object key : properties.keySet()) {
+                            String n = key.toString();
+                            hashtable.put(n, properties.getProperty(n));
+                        }
+                        f.addConfig(cfgName, hashtable);
+                    }
+                    NodeList configurationFiles = e.getElementsByTagName("configfile");
+                    for (int j = 0; j < configurationFiles.getLength(); j++) {
+                    	Element cf = (Element) configurationFiles.item(j);
+                    	String finalname = cf.getAttribute("finalname");
+                    	String location = cf.getTextContent().trim();
+                    	String override = cf.getAttribute("override");
+                    	boolean finalnameOverride = false;
+                    	// Check the value of the "override" attribute
+                        if (override != null && override.length() > 0) {
+                        	finalnameOverride = Boolean.parseBoolean(override);
+                        }
+                    	f.addConfigurationFile(new ConfigFileInfoImpl(location, finalname, finalnameOverride));
+                    }
+                    NodeList bundleNodes = e.getElementsByTagName("bundle");
+                    for (int j = 0; j < bundleNodes.getLength(); j++) {
+                        Element b = (Element) bundleNodes.item(j);
+                        String bStartLevel = b.getAttribute("start-level");
+                        String bStart = b.getAttribute("start");
+                        String bDependency = b.getAttribute("dependency");
+                        boolean bs = true;
+                        boolean bd = false;
+                        int bsl = absl;
+
+                        // Check the value of the "start" attribute
+                        if (bStart != null && bStart.length() > 0) {
+                            bs = Boolean.parseBoolean(bStart);
+                        }
+                        // Check the value of the "dependency" attribute
+                        if (bDependency != null && bDependency.length() > 0) {
+                            bd = Boolean.parseBoolean(bDependency);
+                        }
+                        // Check start level
+                        if (bStartLevel != null && bStartLevel.length() > 0) {
+                            try {
+                                bsl = Integer.parseInt(bStartLevel);
+                            } catch (Exception ex) {
+                                LOGGER.error("The start-level is not an int value for the bundle : " + b.getTextContent());
+                            }
+                        }
+                        f.addBundle(new BundleInfoImpl(b.getTextContent().trim(), bsl, bs, bd));
+                    }
+                    features.add(f);
+                }
+            }
+        } catch (SAXException e) {
+            valid = false;
+            throw (IOException) new IOException().initCause(e);
+        } catch (ParserConfigurationException e) {
+            valid = false;
+            throw (IOException) new IOException().initCause(e);
+        } catch (IllegalArgumentException e) {
+            valid = false;
+            throw (IOException) new IOException(e.getMessage() + " : " + uri).initCause(e);
+        } catch (Exception e) {
+            valid = false;
+            throw (IOException) new IOException(e.getMessage() + " : " + uri).initCause(e);
+        }
+    }
+
+    protected void interpolation(Properties properties) {
+        for (Enumeration e = properties.propertyNames(); e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            String val = properties.getProperty(key);
+            Matcher matcher = Pattern.compile("\\$\\{([^}]+)\\}").matcher(val);
+            while (matcher.find()) {
+                String rep = System.getProperty(matcher.group(1));
+                if (rep != null) {
+                    val = val.replace(matcher.group(0), rep);
+                    matcher.reset(val);
+                }
+            }
+            properties.put(key, val);
+        }
+    }
+
+    public boolean isValid() {
+        return this.valid;
+    }
+
+}
diff --git a/karaf-2.2.x/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml b/karaf-2.2.x/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml
new file mode 100644
index 0000000..ddedd98
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml
@@ -0,0 +1,58 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <ext:property-placeholder placeholder-prefix="$(" placeholder-suffix=")"/>
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" ignore-missing-locations="true">
+        <ext:default-properties>
+            <ext:property name="featuresRepositories" value=""/>
+            <ext:property name="featuresBoot" value=""/>
+            <ext:property name="resolverTimeout" value="5000"/>
+        </ext:default-properties>
+        <ext:location>file:$(karaf.base)/etc/org.apache.karaf.features.cfg</ext:location>
+    </ext:property-placeholder>
+
+    <bean id="featuresService" class="org.apache.karaf.features.internal.FeaturesServiceImpl" init-method="start" destroy-method="stop">
+        <property name="urls" value="$[featuresRepositories]" />
+        <property name="boot" value="$[featuresBoot]" />
+        <property name="resolverTimeout" value="$[resolverTimeout]" />
+        <property name="configAdmin" ref="configAdmin" />
+        <property name="packageAdmin" ref="packageAdmin" />
+        <property name="startLevel" ref="startLevel" />
+        <property name="bundleContext" ref="blueprintBundleContext" />
+    </bean>
+
+    <reference-list id="featuresListeners" interface="org.apache.karaf.features.FeaturesListener" availability="optional">
+        <reference-listener ref="featuresService"
+                            bind-method="registerListener"
+                            unbind-method="unregisterListener" />
+    </reference-list>
+
+    <reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" />
+
+    <reference id="packageAdmin" interface="org.osgi.service.packageadmin.PackageAdmin" />
+
+    <reference id="startLevel" interface="org.osgi.service.startlevel.StartLevel" />
+    
+    <service ref="featuresService" interface="org.apache.karaf.features.FeaturesService" />
+
+</blueprint>
diff --git a/karaf-2.2.x/features/core/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/features/core/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..6368630
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,17 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle is the core implementation of the Karaf features support.
+
+    Karaf provides a simple, yet flexible, way to provision applications or "features". Such a mechanism is mainly
+    provided by a set of commands available in the features shell. The provisioning system uses xml "repositories"
+    that define a set of features.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mProvisioning\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd b/karaf-2.2.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
new file mode 100644
index 0000000..403f074
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
@@ -0,0 +1,239 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault="qualified"
+    targetNamespace="http://karaf.apache.org/xmlns/features/v1.0.0"
+    xmlns:tns="http://karaf.apache.org/xmlns/features/v1.0.0"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:annotation>
+        <xs:documentation><![CDATA[
+Karaf features mechanism. For documentation please visit the
+<a href="http://karaf.apache.org/">Karaf website</a>.
+        ]]></xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="features">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Root element of Feature definition. It contains optional attribute for
+designating from which repository this feature should be loaded. The Karaf
+shell will show the repository name when displaying information about the feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="repository" type="xs:anyURI">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Additional repositories where dependencies are stored.
+                    ]]></xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="feature" type="tns:feature">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Feature definition.
+                    ]]></xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:choice>
+        <xs:attribute name="name" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="feature">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Definition of the Feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="details" minOccurs="0" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+The help shown for this feature when using the feature:info console command.
+                    ]]>
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="config" type="tns:config" />
+            <xs:element name="configfile" type="tns:configFile" />
+            <xs:element name="feature" type="tns:dependency" />
+            <xs:element name="bundle" type="tns:bundle" />
+        </xs:choice>
+        <xs:attribute name="name" type="tns:featureName" use="required" />
+        <xs:attribute name="version" type="xs:string" default="0.0.0" />
+        <xs:attribute name="description" type="xs:string" />
+        <xs:attribute name="resolver" type="tns:resolver">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+Optional alternative resolver to use for determining the list of bundles to install for a given feature.
+                ]]>
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="install" type="tns:install">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+If true, marks that the feature should start automatically when placed in the deploy folder.
+                ]]>
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="start-level" type="xs:int">
+             <xs:annotation>
+                <xs:documentation><![CDATA[
+Set this attribute to have an OSGi start level for this feature different
+from the default start level defined in Karaf's config.properties.
+                ]]>
+                </xs:documentation>
+             </xs:annotation>
+         </xs:attribute>
+
+    </xs:complexType>
+
+    <xs:complexType name="bundle">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Deployable element to install.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:anyURI">
+                <xs:attribute name="start-level" type="xs:int">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Set this attribute to have an OSGi start level for this bundle different
+from the default start level defined in Karaf's config.properties.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="start" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+If false, leaves bundle in resolved start rather than the default active state.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="dependency" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Mark bundle as a dependency for the resolver.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="dependency">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Dependency of feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="tns:featureName">
+                <xs:attribute name="version" type="xs:string" default="0.0.0" />
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="config">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Configuration entries which should be created during feature installation. This
+configuration may be used with OSGi Configuration Admin. The element content is
+read in as a properties file.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="name" type="xs:string" use="required" />
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="configFile">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Additional configuration files which should be created during feature installation.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:anyURI">
+                <xs:attribute name="finalname" type="xs:string" use="required">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+The final destination path and name for the configuration file.
+                        ]]></xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="override" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+If the configFile already exists at the finalname location, whether or not to replace it.
+                        ]]></xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:simpleType name="featureName">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Feature name should be non empty string.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="resolver">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Resolver to use. Karaf will look for OSGi service which have following properties:
+objectClass: org.apache.karaf.features.Resolver
+name: the value
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="install">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Installation mode. Can be either manual or auto. Specifies whether the feature should be automatically installed when
+dropped inside the deploy folder. Note: This attribute doesn't affect feature descriptors that are installed from the
+command line or as part of the org.apache.karaf.features.cfg.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="features" type="tns:features" />
+
+</xs:schema>
diff --git a/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/FeatureTest.java b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/FeatureTest.java
new file mode 100644
index 0000000..5ff45f9
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/FeatureTest.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.karaf.features;
+
+import junit.framework.TestCase;
+import org.apache.karaf.features.internal.FeatureImpl;
+
+public class FeatureTest extends TestCase {
+	
+	public void testValueOf() {
+		Feature feature = FeatureImpl.valueOf("name" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + "version");
+		assertEquals(feature.getName(), "name");
+		assertEquals(feature.getVersion(), "version");
+		feature = FeatureImpl.valueOf("name");
+		assertEquals(feature.getName(), "name");
+		assertEquals(feature.getVersion(), FeatureImpl.DEFAULT_VERSION);
+	}
+	
+}
diff --git a/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
new file mode 100644
index 0000000..4395989
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
@@ -0,0 +1,1004 @@
+/*
+ * 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.karaf.features;
+
+import static org.easymock.EasyMock.aryEq;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.jar.JarInputStream;
+
+import junit.framework.TestCase;
+
+import org.apache.karaf.features.internal.FeatureImpl;
+import org.apache.karaf.features.internal.FeaturesServiceImpl;
+import org.easymock.EasyMock;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.service.log.LogService;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+import static org.easymock.EasyMock.*;
+
+public class FeaturesServiceTest extends TestCase {
+
+    File dataFile;
+
+    protected void setUp() throws IOException {
+        dataFile = File.createTempFile("features", null, null);
+    }
+
+    public void testInstallFeature() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle = EasyMock.createMock(Bundle.class);
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+        
+        Repository[] repositories = svc.listRepositories();
+        assertNotNull(repositories);
+        assertEquals(1, repositories.length);
+        assertNotNull(repositories[0]);
+        Feature[] features = repositories[0].getFeatures();
+        assertNotNull(features);
+        assertEquals(1, features.length);
+        assertNotNull(features[0]);
+        assertEquals("f1", features[0].getName());
+        assertNotNull(features[0].getDependencies());
+        assertEquals(0, features[0].getDependencies().size());
+        assertNotNull(features[0].getBundles());
+        assertEquals(1, features[0].getBundles().size());
+        assertEquals(name, features[0].getBundles().get(0).getLocation());
+        assertTrue(features[0].getBundles().get(0).isStart());
+
+        verify(bundleContext, installedBundle);
+
+        reset(bundleContext, installedBundle);
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        svc.installFeature("f1", FeatureImpl.DEFAULT_VERSION, EnumSet.of(FeaturesService.Option.NoAutoRefreshBundles));
+        
+        Feature[] installed = svc.listInstalledFeatures();
+        assertEquals(1, installed.length);
+        assertEquals("f1", installed[0].getName());
+    }
+
+    public void testUninstallFeature() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f1\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+        
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle = EasyMock.createMock(Bundle.class);
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+        
+        verify(bundleContext, installedBundle);
+
+        reset(bundleContext, installedBundle);
+
+        // Installs f1 and 0.1
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+
+        // Installs f1 and 0.2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(123456L);
+        expect(installedBundle.getBundleId()).andReturn(123456L);
+        expect(installedBundle.getBundleId()).andReturn(123456L);
+        expect(bundleContext.getBundle(123456L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+
+        // UnInstalls f1 and 0.1
+        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        // UnInstalls f1 and 0.2
+        expect(bundleContext.getBundle(123456)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        try {
+            svc.uninstallFeature("f1");
+            fail("Uninstall should have failed as feature is not installed");
+        } catch (Exception e) {
+            // ok
+        }
+
+        svc.installFeature("f1", "0.1", EnumSet.of(FeaturesService.Option.NoAutoRefreshBundles));
+        svc.installFeature("f1", "0.2", EnumSet.of(FeaturesService.Option.NoAutoRefreshBundles));
+
+        try {
+            svc.uninstallFeature("f1");
+            fail("Uninstall should have failed as feature is installed in multiple versions");
+        } catch (Exception e) {
+            // ok
+        }
+
+        svc.uninstallFeature("f1", "0.1");
+        svc.uninstallFeature("f1");
+    }    
+    
+    // Tests Add and Remove Repository
+    public void testAddAndRemoveRepository() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f1\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        // loads the state
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+
+        // Adds Repository
+        svc.addRepository(uri);                                                     
+        
+        // Removes Repository
+        svc.removeRepository(uri);        
+    }
+
+    // Tests installing all features in a repo and uninstalling
+    // all features in a repo
+    public void testInstallUninstallAllFeatures() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f1\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle = EasyMock.createMock(Bundle.class);        
+
+        // Installs first feature name = f1, version = 0.1
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        expect(installedBundle.getSymbolicName()).andReturn("bundle");
+
+        installedBundle.start();
+        
+        // Installs second feature name = f1, version = 0.2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(123456L);
+        expect(installedBundle.getBundleId()).andReturn(123456L);
+        expect(installedBundle.getBundleId()).andReturn(123456L);
+        expect(bundleContext.getBundle(123456L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+        
+        // Installs third feature name = f2, version = 0.2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(1234567L);
+        expect(installedBundle.getBundleId()).andReturn(1234567L);
+        expect(installedBundle.getBundleId()).andReturn(1234567L);
+        expect(bundleContext.getBundle(1234567L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+        
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable()).anyTimes();
+
+        // uninstallAllFeatures 
+        
+        // uninstalls first feature name = f1, version = 0.1
+        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        // uninstalls third feature name = f2, version = 0.2
+        expect(bundleContext.getBundle(1234567)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        // uninstalls second feature name = f1, version = 0.2
+        expect(bundleContext.getBundle(123456)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.installAllFeatures(uri);
+        
+        // Uninstalls features with versions.
+        svc.uninstallAllFeatures(uri);    
+    }    
+
+
+    // Tests install of a Repository that includes a feature
+    // with a feature dependency
+    // The dependant feature is in the same repository
+    // Tests uninstall of features
+    public void testInstallFeatureWithDependantFeatures() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("  <feature version=\"0.1\">f2</feature>");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 with dependency on f2
+        // so will install f2 first
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+
+        // Then installs f1
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(1234L);
+        expect(installedBundle.getBundleId()).andReturn(1234L);
+        expect(installedBundle.getBundleId()).andReturn(1234L);
+        expect(bundleContext.getBundle(1234L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable()).anyTimes();
+        installedBundle.start();
+
+        // uninstalls first feature name = f1, version = 0.1
+        expect(bundleContext.getBundle(1234)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        // uninstalls first feature name = f2, version = 0.1
+        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeature("f1", "0.1");
+
+        // Uninstall repository
+        svc.uninstallFeature("f1", "0.1");
+        svc.uninstallFeature("f2", "0.1");
+
+    }
+
+    // Tests install of a Repository that includes a feature with a feature dependency
+    public void testInstallFeatureWithDependantFeaturesAndVersionWithoutPreinstall() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <feature version=\"0.1\">f2</feature>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = prepareBundleContextForInstallUninstall();
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeature("f1", "0.1");
+
+        // Uninstall repository
+        svc.uninstallFeature("f1", "0.1");
+        svc.uninstallFeature("f2", "0.1");
+    }
+
+    // Tests install of a Repository that includes a feature with a feature dependency
+    public void testInstallFeatureWithDependantFeaturesAndNoVersionWithoutPreinstall() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <feature>f2</feature>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = prepareBundleContextForInstallUninstall();
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeature("f1", "0.1");
+
+        // Uninstall repository
+        svc.uninstallFeature("f1", "0.1");
+        svc.uninstallFeature("f2", "0.2");
+    }
+
+    public void testInstallFeatureWithDependantFeaturesAndRangeWithoutPreinstall() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <feature version=\"[0.1,0.3)\">f2</feature>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = prepareBundleContextForInstallUninstall();
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeature("f1", "0.1");
+
+        // Uninstall repository
+        svc.uninstallFeature("f1", "0.1");
+        svc.uninstallFeature("f2", "0.2");
+    }
+
+    public void testInstallFeatureWithDependantFeaturesAndRangeWithPreinstall() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <feature version=\"[0.1,0.3)\">f2</feature>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 with dependency on f2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(12345L).anyTimes();
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle).anyTimes();
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable()).anyTimes();
+        installedBundle.start();
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { installedBundle });
+        expect(installedBundle.getSymbolicName()).andReturn(name).anyTimes();
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        installedBundle.start();
+
+        // uninstalls first feature name = f2, version = 0.1
+        installedBundle.uninstall();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeature("f2", "0.1");
+        svc.installFeature("f1", "0.1");
+
+        // Uninstall repository
+        svc.uninstallFeature("f1", "0.1");
+        svc.uninstallFeature("f2", "0.1");
+    }
+
+    public void testGetFeaturesShouldHandleDifferentVersionPatterns() throws Exception {
+
+        String name = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name=\"f1\" version=\"0.1\">");
+        pw.println("    <feature version=\"[0.1,0.3)\">f2</feature>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.1\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name=\"f2\" version=\"0.2\">");
+        pw.println("    <bundle>" + name + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.addRepository(uri);
+
+        Feature feature = svc.getFeature("f2", "[0.1,0.3)");
+        assertEquals("f2", feature.getName());
+        assertEquals("0.2", feature.getVersion());
+
+        Feature feature2 = svc.getFeature("f2", "0.0.0");
+        assertEquals("f2", feature2.getName());
+        assertEquals("0.2", feature2.getVersion());
+
+        Feature feature3 = svc.getFeature("f2", "0.2");
+        assertEquals("f2", feature3.getName());
+        assertEquals("0.2", feature3.getVersion());
+
+        Feature feature4 = svc.getFeature("f2", "0.3");
+        assertNull(feature4);
+    }
+
+    private BundleContext prepareBundleContextForInstallUninstall() throws Exception {
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 with dependency on f2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(isA(String.class),
+                                           isA(InputStream.class))).andReturn(installedBundle);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(installedBundle.getBundleId()).andReturn(12345L);
+        expect(bundleContext.getBundle(12345L)).andReturn(installedBundle);
+        expect(installedBundle.getHeaders()).andReturn(new Hashtable());
+        installedBundle.start();
+
+        // uninstalls first feature name = f2, version = 0.1
+        expect(bundleContext.getBundle(12345)).andReturn(installedBundle);
+        installedBundle.uninstall();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle);
+        return bundleContext;
+    }
+
+    public void testInstallBatchFeatureWithContinueOnFailureNoClean() throws Exception {
+        String bundle1 = getJarUrl(Bundle.class);
+        String bundle2 = getJarUrl(LogService.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name='f1'>");
+        pw.println("    <bundle>" + bundle1 + "</bundle>");
+        pw.println("    <bundle>" + "zfs:unknown" + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name='f2'>");
+        pw.println("    <bundle>" + bundle2 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
+        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 and f2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle1), isA(InputStream.class))).andReturn(installedBundle1);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getHeaders()).andReturn(new Hashtable()).anyTimes();
+        installedBundle2.start();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle1, installedBundle2);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeatures(new CopyOnWriteArraySet<Feature>(Arrays.asList(svc.listFeatures())),
+                            EnumSet.of(FeaturesService.Option.ContinueBatchOnFailure, FeaturesService.Option.NoCleanIfFailure));
+
+//        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
+    }
+
+    public void testInstallBatchFeatureWithContinueOnFailureClean() throws Exception {
+        String bundle1 = getJarUrl(Bundle.class);
+        String bundle2 = getJarUrl(LogService.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name='f1'>");
+        pw.println("    <bundle>" + bundle1 + "</bundle>");
+        pw.println("    <bundle>" + "zfs:unknown" + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name='f2'>");
+        pw.println("    <bundle>" + bundle2 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
+        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 and f2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle1), isA(InputStream.class))).andReturn(installedBundle1);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        installedBundle1.uninstall();
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getHeaders()).andReturn(new Hashtable()).anyTimes();
+        installedBundle2.start();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle1, installedBundle2);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        svc.installFeatures(new CopyOnWriteArraySet<Feature>(Arrays.asList(svc.listFeatures())),
+                            EnumSet.of(FeaturesService.Option.ContinueBatchOnFailure));
+
+//        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
+    }
+
+    public void testInstallBatchFeatureWithoutContinueOnFailureNoClean() throws Exception {
+        String bundle1 = getJarUrl(Bundle.class);
+        String bundle2 = getJarUrl(LogService.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name='f1'>");
+        pw.println("    <bundle>" + bundle1 + "</bundle>");
+        pw.println("    <bundle>" + "zfs:unknown" + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name='f2'>");
+        pw.println("    <bundle>" + bundle2 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
+        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 and f2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle1), isA(InputStream.class))).andReturn(installedBundle1);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        installedBundle2.start();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle1, installedBundle2);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        try {
+            List<Feature> features = Arrays.asList(svc.listFeatures());
+            Collections.reverse(features);
+            svc.installFeatures(new CopyOnWriteArraySet<Feature>(features),
+                                EnumSet.of(FeaturesService.Option.NoCleanIfFailure));
+            fail("Call should have thrown an exception");
+        } catch (MalformedURLException e) {
+        }
+
+//        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
+    }
+
+    public void testInstallBatchFeatureWithoutContinueOnFailureClean() throws Exception {
+        String bundle1 = getJarUrl(Bundle.class);
+        String bundle2 = getJarUrl(LogService.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <feature name='f1'>");
+        pw.println("    <bundle>" + bundle1 + "</bundle>");
+        pw.println("    <bundle>" + "zfs:unknown" + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("  <feature name='f2'>");
+        pw.println("    <bundle>" + bundle2 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
+        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1 and f2
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle1), isA(InputStream.class))).andReturn(installedBundle1);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        installedBundle1.uninstall();
+
+        expect(bundleContext.getBundles()).andReturn(new Bundle[0]);
+        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        installedBundle2.uninstall();
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(bundleContext, installedBundle1, installedBundle2);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        try {
+            List<Feature> features = Arrays.asList(svc.listFeatures());
+            Collections.reverse(features);
+            svc.installFeatures(new CopyOnWriteArraySet<Feature>(features),
+                                EnumSet.noneOf(FeaturesService.Option.class));
+            fail("Call should have thrown an exception");
+        } catch (MalformedURLException e) {
+        }
+
+//        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
+    }
+
+    public void testInstallFeatureWithHostToRefresh() throws Exception {
+        String bundle1 = getJarUrl(LogService.class);
+        String bundle2 = getJarUrl(Bundle.class);
+
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features>");
+        pw.println("  <feature name='f1'>");
+        pw.println("    <bundle>" + bundle1 + "</bundle>");
+        pw.println("    <bundle>" + bundle2 + "</bundle>");
+        pw.println("  </feature>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        JarInputStream j = new JarInputStream(new URL(bundle1).openStream());
+        Dictionary<String,String> headers = new Hashtable();
+        for (Map.Entry e : j.getManifest().getMainAttributes().entrySet()) {
+            headers.put(e.getKey().toString(), e.getValue().toString());
+        }
+
+        // loads the state
+        PackageAdmin packageAdmin = EasyMock.createMock(PackageAdmin.class);
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        Bundle installedBundle1 = EasyMock.createMock(Bundle.class);
+        Bundle installedBundle2 = EasyMock.createMock(Bundle.class);
+
+        // Installs feature f1
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getBundleId()).andReturn(12345L);
+        expect(installedBundle1.getSymbolicName()).andReturn(headers.get(Constants.BUNDLE_SYMBOLICNAME)).anyTimes();
+        expect(installedBundle1.getHeaders()).andReturn(headers).anyTimes();
+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { installedBundle1 });
+
+        expect(bundleContext.installBundle(eq(bundle2), isA(InputStream.class))).andReturn(installedBundle2);
+        expect(bundleContext.getBundles()).andReturn(new Bundle[] { installedBundle1, installedBundle2 });
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getBundleId()).andReturn(54321L);
+        expect(installedBundle2.getSymbolicName()).andReturn("fragment").anyTimes();
+        Dictionary d = new Hashtable();
+        d.put(Constants.FRAGMENT_HOST, headers.get(Constants.BUNDLE_SYMBOLICNAME));
+        expect(installedBundle2.getHeaders()).andReturn(d).anyTimes();
+
+        expect(installedBundle1.getState()).andReturn(Bundle.ACTIVE);
+        expect(installedBundle1.getState()).andReturn(Bundle.ACTIVE);
+        expect(installedBundle2.getState()).andReturn(Bundle.INSTALLED);
+        expect(installedBundle2.getState()).andReturn(Bundle.INSTALLED);
+
+        //
+        // This is the real test to make sure the host is actually refreshed
+        //
+        packageAdmin.refreshPackages(aryEq(new Bundle[] { installedBundle1 }));
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        replay(packageAdmin, bundleContext, installedBundle1, installedBundle2);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setPackageAdmin(packageAdmin);
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+
+        List<Feature> features = Arrays.asList(svc.listFeatures());
+        Collections.reverse(features);
+        svc.installFeatures(new CopyOnWriteArraySet<Feature>(features),
+                            EnumSet.noneOf(FeaturesService.Option.class));
+
+//        verify(preferencesService, prefs, repositoriesNode, featuresNode, bundleContext, installedBundle1, installedBundle2);
+    }
+
+    /**
+     * This test checks schema validation of submited uri.
+     */
+    public void testSchemaValidation() throws Exception {
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features xmlns=\"http://karaf.apache.org/xmlns/features/v1.0.0\">");
+        pw.println("  <featur>");
+        pw.println("    <bundle>somebundle</bundle>");
+        pw.println("  </featur>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        try {
+            svc.addRepository(uri);
+            fail("exception expected");
+        } catch (Exception e) {
+            assertTrue(e.getMessage().contains("Unable to validate"));
+        }
+    }
+
+    /**
+     * This test checks feature service behavior with old, non namespaced descriptor.
+     */
+    public void testNoSchemaValidation() throws Exception {
+        File tmp = File.createTempFile("smx", ".feature");
+        PrintWriter pw = new PrintWriter(new FileWriter(tmp));
+        pw.println("<features>");
+        pw.println("  <featur>");
+        pw.println("    <bundle>anotherBundle</bundle>");
+        pw.println("  </featur>");
+        pw.println("</features>");
+        pw.close();
+
+        URI uri = tmp.toURI();
+
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+        replay(bundleContext);
+
+        FeaturesServiceImpl svc = new FeaturesServiceImpl();
+        svc.setBundleContext(bundleContext);
+        svc.addRepository(uri);
+    }
+
+    private String getJarUrl(Class cl) {
+        String name = cl.getName();
+        name = name.replace(".", "/")  + ".class";
+        name = getClass().getClassLoader().getResource(name).toString();
+        name = name.substring("jar:".length(), name.indexOf('!'));
+        return name;
+    }
+
+}
diff --git a/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/RepositoryTest.java b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/RepositoryTest.java
new file mode 100644
index 0000000..2e1c6da
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/RepositoryTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.karaf.features;
+
+import java.net.URI;
+
+import junit.framework.TestCase;
+import org.apache.karaf.features.internal.RepositoryImpl;
+import org.apache.karaf.features.internal.FeatureImpl;
+
+
+public class RepositoryTest extends TestCase {
+
+    public void testLoad() throws Exception {
+        RepositoryImpl r = new RepositoryImpl(getClass().getResource("repo1.xml").toURI());
+        // Check repo
+        URI[] repos = r.getRepositories();
+        assertNotNull(repos);
+        assertEquals(1, repos.length);
+        assertEquals(URI.create("urn:r1"), repos[0]);
+        // Check features
+        Feature[] features = r.getFeatures();
+        assertNotNull(features);
+        assertEquals(3, features.length);
+        assertNotNull(features[0]);
+        assertEquals("f1", features[0].getName());
+        assertNotNull(features[0].getConfigurations());
+        assertEquals(1, features[0].getConfigurations().size());
+        assertNotNull(features[0].getConfigurations().get("c1"));
+        assertEquals(1, features[0].getConfigurations().get("c1").size());
+        assertEquals("v", features[0].getConfigurations().get("c1").get("k"));
+        assertNotNull(features[0].getDependencies());
+        assertEquals(0, features[0].getDependencies().size());
+        assertNotNull(features[0].getBundles());
+        assertEquals(2, features[0].getBundles().size());
+        assertEquals("b1", features[0].getBundles().get(0).getLocation());
+        assertEquals("b2", features[0].getBundles().get(1).getLocation());
+        assertNotNull(features[1]);
+        assertEquals("f2", features[1].getName());
+        assertNotNull(features[1].getConfigurations());
+        assertEquals(0, features[1].getConfigurations().size());
+        assertNotNull(features[1].getDependencies());
+        assertEquals(1, features[1].getDependencies().size());
+        assertEquals("f1" + FeatureImpl.SPLIT_FOR_NAME_AND_VERSION + FeatureImpl.DEFAULT_VERSION, features[1].getDependencies().get(0).toString());
+        assertNotNull(features[1].getBundles());
+        assertEquals(1, features[1].getBundles().size());
+        assertEquals("b3", features[1].getBundles().get(0).getLocation());
+        assertEquals("f3", features[2].getName());
+        assertNotNull(features[2].getConfigurationFiles());
+        assertEquals(1, features[2].getConfigurationFiles().size());
+        assertEquals("cf1", features[2].getConfigurationFiles().get(0).getFinalname());
+        assertEquals("cfloc", features[2].getConfigurationFiles().get(0).getLocation());
+    }
+    
+    public void testShowWrongUriInException() throws Exception {
+        String uri = "src/test/resources/org/apache/karaf/shell/features/repo1.xml";
+        RepositoryImpl r = new RepositoryImpl(new URI(uri));
+        try {
+            r.load();
+        } catch (Exception e) {
+            assertTrue(e.getMessage().contains(uri));
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/internal/FeaturesServiceImplTest.java b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/internal/FeaturesServiceImplTest.java
new file mode 100644
index 0000000..3f252f8
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/test/java/org/apache/karaf/features/internal/FeaturesServiceImplTest.java
@@ -0,0 +1,187 @@
+/*
+ * 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.karaf.features.internal;
+
+import static org.easymock.EasyMock.*;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.karaf.features.Feature;
+import org.easymock.EasyMock;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkListener;
+
+/**
+ * Test cases for {@link FeaturesServiceImpl}
+ */
+public class FeaturesServiceImplTest extends TestCase {
+    
+    File dataFile;
+
+    protected void setUp() throws IOException {
+        dataFile = File.createTempFile("features", null, null);
+    }
+
+    public void testGetFeature() throws Exception {
+        final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
+        Map<String, Feature> versions = new HashMap<String, Feature>();
+        FeatureImpl feature = new FeatureImpl("transaction");
+        versions.put("1.0.0", feature);
+        features.put("transaction", versions);
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
+            protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
+                return features;
+            };
+        };
+        assertNotNull(impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION));
+        assertSame(feature, impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION));
+    }
+    
+    public void testGetFeatureStripVersion() throws Exception {
+        final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
+        Map<String, Feature> versions = new HashMap<String, Feature>();
+        FeatureImpl feature = new FeatureImpl("transaction");
+        versions.put("1.0.0", feature);
+        features.put("transaction", versions);
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
+            protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
+                return features;
+            };
+        };
+        assertNotNull(impl.getFeature("transaction", "  1.0.0  "));
+        assertSame(feature, impl.getFeature("transaction", "  1.0.0   "));
+    }
+    
+    public void testGetFeatureNotAvailable() throws Exception {
+        final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
+        Map<String, Feature> versions = new HashMap<String, Feature>();
+        versions.put("1.0.0", new FeatureImpl("transaction"));
+        features.put("transaction", versions);
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
+            protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
+                return features;
+            };
+        };
+        assertNull(impl.getFeature("activemq", FeatureImpl.DEFAULT_VERSION));
+    }
+    
+    public void testGetFeatureHighestAvailable() throws Exception {
+        final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
+        Map<String, Feature> versions = new HashMap<String, Feature>();
+        versions.put("1.0.0", new FeatureImpl("transaction", "1.0.0"));
+        versions.put("2.0.0", new FeatureImpl("transaction", "2.0.0"));
+        features.put("transaction", versions);
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
+            protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
+                return features;
+            };
+        };
+        assertNotNull(impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION));
+        assertSame("2.0.0", impl.getFeature("transaction", FeatureImpl.DEFAULT_VERSION).getVersion());
+    }
+
+    public void testStartDoesNotFailWithOneInvalidUri()  {
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+        expect(bundleContext.getDataFile(EasyMock.<String>anyObject())).andReturn(dataFile).anyTimes();
+        bundleContext.addFrameworkListener(EasyMock.<FrameworkListener>anyObject());
+        bundleContext.removeFrameworkListener(EasyMock.<FrameworkListener>anyObject());
+        replay(bundleContext);
+        FeaturesServiceImpl service = new FeaturesServiceImpl();
+        service.setBundleContext(bundleContext);
+        try {
+            service.setUrls("mvn:inexistent/features/1.0/xml/features");
+            service.start();
+        } catch (Exception e) {
+            fail(String.format("Service should not throw start-up exception but log the error instead: %s", e));
+        }
+    }
+
+    /**
+     * This test checks KARAF-388 which allows you to specify version of boot feature.
+     */
+    public void testStartDoesNotFailWithNonExistentVersion()  {
+        BundleContext bundleContext = EasyMock.createMock(BundleContext.class);
+
+        final Map<String, Map<String, Feature>> features = new HashMap<String, Map<String,Feature>>();
+        Map<String, Feature> versions = new HashMap<String, Feature>();
+        versions.put("1.0.0", new FeatureImpl("transaction", "1.0.0"));
+        versions.put("2.0.0", new FeatureImpl("transaction", "2.0.0"));
+        features.put("transaction", versions);
+
+        Map<String, Feature> versions2 = new HashMap<String, Feature>();
+        versions2.put("1.0.0", new FeatureImpl("ssh", "1.0.0"));
+        features.put("ssh", versions2);
+        
+        final CountDownLatch latch = new CountDownLatch(2);
+
+        final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
+            protected Map<String,Map<String,Feature>> getFeatures() throws Exception {
+                return features;
+            };
+
+            // override methods which refers to bundle context to avoid mocking everything
+            @Override
+            protected boolean loadState() {
+                return true;
+            }
+            @Override
+            protected void saveState() {
+                // this method will be invoked twice while features service is starting
+                latch.countDown();
+            }
+        };
+        impl.setBundleContext(bundleContext);
+
+        try {
+            Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[0]));
+            impl.setBoot("transaction;version=1.2,ssh;version=1.0.0");
+            impl.start();
+
+            // waiting for the features service installation thread to finish its work
+            latch.await(2, TimeUnit.SECONDS);
+
+            assertFalse("Feature transaction 1.0.0 should not be installed", impl.isInstalled(impl.getFeature("transaction", "1.0.0")));
+            assertFalse("Feature transaction 2.0.0 should not be installed", impl.isInstalled(impl.getFeature("transaction", "2.0.0")));
+            assertTrue("Feature ssh should be installed", impl.isInstalled(impl.getFeature("ssh", "1.0.0")));
+        } catch (Exception e) {
+            fail(String.format("Service should not throw start-up exception but log the error instead: %s", e));
+        }
+    }
+
+    public void testGetOptionalImportsOnly() {
+        FeaturesServiceImpl service = new FeaturesServiceImpl();
+
+        List<Clause> result = service.getOptionalImports("org.apache.karaf,org.apache.karaf.optional;resolution:=optional");
+        assertEquals("One optional import expected", 1, result.size());
+        assertEquals("org.apache.karaf.optional", result.get(0).getName());
+
+        result = service.getOptionalImports(null);
+        assertNotNull(result);
+        assertEquals("No optional imports expected", 0, result.size());
+    }
+}
diff --git a/karaf-2.2.x/features/core/src/test/resources/org/apache/karaf/features/repo1.xml b/karaf-2.2.x/features/core/src/test/resources/org/apache/karaf/features/repo1.xml
new file mode 100644
index 0000000..4c8db01
--- /dev/null
+++ b/karaf-2.2.x/features/core/src/test/resources/org/apache/karaf/features/repo1.xml
@@ -0,0 +1,35 @@
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<features name="test">
+    <repository>urn:r1</repository>
+    <feature name="f1">
+        <config name="c1">
+            k=v
+        </config>
+        <bundle>b1</bundle>
+        <bundle>b2</bundle>
+    </feature>
+    <feature name="f2">
+        <feature>f1</feature>
+        <bundle>b3</bundle>
+    </feature>
+    <feature name="f3">
+    	<configfile finalname="cf1">cfloc</configfile>
+    	<bundle>b4</bundle> 
+    </feature>
+</features>
diff --git a/karaf-2.2.x/features/management/NOTICE b/karaf-2.2.x/features/management/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/features/management/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/features/management/pom.xml b/karaf-2.2.x/features/management/pom.xml
new file mode 100644
index 0000000..b88f98e
--- /dev/null
+++ b/karaf-2.2.x/features/management/pom.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.features</groupId>
+        <artifactId>features</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.features.management</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Features :: Management</name>
+    <description>This bundle provides MBeans to manipulate features via JMX.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.obr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.management</groupId>
+            <artifactId>org.apache.karaf.management.server</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.features.management.internal;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
new file mode 100644
index 0000000..f8b0cc7
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.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.karaf.features.management;
+
+import javax.management.openmbean.TabularData;
+
+public interface FeaturesServiceMBean {
+
+    TabularData getFeatures() throws Exception;
+
+    TabularData getRepositories() throws Exception;
+
+    void addRepository(String url) throws Exception;
+
+    void removeRepository(String url) throws Exception;
+
+    void installFeature(String name) throws Exception;
+
+    void installFeature(String name, String version) throws Exception;
+
+    void uninstallFeature(String name) throws Exception;
+
+    void uninstallFeature(String name, String version) throws Exception;
+
+    String FEATURE_NAME = "Name";
+
+    String FEATURE_VERSION = "Version";
+
+    String FEATURE_DEPENDENCIES = "Dependencies";
+
+    String FEATURE_BUNDLES = "Bundles";
+
+    String FEATURE_CONFIGURATIONS = "Configurations";
+    
+    String FEATURE_CONFIGURATIONFILES = "Configuration Files";
+
+    String FEATURE_INSTALLED = "Installed";
+
+    String FEATURE_CONFIG_PID = "Pid";
+    String FEATURE_CONFIG_ELEMENTS = "Elements";
+    String FEATURE_CONFIG_ELEMENT_KEY = "Key";
+    String FEATURE_CONFIG_ELEMENT_VALUE = "Value";
+    
+    String FEATURE_CONFIG_FILES_ELEMENTS = "Files";
+
+    /**
+     * The type of the event which is emitted for features events
+     */
+    String FEATURE_EVENT_TYPE = "org.apache.karaf.features.featureEvent";
+
+    String FEATURE_EVENT_EVENT_TYPE = "Type";
+
+    String FEATURE_EVENT_EVENT_TYPE_INSTALLED = "Installed";
+
+    String FEATURE_EVENT_EVENT_TYPE_UNINSTALLED = "Uninstalled";
+
+    /**
+     * The item names in the CompositeData representing a feature
+     */
+    String[] FEATURE = { FEATURE_NAME, FEATURE_VERSION, FEATURE_DEPENDENCIES, FEATURE_BUNDLES,
+                         FEATURE_CONFIGURATIONS, FEATURE_CONFIGURATIONFILES, FEATURE_INSTALLED };
+
+    String[] FEATURE_IDENTIFIER = { FEATURE_NAME, FEATURE_VERSION };
+
+    String[] FEATURE_CONFIG = { FEATURE_CONFIG_PID, FEATURE_CONFIG_ELEMENTS };
+    
+    String[] FEATURE_CONFIG_FILES = { FEATURE_CONFIG_FILES_ELEMENTS };
+
+    String[] FEATURE_CONFIG_ELEMENT = { FEATURE_CONFIG_ELEMENT_KEY, FEATURE_CONFIG_ELEMENT_VALUE };
+
+    /**
+     * The item names in the CompositeData representing the event raised for
+     * feature events within the OSGi container by this bean
+     */
+    String[] FEATURE_EVENT = { FEATURE_NAME, FEATURE_VERSION, FEATURE_EVENT_EVENT_TYPE };
+
+
+    String REPOSITORY_NAME = "Name";
+
+    String REPOSITORY_URI = "Uri";
+
+    String REPOSITORY_REPOSITORIES = "Repositories";
+
+    String REPOSITORY_FEATURES = "Features";
+
+    /**
+     * The type of the event which is emitted for repositories events
+     */
+    String REPOSITORY_EVENT_TYPE = "org.apache.karaf.features.repositoryEvent";
+
+    String REPOSITORY_EVENT_EVENT_TYPE = "Type";
+
+    String REPOSITORY_EVENT_EVENT_TYPE_ADDED = "Added";
+
+    String REPOSITORY_EVENT_EVENT_TYPE_REMOVED = "Removed";
+
+    /**
+     * The item names in the CompositeData representing a feature
+     */
+    String[] REPOSITORY = { REPOSITORY_NAME, REPOSITORY_URI,  REPOSITORY_REPOSITORIES, REPOSITORY_FEATURES };
+
+    /**
+     * The item names in the CompositeData representing the event raised for
+     * feature events within the OSGi container by this bean
+     */
+    String[] REPOSITORY_EVENT = { REPOSITORY_NAME, REPOSITORY_URI, REPOSITORY_EVENT_EVENT_TYPE };
+
+}
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeature.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeature.java
new file mode 100644
index 0000000..ad682be
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeature.java
@@ -0,0 +1,322 @@
+/*
+ * 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.karaf.features.management.codec;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.ArrayType;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.TabularDataSupport;
+
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.ConfigFileInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.management.FeaturesServiceMBean;
+
+public class JmxFeature {
+
+    /**
+     * The CompositeType which represents a single feature
+     */
+    public final static CompositeType FEATURE;
+
+    /**
+     * The TabularType which represents a list of features
+     */
+    public final static TabularType FEATURE_TABLE;
+
+    public final static CompositeType FEATURE_IDENTIFIER;
+
+    public final static TabularType FEATURE_IDENTIFIER_TABLE;
+
+    public final static CompositeType FEATURE_CONFIG_ELEMENT;
+
+    public final static TabularType FEATURE_CONFIG_ELEMENT_TABLE;
+
+    public final static CompositeType FEATURE_CONFIG;
+
+    public final static TabularType FEATURE_CONFIG_TABLE;
+
+    public final static CompositeType FEATURE_CONFIG_FILES;
+    
+    public final static TabularType FEATURE_CONFIG_FILES_TABLE;
+    
+    private final CompositeData data;
+
+    public JmxFeature(Feature feature, boolean installed) {
+        try {
+            String[] itemNames = FeaturesServiceMBean.FEATURE;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = feature.getName();
+            itemValues[1] = feature.getVersion();
+            itemValues[2] = getFeatureIdentifierTable(feature.getDependencies());
+            itemValues[3] = getBundleUris(feature.getBundles());
+            itemValues[4] = getConfigTable(feature.getConfigurations());
+            itemValues[5] = getConfigFileList(feature.getConfigurationFiles());
+            itemValues[6] = installed;
+            data = new CompositeDataSupport(FEATURE, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot form feature open data", e);
+        }
+    }
+
+    public CompositeData asCompositeData() {
+        return data;
+    }
+
+    public static TabularData tableFrom(Collection<JmxFeature> features) {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_TABLE);
+        for (JmxFeature feature : features) {
+            table.put(feature.asCompositeData());
+        }
+        return table;
+    }
+
+    static TabularData getFeatureIdentifierTable(List<Feature> features) throws OpenDataException {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_IDENTIFIER_TABLE);
+        Set<String> featureSet = new HashSet<String>();
+        for (Feature feature : features) {
+        	if (featureSet.contains(feature.getName() + feature.getVersion())) {
+        		continue;
+        	} else {
+        		featureSet.add(feature.getName() + feature.getVersion());
+        	}
+            String[] itemNames = new String[] { FeaturesServiceMBean.FEATURE_NAME, FeaturesServiceMBean.FEATURE_VERSION };
+            Object[] itemValues = new Object[] { feature.getName(), feature.getVersion() };
+            CompositeData ident = new CompositeDataSupport(FEATURE_IDENTIFIER, itemNames, itemValues);
+            table.put(ident);
+        }
+        return table;
+    }
+
+    static String[] getBundleUris(List<BundleInfo> infos) {
+        String[] array = new String[infos.size()];
+        for (int i = 0; i < array.length; i++) {
+            array[i] = infos.get(i).getLocation();
+        }
+        return array;
+    }
+
+    static TabularData getConfigTable(Map<String, Map<String, String>> configs) throws OpenDataException {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_CONFIG_TABLE);
+        for (Map.Entry<String, Map<String, String>> entry : configs.entrySet()) {
+            String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG;
+            Object[] itemValues = new Object[2];
+            itemValues[0] = entry.getKey();
+            itemValues[1] = getConfigElementTable(entry.getValue());
+            CompositeData config = new CompositeDataSupport(FEATURE_CONFIG, itemNames, itemValues);
+            table.put(config);
+        }
+        return table;
+    }
+    
+    static TabularData getConfigFileList(List<ConfigFileInfo> configFiles) throws OpenDataException {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_CONFIG_FILES_TABLE);
+        for (ConfigFileInfo configFile : configFiles) {
+            String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_FILES;
+            Object[] itemValues = { configFile.getFinalname() };
+            CompositeData config = new CompositeDataSupport(FEATURE_CONFIG_FILES, itemNames, itemValues);
+            table.put(config);
+        }
+        return table;
+    }
+
+    static TabularData getConfigElementTable(Map<String, String> config) throws OpenDataException {
+        TabularDataSupport table = new TabularDataSupport(FEATURE_CONFIG_ELEMENT_TABLE);
+        for (Map.Entry<String, String> entry : config.entrySet()) {
+            String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_ELEMENT;
+            Object[] itemValues = { entry.getKey(), entry.getValue() };
+            CompositeData element = new CompositeDataSupport(FEATURE_CONFIG_ELEMENT, itemNames, itemValues);
+            table.put(element);
+        }
+        return table;
+    }
+
+
+    static {
+        FEATURE_IDENTIFIER = createFeatureIdentifierType();
+        FEATURE_IDENTIFIER_TABLE = createFeatureIdentifierTableType();
+        FEATURE_CONFIG_ELEMENT = createFeatureConfigElementType();
+        FEATURE_CONFIG_ELEMENT_TABLE = createFeatureConfigElementTableType();
+        FEATURE_CONFIG = createFeatureConfigType();
+        FEATURE_CONFIG_TABLE = createFeatureConfigTableType();
+        FEATURE_CONFIG_FILES =  createFeatureConfigFilesType();
+        FEATURE_CONFIG_FILES_TABLE = createFeatureConfigFilesTableType();
+        FEATURE = createFeatureType();
+        FEATURE_TABLE = createFeatureTableType();
+    }
+
+    private static CompositeType createFeatureIdentifierType() {
+        try {
+            String description = "This type identify a Karaf features";
+            String[] itemNames = FeaturesServiceMBean.FEATURE_IDENTIFIER;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = SimpleType.STRING;
+
+            itemDescriptions[0] = "The id of the feature";
+            itemDescriptions[1] = "The version of the feature";
+
+            return new CompositeType("FeatureIdentifier", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build featureIdentifier type", e);
+        }
+    }
+
+    private static TabularType createFeatureIdentifierTableType() {
+        try {
+            return new TabularType("Features", "The table of featureIdentifiers",
+                    FEATURE_IDENTIFIER, new String[] { FeaturesServiceMBean.FEATURE_NAME, FeaturesServiceMBean.FEATURE_VERSION });
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build featureIdentifier table type", e);
+        }
+    }
+
+    private static CompositeType createFeatureConfigElementType() {
+        try {
+            String description = "This type encapsulates Karaf feature config element";
+            String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_ELEMENT;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = SimpleType.STRING;
+
+            itemDescriptions[0] = "The key";
+            itemDescriptions[1] = "The value";
+
+            return new CompositeType("ConfigElement", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build configElement type", e);
+        }
+    }
+
+    private static TabularType createFeatureConfigElementTableType() {
+        try {
+            return new TabularType("ConfigElement", "The table of configurations elements",
+                    FEATURE_CONFIG_ELEMENT, new String[] { FeaturesServiceMBean.FEATURE_CONFIG_ELEMENT_KEY});
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature table type", e);
+        }
+    }
+
+    private static CompositeType createFeatureConfigType() {
+        try {
+            String description = "This type encapsulates Karaf feature config";
+            String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = FEATURE_CONFIG_ELEMENT_TABLE;
+
+            itemDescriptions[0] = "The PID of the config";
+            itemDescriptions[1] = "The configuration elements";
+
+            return new CompositeType("Config", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build configElement type", e);
+        }
+    }
+    
+    private static CompositeType createFeatureConfigFilesType() {
+        try {
+            String description = "This type encapsulates Karaf feature config files";
+            String[] itemNames = FeaturesServiceMBean.FEATURE_CONFIG_FILES;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+
+            itemDescriptions[0] = "The configuration file";
+
+            return new CompositeType("Config", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build configElement type", e);
+        }
+    }
+
+    private static TabularType createFeatureConfigTableType() {
+        try {
+            return new TabularType("Features", "The table of configurations",
+                    FEATURE_CONFIG, new String[] { FeaturesServiceMBean.FEATURE_CONFIG_PID});
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature table type", e);
+        }
+    }
+    
+    private static TabularType createFeatureConfigFilesTableType() {
+        try {
+            return new TabularType("Features", "The table of configuration files",
+            		FEATURE_CONFIG_FILES, new String[] { FeaturesServiceMBean.FEATURE_CONFIG_FILES_ELEMENTS });
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature table type", e);
+        }
+    }
+
+    private static CompositeType createFeatureType() {
+        try {
+            String description = "This type encapsulates Karaf features";
+            String[] itemNames = FeaturesServiceMBean.FEATURE;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = SimpleType.STRING;
+            itemTypes[2] = FEATURE_IDENTIFIER_TABLE;
+            itemTypes[3] = new ArrayType(1, SimpleType.STRING);
+            itemTypes[4] = FEATURE_CONFIG_TABLE;
+            itemTypes[5] = FEATURE_CONFIG_FILES_TABLE;
+            itemTypes[6] = SimpleType.BOOLEAN;
+
+            itemDescriptions[0] = "The name of the feature";
+            itemDescriptions[1] = "The version of the feature";
+            itemDescriptions[2] = "The feature dependencies";
+            itemDescriptions[3] = "The feature bundles";
+            itemDescriptions[4] = "The feature configurations";
+            itemDescriptions[5] = "The feature configuration files";
+            itemDescriptions[6] = "Whether the feature is installed";
+
+            return new CompositeType("Feature", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature type", e);
+        }
+    }
+
+    private static TabularType createFeatureTableType() {
+        try {
+            return new TabularType("Features", "The table of all features",
+                    FEATURE, new String[] { FeaturesServiceMBean.FEATURE_NAME, FeaturesServiceMBean.FEATURE_VERSION });
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build feature table type", e);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeatureEvent.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeatureEvent.java
new file mode 100644
index 0000000..81f446b
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeatureEvent.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.features.management.codec;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+
+import org.apache.karaf.features.FeatureEvent;
+import org.apache.karaf.features.management.FeaturesServiceMBean;
+
+public class JmxFeatureEvent {
+
+    public static final CompositeType FEATURE_EVENT;
+
+    private final CompositeData data;
+
+    public JmxFeatureEvent(FeatureEvent event) {
+        try {
+            String[] itemNames = FeaturesServiceMBean.FEATURE_EVENT;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = event.getFeature().getName();
+            itemValues[1] = event.getFeature().getVersion();
+            switch (event.getType()) {
+                case FeatureInstalled:   itemValues[2] = FeaturesServiceMBean.FEATURE_EVENT_EVENT_TYPE_INSTALLED; break;
+                case FeatureUninstalled: itemValues[2] = FeaturesServiceMBean.FEATURE_EVENT_EVENT_TYPE_UNINSTALLED; break;
+                default: throw new IllegalStateException("Unsupported event type: " + event.getType());
+            }
+            data = new CompositeDataSupport(FEATURE_EVENT, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot form feature event open data", e);
+        }
+    }
+
+    public CompositeData asCompositeData() {
+        return data;
+    }
+
+    static {
+        FEATURE_EVENT = createFeatureEventType();
+    }
+
+    private static CompositeType createFeatureEventType() {
+        try {
+            String description = "This type identify a Karaf feature event";
+            String[] itemNames = FeaturesServiceMBean.FEATURE_EVENT;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = SimpleType.STRING;
+            itemTypes[2] = SimpleType.STRING;
+
+            itemDescriptions[0] = "The id of the feature";
+            itemDescriptions[1] = "The version of the feature";
+            itemDescriptions[2] = "The type of the event";
+
+            return new CompositeType("FeatureEvent", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build featureEvent type", e);
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepository.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepository.java
new file mode 100644
index 0000000..f535b2b
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepository.java
@@ -0,0 +1,119 @@
+/*
+ * 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.karaf.features.management.codec;
+
+import java.util.Collection;
+import java.util.Arrays;
+import java.net.URI;
+
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.TabularType;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.ArrayType;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.CompositeDataSupport;
+
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.features.management.FeaturesServiceMBean;
+
+public class JmxRepository {
+
+    public final static CompositeType REPOSITORY;
+
+    public final static TabularType REPOSITORY_TABLE;
+
+    private final CompositeData data;
+
+    public JmxRepository(Repository repository) {
+        try {
+            String[] itemNames = FeaturesServiceMBean.REPOSITORY;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = repository.getName();
+            itemValues[1] = repository.getURI().toString();
+            itemValues[2] = toStringArray(repository.getRepositories());
+            itemValues[3] = JmxFeature.getFeatureIdentifierTable(Arrays.asList(repository.getFeatures()));
+            data = new CompositeDataSupport(REPOSITORY, itemNames, itemValues);
+        } catch (Exception e) {
+            throw new IllegalStateException("Cannot form repository open data", e);
+        }
+    }
+
+    public CompositeData asCompositeData() {
+        return data;
+    }
+
+    public static TabularData tableFrom(Collection<JmxRepository> repositories) {
+        TabularDataSupport table = new TabularDataSupport(REPOSITORY_TABLE);
+        for (JmxRepository repository : repositories) {
+            table.put(repository.asCompositeData());
+        }
+        return table;
+    }
+
+    private static String[] toStringArray(URI[] uris) {
+        if (uris == null) {
+            return null;
+        }
+        String[] res = new String[uris.length];
+        for (int i = 0; i < res.length; i++) {
+            res[i] = uris[i].toString();
+        }
+        return res;
+    }
+
+    static {
+        REPOSITORY = createRepositoryType();
+        REPOSITORY_TABLE = createRepositoryTableType();
+    }
+
+    private static CompositeType createRepositoryType() {
+        try {
+            String description = "This type identify a Karaf repository";
+            String[] itemNames = FeaturesServiceMBean.REPOSITORY;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = SimpleType.STRING;
+            itemTypes[2] = new ArrayType(1, SimpleType.STRING);
+            itemTypes[3] = JmxFeature.FEATURE_IDENTIFIER_TABLE;
+
+            itemDescriptions[0] = "The name of the repository";
+            itemDescriptions[1] = "The uri of the repository";
+            itemDescriptions[2] = "The dependent repositories";
+            itemDescriptions[3] = "The list of included features";
+
+            return new CompositeType("Repository", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build repository type", e);
+        }
+    }
+
+    private static TabularType createRepositoryTableType() {
+        try {
+            return new TabularType("Features", "The table of repositories",
+                    REPOSITORY, new String[] { FeaturesServiceMBean.REPOSITORY_URI });
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build repository table type", e);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepositoryEvent.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepositoryEvent.java
new file mode 100644
index 0000000..bf7910a
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepositoryEvent.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.features.management.codec;
+
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+
+import org.apache.karaf.features.RepositoryEvent;
+import org.apache.karaf.features.management.FeaturesServiceMBean;
+
+public class JmxRepositoryEvent {
+
+    public static final CompositeType REPOSITORY_EVENT;
+
+    private final CompositeData data;
+
+    public JmxRepositoryEvent(RepositoryEvent event) {
+        try {
+            String[] itemNames = FeaturesServiceMBean.REPOSITORY_EVENT;
+            Object[] itemValues = new Object[itemNames.length];
+            itemValues[0] = event.getRepository().getName();
+            itemValues[1] = event.getRepository().getURI().toString();
+            switch (event.getType()) {
+                case RepositoryAdded:   itemValues[2] = FeaturesServiceMBean.REPOSITORY_EVENT_EVENT_TYPE_ADDED; break;
+                case RepositoryRemoved: itemValues[2] = FeaturesServiceMBean.REPOSITORY_EVENT_EVENT_TYPE_REMOVED; break;
+                default: throw new IllegalStateException("Unsupported event type: " + event.getType());
+            }
+            data = new CompositeDataSupport(REPOSITORY_EVENT, itemNames, itemValues);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Cannot form repository event open data", e);
+        }
+    }
+
+    public CompositeData asCompositeData() {
+        return data;
+    }
+
+    static {
+        REPOSITORY_EVENT = createRepositoryEventType();
+    }
+
+    private static CompositeType createRepositoryEventType() {
+        try {
+            String description = "This type identify a Karaf repository event";
+            String[] itemNames = FeaturesServiceMBean.REPOSITORY_EVENT;
+            OpenType[] itemTypes = new OpenType[itemNames.length];
+            String[] itemDescriptions = new String[itemNames.length];
+            itemTypes[0] = SimpleType.STRING;
+            itemTypes[1] = SimpleType.STRING;
+            itemTypes[2] = SimpleType.STRING;
+
+            itemDescriptions[0] = "The name of the repository";
+            itemDescriptions[1] = "The uri of the repository";
+            itemDescriptions[2] = "The type of event";
+
+            return new CompositeType("RepositoryEvent", description, itemNames,
+                    itemDescriptions, itemTypes);
+        } catch (OpenDataException e) {
+            throw new IllegalStateException("Unable to build repositoryEvent type", e);
+        }
+    }
+}
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
new file mode 100644
index 0000000..b2c17ec
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
@@ -0,0 +1,198 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.features.management.internal;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.NotCompliantMBeanException;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.ObjectName;
+import javax.management.openmbean.TabularData;
+
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeatureEvent;
+import org.apache.karaf.features.FeaturesListener;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.features.RepositoryEvent;
+import org.apache.karaf.features.management.FeaturesServiceMBean;
+import org.apache.karaf.features.management.codec.JmxFeature;
+import org.apache.karaf.features.management.codec.JmxFeatureEvent;
+import org.apache.karaf.features.management.codec.JmxRepository;
+import org.apache.karaf.features.management.codec.JmxRepositoryEvent;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Implementation of {@link FeaturesServiceMBean}.
+ */
+public class FeaturesServiceMBeanImpl extends StandardEmitterMBean implements
+    MBeanRegistration, FeaturesServiceMBean {
+
+    private ServiceRegistration registration;
+
+    private BundleContext bundleContext;
+
+	private ObjectName objectName;
+
+	private volatile long sequenceNumber = 0;
+
+	private MBeanServer server;
+
+    private FeaturesService featuresService;
+
+    public FeaturesServiceMBeanImpl() throws NotCompliantMBeanException {
+        super(FeaturesServiceMBean.class);
+    }
+
+    public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
+        objectName = name;
+        this.server = server;
+        return name;
+    }
+
+    public void postRegister(Boolean registrationDone) {
+        registration = bundleContext.registerService(FeaturesListener.class.getName(),
+            getFeaturesListener(), new Hashtable());
+    }
+
+    public void preDeregister() throws Exception {
+        registration.unregister();
+    }
+
+    public void postDeregister() {
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public TabularData getFeatures() throws Exception {
+        try {
+            List<Feature> allFeatures = Arrays.asList(featuresService.listFeatures());
+            List<Feature> insFeatures = Arrays.asList(featuresService.listInstalledFeatures());
+            ArrayList<JmxFeature> features = new ArrayList<JmxFeature>();
+            for (Feature feature : allFeatures) {
+                try {
+                    features.add(new JmxFeature(feature, insFeatures.contains(feature)));
+                } catch (Throwable t) {
+                    t.printStackTrace();
+                }
+            }
+            TabularData table = JmxFeature.tableFrom(features);
+            return table;
+        } catch (Throwable t) {
+            t.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public TabularData getRepositories() throws Exception {
+        try {
+            List<Repository> allRepositories = Arrays.asList(featuresService.listRepositories());
+            ArrayList<JmxRepository> repositories = new ArrayList<JmxRepository>();
+            for (Repository repository : allRepositories) {
+                repositories.add(new JmxRepository(repository));
+            }
+            TabularData table = JmxRepository.tableFrom(repositories);
+            return table;
+        } catch (Throwable t) {
+            t.printStackTrace();
+            return null;
+        }
+    }
+
+    public void addRepository(String uri) throws Exception {
+        featuresService.addRepository(new URI(uri));
+    }
+
+    public void removeRepository(String uri) throws Exception {
+        featuresService.removeRepository(new URI(uri));
+    }
+
+    public void installFeature(String name) throws Exception {
+        featuresService.installFeature(name);
+    }
+
+    public void installFeature(String name, String version) throws Exception {
+        featuresService.installFeature(name, version);
+    }
+
+    public void uninstallFeature(String name) throws Exception {
+        featuresService.uninstallFeature(name);
+    }
+
+    public void uninstallFeature(String name, String version) throws Exception {
+        featuresService.uninstallFeature(name, version);
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void setFeaturesService(FeaturesService featuresService) {
+        this.featuresService = featuresService;
+    }
+
+    public FeaturesListener getFeaturesListener() {
+        return new FeaturesListener() {
+            public void featureEvent(FeatureEvent event) {
+                if (!event.isReplay()) {
+                    Notification notification = new Notification(FEATURE_EVENT_TYPE, objectName, sequenceNumber++);
+                    notification.setUserData(new JmxFeatureEvent(event).asCompositeData());
+                    sendNotification(notification);
+                }
+            }
+            public void repositoryEvent(RepositoryEvent event) {
+                if (!event.isReplay()) {
+                    Notification notification = new Notification(REPOSITORY_EVENT_TYPE, objectName, sequenceNumber++);
+                    notification.setUserData(new JmxRepositoryEvent(event).asCompositeData());
+                    sendNotification(notification);
+                }
+            }
+            
+            public boolean equals(Object o) {
+            	if (this == o) {
+            		return true;
+            	}
+            	return o.equals(this);
+              }
+
+        };
+    }
+
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return getBroadcastInfo();
+    }
+
+    private static MBeanNotificationInfo[] getBroadcastInfo() {
+        String type = Notification.class.getCanonicalName();
+        MBeanNotificationInfo info1 = new MBeanNotificationInfo(new String[] {FEATURE_EVENT_EVENT_TYPE},
+            type, "Some features notification");
+        MBeanNotificationInfo info2 = new MBeanNotificationInfo(new String[] {REPOSITORY_EVENT_EVENT_TYPE},
+            type, "Some repository notification");
+        return new MBeanNotificationInfo[] {info1, info2};
+    }
+
+}
diff --git a/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/internal/StandardEmitterMBean.java b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/internal/StandardEmitterMBean.java
new file mode 100644
index 0000000..58f587c
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/java/org/apache/karaf/features/management/internal/StandardEmitterMBean.java
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.features.management.internal;
+
+import javax.management.*;
+
+public class StandardEmitterMBean extends StandardMBean implements NotificationEmitter {
+
+    private final NotificationBroadcasterSupport emitter;
+
+    public StandardEmitterMBean(Class mbeanInterface) throws NotCompliantMBeanException {
+        super(mbeanInterface);
+        this.emitter = new NotificationBroadcasterSupport() {
+            @Override
+            public MBeanNotificationInfo[] getNotificationInfo() {
+                return StandardEmitterMBean.this.getNotificationInfo();
+            }
+        };
+    }
+
+    public void sendNotification(Notification notification) {
+        emitter.sendNotification(notification);
+    }
+
+
+    public void removeNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws ListenerNotFoundException {
+        emitter.removeNotificationListener(listener, filter, handback);
+    }
+
+    public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback) throws IllegalArgumentException {
+        emitter.addNotificationListener(listener, filter, handback);
+    }
+
+    public void removeNotificationListener(NotificationListener listener) throws ListenerNotFoundException {
+        emitter.removeNotificationListener(listener);
+    }
+
+    public MBeanNotificationInfo[] getNotificationInfo() {
+        return new MBeanNotificationInfo[0];
+    }
+
+    @Override
+    public MBeanInfo getMBeanInfo() {
+        MBeanInfo mbeanInfo = super.getMBeanInfo();
+        if (mbeanInfo != null) {
+            MBeanNotificationInfo[] notificationInfo = getNotificationInfo();
+            mbeanInfo = new MBeanInfo(mbeanInfo.getClassName(), mbeanInfo.getDescription(), mbeanInfo.getAttributes(),
+                    mbeanInfo.getConstructors(), mbeanInfo.getOperations(), notificationInfo);
+        }
+        return mbeanInfo;
+    }
+
+}
diff --git a/karaf-2.2.x/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml b/karaf-2.2.x/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml
new file mode 100644
index 0000000..e6a53ee
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml
@@ -0,0 +1,42 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="eager">
+
+    <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService" />
+
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegister" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer" />
+    </reference>
+
+    <bean id="mbeanImpl" class="org.apache.karaf.features.management.internal.FeaturesServiceMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext" />
+        <property name="featuresService" ref="featuresService" />
+    </bean>
+
+    <bean id="mbeanRegister" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=features,name=${karaf.name}"
+                    key-ref="mbeanImpl" />
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
diff --git a/karaf-2.2.x/features/management/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/features/management/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..13fed77
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,23 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides MBean to manipulate Karaf features via JMX.
+
+    In particular it provides the FeaturesServiceMBean supporting the following operations:
+    \u001B[36mgetFeatures()\u001B[0m Gets the list of features with the current status (installed or uninstalled).
+    \u001B[36mgetRepositories()\u001B[0m Gets the list of features repositories.
+    \u001B[36maddRepository(url)\u001B[0m Adds a new repository URL in the repositories set.
+    \u001B[36mremoveRepository(url)\u001B[0m Removes a repository URL from the repositories set.
+    \u001B[36minstallFeature(name)\u001B[0m Installs a feature identified by name.
+    \u001B[36minstallFeature(name, version)\u001B[0m Installs a feature identified by name and version.
+    \u001B[36muninstallFeature(name)\u001B[0m Uninstalls a feature identified by name.
+    \u001B[36muninstallFeature(name, version)\u001B[0m Uninstalls a feature identified by name and version.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mProvisioning\u001B[0m and \u001B[Remote Management via JMX\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/features/management/src/test/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImplTest.java b/karaf-2.2.x/features/management/src/test/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImplTest.java
new file mode 100644
index 0000000..0a8a00e
--- /dev/null
+++ b/karaf-2.2.x/features/management/src/test/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImplTest.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.features.management.internal;
+
+import org.junit.Test;
+
+public class FeaturesServiceMBeanImplTest {
+
+    @Test
+    public void testInstantiation() throws Exception {
+        new FeaturesServiceMBeanImpl();
+    }
+}
diff --git a/karaf-2.2.x/features/obr/NOTICE b/karaf-2.2.x/features/obr/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/features/obr/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/features/obr/pom.xml b/karaf-2.2.x/features/obr/pom.xml
new file mode 100644
index 0000000..90de79a
--- /dev/null
+++ b/karaf-2.2.x/features/obr/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.features</groupId>
+        <artifactId>features</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.features.obr</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Features :: OBR Resolver</name>
+    <description>This bundle provide OBR (OSGi Bundle Repository) support for Karaf features.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.features.obr.internal;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java b/karaf-2.2.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java
new file mode 100644
index 0000000..ac48da8
--- /dev/null
+++ b/karaf-2.2.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java
@@ -0,0 +1,95 @@
+/*
+ * 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.karaf.features.obr.internal;
+
+import org.apache.karaf.features.BundleInfo;
+
+/**
+ * A holder of bundle info
+ */
+public class BundleInfoImpl implements BundleInfo {
+
+    private int startLevel;
+    private String location;
+    private boolean start;
+    private boolean dependency;
+
+
+    public BundleInfoImpl() {
+    }
+
+    public BundleInfoImpl(String location) {
+    	this.location = location;
+    }
+
+
+    public BundleInfoImpl(String location, boolean start) {
+    	this.location = location;
+        this.start = start;
+    }
+
+    public BundleInfoImpl(String location, int startLevel) {
+    	this.location = location;
+        this.startLevel = startLevel;
+    }
+
+    public BundleInfoImpl(String location, int startLevel, boolean start) {
+    	this.location = location;
+        this.startLevel = startLevel;
+        this.start = start;
+    }
+
+    public BundleInfoImpl(String location, int startLevel, boolean start, boolean dependency) {
+        this.location = location;
+        this.startLevel = startLevel;
+        this.start = start;
+        this.dependency = dependency;
+    }
+
+    public void setStartLevel(Integer startLevel) {
+    	this.startLevel = startLevel;
+    }
+
+    public int getStartLevel() {
+		return this.startLevel;
+	}
+
+	public void setName(String location) {
+		this.location = location;
+	}
+
+	public String getLocation() {
+		return this.location;
+	}
+
+	public void setStart(boolean start) {
+		this.start = start;
+	}
+
+	public boolean isStart() {
+		return start;
+	}
+
+    public void setDependency(boolean dependency) {
+        this.dependency = dependency;
+    }
+
+    public boolean isDependency() {
+        return dependency;
+    }
+
+}
diff --git a/karaf-2.2.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java b/karaf-2.2.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
new file mode 100644
index 0000000..45d2895
--- /dev/null
+++ b/karaf-2.2.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.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.karaf.features.obr.internal;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.bundlerepository.Reason;
+import org.apache.felix.bundlerepository.Repository;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.Resolver;
+
+public class ObrResolver implements Resolver {
+
+    private RepositoryAdmin repositoryAdmin;
+    private boolean resolveOptionalImports;
+
+    public RepositoryAdmin getRepositoryAdmin() {
+        return repositoryAdmin;
+    }
+
+    public void setRepositoryAdmin(RepositoryAdmin repositoryAdmin) {
+        this.repositoryAdmin = repositoryAdmin;
+    }
+
+    public boolean isResolveOptionalImports() {
+        return resolveOptionalImports;
+    }
+
+    /**
+     * When set to <code>true</code>, the OBR resolver will try to resolve optional imports as well.
+     * Defaults to <code>false</code>
+     *
+     * @param resolveOptionalImports
+     */
+    public void setResolveOptionalImports(boolean resolveOptionalImports) {
+        this.resolveOptionalImports = resolveOptionalImports;
+    }
+
+    public List<BundleInfo> resolve(Feature feature) throws Exception {
+        List<Requirement> reqs = new ArrayList<Requirement>();
+        List<Resource> ress = new ArrayList<Resource>();
+        List<Resource> deploy = new ArrayList<Resource>();
+        Map<Object, BundleInfo> infos = new HashMap<Object, BundleInfo>();
+        for (BundleInfo bundleInfo : feature.getBundles()) {
+        	URL url = null;
+            try {
+                url = new URL(bundleInfo.getLocation());
+            } catch (MalformedURLException e) {
+                Requirement req = parseRequirement(bundleInfo.getLocation());
+                reqs.add(req);
+                infos.put(req, bundleInfo);
+            }
+            if (url != null) {
+            	Resource res = repositoryAdmin.getHelper().createResource(url);
+            	ress.add(res);
+            	infos.put(res, bundleInfo);
+            }
+        }
+
+        Repository repository = repositoryAdmin.getHelper().repository(ress.toArray(new Resource[ress.size()]));
+        List<Repository> repos = new ArrayList<Repository>();
+        repos.add(repositoryAdmin.getSystemRepository());
+        repos.add(repositoryAdmin.getLocalRepository());
+        repos.add(repository);
+        repos.addAll(Arrays.asList(repositoryAdmin.listRepositories()));
+        org.apache.felix.bundlerepository.Resolver resolver = repositoryAdmin.resolver(repos.toArray(new Repository[repos.size()]));
+
+        for (Resource res : ress) {
+            if (!infos.get(res).isDependency()) {
+                resolver.add(res);
+            }
+        }
+        for (Requirement req : reqs) {
+            resolver.add(req);
+        }
+
+        if (!doResolve(resolver)) {
+            StringWriter w = new StringWriter();
+            PrintWriter out = new PrintWriter(w);
+            Reason[] failedReqs = resolver.getUnsatisfiedRequirements();
+            if ((failedReqs != null) && (failedReqs.length > 0)) {
+                out.println("Unsatisfied requirement(s):");
+                printUnderline(out, 27);
+                for (Reason r : failedReqs) {
+                    out.println("   " + r.getRequirement().getName() + ":" + r.getRequirement().getFilter());
+                    out.println("      " + r.getResource().getPresentationName());
+                }
+            } else {
+                out.println("Could not resolve targets.");
+            }
+            out.flush();
+            throw new Exception("Can not resolve feature:\n" + w.toString());
+        }
+
+        List<BundleInfo> bundles = new ArrayList<BundleInfo>();
+        Collections.addAll(deploy, resolver.getAddedResources());
+        Collections.addAll(deploy, resolver.getRequiredResources());
+        if (resolveOptionalImports) {
+            Collections.addAll(deploy, resolver.getOptionalResources());
+        }
+        for (Resource res : deploy) {
+            BundleInfo info = infos.get(res);
+            if (info == null) {
+                Reason[] reasons = resolver.getReason(res);
+                if (reasons != null) {
+                    for (Reason r : reasons) {
+                        info = infos.get(r);
+                        if (info != null) {
+                            break;
+                        }
+                    }
+                }
+            }
+            if (info == null) {
+                info = new BundleInfoImpl(res.getURI());
+            }
+            bundles.add(info);
+        }
+        return bundles;
+    }
+
+    private boolean doResolve(org.apache.felix.bundlerepository.Resolver resolver) {
+        if (resolveOptionalImports) {
+            return resolver.resolve();
+        } else {
+            return resolver.resolve(org.apache.felix.bundlerepository.Resolver.NO_OPTIONAL_RESOURCES);
+        }
+    }
+
+    protected void printUnderline(PrintWriter out, int length) {
+        for (int i = 0; i < length; i++) {
+            out.print('-');
+        }
+        out.println("");
+    }
+
+    protected Requirement parseRequirement(String req) {
+        int p = req.indexOf(':');
+        String name;
+        String filter;
+        if (p > 0) {
+            name = req.substring(0, p);
+            filter = req.substring(p + 1);
+        } else {
+            if (req.contains("package")) {
+                name = "package";
+            } else if (req.contains("service")) {
+                name = "service";
+            } else {
+                name = "bundle";
+            }
+            filter = req;
+        }
+        if (!filter.startsWith("(")) {
+            filter = "(" + filter + ")";
+        }
+        return repositoryAdmin.getHelper().requirement(name, filter);
+    }
+}
diff --git a/karaf-2.2.x/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml b/karaf-2.2.x/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml
new file mode 100644
index 0000000..a9bd16d
--- /dev/null
+++ b/karaf-2.2.x/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml
@@ -0,0 +1,46 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <ext:property-placeholder placeholder-prefix="$(" placeholder-suffix=")"/>
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" ignore-missing-locations="true">
+        <ext:default-properties>
+            <ext:property name="resolveOptionalImports" value="false"/>
+        </ext:default-properties>
+        <ext:location>file:$(karaf.base)/etc/org.apache.karaf.features.obr.cfg</ext:location>
+    </ext:property-placeholder>
+
+    <bean id="obrResolver" class="org.apache.karaf.features.obr.internal.ObrResolver">
+        <property name="repositoryAdmin" ref="repositoryAdmin" />
+        <property name="resolveOptionalImports" value="$[resolveOptionalImports]" />
+    </bean>
+
+    <reference id="repositoryAdmin" interface="org.apache.felix.bundlerepository.RepositoryAdmin" />
+
+    <service ref="obrResolver" interface="org.apache.karaf.features.Resolver">
+        <service-properties>
+            <entry key="name" value="obr" />
+        </service-properties>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/features/obr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/features/obr/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..0a73a45
--- /dev/null
+++ b/karaf-2.2.x/features/obr/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides the OBR (OSGi Bundle Repository) support for Karaf features.
+
+    It allows you to use an OBR resolver for bundle.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mProvisioning\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java b/karaf-2.2.x/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java
new file mode 100644
index 0000000..31c9956
--- /dev/null
+++ b/karaf-2.2.x/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java
@@ -0,0 +1,174 @@
+/*
+ * 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.karaf.features.obr.internal;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.bundlerepository.Reason;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.bundlerepository.Resolver;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.bundlerepository.impl.DataModelHelperImpl;
+import org.apache.felix.bundlerepository.impl.ReasonImpl;
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.internal.FeatureImpl;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+import org.junit.Test;
+
+public class ObrResolverTest {
+
+    @Test
+    public void testResolver() throws Exception {
+        final String requirement = "bundle:(&(symbolicname=org.apache.camel.camel-blueprint)(version>=2.4.0)(version<2.4.1))";
+
+        final FeatureImpl f = new FeatureImpl("f1", "1.0");
+        f.setResolver("obr");
+        f.addBundle(new BundleInfoImpl(requirement));
+        final RepositoryAdmin admin = createMock(RepositoryAdmin.class);
+        final Resolver resolver = createMock(Resolver.class);
+        final Resource resource = createMock(Resource.class);
+        final ObrResolver obrResolver = new ObrResolver();
+        obrResolver.setRepositoryAdmin(admin);
+
+        final Capture<Requirement> captureReq = new Capture<Requirement>();
+
+        expect(admin.getHelper()).andReturn(new DataModelHelperImpl()).anyTimes();
+        expect(admin.getSystemRepository()).andReturn(createMock(org.apache.felix.bundlerepository.Repository.class));
+        expect(admin.getLocalRepository()).andReturn(createMock(org.apache.felix.bundlerepository.Repository.class));
+        expect(admin.listRepositories()).andReturn(new org.apache.felix.bundlerepository.Repository[0]);
+        expect(admin.resolver(EasyMock.<org.apache.felix.bundlerepository.Repository[]>anyObject())).andReturn(resolver);
+        resolver.add(EasyMock.capture(captureReq));
+        expect(resolver.resolve(Resolver.NO_OPTIONAL_RESOURCES)).andReturn(true);
+        expect(resolver.getAddedResources()).andReturn(new Resource[] { });
+        expect(resolver.getRequiredResources()).andReturn(new Resource[] { resource });
+        expect(resolver.getReason(resource)).andAnswer(new IAnswer<Reason[]>() {
+            public Reason[] answer() throws Throwable {
+                return new Reason[] { new ReasonImpl( resource, captureReq.getValue()) };
+            }
+        });
+        expect(resource.getURI()).andReturn("foo:bar");
+        replay(admin, resolver, resource);
+
+        List<BundleInfo> bundles = obrResolver.resolve(f);
+        assertNotNull(bundles);
+        assertEquals(1, bundles.size());
+        assertEquals("foo:bar", bundles.get(0).getLocation());
+        assertEquals(obrResolver.parseRequirement(requirement).toString(), captureReq.getValue().toString());
+        verify(admin, resolver, resource);
+    }
+
+    @Test
+    public void testResolverWithOptionalImports() throws Exception {
+        final String requirement = "bundle:(&(symbolicname=org.apache.camel.camel-blueprint)(version>=2.4.0)(version<2.4.1))";
+
+        final FeatureImpl f = new FeatureImpl("f1", "1.0");
+        f.setResolver("obr");
+        f.getBundles().add(new BundleInfoImpl(requirement));
+        final RepositoryAdmin admin = createMock(RepositoryAdmin.class);
+        final Resolver resolver = createMock(Resolver.class);
+        final Resource resource = createMock(Resource.class);
+        final Resource optionalResource = createMock(Resource.class);
+        final ObrResolver obrResolver = new ObrResolver();
+        obrResolver.setRepositoryAdmin(admin);
+        obrResolver.setResolveOptionalImports(true);
+
+        final Capture<Requirement> captureReq = new Capture<Requirement>();
+
+        expect(admin.getHelper()).andReturn(new DataModelHelperImpl()).anyTimes();
+        expect(admin.getSystemRepository()).andReturn(createMock(org.apache.felix.bundlerepository.Repository.class));
+        expect(admin.getLocalRepository()).andReturn(createMock(org.apache.felix.bundlerepository.Repository.class));
+        expect(admin.listRepositories()).andReturn(new org.apache.felix.bundlerepository.Repository[0]);
+        expect(admin.resolver(EasyMock.<org.apache.felix.bundlerepository.Repository[]>anyObject())).andReturn(resolver);
+        resolver.add(EasyMock.capture(captureReq));
+        expect(resolver.resolve()).andReturn(true);
+        expect(resolver.getAddedResources()).andReturn(new Resource[] { });
+        expect(resolver.getRequiredResources()).andReturn(new Resource[] { resource });
+        expect(resolver.getOptionalResources()).andReturn(new Resource[] { optionalResource});
+        expect(resolver.getReason(resource)).andAnswer(new IAnswer<Reason[]>() {
+            public Reason[] answer() throws Throwable {
+                return new Reason[] { new ReasonImpl( resource, captureReq.getValue()) };
+            }
+        });
+        expect(resolver.getReason(optionalResource)).andAnswer(new IAnswer<Reason[]>() {
+            public Reason[] answer() throws Throwable {
+                return new Reason[] { new ReasonImpl( optionalResource, captureReq.getValue()) };
+            }
+        });
+        expect(resource.getURI()).andReturn("foo:bar");
+        expect(optionalResource.getURI()).andReturn("foo:optional:baz");
+        replay(admin, resolver, resource, optionalResource);
+
+        List<BundleInfo> bundles = obrResolver.resolve(f);
+        assertNotNull(bundles);
+        assertEquals(2, bundles.size());
+        assertEquals("foo:bar", bundles.get(0).getLocation());
+        assertEquals("foo:optional:baz", bundles.get(1).getLocation());
+        assertEquals(obrResolver.parseRequirement(requirement).toString(), captureReq.getValue().toString());
+        verify(admin, resolver, resource);
+    }
+    
+    /**
+     * Test resolving a mvn url when pax url is configured with a repo that contains no protocol like: "test"
+     * We expect to get a MalFormedUrlException not a IllegalArgumentException as in the issue 
+     * @throws Exception
+     */
+    @Test(expected=MalformedURLException.class)
+    public void testResolverWithInvalidMvnRepoIssueKaraf667() throws Exception {
+        final FeatureImpl f = new FeatureImpl("f1", "1.0");
+        f.setResolver("obr");
+        // Using file instead of mvn: as we do not want to mess with URL handlers
+        f.addBundle(new BundleInfoImpl("file:org.foo/foo/1.0"));
+
+        final RepositoryAdmin admin = createMock(RepositoryAdmin.class);
+        final Resolver resolver = createMock(Resolver.class);
+        final Resource resource = createMock(Resource.class);
+        final ObrResolver obrResolver = new ObrResolver();
+        obrResolver.setRepositoryAdmin(admin);
+
+        expect(admin.getHelper()).andReturn(new DummyDataModelHelper()).anyTimes();
+        replay(admin, resolver, resource);
+
+       	obrResolver.resolve(f);
+    }
+    
+    /**
+     * Recreates behaviour of DataModelHelper when an invalid maven url is set for pax url repos
+     * TODO Remove as soon as DataModelHelper does not throw this exception any more  
+     */
+    class DummyDataModelHelper extends DataModelHelperImpl {
+
+		@Override
+		public Resource createResource(URL bundleUrl) throws IOException {
+			throw new MalformedURLException("Missing protocol");
+		}
+
+    	
+    }
+}
diff --git a/karaf-2.2.x/features/pom.xml b/karaf-2.2.x/features/pom.xml
new file mode 100644
index 0000000..aa199d6
--- /dev/null
+++ b/karaf-2.2.x/features/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.features</groupId>
+    <artifactId>features</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Features</name>
+
+    <modules>
+        <module>core</module>
+        <module>command</module>
+        <module>management</module>
+        <module>obr</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/itests/NOTICE b/karaf-2.2.x/itests/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/itests/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/itests/dependencies/pom.xml b/karaf-2.2.x/itests/dependencies/pom.xml
new file mode 100644
index 0000000..7c9d976
--- /dev/null
+++ b/karaf-2.2.x/itests/dependencies/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.itests</groupId>
+        <artifactId>itests</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>dependencies</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Integration Tests :: Dependencies</name>
+
+    <dependencies>
+        <dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.main</artifactId>
+			<version>3.0.2</version>
+        </dependency>
+        <dependency>
+			<groupId>org.ops4j.pax.exam</groupId>
+			<artifactId>pax-exam-container-default</artifactId>
+			<version>${pax.exam.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/karaf-2.2.x/itests/kittests/pom.xml b/karaf-2.2.x/itests/kittests/pom.xml
new file mode 100644
index 0000000..f3d7d6c
--- /dev/null
+++ b/karaf-2.2.x/itests/kittests/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.itests</groupId>
+        <artifactId>itests</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>kittests</artifactId>
+    <packaging>jar</packaging>
+    <name>Apache Karaf :: Integration Tests :: Kit Tests</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <!-- This is required to be first so that pax-exam classloader is not messed up with a newer version of felix
+              which would lead to java.lang.RuntimeException: Could not create [service.obr] -->
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf</artifactId>
+            <type>tar.gz</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf</artifactId>
+            <type>zip</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.1</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.3.2</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- generate dependencies versions -->
+            <plugin>
+                <groupId>org.apache.servicemix.tooling</groupId>
+                <artifactId>depends-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-depends-file</id>
+                        <goals>
+                            <goal>generate-depends-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-unix</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>apache-karaf</artifactId>
+                                    <type>tar.gz</type>
+                                    <outputDirectory>target/distributions</outputDirectory>
+                                    <destFileName>karaf.tar.gz</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>copy-win</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.karaf</groupId>
+                                    <artifactId>apache-karaf</artifactId>
+                                    <type>zip</type>
+                                    <outputDirectory>target/distributions</outputDirectory>
+                                    <destFileName>karaf.zip</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-resource</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>add-resource</goal>
+                        </goals>
+                        <configuration>
+                            <resources>
+                                <resource>
+                                    <directory>target/distributions</directory>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>ci-build-profile</id>
+            <activation>
+                <property>
+                    <name>maven.repo.local</name>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <!-- when the local repo location has been specified, we need to pass on this information to PAX mvn url -->
+                            <argLine>-Dorg.ops4j.pax.url.mvn.localRepository=${maven.repo.local}</argLine>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/karaf-2.2.x/itests/kittests/src/test/java/org/apache/karaf/kittests/Helper.java b/karaf-2.2.x/itests/kittests/src/test/java/org/apache/karaf/kittests/Helper.java
new file mode 100644
index 0000000..73da121
--- /dev/null
+++ b/karaf-2.2.x/itests/kittests/src/test/java/org/apache/karaf/kittests/Helper.java
@@ -0,0 +1,341 @@
+/*
+ * 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.karaf.kittests;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.ArchiveInputStream;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.felix.utils.properties.InterpolationHelper;
+import org.apache.karaf.util.process.PumpStreamHandler;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+public final class Helper {
+
+    private Helper() {
+    }
+
+    public static class Instance {
+        public static final String STOPPED = "Stopped";
+        public static final String STARTING = "Starting";
+        public static final String STARTED = "Started";
+        public static final String ERROR = "Error";
+
+        private static final String CONFIG_PROPERTIES_FILE_NAME = "config.properties";
+        private static final String KARAF_SHUTDOWN_PORT = "karaf.shutdown.port";
+        private static final String KARAF_SHUTDOWN_HOST = "karaf.shutdown.host";
+        private static final String KARAF_SHUTDOWN_PORT_FILE = "karaf.shutdown.port.file";
+        private static final String KARAF_SHUTDOWN_COMMAND = "karaf.shutdown.command";
+        private static final String KARAF_SHUTDOWN_PID_FILE = "karaf.shutdown.pid.file";
+        private static final String DEFAULT_SHUTDOWN_COMMAND = "SHUTDOWN";
+
+        private String location;
+        private Process process;
+
+        public Instance(String location, Process process) {
+            this.location = location;
+            this.process = process;
+        }
+
+        public boolean exists() {
+            return new File(location).isDirectory();
+        }
+
+        public int getSshPort() {
+            InputStream is = null;
+            try {
+                File f = new File(location, "etc/org.apache.karaf.shell.cfg");
+                is = new FileInputStream(f);
+                Properties props = new Properties();
+                props.load(is);
+                String loc = props.getProperty("sshPort");
+                return Integer.parseInt(loc);
+            } catch (Exception e) {
+                return 0;
+            } finally {
+                if (is != null) {
+                    try {
+                        is.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+                }
+            }
+        }
+
+        public synchronized String getState() {
+            int port = getSshPort();
+            if (!exists() || port <= 0) {
+                return ERROR;
+            }
+            checkProcess();
+            if (this.process == null) {
+                return STOPPED;
+            } else {
+                try {
+                    Socket s = new Socket("localhost", port);
+                    s.close();
+                    return STARTED;
+                } catch (Exception e) {
+                    // ignore
+                }
+                return STARTING;
+            }
+        }
+
+        protected void checkProcess() {
+            if (this.process != null) {
+                try {
+                    this.process.exitValue();
+                    this.process = null;
+                } catch (IllegalThreadStateException e) {
+                }
+            }
+        }
+
+        private static String getProperty(Map<String,String> props, String key, String deflt) {
+            String res = props.get(key);
+            if (res == null) {
+                res = deflt;
+            }
+            return res;
+        }
+
+        public void stop() throws Exception {
+            checkProcess();
+            if (this.process != null) {
+                // Try a clean shutdown
+                cleanShutdown();
+                if (this.process != null) {
+                    this.process.destroy();
+                }
+            }
+        }
+
+        protected void cleanShutdown() {
+            try {
+                File file = new File(new File(location, "etc"), CONFIG_PROPERTIES_FILE_NAME);
+                URL configPropURL = file.toURI().toURL();
+                Map<String,String> props = loadPropertiesFile(configPropURL);
+                props.put("karaf.base", new File(location).getCanonicalPath());
+                props.put("karaf.home", new File(location).getCanonicalPath());
+                props.put("karaf.data", new File(new File(location), "data").getCanonicalPath());
+                InterpolationHelper.performSubstitution(props);
+                int port = Integer.parseInt(getProperty(props, KARAF_SHUTDOWN_PORT, "0"));
+                String host = getProperty(props, KARAF_SHUTDOWN_HOST, "localhost");
+                String portFile = props.get(KARAF_SHUTDOWN_PORT_FILE);
+                String shutdown = getProperty(props, KARAF_SHUTDOWN_COMMAND, DEFAULT_SHUTDOWN_COMMAND);
+                if (port == 0 && portFile != null) {
+                    BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(portFile)));
+                    String portStr = r.readLine();
+                    port = Integer.parseInt(portStr);
+                    r.close();
+                }
+                // We found the port, try to send the command
+                if (port > 0) {
+                    Socket s = new Socket(host, port);
+                    s.getOutputStream().write(shutdown.getBytes());
+                    s.close();
+                    long t = System.currentTimeMillis() + 5000;
+                    do {
+                        Thread.sleep(100);
+                        checkProcess();
+                    } while (System.currentTimeMillis() < t && process != null);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        protected static Map<String,String> loadPropertiesFile(URL configPropURL) throws Exception {
+            // Read the properties file.
+            Properties configProps = new Properties();
+            InputStream is = null;
+            try {
+                is = configPropURL.openConnection().getInputStream();
+                configProps.load(is);
+                is.close();
+            }
+            catch (Exception ex) {
+                System.err.println(
+                        "Error loading config properties from " + configPropURL);
+                System.err.println("Main: " + ex);
+                try {
+                    if (is != null) is.close();
+                }
+                catch (IOException ex2) {
+                    // Nothing we can do.
+                }
+                return null;
+            }
+            return (Map) configProps;
+        }
+
+    }
+
+    protected static final boolean IS_WINDOWS_OS = System.getProperty("os.name").toLowerCase().contains("windows");
+
+    public static void extractKit(File targetDir) throws Exception {
+        if (isWindowsOs()) {
+            extractWindowsKit(targetDir);
+        } else {
+            extractUnixKit(targetDir);
+        }
+    }
+
+    public static boolean isWindowsOs() {
+        return IS_WINDOWS_OS;
+    }
+
+    protected static void extractWindowsKit(File targetDir) throws Exception {
+        InputStream is = Helper.class.getResourceAsStream("/karaf.zip");
+        extract(new ZipArchiveInputStream(is), targetDir);
+    }
+
+    protected static void extractUnixKit(File targetDir) throws Exception {
+        InputStream is = Helper.class.getResourceAsStream("/karaf.tar.gz");
+        extract(new TarArchiveInputStream(new GzipCompressorInputStream(is)), targetDir);
+        File bin = new File(targetDir, "bin");
+        String[] files = bin.list();
+        List<String> args = new ArrayList();
+        Collections.addAll(args, "chmod", "+x");
+        Collections.addAll(args, files);
+        Process chmod = new ProcessBuilder()
+            .directory(new File(targetDir, "bin"))
+            .command(args)
+            .start();
+        PumpStreamHandler pump = new PumpStreamHandler(System.in, System.out, System.err);
+        pump.attach(chmod);
+        pump.start();
+        waitForProcessEnd(chmod, 5000);
+    }
+
+    protected static void extract(ArchiveInputStream is, File targetDir) throws IOException {
+        try {
+            if (targetDir.exists()) {
+                FileUtils.forceDelete(targetDir);
+            }
+            targetDir.mkdirs();
+            ArchiveEntry entry = is.getNextEntry();
+            while (entry != null) {
+                String name = entry.getName();
+                name = name.substring(name.indexOf("/") + 1);
+                File file = new File(targetDir, name);
+                if (entry.isDirectory()) {
+                    file.mkdirs();
+                } else {
+                    file.getParentFile().mkdirs();
+                    OutputStream os = new FileOutputStream(file);
+                    try {
+                        IOUtils.copy(is, os);
+                    } finally {
+                        IOUtils.closeQuietly(os);
+                    }
+                }
+                entry = is.getNextEntry();
+            }
+        } finally {
+            is.close();
+        }
+    }
+
+    public static Process launchScript(File homeDir, String script, String args) throws IOException {
+        ProcessBuilder builder = new ProcessBuilder();
+        builder.directory(homeDir);
+        if (isWindowsOs()) {
+            builder.command("cmd.exe", "/c", new File(homeDir, "bin\\" + script + ".bat").getAbsolutePath(), args);
+        } else {
+            builder.command("/bin/sh", new File(homeDir, "bin/" + script).getAbsolutePath(), args);
+        }
+        builder.redirectErrorStream(true);
+        Process process = builder.start();
+        PumpStreamHandler pump = new PumpStreamHandler(System.in, System.out, System.err);
+        pump.attach(process);
+        pump.start();
+        return process;
+    }
+
+    public static Instance startKaraf(File home) throws Exception {
+        Process karaf = launchScript(home, "karaf", "server");
+        return new Instance(home.getAbsolutePath(), karaf);
+//        InstanceImpl instance = new InstanceImpl(null, "root", home.getAbsolutePath(), null, true);
+//        instance.attach(karaf.getPid());
+//        return instance;
+    }
+
+    public static void waitForKarafStarted(Instance karaf, long timeout) throws Exception {
+        for (int i = 0; i < timeout / 100; i++) {
+            if (Instance.STARTING.equals(karaf.getState())) {
+                Thread.sleep(100);
+            } else {
+                break;
+            }
+        }
+        if (!Instance.STARTED.equals(karaf.getState())) {
+            throw new Exception("Karaf did not start correctly");
+        }
+    }
+
+    public static void waitForKarafStopped(Instance karaf, long timeout) throws Exception {
+        waitForProcessEnd(karaf.process, timeout);
+    }
+
+    public static void waitForProcessEnd(Process process, long timeout) throws Exception {
+        for (int i = 0; i < timeout / 100; i++) {
+            try {
+                process.exitValue();
+                return;
+            } catch (IllegalThreadStateException e) {
+            }
+            Thread.sleep(100);
+        }
+        throw new Exception("Process is still running");
+    }
+
+    public static void kill(Process process) {
+        try {
+            process.destroy();
+        } catch (Throwable e) {
+        }
+    }
+
+    public static void kill(Instance instance) {
+        try {
+            instance.stop();
+        } catch (Throwable e) {
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/itests/kittests/src/test/java/org/apache/karaf/kittests/KitTest.java b/karaf-2.2.x/itests/kittests/src/test/java/org/apache/karaf/kittests/KitTest.java
new file mode 100644
index 0000000..f277898
--- /dev/null
+++ b/karaf-2.2.x/itests/kittests/src/test/java/org/apache/karaf/kittests/KitTest.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.karaf.kittests;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.apache.karaf.kittests.Helper.*;
+
+public class KitTest {
+
+    @Test
+    public void testKit() throws Exception {
+        File home = new File("target/karaf").getAbsoluteFile();
+        System.out.println("Karaf home: " + home);
+        System.out.println("Extracting Karaf");
+        extractKit(home);
+
+        System.out.println("Starting Karaf");
+        Instance karaf = startKaraf(home);
+        try {
+            System.out.println("Wait for Karaf to be started");
+            waitForKarafStarted(karaf, 20000);
+
+            System.out.println("Launching stop script to shutdown");
+            Process client = launchScript(home, "stop", "");
+            try {
+                waitForProcessEnd(client, 20000);
+                System.out.println("Client terminated");
+            } finally {
+                kill(client);
+            }
+
+            System.out.println("Waiting for karaf to stop");
+            waitForKarafStopped(karaf, 20000);
+            System.out.println("Karaf stopped");
+
+        } finally {
+            kill(karaf);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/itests/pom.xml b/karaf-2.2.x/itests/pom.xml
new file mode 100644
index 0000000..3cfeb30
--- /dev/null
+++ b/karaf-2.2.x/itests/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.itests</groupId>
+    <artifactId>itests</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Integration Tests</name>
+
+    <modules>
+        <module>dependencies</module>
+        <module>tests</module>
+        <module>kittests</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/itests/tests/pom.xml b/karaf-2.2.x/itests/tests/pom.xml
new file mode 100644
index 0000000..f75b806
--- /dev/null
+++ b/karaf-2.2.x/itests/tests/pom.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.itests</groupId>
+        <artifactId>itests</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tests</artifactId>
+    <packaging>jar</packaging>
+    <name>Apache Karaf :: Integration Tests :: ITests</name>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <!-- This is required to be first so that pax-exam classloader is not messed up with a newer version of felix
+              which would lead to java.lang.NoSuchMethodError: org.apache.felix.framework.Logger.<init>(I)V -->
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.framework</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!-- This is required to be first so that pax-exam classloader is not messed up with a newer version of felix
+              which would lead to java.lang.RuntimeException: Could not create [service.obr] -->
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+            <version>1.2.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.tooling</groupId>
+            <artifactId>org.apache.karaf.tooling.testing</artifactId>
+            <scope>test</scope>
+        </dependency>
+   </dependencies>
+
+    <build>
+        <plugins>
+            <!-- generate dependencies versions -->
+            <plugin>
+                <groupId>org.apache.servicemix.tooling</groupId>
+                <artifactId>depends-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-depends-file</id>
+                        <goals>
+                            <goal>generate-depends-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>ci-build-profile</id>
+            <activation>
+                <property>
+                   <name>maven.repo.local</name>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                           <!-- when the local repo location has been specified, we need to pass on this information to PAX mvn url -->
+                           <argLine>-Dorg.ops4j.pax.url.mvn.localRepository=${maven.repo.local}</argLine>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/karaf-2.2.x/itests/tests/src/test/java/org/apache/karaf/shell/itests/CoreTest.java b/karaf-2.2.x/itests/tests/src/test/java/org/apache/karaf/shell/itests/CoreTest.java
new file mode 100644
index 0000000..2088b27
--- /dev/null
+++ b/karaf-2.2.x/itests/tests/src/test/java/org/apache/karaf/shell/itests/CoreTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.karaf.shell.itests;
+
+import static org.apache.karaf.testing.Helper.felixProvisionalApis;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.ops4j.pax.exam.CoreOptions.equinox;
+import static org.ops4j.pax.exam.CoreOptions.felix;
+import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartup;
+import static org.ops4j.pax.exam.OptionUtils.combine;
+import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.testing.AbstractIntegrationTest;
+import org.apache.karaf.testing.Helper;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.Bundle;
+
+@RunWith(JUnit4TestRunner.class)
+public class CoreTest extends AbstractIntegrationTest {
+
+    @Test
+    public void testHelp() throws Exception {
+        Thread.sleep(10000);
+
+        CommandProcessor cp = getOsgiService(CommandProcessor.class);
+        CommandSession cs = cp.createSession(System.in, System.out, System.err);
+        cs.execute("osgi:list --help");
+        cs.close();
+    }
+
+    @Test
+    public void testInstallCommand() throws Exception {
+        Thread.sleep(12000);
+
+        CommandProcessor cp = getOsgiService(CommandProcessor.class);
+        CommandSession cs = cp.createSession(System.in, System.out, System.err);
+
+        try {
+            cs.execute("log:display");
+            fail("command should not exist");
+        } catch (IllegalArgumentException e) {
+            assertTrue(e.getMessage().indexOf("Command not found") >= 0);
+        }
+
+        Bundle b = getInstalledBundle("org.apache.karaf.shell.log");
+        b.start();
+
+        Thread.sleep(1000);
+
+        cs.execute("log:display");
+
+        b.stop();
+
+        Thread.sleep(1000);
+
+        try {
+            cs.execute("log:display");
+            fail("command should not exist");
+        } catch (IllegalArgumentException e) {
+            assertTrue(e.getMessage().indexOf("Command not found") >= 0);
+        }
+
+        cs.close();
+    }
+
+//    @Test
+//    public void testCommandGroup() throws Exception {
+//        Thread.sleep(5000);
+//
+//        Shell shell = getOsgiService(Shell.class);
+//        shell.execute("osgi");
+//        shell.execute("help");
+//        shell.execute("..");
+//    }
+//
+//    @Test
+//    public void testCommandGroupAfterInstall() throws Exception {
+//        Bundle b = getInstalledBundle("org.apache.karaf.shell.log");
+//        b.start();
+//
+//        Thread.sleep(5000);
+//
+//        Shell shell = getOsgiService(Shell.class);
+//        shell.execute("log");
+//        shell.execute("help");
+//        shell.execute("..");
+//    }
+//
+    @Configuration
+    public static Option[] configuration() throws Exception {
+        Option[] options = combine(
+            // Default karaf environment
+            Helper.getDefaultOptions(
+                // this is how you set the default log level when using pax logging (logProfile)
+                Helper.setLogLevel("TRACE")),
+
+            workingDirectory("target/paxrunner/core/"),
+
+            waitForFrameworkStartup(),
+
+            // Test on both equinox and felix
+            // TODO: pax-exam does not support the latest felix version :-(
+            // TODO: so we use the higher supported which should be the same
+            // TODO: as the one specified in itests/dependencies/pom.xml
+            equinox(), felix().version("3.0.2"),
+
+            felixProvisionalApis()
+        );
+        // Stop the shell log bundle
+        Helper.findMaven(options, "org.apache.karaf.shell", "org.apache.karaf.shell.log").noStart();
+        return options;
+    }
+
+
+}
diff --git a/karaf-2.2.x/itests/tests/src/test/java/org/apache/karaf/shell/itests/FeaturesTest.java b/karaf-2.2.x/itests/tests/src/test/java/org/apache/karaf/shell/itests/FeaturesTest.java
new file mode 100644
index 0000000..074a29e
--- /dev/null
+++ b/karaf-2.2.x/itests/tests/src/test/java/org/apache/karaf/shell/itests/FeaturesTest.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.karaf.shell.itests;
+
+import static org.apache.karaf.testing.Helper.felixProvisionalApis;
+import static org.junit.Assert.assertNotNull;
+import static org.ops4j.pax.exam.CoreOptions.equinox;
+import static org.ops4j.pax.exam.CoreOptions.felix;
+import static org.ops4j.pax.exam.CoreOptions.waitForFrameworkStartup;
+import static org.ops4j.pax.exam.OptionUtils.combine;
+import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.workingDirectory;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.testing.AbstractIntegrationTest;
+import org.apache.karaf.testing.Helper;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+@RunWith(JUnit4TestRunner.class)
+public class FeaturesTest extends AbstractIntegrationTest {
+
+    @Test
+    public void testFeatures() throws Exception {
+        // Make sure the command services are available
+        assertNotNull(getOsgiService(BlueprintContainer.class, "osgi.blueprint.container.symbolicname=org.apache.karaf.shell.obr", 20000));
+        assertNotNull(getOsgiService(BlueprintContainer.class, "osgi.blueprint.container.symbolicname=org.apache.karaf.shell.wrapper", 20000));
+        // Run some commands to make sure they are installed properly
+        CommandProcessor cp = getOsgiService(CommandProcessor.class);
+        CommandSession cs = cp.createSession(System.in, System.out, System.err);
+        cs.execute("obr:listUrl");
+        cs.execute("wrapper:install --help");
+        cs.close();
+    }
+
+    @Configuration
+    public static Option[] configuration() throws Exception{
+        return combine(
+            // Default karaf environment
+            Helper.getDefaultOptions(
+                // this is how you set the default log level when using pax logging (logProfile)
+                Helper.setLogLevel("DEBUG")),
+
+            // add two features
+            Helper.loadKarafStandardFeatures("obr", "wrapper"),
+
+            workingDirectory("target/paxrunner/features/"),
+
+            waitForFrameworkStartup(),
+
+            // Test on both equinox and felix
+            // TODO: pax-exam does not support the latest felix version :-(
+            // TODO: so we use the higher supported which should be the same
+            // TODO: as the one specified in itests/dependencies/pom.xml
+            equinox(), felix().version("3.0.2"),
+
+            felixProvisionalApis()
+        );
+    }
+
+}
diff --git a/karaf-2.2.x/itests/tests/src/test/resources/log4j.properties b/karaf-2.2.x/itests/tests/src/test/resources/log4j.properties
new file mode 100644
index 0000000..56221b8
--- /dev/null
+++ b/karaf-2.2.x/itests/tests/src/test/resources/log4j.properties
@@ -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.
+#
+################################################################################
+
+# Root logger
+log4j.rootLogger=INFO, stdout
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+log4j.appender.out.file=${karaf.data}/log/karaf.log
+log4j.appender.out.append=true
diff --git a/karaf-2.2.x/jaas/boot/NOTICE b/karaf-2.2.x/jaas/boot/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/jaas/boot/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/jaas/boot/pom.xml b/karaf-2.2.x/jaas/boot/pom.xml
new file mode 100644
index 0000000..6b8d39e
--- /dev/null
+++ b/karaf-2.2.x/jaas/boot/pom.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.jaas</groupId>
+        <artifactId>jaas</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.jaas.boot</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: JAAS :: Boot</name>
+    <description>Provides the JAAS classes loading at boot process.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java b/karaf-2.2.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java
new file mode 100644
index 0000000..6f65b5d
--- /dev/null
+++ b/karaf-2.2.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java
@@ -0,0 +1,107 @@
+/*
+ * 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.karaf.jaas.boot;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.spi.LoginModule;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * An OSGi proxy login module that should be used instead of a plain reference to
+ * a given login module.  Two properties must be set, the name of the login module
+ * class and the bundle to be used to load it.
+ * This class must be available from all modules, so it has to be either in a fragment
+ * bundle attached to the system bundle or be made available through the boot delegation
+ * class path.
+ */
+public class ProxyLoginModule implements LoginModule {
+
+    public static final String PROPERTY_MODULE = "org.apache.karaf.jaas.module";
+    public static final String PROPERTY_BUNDLE = "org.apache.karaf.jaas.bundle";
+
+    private static BundleContext bundleContext = null;
+    
+    private LoginModule target = null;
+
+    public static void init(BundleContext context) {
+        bundleContext = context;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.security.auth.spi.LoginModule#initialize(javax.security.auth.Subject, javax.security.auth.callback.CallbackHandler, java.util.Map, java.util.Map)
+     */
+    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
+        if (bundleContext == null) {
+            throw new IllegalStateException("ProxyLoginModule not initialized. Init must be called prior any invocation.");
+        }
+        Map<String,?> newOptions = new HashMap<String,Object>(options);
+        String module = (String) newOptions.remove(PROPERTY_MODULE);
+        if (module == null) {
+            throw new IllegalStateException("Option " + PROPERTY_MODULE + " must be set to the name of the factory service");
+        }
+        String bundleId = (String) newOptions.remove(PROPERTY_BUNDLE);
+        if (bundleId == null) {
+            throw new IllegalStateException("Option " + PROPERTY_BUNDLE + " must be set to the name of the factory service");
+        }
+        Bundle bundle = bundleContext.getBundle(Long.parseLong(bundleId));
+        if (bundle == null) {
+            throw new IllegalStateException("No bundle found for id " + bundleId);
+        }
+        try {
+            target = (LoginModule) bundle.loadClass(module).newInstance();
+        } catch (Exception e) {
+            throw new IllegalStateException("Can not load or create login module " + module + " for bundle " + bundleId, e);
+        }
+        target.initialize(subject, callbackHandler, sharedState, newOptions);
+    }
+
+    /* (non-Javadoc)
+     * @see javax.security.auth.spi.LoginModule#login()
+     */
+    public boolean login() throws LoginException {
+        return target.login();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.security.auth.spi.LoginModule#commit()
+     */
+    public boolean commit() throws LoginException {
+        return target.commit();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.security.auth.spi.LoginModule#abort()
+     */
+    public boolean abort() throws LoginException {
+        return target.abort();
+    }
+
+    /* (non-Javadoc)
+     * @see javax.security.auth.spi.LoginModule#logout()
+     */
+    public boolean logout() throws LoginException {
+        return target.logout();
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/boot/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/jaas/boot/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..a334424
--- /dev/null
+++ b/karaf-2.2.x/jaas/boot/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,22 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides JAAS classes loaded during Karaf boot process.
+
+    In particular it provides the ProxyLoginModule.
+
+    The ProxyLoginModule is an OSGi proxy login module that should be used instead of a plain reference to
+    a given login module. It takes two properties, the name of the login module class, and the bundle to be used
+    to load it.
+    This class must be loadable from modules, so it has to be either in a fragment bundle attached to the
+    system bundle or be made available through the boot delegation class path.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mSecurity\u001B[0m section of the Karaf User Guide.
+    \u001B[36mSecurity Framework\u001B[0m section of the Karaf Developer Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/command/NOTICE b/karaf-2.2.x/jaas/command/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/jaas/command/pom.xml b/karaf-2.2.x/jaas/command/pom.xml
new file mode 100644
index 0000000..a6157be
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/pom.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>jaas</artifactId>
+        <groupId>org.apache.karaf.jaas</groupId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.jaas.command</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Jaas :: Command</name>
+    <description>This bundle provides Karaf shell commands to manipulate JAAS security framework.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.config</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.boot</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.modules</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.obr</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/CancelCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/CancelCommand.java
new file mode 100644
index 0000000..30b950b
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/CancelCommand.java
@@ -0,0 +1,43 @@
+/*
+ * 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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+import java.util.LinkedList;
+
+/**
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "cancel", description = "Cancel the modification of a JAAS realm.")
+public class CancelCommand extends JaasCommandSupport {
+
+    @Override
+    protected Object doExecute() throws Exception {
+        //Cleanup the session
+        session.put(JAAS_REALM, null);
+        session.put(JAAS_ENTRY, null);
+        session.put(JAAS_CMDS, new LinkedList<JaasCommandSupport>());
+        return null;
+    }
+
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/JaasCommandSupport.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/JaasCommandSupport.java
new file mode 100644
index 0000000..2ed2580
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/JaasCommandSupport.java
@@ -0,0 +1,125 @@
+/*
+ * 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.karaf.jaas.command;
+
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.modules.BackingEngine;
+import org.apache.karaf.jaas.modules.BackingEngineService;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+import javax.security.auth.login.AppConfigurationEntry;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ * @author iocanel
+ */
+public abstract class JaasCommandSupport extends OsgiCommandSupport {
+
+    public static final String JAAS_REALM = "JaasCommand.REALM";
+    public static final String JAAS_ENTRY = "JaasCommand.ENTRY";
+    public static final String JAAS_CMDS = "JaasCommand.COMMANDS";
+
+    private List<JaasRealm> realms;
+
+    protected BackingEngineService backingEngineService;
+
+    protected abstract Object doExecute(BackingEngine engine) throws Exception;
+
+    /**
+     * Add the command to the command queue.
+     *
+     * @return
+     * @throws Exception
+     */
+    protected Object doExecute() throws Exception {
+        JaasRealm realm = (JaasRealm) session.get(JAAS_REALM);
+        AppConfigurationEntry entry = (AppConfigurationEntry) session.get(JAAS_ENTRY);
+        Queue commandQueue = (Queue) session.get(JAAS_CMDS);
+
+        if (realm != null && entry != null) {
+            if (commandQueue != null) {
+                commandQueue.add(this);
+            }
+        } else {
+            System.err.println("No JAAS Realm / Module has been selected.");
+        }
+        return null;
+    }
+
+
+    /**
+     * Returns the Jaas Realm named as realmName.
+     *
+     * @param realmName
+     * @return
+     */
+    public JaasRealm findRealmByNameOrIndex(String realmName, int index) {
+        JaasRealm realm = null;
+        if (realms != null) {
+            for (int i=1; i <= realms.size();i++) {
+                if (realms.get(i-1).getName().equals(realmName) || index == i)
+                    return realms.get(i-1);
+            }
+        }
+        return realm;
+    }
+
+    /**
+     * Returns the Jaas Module entry of the specified realm, named as moduleName.
+     *
+     * @param moduleName
+     * @return
+     */
+    public AppConfigurationEntry findEntryByRealmAndName(JaasRealm realm, String moduleName) {
+        AppConfigurationEntry appConfigurationEntry = null;
+        if (realm != null) {
+
+            AppConfigurationEntry[] entries = realm.getEntries();
+
+            //If no moduleName provided and a there is a single module in the realm.
+            if (entries != null && entries.length == 1 && moduleName == null) {
+                return entries[0];
+            }
+
+            for (AppConfigurationEntry entry : entries) {
+                if (moduleName.equals(entry.getLoginModuleName())) {
+                    return entry;
+                }
+            }
+
+        }
+        return appConfigurationEntry;
+    }
+
+
+    public List<JaasRealm> getRealms() {
+        return realms;
+    }
+
+    public void setRealms(List<JaasRealm> realms) {
+        this.realms = realms;
+    }
+
+    public BackingEngineService getBackingEngineService() {
+        return backingEngineService;
+    }
+
+    public void setBackingEngineService(BackingEngineService backingEngineService) {
+        this.backingEngineService = backingEngineService;
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListPendingCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListPendingCommand.java
new file mode 100644
index 0000000..019ca8b
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListPendingCommand.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.karaf.jaas.command;
+
+import java.util.Queue;
+import javax.security.auth.login.AppConfigurationEntry;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.boot.ProxyLoginModule;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+/**
+ * @author iocanel
+ */
+
+/**
+ * Lists the commands the are in the command queue, for the active realm/module.
+ *
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "pending", description = "Lists the modification on the active realm/module.")
+public class ListPendingCommand extends JaasCommandSupport {
+
+    @Override
+    protected Object doExecute() throws Exception {
+        JaasRealm realm = (JaasRealm) session.get(JAAS_REALM);
+        AppConfigurationEntry entry = (AppConfigurationEntry) session.get(JAAS_ENTRY);
+        Queue<JaasCommandSupport> commandQueue = (Queue<JaasCommandSupport>) session.get(JAAS_CMDS);
+
+        if (realm != null && entry != null) {
+            String moduleClass = (String) entry.getOptions().get(ProxyLoginModule.PROPERTY_MODULE);
+            System.out.println(String.format("Jaas Realm:%s Jaas Module:%s", realm.getName(), moduleClass));
+
+            if (commandQueue != null && !commandQueue.isEmpty()) {
+                for (JaasCommandSupport command : commandQueue) {
+                    System.out.println(command);
+                }
+            } else {
+                System.err.println("No JAAS command in queue.");
+            }
+        } else {
+            System.err.println("No JAAS Realm / Module has been selected.");
+        }
+        return null;
+    }
+
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListRealmsCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListRealmsCommand.java
new file mode 100644
index 0000000..a0c0c31
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListRealmsCommand.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.karaf.jaas.command;
+
+import java.util.List;
+import javax.security.auth.login.AppConfigurationEntry;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.boot.ProxyLoginModule;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+/**
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "realms", description = "Lists the existing JAAS realms.")
+public class ListRealmsCommand extends JaasCommandSupport {
+
+    private static final String REALM_LIST_FORMAT = "%5s %-20s %-80s";
+
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        return null;
+    }
+
+    protected Object doExecute() throws Exception {
+        List<JaasRealm> realms = getRealms();
+        if (realms != null && realms.size() > 0) {
+            System.out.println(String.format(REALM_LIST_FORMAT, "Index","Realm", "Module Class"));
+            int index = 1;
+            for (JaasRealm realm : realms) {
+                String realmName = realm.getName();
+                AppConfigurationEntry[] entries = realm.getEntries();
+
+                if (entries != null && entries.length > 0) {
+                    for (int i = 0; i < entries.length; i++) {
+                        String moduleClass = (String) entries[i].getOptions().get(ProxyLoginModule.PROPERTY_MODULE);
+                        System.out.println(String.format(REALM_LIST_FORMAT, index++, realmName, moduleClass));
+                    }
+                } else {
+                    System.out.println(String.format(REALM_LIST_FORMAT, realmName, "No module found for realm."));
+                }
+            }
+        } else {
+            System.err.println("No realm found");
+        }
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListUsersCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListUsersCommand.java
new file mode 100644
index 0000000..7799071
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListUsersCommand.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.karaf.jaas.command;
+
+import java.util.List;
+import javax.security.auth.login.AppConfigurationEntry;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.modules.BackingEngine;
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+
+/**
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "users", description = "Lists the users of the active realm/module.")
+public class ListUsersCommand extends JaasCommandSupport {
+
+    private static final String OUTPUT_FORMAT = "%-20s %-20s";
+
+    @Override
+    protected Object doExecute() throws Exception {
+        JaasRealm realm = (JaasRealm) session.get(JAAS_REALM);
+        AppConfigurationEntry entry = (AppConfigurationEntry) session.get(JAAS_ENTRY);
+
+        if (realm == null || entry == null) {
+            System.err.println("No JAAS Realm / Module has been selected.");
+            return null;
+        }
+
+        BackingEngine engine = backingEngineService.get(entry);
+
+        if (engine == null) {
+            System.err.println(String.format("Failed to resolve backing engine for realm:%s and moudle:%s", realm.getName(), entry.getLoginModuleName()));
+            return null;
+        }
+
+        return doExecute(engine);
+    }
+
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        List<UserPrincipal> users = engine.listUsers();
+        System.out.println(String.format(OUTPUT_FORMAT, "User Name", "Role"));
+
+        for (UserPrincipal user : users) {
+            String userName = user.getName();
+            List<RolePrincipal> roles = engine.listRoles(user);
+
+            if (roles != null && roles.size() >= 1) {
+                for (RolePrincipal role : roles) {
+                    String roleName = role.getName();
+                    System.out.println(String.format(OUTPUT_FORMAT, userName, roleName));
+                }
+            } else {
+                System.out.println(String.format(OUTPUT_FORMAT, userName, ""));
+            }
+
+        }
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ManageRealmCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ManageRealmCommand.java
new file mode 100644
index 0000000..37dc701
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ManageRealmCommand.java
@@ -0,0 +1,93 @@
+/*
+ * 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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+import javax.security.auth.login.AppConfigurationEntry;
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "manage", description = "Manage user and roles of a Jaas Realm.")
+public class ManageRealmCommand extends JaasCommandSupport {
+
+    @Option(name = "--realm", description = "Jaas Realm", required = false, multiValued = false)
+    String realmName;
+
+    @Option(name = "--index", description = "Realm Index", required = false, multiValued = false)
+    int index;
+
+    @Option(name = "--module", aliases = {}, description = "Realm Module", required = false, multiValued = false)
+    String moduleName;
+
+    @Option(name = "--force", aliases = {}, description = "Force the management of this realm, even if another one was under management", required = false, multiValued = false)
+    boolean force;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        if (realmName == null && index <= 0 ) {
+            System.err.println("A valid realm or the realm index need to be specified");
+            return null;
+        }
+        JaasRealm oldRealm = (JaasRealm) this.session.get(JAAS_REALM);
+        AppConfigurationEntry oldEntry = (AppConfigurationEntry) this.session.get(JAAS_ENTRY);
+
+        if (oldRealm != null && !oldRealm.getName().equals(realmName) && !force) {
+            System.err.println("Another realm is being edited.  Cancel / update first, or use the --force option");
+        } else if (oldEntry != null && !oldEntry.getLoginModuleName().equals(moduleName) && !force) {
+            System.err.println("Another module is being edited.  Cancel / update first, or use the --force option");
+        } else {
+
+            JaasRealm realm = findRealmByNameOrIndex(realmName, index);
+
+            if (realm != null) {
+                AppConfigurationEntry entry = findEntryByRealmAndName(realm, moduleName);
+
+                if (entry != null) {
+                    Queue<JaasCommandSupport> commands = null;
+
+                    commands = (Queue<JaasCommandSupport>) this.session.get(JAAS_CMDS);
+                    if (commands == null) {
+                        commands = new LinkedList<JaasCommandSupport>();
+                    }
+
+
+                    this.session.put(JAAS_REALM, realm);
+                    this.session.put(JAAS_ENTRY, entry);
+                    this.session.put(JAAS_CMDS, commands);
+                } else {
+                    System.err.println(String.format("Could not find module: %s in realm:%s", moduleName, realmName));
+                }
+            } else {
+                System.err.println(String.format("Could not find realm:%s", realmName));
+            }
+        }
+        return null;
+    }
+
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleAddCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleAddCommand.java
new file mode 100644
index 0000000..3910ef7
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleAddCommand.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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+/**
+ * Adds a role to a user of the active realm/module.
+ *
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "roleadd", description = "Add a role to a user.")
+public class RoleAddCommand extends JaasCommandSupport {
+
+    @Argument(index = 0, name = "username", description = "User Name", required = true, multiValued = false)
+    private String username;
+
+    @Argument(index = 1, name = "role", description = "Role", required = true, multiValued = false)
+    private String role;
+
+    /**
+     * Execute the RoleAddCommand in the given Excecution Context.
+     *
+     * @param engine
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        engine.addRole(username, role);
+        return null;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleAddCommand{" +
+                "username='" + username + '\'' +
+                ", role='" + role + '\'' +
+                '}';
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleDeleteCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleDeleteCommand.java
new file mode 100644
index 0000000..5b08e9a
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleDeleteCommand.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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+/**
+ * Deletes a role from a user of the active realm/module.
+ *
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "roledel", description = "Delete a role from a user.")
+public class RoleDeleteCommand extends JaasCommandSupport {
+
+    @Argument(index = 0, name = "username", description = "User Name", required = true, multiValued = false)
+    private String username;
+
+    @Argument(index = 1, name = "role", description = "Role", required = true, multiValued = false)
+    private String role;
+
+    /**
+     * Execute the RoleDeleteCommand in the given Excecution Context.
+     *
+     * @param engine
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        engine.deleteRole(username, role);
+        return null;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleDeleteCommand{" +
+                "username='" + username + '\'' +
+                ", role='" + role + '\'' +
+                '}';
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UpdateCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UpdateCommand.java
new file mode 100644
index 0000000..857723f
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UpdateCommand.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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+import javax.security.auth.login.AppConfigurationEntry;
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * Executes all the pending commands of the active realm/module.
+ *
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "update", description = "Update JAAS realm.")
+public class UpdateCommand extends JaasCommandSupport {
+
+    @Override
+    protected Object doExecute() throws Exception {
+        JaasRealm realm = (JaasRealm) session.get(JAAS_REALM);
+        AppConfigurationEntry entry = (AppConfigurationEntry) session.get(JAAS_ENTRY);
+
+        if (realm == null || entry == null) {
+            System.err.println("No JAAS Realm / Module has been selected.");
+            return null;
+        }
+
+        BackingEngine engine = backingEngineService.get(entry);
+
+        if (engine == null) {
+            System.err.println(String.format("Failed to resolve backing engine for realm:%s and moudle:%s", realm.getName(), entry.getLoginModuleName()));
+            return null;
+        }
+
+        return doExecute(engine);
+    }
+
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        Queue<? extends JaasCommandSupport> commands = (Queue<? extends JaasCommandSupport>) session.get(JAAS_CMDS);
+
+        if (commands == null || commands.isEmpty()) {
+            System.err.println("No JAAS command in queue.");
+            return null;
+        }
+
+        //Loop throught the commands and execute them.
+        while (!commands.isEmpty()) {
+            Object obj = commands.remove();
+            if (obj instanceof JaasCommandSupport) {
+                ((JaasCommandSupport) obj).doExecute(engine);
+            }
+        }
+        //Cleanup the session
+        session.put(JAAS_REALM, null);
+        session.put(JAAS_ENTRY, null);
+        session.put(JAAS_CMDS, new LinkedList<JaasCommandSupport>());
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserAddCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserAddCommand.java
new file mode 100644
index 0000000..7d371ad
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserAddCommand.java
@@ -0,0 +1,74 @@
+/*
+ * 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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+/**
+ * Creates a new user in the active realm/module.
+ *
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "useradd", description = "Add a user.")
+public class UserAddCommand extends JaasCommandSupport {
+
+    @Argument(index = 0, name = "username", description = "User Name", required = true, multiValued = false)
+    private String username;
+
+    @Argument(index = 1, name = "password", description = "Password", required = true, multiValued = false)
+    private String password;
+
+
+    /**
+     * Execute the RoleAddCommand in the given Excecution Context.
+     *
+     * @param engine
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        engine.addUser(username, password);
+        return null;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    @Override
+    public String toString() {
+        return "UserAddCommand{" +
+                "username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                '}';
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserDeleteCommand.java b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserDeleteCommand.java
new file mode 100644
index 0000000..fd73266
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserDeleteCommand.java
@@ -0,0 +1,62 @@
+/*
+ * 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.karaf.jaas.command;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.jaas.modules.BackingEngine;
+
+/**
+ * Deletes a user of the active realm/module.
+ *
+ * @author iocanel
+ */
+@Command(scope = "jaas", name = "userdel", description = "Delete a user.")
+public class UserDeleteCommand extends JaasCommandSupport {
+
+    @Argument(index = 0, name = "username", description = "User Name", required = true, multiValued = false)
+    private String username;
+
+    /**
+     * Execute the RoleAddCommand in the given Excecution Context.
+     *
+     * @param engine
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected Object doExecute(BackingEngine engine) throws Exception {
+        engine.deleteUser(username);
+        return null;
+    }
+
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    @Override
+    public String toString() {
+        return "UserDeleteCommand{" +
+                "username='" + username + '\'' +
+                '}';
+    }
+}
diff --git a/karaf-2.2.x/jaas/command/src/main/resources/OSGI-INF/blueprint/jaas-command.xml b/karaf-2.2.x/jaas/command/src/main/resources/OSGI-INF/blueprint/jaas-command.xml
new file mode 100644
index 0000000..c9b9251
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/resources/OSGI-INF/blueprint/jaas-command.xml
@@ -0,0 +1,74 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="jaas/manage">
+            <action class="org.apache.karaf.jaas.command.ManageRealmCommand">
+                <property name="realms" ref="realms"/>
+            </action>
+        </command>
+        <command name="jaas/update">
+            <action class="org.apache.karaf.jaas.command.UpdateCommand">
+                <property name="backingEngineService" ref="engineService"/>
+            </action>
+        </command>
+        <command name="jaas/cancel">
+            <action class="org.apache.karaf.jaas.command.CancelCommand"/>
+        </command>
+        <command name="jaas/pending">
+            <action class="org.apache.karaf.jaas.command.ListPendingCommand"/>
+        </command>
+        <command name="jaas/users">
+            <action class="org.apache.karaf.jaas.command.ListUsersCommand">
+                <property name="backingEngineService" ref="engineService"/>
+            </action>
+        </command>
+        <command name="jaas/realms">
+            <action class="org.apache.karaf.jaas.command.ListRealmsCommand">
+                <property name="realms" ref="realms"/>
+            </action>
+        </command>
+        <command name="jaas/useradd">
+            <action class="org.apache.karaf.jaas.command.UserAddCommand"/>
+        </command>
+        <command name="jaas/userdel">
+            <action class="org.apache.karaf.jaas.command.UserDeleteCommand"/>
+        </command>
+        <command name="jaas/roleadd">
+            <action class="org.apache.karaf.jaas.command.RoleAddCommand"/>
+        </command>
+        <command name="jaas/roledel">
+            <action class="org.apache.karaf.jaas.command.RoleDeleteCommand"/>
+        </command>
+    </command-bundle>
+
+    <!-- JAAS Realms -->
+    <reference-list id="realms" interface="org.apache.karaf.jaas.config.JaasRealm" availability="optional"/>
+
+    <!-- Backing Engine Service -->
+    <bean id="engineService" class="org.apache.karaf.jaas.modules.BackingEngineService">
+        <property name="engineFactories" ref="engineFactories"/>
+    </bean>
+
+    <!-- Backing Engine Factories -->
+    <reference-list id="engineFactories" interface="org.apache.karaf.jaas.modules.BackingEngineFactory"
+                    availability="optional"/>
+</blueprint>
diff --git a/karaf-2.2.x/jaas/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/jaas/command/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..6432a50
--- /dev/null
+++ b/karaf-2.2.x/jaas/command/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,26 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Karaf shell commands to manipulate the JAAS security framework.
+
+    The following commands are available:
+    \u001B[36mjaas:cancel\u001B[0m Cancel the modification of a JAAS realm.
+    \u001B[36mjaas:pending\u001B[0m Lists the modification on the active realm/module.
+    \u001B[36mjaas:list\u001B[0m Lists the modification on the active realm/module.
+    \u001B[36mjaas:userlist\u001B[0m Lists the users of the active realm/module.
+    \u001B[36mjaas:manage\u001B[0m Manage user and roles of a Jaas Realm.
+    \u001B[36mjaas:roleadd\u001B[0m Add a role to a user.
+    \u001B[36mjaas:roledel\u001B[0m Delete a role from a user.
+    \u001B[36mjaas:update\u001B[0m Update JAAS realm.
+    \u001B[36mjaas:useradd\u001B[0m Add a user.
+    \u001B[36mjaas:userdel\u001B[0m Delete a user.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mSecurity\u001B[0m section of the Karaf User Guide.
+    \u001B[36mSeucrity Framework\u001B[0m section of the Karaf Developer Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/config/NOTICE b/karaf-2.2.x/jaas/config/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/jaas/config/pom.xml b/karaf-2.2.x/jaas/config/pom.xml
new file mode 100644
index 0000000..81ca199
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/pom.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.jaas</groupId>
+        <artifactId>jaas</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.jaas.config</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: JAAS :: Config</name>
+    <description>This bundle provides the configuration facility for the JAAS security framework.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.boot</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.blueprint</groupId>
+            <artifactId>org.apache.aries.blueprint</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>${project.artifactId};version=${project.version}</Export-Package>
+                        <Import-Package>!${project.artifactId},*</Import-Package>
+                        <Private-Package>
+                            ${project.artifactId}.impl;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java
new file mode 100644
index 0000000..d3fc014
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.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.karaf.jaas.config;
+
+import javax.security.auth.login.AppConfigurationEntry;
+
+public interface JaasRealm {
+
+    public String getName();
+
+    public int getRank();
+
+    public AppConfigurationEntry[] getEntries();
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeyIsLocked.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeyIsLocked.java
new file mode 100644
index 0000000..e0e76f7
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeyIsLocked.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.jaas.config;
+
+import java.security.GeneralSecurityException;
+
+public class KeyIsLocked extends GeneralSecurityException {
+
+    public KeyIsLocked() {
+        super();
+    }
+
+    public KeyIsLocked(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public KeyIsLocked(String msg) {
+        super(msg);
+    }
+
+    public KeyIsLocked(Throwable cause) {
+        super(cause);
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreInstance.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreInstance.java
new file mode 100644
index 0000000..270c585
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreInstance.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.jaas.config;
+
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.TrustManager;
+
+/**
+ * Based on http://svn.apache.org/repos/asf/geronimo/trunk/modules/management/
+ *              src/java/org/apache/geronimo/management/geronimo/KeystoreInstance.java
+ *
+ * @version $Rev: $ $Date: $
+ */
+public interface KeystoreInstance {
+
+    String getName();
+
+    int getRank();
+
+    String[] listPrivateKeys();
+
+    String[] listTrustCertificates();
+
+    Certificate getCertificate(String alias);
+
+    String getCertificateAlias(Certificate cert);
+
+    Certificate[] getCertificateChain(String alias);
+
+    PrivateKey getPrivateKey(String alias);
+
+    boolean isKeystoreLocked();
+
+    boolean isKeyLocked(String keyAlias);
+
+    KeyManager[] getKeyManager(String algorithm, String keyAlias) throws NoSuchAlgorithmException,
+                                UnrecoverableKeyException, KeyStoreException, KeystoreIsLocked;
+
+    TrustManager[] getTrustManager(String algorithm) throws KeyStoreException, NoSuchAlgorithmException, KeystoreIsLocked;
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreIsLocked.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreIsLocked.java
new file mode 100644
index 0000000..1ee4dc8
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreIsLocked.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.jaas.config;
+
+import java.security.GeneralSecurityException;
+
+public class KeystoreIsLocked extends GeneralSecurityException {
+
+    public KeystoreIsLocked() {
+        super();
+    }
+
+    public KeystoreIsLocked(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public KeystoreIsLocked(String msg) {
+        super(msg);
+    }
+
+    public KeystoreIsLocked(Throwable cause) {
+        super(cause);
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreManager.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreManager.java
new file mode 100644
index 0000000..146ba50
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreManager.java
@@ -0,0 +1,192 @@
+/*
+ * 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.karaf.jaas.config;
+
+import java.security.GeneralSecurityException;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ * Based on http://svn.apache.org/repos/asf/geronimo/trunk/modules/management/
+ *                      src/java/org/apache/geronimo/management/geronimo/KeystoreManager.java
+ *
+ */
+public interface KeystoreManager {
+
+    KeystoreInstance getKeystore(String name);
+
+    /**
+     * Gets a SSLContext using one Keystore to access the private key
+     * and another to provide the list of trusted certificate authorities.
+     * @param provider
+     * @param protocol The SSL protocol to use
+     * @param algorithm The SSL algorithm to use
+     * @param keyStore The key keystore name as provided by listKeystores.  The
+     *                 KeystoreInstance for this keystore must be unlocked.
+     * @param keyAlias The name of the private key in the keystore.  The
+     *                 KeystoreInstance for this keystore must have unlocked
+     *                 this key.
+     * @param trustStore The trust keystore name as provided by listKeystores.
+     *                   The KeystoreInstance for this keystore must have
+     *                   unlocked this key.
+     * @param timeout Amount of time waiting for keyStore and keyAlias to be available.
+     *
+     * @throws KeystoreIsLocked Occurs when the requested key keystore cannot
+     *                          be used because it has not been unlocked.
+     * @throws KeyIsLocked Occurs when the requested private key in the key
+     *                     keystore cannot be used because it has not been
+     *                     unlocked.
+     */
+    SSLContext createSSLContext(String provider, String protocol,
+                                String algorithm, String keyStore,
+                                String keyAlias, String trustStore,
+                                long timeout) throws GeneralSecurityException;
+
+    /**
+     * Gets a SSLContext using one Keystore to access the private key
+     * and another to provide the list of trusted certificate authorities.
+     * @param provider
+     * @param protocol The SSL protocol to use
+     * @param algorithm The SSL algorithm to use
+     * @param keyStore The key keystore name as provided by listKeystores.  The
+     *                 KeystoreInstance for this keystore must be unlocked.
+     * @param keyAlias The name of the private key in the keystore.  The
+     *                 KeystoreInstance for this keystore must have unlocked
+     *                 this key.
+     * @param trustStore The trust keystore name as provided by listKeystores.
+     *                   The KeystoreInstance for this keystore must have
+     *                   unlocked this key.
+     *
+     * @throws KeystoreIsLocked Occurs when the requested key keystore cannot
+     *                          be used because it has not been unlocked.
+     * @throws KeyIsLocked Occurs when the requested private key in the key
+     *                     keystore cannot be used because it has not been
+     *                     unlocked.
+     */
+    SSLContext createSSLContext(String provider, String protocol,
+                                String algorithm, String keyStore,
+                                String keyAlias, String trustStore) throws GeneralSecurityException;
+
+    /**
+     * Gets a ServerSocketFactory using one Keystore to access the private key
+     * and another to provide the list of trusted certificate authorities.
+     * @param provider
+     * @param protocol The SSL protocol to use
+     * @param algorithm The SSL algorithm to use
+     * @param keyStore The key keystore name as provided by listKeystores.  The
+     *                 KeystoreInstance for this keystore must be unlocked.
+     * @param keyAlias The name of the private key in the keystore.  The
+     *                 KeystoreInstance for this keystore must have unlocked
+     *                 this key.
+     * @param trustStore The trust keystore name as provided by listKeystores.
+     *                   The KeystoreInstance for this keystore must have
+     *                   unlocked this key.
+     * @param timeout Amount of time waiting for keyStore and keyAlias to be available.
+     *
+     * @throws KeystoreIsLocked Occurs when the requested key keystore cannot
+     *                          be used because it has not been unlocked.
+     * @throws KeyIsLocked Occurs when the requested private key in the key
+     *                     keystore cannot be used because it has not been
+     *                     unlocked.
+     */
+    SSLServerSocketFactory createSSLServerFactory(String provider, String protocol,
+                                                  String algorithm, String keyStore,
+                                                  String keyAlias, String trustStore,
+                                                  long timeout) throws GeneralSecurityException;
+
+    /**
+     * Gets a ServerSocketFactory using one Keystore to access the private key
+     * and another to provide the list of trusted certificate authorities.
+     * @param provider
+     * @param protocol The SSL protocol to use
+     * @param algorithm The SSL algorithm to use
+     * @param keyStore The key keystore name as provided by listKeystores.  The
+     *                 KeystoreInstance for this keystore must be unlocked.
+     * @param keyAlias The name of the private key in the keystore.  The
+     *                 KeystoreInstance for this keystore must have unlocked
+     *                 this key.
+     * @param trustStore The trust keystore name as provided by listKeystores.
+     *                   The KeystoreInstance for this keystore must have
+     *                   unlocked this key.
+     *
+     * @throws KeystoreIsLocked Occurs when the requested key keystore cannot
+     *                          be used because it has not been unlocked.
+     * @throws KeyIsLocked Occurs when the requested private key in the key
+     *                     keystore cannot be used because it has not been
+     *                     unlocked.
+     */
+    SSLServerSocketFactory createSSLServerFactory(String provider, String protocol,
+                                                  String algorithm, String keyStore,
+                                                  String keyAlias, String trustStore) throws GeneralSecurityException;
+
+    /**
+     * Gets a SocketFactory using one Keystore to access the private key
+     * and another to provide the list of trusted certificate authorities.
+     * @param provider The SSL provider to use, or null for the default
+     * @param protocol The SSL protocol to use
+     * @param algorithm The SSL algorithm to use
+     * @param keyStore The key keystore name as provided by listKeystores.  The
+     *                 KeystoreInstance for this keystore must be unlocked.
+     * @param keyAlias The name of the private key in the keystore.  The
+     *                 KeystoreInstance for this keystore must have unlocked
+     *                 this key.
+     * @param trustStore The trust keystore name as provided by listKeystores.
+     *                   The KeystoreInstance for this keystore must have
+     *                   unlocked this key.
+     * @param timeout Amount of time waiting for keyStore and keyAlias to be available.
+     *
+     * @throws KeystoreIsLocked Occurs when the requested key keystore cannot
+     *                          be used because it has not been unlocked.
+     * @throws KeyIsLocked Occurs when the requested private key in the key
+     *                     keystore cannot be used because it has not been
+     *                     unlocked.
+     * @throws GeneralSecurityException
+     */
+    SSLSocketFactory createSSLFactory(String provider, String protocol,
+                                      String algorithm, String keyStore,
+                                      String keyAlias, String trustStore,
+                                      long timeout) throws GeneralSecurityException;
+
+    /**
+     * Gets a SocketFactory using one Keystore to access the private key
+     * and another to provide the list of trusted certificate authorities.
+     * @param provider The SSL provider to use, or null for the default
+     * @param protocol The SSL protocol to use
+     * @param algorithm The SSL algorithm to use
+     * @param keyStore The key keystore name as provided by listKeystores.  The
+     *                 KeystoreInstance for this keystore must be unlocked.
+     * @param keyAlias The name of the private key in the keystore.  The
+     *                 KeystoreInstance for this keystore must have unlocked
+     *                 this key.
+     * @param trustStore The trust keystore name as provided by listKeystores.
+     *                   The KeystoreInstance for this keystore must have
+     *                   unlocked this key.
+     *
+     * @throws KeystoreIsLocked Occurs when the requested key keystore cannot
+     *                          be used because it has not been unlocked.
+     * @throws KeyIsLocked Occurs when the requested private key in the key
+     *                     keystore cannot be used because it has not been
+     *                     unlocked.
+     * @throws GeneralSecurityException
+     */
+    SSLSocketFactory createSSLFactory(String provider, String protocol,
+                                      String algorithm, String keyStore,
+                                      String keyAlias, String trustStore) throws GeneralSecurityException;
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Config.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Config.java
new file mode 100644
index 0000000..b7966b1
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Config.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.jaas.config.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.security.auth.login.AppConfigurationEntry;
+
+import org.apache.karaf.jaas.boot.ProxyLoginModule;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.osgi.framework.BundleContext;
+
+/**
+ * An implementation of JaasRealm which is created
+ * by the spring namespace handler.
+ */
+public class Config implements JaasRealm {
+
+    private String name;
+    private int rank;
+    private Module[] modules;
+    private BundleContext bundleContext;
+    private transient AppConfigurationEntry[] entries;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getRank() {
+        return rank;
+    }
+
+    public void setRank(int rank) {
+        this.rank = rank;
+    }
+
+    public Module[] getModules() {
+        return modules;
+    }
+
+    public void setModules(Module[] modules) {
+        this.modules = modules;
+        this.entries = null;
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public AppConfigurationEntry[] getEntries() {
+        if (this.entries == null && this.modules != null) {
+            Module[] modules = this.modules;
+            AppConfigurationEntry[] entries = new AppConfigurationEntry[modules.length];
+            for (int i = 0; i < modules.length; i++) {
+                Map<String,Object> options = new HashMap<String,Object>();
+                // put the bundle context in the options map
+                // it's required to be able to use the encryption service
+                // in the AbstractKarafLoginModule
+                options.put(BundleContext.class.getName(), bundleContext);
+                if (modules[i].getOptions() != null) {
+                    for (Map.Entry e : modules[i].getOptions().entrySet()) {
+                        options.put(e.getKey().toString(), e.getValue());
+                    }
+                }
+                options.put(ProxyLoginModule.PROPERTY_MODULE, modules[i].getClassName());
+                options.put(ProxyLoginModule.PROPERTY_BUNDLE, Long.toString(bundleContext.getBundle().getBundleId()));
+                entries[i] = new AppConfigurationEntry(ProxyLoginModule.class.getName(),
+                                                       getControlFlag(modules[i].getFlags()),
+                                                       options);
+            }
+            this.entries = entries;
+        }
+        return this.entries;
+    }
+
+    private AppConfigurationEntry.LoginModuleControlFlag getControlFlag(String flags) {
+        if ("required".equalsIgnoreCase(flags)) {
+            return AppConfigurationEntry.LoginModuleControlFlag.REQUIRED;
+        }
+        if ("optional".equalsIgnoreCase(flags)) {
+            return AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL;
+        }
+        if ("requisite".equalsIgnoreCase(flags)) {
+            return AppConfigurationEntry.LoginModuleControlFlag.REQUISITE;
+        }
+        if ("sufficient".equalsIgnoreCase(flags)) {
+            return AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT;
+        }
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Module.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Module.java
new file mode 100644
index 0000000..0a990d4
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Module.java
@@ -0,0 +1,64 @@
+/*
+ * 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.karaf.jaas.config.impl;
+
+import java.util.Properties;
+
+/**
+ * POJO for a login module.
+ * It contains the class name, flags and a map of options.
+ */
+public class Module {
+
+    private String name;
+    private String className;
+    private String flags;
+    private Properties options;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getFlags() {
+        return flags;
+    }
+
+    public void setFlags(String flags) {
+        this.flags = flags;
+    }
+
+    public Properties getOptions() {
+        return options;
+    }
+
+    public void setOptions(Properties options) {
+        this.options = options;
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/NamespaceHandler.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/NamespaceHandler.java
new file mode 100644
index 0000000..a6ed36c
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/NamespaceHandler.java
@@ -0,0 +1,165 @@
+/*
+ * 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.karaf.jaas.config.impl;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.*;
+import org.apache.karaf.jaas.boot.ProxyLoginModule;
+import org.apache.karaf.jaas.config.JaasRealm;
+import org.apache.karaf.jaas.config.KeystoreInstance;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
+import org.w3c.dom.*;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler {
+
+    public URL getSchemaLocation(String namespace) {
+        if ("http://karaf.apache.org/xmlns/jaas/v1.0.0".equals(namespace)) {
+            return getClass().getResource("/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd");
+        } else {
+            return getClass().getResource("/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd");
+        }
+    }
+
+    public Set<Class> getManagedClasses() {
+        return new HashSet<Class>(Arrays.asList(
+                Config.class,
+                ResourceKeystoreInstance.class
+        ));
+    }
+
+    public Metadata parse(Element element, ParserContext context) {
+        String name = element.getLocalName() != null ? element.getLocalName() : element.getNodeName();
+        if ("config".equals(name)) {
+            return parseConfig(element, context);
+        } else if ("keystore".equals(name)) {
+            return parseKeystore(element, context);
+        }
+        throw new ComponentDefinitionException("Bad xml syntax: unknown element '" + name + "'");
+    }
+
+    public ComponentMetadata decorate(Node node, ComponentMetadata component, ParserContext context) {
+        throw new ComponentDefinitionException("Bad xml syntax: node decoration is not supported");
+    }
+
+    public ComponentMetadata parseConfig(Element element, ParserContext context) {
+        MutableBeanMetadata bean = context.createMetadata(MutableBeanMetadata.class);
+        bean.setRuntimeClass(Config.class);
+        String name = element.getAttribute("name");
+        bean.addProperty("bundleContext", createRef(context, "blueprintBundleContext"));
+        bean.addProperty("name", createValue(context, name));
+        String rank = element.getAttribute("rank");
+        if (rank != null && rank.length() > 0) {
+            bean.addProperty("rank", createValue(context, rank));
+        }
+        NodeList childElements = element.getElementsByTagNameNS(element.getNamespaceURI(), "module");
+        if (childElements != null && childElements.getLength() > 0) {
+            MutableCollectionMetadata children = context.createMetadata(MutableCollectionMetadata.class);
+            for (int i = 0; i < childElements.getLength(); ++i) {
+                Element childElement = (Element) childElements.item(i);
+                MutableBeanMetadata md = context.createMetadata(MutableBeanMetadata.class);
+                md.setRuntimeClass(Module.class);
+                md.addProperty("className", createValue(context, childElement.getAttribute("className")));
+                if (childElement.getAttribute("name") != null) {
+                    md.addProperty("name", createValue(context, childElement.getAttribute("name")));
+                }
+                if (childElement.getAttribute("flags") != null) {
+                    md.addProperty("flags", createValue(context, childElement.getAttribute("flags")));
+                }
+                String options = getTextValue(childElement);
+                if (options != null && options.length() > 0) {
+                    md.addProperty("options", createValue(context, options));
+                }
+                children.addValue(md);
+            }
+            bean.addProperty("modules", children);
+        }
+        // Publish Config
+        MutableServiceMetadata service = context.createMetadata(MutableServiceMetadata.class);
+        service.setId(name);
+        service.setServiceComponent(bean);
+        service.addInterface(JaasRealm.class.getName());
+        service.addServiceProperty(createValue(context, ProxyLoginModule.PROPERTY_MODULE), createValue(context, name));
+        return service;
+    }
+
+    public ComponentMetadata parseKeystore(Element element, ParserContext context) {
+        MutableBeanMetadata bean = context.createMetadata(MutableBeanMetadata.class);
+        bean.setRuntimeClass(ResourceKeystoreInstance.class);
+        // Parse name
+        String name = element.getAttribute("name");
+        bean.addProperty("name", createValue(context, name));
+        // Parse rank
+        String rank = element.getAttribute("rank");
+        if (rank != null && rank.length() > 0) {
+            bean.addProperty("rank", createValue(context, rank));
+        }
+        // Parse path
+        String path = element.getAttribute("path");
+        if (path != null && path.length() > 0) {
+            bean.addProperty("path", createValue(context, path));
+        }
+        // Parse keystorePassword
+        String keystorePassword = element.getAttribute("keystorePassword");
+        if (keystorePassword != null && keystorePassword.length() > 0) {
+            bean.addProperty("keystorePassword", createValue(context, keystorePassword));
+        }
+        // Parse keyPasswords
+        String keyPasswords = element.getAttribute("keyPasswords");
+        if (keyPasswords != null && keyPasswords.length() > 0) {
+            bean.addProperty("keyPasswords", createValue(context, keyPasswords));
+        }
+        // Publish Config
+        MutableServiceMetadata service = context.createMetadata(MutableServiceMetadata.class);
+        service.setId(name);
+        service.setServiceComponent(bean);
+        service.addInterface(KeystoreInstance.class.getName());
+        return service;
+    }
+
+    private ValueMetadata createValue(ParserContext context, String value) {
+        MutableValueMetadata v = context.createMetadata(MutableValueMetadata.class);
+        v.setStringValue(value);
+        return v;
+    }
+
+    private RefMetadata createRef(ParserContext context, String value) {
+        MutableRefMetadata r = context.createMetadata(MutableRefMetadata.class);
+        r.setComponentId(value);
+        return r;
+    }
+
+    private static String getTextValue(Element element) {
+        StringBuffer value = new StringBuffer();
+        NodeList nl = element.getChildNodes();
+        for (int i = 0; i < nl.getLength(); i++) {
+            Node item = nl.item(i);
+            if ((item instanceof CharacterData && !(item instanceof Comment)) || item instanceof EntityReference) {
+                value.append(item.getNodeValue());
+            }
+        }
+        return value.toString();
+    }
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiConfiguration.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiConfiguration.java
new file mode 100644
index 0000000..c0d74cc
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiConfiguration.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.karaf.jaas.config.impl;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+
+import org.apache.karaf.jaas.config.JaasRealm;
+
+public class OsgiConfiguration extends Configuration {
+
+    private final List<JaasRealm> realms = new CopyOnWriteArrayList<JaasRealm>();
+
+    public void init() {
+        Configuration.setConfiguration(this);
+    }
+
+    public void close() {
+        realms.clear();
+        Configuration.setConfiguration(null);
+    }
+
+    public void register(JaasRealm realm, Map<String,?> properties) {
+        realms.add(realm);
+    }
+
+    public void unregister(JaasRealm realm, Map<String,?> properties) {
+        realms.remove(realm);
+    }
+
+    public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+        JaasRealm realm = null;
+        for (JaasRealm r : realms) {
+            if (r.getName().equals(name)) {
+                if (realm == null || r.getRank() > realm.getRank()) {
+                    realm = r;
+                }
+            }
+        }
+        if (realm != null) {
+            return realm.getEntries();
+        }
+        return null;
+    }
+
+    public void refresh() {
+        // Nothing to do, as we auto-update the configuration
+    }
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiKeystoreManager.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiKeystoreManager.java
new file mode 100644
index 0000000..8262104
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiKeystoreManager.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.jaas.config.impl;
+
+import java.security.GeneralSecurityException;
+import java.security.SecureRandom;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.net.ssl.SSLSocketFactory;
+
+import org.apache.karaf.jaas.config.KeystoreInstance;
+import org.apache.karaf.jaas.config.KeystoreIsLocked;
+import org.apache.karaf.jaas.config.KeystoreManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Implementation of KeystoreManager
+ */
+public class OsgiKeystoreManager implements KeystoreManager {
+
+    private final static transient Logger logger = LoggerFactory.getLogger(OsgiKeystoreManager.class);
+
+    private List<KeystoreInstance> keystores = new CopyOnWriteArrayList<KeystoreInstance>();
+
+    public void register(KeystoreInstance keystore, Map<String,?> properties) {
+        keystores.add(keystore);
+    }
+
+    public void unregister(KeystoreInstance keystore, Map<String,?> properties) {
+        keystores.remove(keystore);
+    }
+
+    public KeystoreInstance getKeystore(String name) {
+        KeystoreInstance keystore = null;
+        for (KeystoreInstance ks : keystores) {
+            if (ks.getName().equals(name)) {
+                if (keystore == null || keystore.getRank() < ks.getRank()) {
+                    keystore = ks;
+                }
+            }
+        }
+        return keystore;
+    }
+
+    public SSLContext createSSLContext(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore) throws GeneralSecurityException {
+        return createSSLContext(provider, protocol, algorithm, keyStore, keyAlias, trustStore, 0);
+    }
+
+    public SSLContext createSSLContext(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore, long timeout) throws GeneralSecurityException {
+
+        if (!this.checkForKeystoresAvailability(keyStore, keyAlias, trustStore, timeout)) {
+            throw new GeneralSecurityException("Unable to lookup configured keystore and/or truststore");
+        }
+
+        KeystoreInstance keyInstance = getKeystore(keyStore);
+        if (keyInstance != null && keyInstance.isKeystoreLocked()) {
+            throw new KeystoreIsLocked("Keystore '" + keyStore + "' is locked");
+        }
+        if (keyInstance != null && keyInstance.isKeyLocked(keyAlias)) {
+            throw new KeystoreIsLocked("Key '" + keyAlias + "' in keystore '" + keyStore + "' is locked");
+        }
+        KeystoreInstance trustInstance = trustStore == null ? null : getKeystore(trustStore);
+        if (trustInstance != null && trustInstance.isKeystoreLocked()) {
+            throw new KeystoreIsLocked("Keystore '" + trustStore + "' is locked");
+        }
+        SSLContext context;
+        if (provider == null) {
+            context = SSLContext.getInstance(protocol);
+        } else {
+            context = SSLContext.getInstance(protocol, provider);
+        }
+        context.init(keyInstance == null ? null : keyInstance.getKeyManager(algorithm, keyAlias),
+                     trustInstance == null ? null : trustInstance.getTrustManager(algorithm), new SecureRandom());
+        return context;
+    }
+
+    public SSLServerSocketFactory createSSLServerFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore) throws GeneralSecurityException {
+        return createSSLServerFactory(provider, protocol, algorithm, keyStore, keyAlias, trustStore, 0);
+    }
+
+    public SSLServerSocketFactory createSSLServerFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore, long timeout) throws GeneralSecurityException {
+        SSLContext context = createSSLContext(provider, protocol, algorithm, keyStore, keyAlias, trustStore, timeout);
+        return context.getServerSocketFactory();
+    }
+
+    public SSLSocketFactory createSSLFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore) throws GeneralSecurityException {
+        return createSSLFactory(provider, protocol, algorithm, keyStore, keyAlias, trustStore, 0);
+    }
+
+    public SSLSocketFactory createSSLFactory(String provider, String protocol, String algorithm, String keyStore, String keyAlias, String trustStore, long timeout) throws GeneralSecurityException {
+        SSLContext context = createSSLContext(provider, protocol, algorithm, keyStore, keyAlias, trustStore, timeout);
+        return context.getSocketFactory();
+    }
+
+    private void sleep(long time) {
+        try {
+            Thread.sleep(time);
+        } catch (InterruptedException e) {
+
+        }
+    }
+
+    /**
+     * Purely check for the availability of provided key stores and key
+
+     * @param keyStore
+     * @param keyAlias
+     * @param trustStore
+     * @param timeout
+     */
+    private boolean checkForKeystoresAvailability(  String keyStore, String keyAlias, String trustStore, long timeout ) {
+        boolean found = false;
+        for (int i = 0 ; i < timeout/1000; ++i) {
+            KeystoreInstance keyInstance = getKeystore(keyStore);
+            if (keyInstance == null || (keyInstance != null && keyInstance.isKeystoreLocked())) {
+                sleep(1000);
+                logger.info( "Looking for keystore: {}...", keyStore );
+                continue;
+            }
+            if (keyInstance == null || (keyInstance != null && keyInstance.isKeyLocked(keyAlias))) {
+                sleep(1000);
+                logger.info( "Looking for keystore's key: {}...", keyAlias );
+                continue;
+            }
+
+            KeystoreInstance trustInstance = trustStore == null ? null : getKeystore(trustStore);
+            if (trustInstance == null || (trustInstance != null && trustInstance.isKeystoreLocked())) {
+                sleep(1000);
+                logger.info( "Looking for truststore: {}...", trustStore );
+                continue;
+            }
+
+            found = true;
+            break;
+        }
+
+        return found;
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java
new file mode 100644
index 0000000..acdee67
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java
@@ -0,0 +1,34 @@
+/*
+ * 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.karaf.jaas.config.impl;
+
+import org.apache.karaf.jaas.boot.ProxyLoginModule;
+import org.osgi.framework.BundleContext;
+
+public class ProxyLoginModuleInitializer {
+
+    private BundleContext bundleContext;
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void init() {
+        BundleContext context = bundleContext.getBundle(0).getBundleContext();
+        ProxyLoginModule.init(context);
+    }
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ResourceKeystoreInstance.java b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ResourceKeystoreInstance.java
new file mode 100644
index 0000000..f2c7260
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ResourceKeystoreInstance.java
@@ -0,0 +1,292 @@
+/*
+ * 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.karaf.jaas.config.impl;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.Key;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.net.URL;
+import java.net.URI;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.karaf.jaas.config.KeystoreInstance;
+import org.apache.karaf.jaas.config.KeystoreIsLocked;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ */
+public class ResourceKeystoreInstance implements KeystoreInstance {
+
+    private final Logger logger = LoggerFactory.getLogger(ResourceKeystoreInstance.class);
+
+    private static final String JKS = "JKS";
+
+    private String name;
+    private int rank;
+    private URL path;
+    private String keystorePassword;
+    private Map keyPasswords = new HashMap();
+    private File keystoreFile; // Only valid after startup and if the resource points to a file
+
+    // The following variables are the state of the keystore, which should be chucked if the file on disk changes
+    private List privateKeys = new ArrayList();
+    private List trustCerts = new ArrayList();
+    private KeyStore keystore;
+    private long keystoreReadDate = Long.MIN_VALUE;
+
+    /**
+     * @return the keystoreName
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param keystoreName the keystoreName to set
+     */
+    public void setName(String keystoreName) {
+        this.name = keystoreName;
+    }
+
+    /**
+     * @return the rank
+     */
+    public int getRank() {
+        return rank;
+    }
+
+    /**
+     * @param rank the rank to set
+     */
+    public void setRank(int rank) {
+        this.rank = rank;
+    }
+
+    /**
+     * @return the keystorePath
+     */
+    public URL getPath() {
+        return path;
+    }
+
+    /**
+     * @param keystorePath the keystorePath to set
+     */
+    public void setPath(URL keystorePath) throws IOException {
+        this.path = keystorePath;
+        if (keystorePath.getProtocol().equals("file")) {
+            URI uri = URI.create(keystorePath.toString().replace(" ", "%20"));
+            this.keystoreFile = new File(uri.getSchemeSpecificPart());
+        }
+    }
+
+    /**
+     * @param keystorePassword the keystorePassword to set
+     */
+    public void setKeystorePassword(String keystorePassword) {
+        this.keystorePassword = keystorePassword;
+    }
+
+    /**
+     * @param keyPasswords the keyPasswords to set
+     */
+    public void setKeyPasswords(String keyPasswords) {
+        if (keyPasswords != null) {
+            String[] keys = keyPasswords.split("\\]\\!\\[");
+            for (int i = 0; i < keys.length; i++) {
+                String key = keys[i];
+                int pos = key.indexOf('=');
+                this.keyPasswords.put(key.substring(0, pos), key.substring(pos + 1).toCharArray());
+            }
+        }
+    }
+
+    public Certificate getCertificate(String alias) {
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        try {
+            return keystore.getCertificate(alias);
+        } catch (KeyStoreException e) {
+            logger.error("Unable to read certificate from keystore", e);
+        }
+        return null;
+    }
+
+    public String getCertificateAlias(Certificate cert) {
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        try {
+            return keystore.getCertificateAlias(cert);
+        } catch (KeyStoreException e) {
+            logger.error("Unable to read retrieve alias for given certificate from keystore", e);
+        }
+        return null;
+    }
+
+    public Certificate[] getCertificateChain(String alias) {
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        try {
+            return keystore.getCertificateChain(alias);
+        } catch (KeyStoreException e) {
+            logger.error("Unable to read certificate chain from keystore", e);
+        }
+        return null;
+    }
+
+    public KeyManager[] getKeyManager(String algorithm, String keyAlias) throws KeystoreIsLocked,
+                                    NoSuchAlgorithmException, KeyStoreException, UnrecoverableKeyException {
+        if (isKeystoreLocked()) {
+            throw new KeystoreIsLocked("Keystore '" + name + "' is locked.");
+        }
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(algorithm);
+        keyFactory.init(keystore, (char[]) keyPasswords.get(keyAlias));
+        return keyFactory.getKeyManagers();
+    }
+
+    public PrivateKey getPrivateKey(String alias) {
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        try {
+            if (isKeyLocked(alias)) {
+                return null;
+            }
+            Key key = keystore.getKey(alias, (char[]) keyPasswords.get(alias));
+            if (key instanceof PrivateKey) {
+                return (PrivateKey) key;
+            }
+        } catch (KeyStoreException e) {
+            logger.error("Unable to read private key from keystore", e);
+        } catch (NoSuchAlgorithmException e) {
+            logger.error("Unable to read private key from keystore", e);
+        } catch (UnrecoverableKeyException e) {
+            logger.error("Unable to read private key from keystore", e);
+        }
+        return null;
+    }
+
+    public TrustManager[] getTrustManager(String algorithm) throws KeyStoreException,
+                                            NoSuchAlgorithmException, KeystoreIsLocked {
+        if (isKeystoreLocked()) {
+            throw new KeystoreIsLocked("Keystore '" + name + "' is locked.");
+        }
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(algorithm);
+        trustFactory.init(keystore);
+        return trustFactory.getTrustManagers();
+    }
+
+    public boolean isKeyLocked(String keyAlias) {
+        return keyPasswords.get(keyAlias) == null;
+    }
+
+    public boolean isKeystoreLocked() {
+        return keystorePassword == null;
+    }
+
+    public String[] listPrivateKeys() {
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        return (String[]) privateKeys.toArray(new String[privateKeys.size()]);
+    }
+
+    public String[] listTrustCertificates() {
+        if (!loadKeystoreData()) {
+            return null;
+        }
+        return (String[]) trustCerts.toArray(new String[trustCerts.size()]);
+    }
+
+    // ==================== Internals =====================
+
+    private boolean loadKeystoreData() {
+        // Check to reload the data if needed
+        if (keystoreFile != null && keystoreReadDate >= keystoreFile.lastModified()) {
+            return true;
+        }
+        // If not a file, just not reload the data if it has already been loaded
+        if (keystoreFile == null && keystore != null) {
+            return true;
+        }
+        // Check if the file is invalid
+        if (keystoreFile != null && (!keystoreFile.exists() || !keystoreFile.canRead())) {
+            throw new IllegalArgumentException("Invalid keystore file (" + path + " = " + keystoreFile.getAbsolutePath() + ")");
+        }
+        // Load the keystore data
+        try {
+            keystoreReadDate = System.currentTimeMillis();
+            privateKeys.clear();
+            trustCerts.clear();
+            if (keystore == null) {
+                keystore = KeyStore.getInstance(JKS);
+            }
+            InputStream in = new BufferedInputStream(path.openStream());
+            keystore.load(in, keystorePassword == null ? new char[0] : keystorePassword.toCharArray());
+            in.close();
+            Enumeration aliases = keystore.aliases();
+            while (aliases.hasMoreElements()) {
+                String alias = (String) aliases.nextElement();
+                if (keystore.isKeyEntry(alias)) {
+                    privateKeys.add(alias);
+                } else if (keystore.isCertificateEntry(alias)) {
+                    trustCerts.add(alias);
+                }
+            }
+            return true;
+        } catch (KeyStoreException e) {
+            logger.error("Unable to open keystore with provided password", e);
+        } catch (IOException e) {
+            logger.error("Unable to open keystore with provided password", e);
+        } catch (NoSuchAlgorithmException e) {
+            logger.error("Unable to open keystore with provided password", e);
+        } catch (CertificateException e) {
+            logger.error("Unable to open keystore with provided password", e);
+        }
+        return false;
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml b/karaf-2.2.x/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml
new file mode 100644
index 0000000..8698f87
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml
@@ -0,0 +1,59 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <bean id="config"
+          class="org.apache.karaf.jaas.config.impl.OsgiConfiguration"
+          init-method="init"
+          destroy-method="close"/>
+
+    <reference-list id="realms"
+                    interface="org.apache.karaf.jaas.config.JaasRealm"
+                    availability="optional">
+        <reference-listener ref="config" bind-method="register" unbind-method="unregister" />
+    </reference-list>
+
+    <bean id="proxyLoginModuleInitializer" class="org.apache.karaf.jaas.config.impl.ProxyLoginModuleInitializer" init-method="init">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- Register the Straight-Through flow -->
+    <bean id="keystoreManager" class="org.apache.karaf.jaas.config.impl.OsgiKeystoreManager" />
+    <service ref="keystoreManager" interface="org.apache.karaf.jaas.config.KeystoreManager" />
+
+    <reference-list id="keystores"
+                    interface="org.apache.karaf.jaas.config.KeystoreInstance"
+                    availability="optional">
+        <reference-listener ref="keystoreManager" bind-method="register" unbind-method="unregister" />
+    </reference-list>
+
+    <service interface="org.apache.aries.blueprint.NamespaceHandler">
+        <service-properties>
+            <entry key="osgi.service.blueprint.namespace">
+                <array>
+                    <value>http://karaf.apache.org/xmlns/jaas/v1.0.0</value>
+                    <value>http://karaf.apache.org/xmlns/jaas/v1.1.0</value>
+                </array>
+            </entry>
+        </service-properties>
+        <bean class="org.apache.karaf.jaas.config.impl.NamespaceHandler"/>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/jaas/config/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/jaas/config/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..17e17f4
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,18 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle manages the configuration of the JAAS security framework.
+
+    In particular it  initializes the JAAS ProxyLoginModule and manages the Karaf JAAS namespaces:
+    \u001B[33mhttp://karaf.apache.org/xmlns/jaas/v1.0.0\u001B[0m
+    \u001B[33mhttp://karaf.apache.org/xmlns/jaas/v1.1.0\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mSecurity\u001B[0m section of the Karaf User Guide.
+    \u001B[36mSecurity Framework\u001B[0m section of the Karaf Developer Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd b/karaf-2.2.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd
new file mode 100644
index 0000000..225665c
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd
@@ -0,0 +1,62 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault='qualified'
+           targetNamespace='http://karaf.apache.org/xmlns/jaas/v1.0.0'
+           xmlns:xs='http://www.w3.org/2001/XMLSchema'
+           xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:tns='http://karaf.apache.org/xmlns/jaas/v1.0.0'>
+
+    <xs:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+    <xs:element name="config">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="module" minOccurs="0" maxOccurs="unbounded">
+                    <xs:complexType mixed="true">
+                        <xs:attribute name="className" use="required" type="xs:string"/>
+                        <xs:attribute name="flags" default="required">
+                            <xs:simpleType>
+                                <xs:restriction base="xs:NMTOKEN">
+                                    <xs:enumeration value="required"/>
+                                    <xs:enumeration value="requisite"/>
+                                    <xs:enumeration value="sufficient"/>
+                                    <xs:enumeration value="optional"/>
+                                </xs:restriction>
+                            </xs:simpleType>
+                        </xs:attribute>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="name" use="required" type="xs:string"/>
+            <xs:attribute name="rank" use="optional" default="0" type="xs:int"/>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="keystore">
+        <xs:complexType>
+            <xs:attribute name="name" use="required" type="xs:string"/>
+            <xs:attribute name="rank" use="optional" default="0" type="xs:int"/>
+            <xs:attribute name="path" use="required" type="xs:string"/>
+            <xs:attribute name="keystorePassword" use="optional" type="xs:string"/>
+            <xs:attribute name="keyPasswords" use="optional" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
diff --git a/karaf-2.2.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd b/karaf-2.2.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd
new file mode 100644
index 0000000..f56b206
--- /dev/null
+++ b/karaf-2.2.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd
@@ -0,0 +1,63 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault='qualified'
+           targetNamespace='http://karaf.apache.org/xmlns/jaas/v1.1.0'
+           xmlns:xs='http://www.w3.org/2001/XMLSchema'
+           xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:tns='http://karaf.apache.org/xmlns/jaas/v1.1.0'>
+
+    <xs:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+    <xs:element name="config">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="module" minOccurs="0" maxOccurs="unbounded">
+                    <xs:complexType mixed="true">
+                        <xs:attribute name="name" use="optional" type="xs:string"/>
+                        <xs:attribute name="className" use="required" type="xs:string"/>
+                        <xs:attribute name="flags" default="required">
+                            <xs:simpleType>
+                                <xs:restriction base="xs:NMTOKEN">
+                                    <xs:enumeration value="required"/>
+                                    <xs:enumeration value="requisite"/>
+                                    <xs:enumeration value="sufficient"/>
+                                    <xs:enumeration value="optional"/>
+                                </xs:restriction>
+                            </xs:simpleType>
+                        </xs:attribute>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+            <xs:attribute name="name" use="required" type="xs:string"/>
+            <xs:attribute name="rank" use="optional" default="0" type="xs:int"/>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="keystore">
+        <xs:complexType>
+            <xs:attribute name="name" use="required" type="xs:string"/>
+            <xs:attribute name="rank" use="optional" default="0" type="xs:int"/>
+            <xs:attribute name="path" use="required" type="xs:string"/>
+            <xs:attribute name="keystorePassword" use="optional" type="xs:string"/>
+            <xs:attribute name="keyPasswords" use="optional" type="xs:string"/>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
diff --git a/karaf-2.2.x/jaas/jasypt/NOTICE b/karaf-2.2.x/jaas/jasypt/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/jaas/jasypt/pom.xml b/karaf-2.2.x/jaas/jasypt/pom.xml
new file mode 100644
index 0000000..cb178e2
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/pom.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+    
+    <modelVersion>4.0.0</modelVersion>
+    
+    <parent>
+        <groupId>org.apache.karaf.jaas</groupId>
+        <artifactId>jaas</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    
+    <artifactId>org.apache.karaf.jaas.jasypt</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: JAAS :: Jasypt Encryption</name>
+    <description>This bundle provide Jasypt service for the encryption support in the JAAS security framework.</description>
+    
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+    
+    <dependencies>
+    
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.modules</artifactId>    
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.jasypt</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.ibm.icu</groupId>
+            <artifactId>icu4j</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.aries.blueprint</groupId>
+            <artifactId>org.apache.aries.blueprint</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.googlecode.pojosr</groupId>
+            <artifactId>de.kalpatec.pojosr.framework</artifactId>
+            <version>0.1.4</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ops4j.pax.swissbox</groupId>
+            <artifactId>pax-swissbox-tinybundles</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.aries.proxy</groupId>
+            <artifactId>org.apache.aries.proxy</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>jcl-over-slf4j</artifactId>
+            <version>${slf4j.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            com.ibm.icu*;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholder.java b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholder.java
new file mode 100644
index 0000000..c8e518e
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholder.java
@@ -0,0 +1,41 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.jasypt.handler;
+
+import org.apache.aries.blueprint.ext.AbstractPropertyPlaceholder;
+import org.jasypt.encryption.StringEncryptor;
+
+public class EncryptablePropertyPlaceholder extends AbstractPropertyPlaceholder {
+
+    private StringEncryptor encryptor;
+
+    public StringEncryptor getEncryptor() {
+        return encryptor;
+    }
+
+    public void setEncryptor(StringEncryptor encryptor) {
+        this.encryptor = encryptor;
+    }
+
+    public void init() {
+
+    }
+
+    @Override
+    protected String getProperty(String val) {
+        return encryptor.decrypt(val);
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/NamespaceHandler.java b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/NamespaceHandler.java
new file mode 100644
index 0000000..4a196c0
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/NamespaceHandler.java
@@ -0,0 +1,173 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.jasypt.handler;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.ext.PlaceholdersUtils;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;
+import org.apache.aries.blueprint.mutable.MutableRefMetadata;
+import org.apache.aries.blueprint.mutable.MutableValueMetadata;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.reflect.BeanMetadata;
+import org.osgi.service.blueprint.reflect.CollectionMetadata;
+import org.osgi.service.blueprint.reflect.ComponentMetadata;
+import org.osgi.service.blueprint.reflect.Metadata;
+import org.osgi.service.blueprint.reflect.RefMetadata;
+import org.osgi.service.blueprint.reflect.ValueMetadata;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Comment;
+import org.w3c.dom.Element;
+import org.w3c.dom.EntityReference;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler {
+
+    public static final String ID_ATTRIBUTE = "id";
+    public static final String PLACEHOLDER_PREFIX_ATTRIBUTE = "placeholder-prefix";
+    public static final String PLACEHOLDER_SUFFIX_ATTRIBUTE = "placeholder-suffix";
+    public static final String PROPERTY_PLACEHOLDER_ELEMENT = "property-placeholder";
+    public static final String ENCRYPTOR_REF_ATTRIBUTE = "encryptor-ref";
+    public static final String ENCRYPTOR_ELEMENT = "encryptor";
+    public static final String JASYPT_NAMESPACE_1_0 = "http://karaf.apache.org/xmlns/jasypt/v1.0.0";
+
+    private int idCounter;
+
+    public URL getSchemaLocation(String s) {
+        return getClass().getResource("/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd");
+    }
+
+    public Set<Class> getManagedClasses() {
+        return new HashSet<Class>(Arrays.asList(
+                EncryptablePropertyPlaceholder.class
+        ));
+    }
+
+    public Metadata parse(Element element, ParserContext context) {
+        String name = element.getLocalName() != null ? element.getLocalName() : element.getNodeName();
+        if (PROPERTY_PLACEHOLDER_ELEMENT.equals(name)) {
+            return parsePropertyPlaceholder(element, context);
+        }
+        throw new ComponentDefinitionException("Bad xml syntax: unknown element '" + name + "'");
+    }
+
+    public ComponentMetadata decorate(Node node, ComponentMetadata componentMetadata, ParserContext parserContext) {
+        throw new ComponentDefinitionException("Bad xml syntax: node decoration is not supported");
+    }
+
+    public ComponentMetadata parsePropertyPlaceholder(Element element, ParserContext context) {
+        MutableBeanMetadata metadata = context.createMetadata(MutableBeanMetadata.class);
+        metadata.setProcessor(true);
+        metadata.setId(getId(context, element));
+        metadata.setScope(BeanMetadata.SCOPE_SINGLETON);
+        metadata.setRuntimeClass(EncryptablePropertyPlaceholder.class);
+        metadata.setInitMethod("init");
+        String prefix = element.hasAttribute(PLACEHOLDER_PREFIX_ATTRIBUTE)
+                                    ? element.getAttribute(PLACEHOLDER_PREFIX_ATTRIBUTE)
+                                    : "ENC(";
+        metadata.addProperty("placeholderPrefix", createValue(context, prefix));
+        String suffix = element.hasAttribute(PLACEHOLDER_SUFFIX_ATTRIBUTE)
+                                    ? element.getAttribute(PLACEHOLDER_SUFFIX_ATTRIBUTE)
+                                    : ")";
+        metadata.addProperty("placeholderSuffix", createValue(context, suffix));
+        String encryptorRef = element.hasAttribute("encryptor-ref")
+                                    ? element.getAttribute("encryptor-ref")
+                                    : null;
+        if (encryptorRef != null) {
+            metadata.addProperty("encryptor", createRef(context, encryptorRef));
+        }
+        NodeList nl = element.getChildNodes();
+        for (int i = 0; i < nl.getLength(); i++) {
+            Node node = nl.item(i);
+            if (node instanceof Element) {
+                Element e = (Element) node;
+                if (JASYPT_NAMESPACE_1_0.equals(e.getNamespaceURI())) {
+                    String name = e.getLocalName() != null ? e.getLocalName() : e.getNodeName();
+                    if (ENCRYPTOR_ELEMENT.equals(name)) {
+                        if (encryptorRef != null) {
+                            throw new ComponentDefinitionException("Only one of " + ENCRYPTOR_REF_ATTRIBUTE + " attribute or " + ENCRYPTOR_ELEMENT + " element is allowed");
+                        }
+                        BeanMetadata encryptor = context.parseElement(BeanMetadata.class, metadata, e);
+                        metadata.addProperty("encryptor", encryptor);
+                    }
+                }
+            }
+        }
+        PlaceholdersUtils.validatePlaceholder(metadata, context.getComponentDefinitionRegistry());
+        return metadata;
+    }
+
+    public String getId(ParserContext context, Element element) {
+        if (element.hasAttribute(ID_ATTRIBUTE)) {
+            return element.getAttribute(ID_ATTRIBUTE);
+        } else {
+            return generateId(context);
+        }
+    }
+
+    private String generateId(ParserContext context) {
+        String id;
+        do {
+            id = ".jaas-" + ++idCounter;
+        } while (context.getComponentDefinitionRegistry().containsComponentDefinition(id));
+        return id;
+    }
+
+    private static ValueMetadata createValue(ParserContext context, String value) {
+        return createValue(context, value, null);
+    }
+
+    private static ValueMetadata createValue(ParserContext context, String value, String type) {
+        MutableValueMetadata m = context.createMetadata(MutableValueMetadata.class);
+        m.setStringValue(value);
+        m.setType(type);
+        return m;
+    }
+
+    private static CollectionMetadata createList(ParserContext context, List<String> list) {
+        MutableCollectionMetadata m = context.createMetadata(MutableCollectionMetadata.class);
+        m.setCollectionClass(List.class);
+        m.setValueType(String.class.getName());
+        for (String v : list) {
+            m.addValue(createValue(context, v, String.class.getName()));
+        }
+        return m;
+    }
+
+    private RefMetadata createRef(ParserContext context, String value) {
+        MutableRefMetadata r = context.createMetadata(MutableRefMetadata.class);
+        r.setComponentId(value);
+        return r;
+    }
+
+    private static String getTextValue(Element element) {
+        StringBuffer value = new StringBuffer();
+        NodeList nl = element.getChildNodes();
+        for (int i = 0; i < nl.getLength(); i++) {
+            Node item = nl.item(i);
+            if ((item instanceof CharacterData && !(item instanceof Comment)) || item instanceof EntityReference) {
+                value.append(item.getNodeValue());
+            }
+        }
+        return value.toString();
+    }
+}
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryption.java b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryption.java
new file mode 100644
index 0000000..99311a8
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryption.java
@@ -0,0 +1,87 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.jasypt.impl;
+
+import java.util.Map;
+
+import org.apache.karaf.jaas.modules.Encryption;
+import org.apache.karaf.jaas.modules.EncryptionService;
+import org.jasypt.digest.config.DigesterConfig;
+import org.jasypt.digest.config.SimpleDigesterConfig;
+import org.jasypt.digest.config.SimpleStringDigesterConfig;
+import org.jasypt.exceptions.EncryptionInitializationException;
+import org.jasypt.util.password.ConfigurablePasswordEncryptor;
+
+/**
+ * Jasypt implementation of the Encryption service.
+ */
+public class JasyptEncryption implements Encryption {
+
+    private ConfigurablePasswordEncryptor passwordEncryptor;
+    
+    /**
+     * <p>
+     * Default constructor with the encryption algorithm.
+     * </p>
+     * 
+     * @param params encryption parameters
+     */
+    public JasyptEncryption(Map<String,String> params) {
+        SimpleStringDigesterConfig config = new SimpleStringDigesterConfig();
+        for (String key : params.keySet()) {
+            if (EncryptionService.ALGORITHM.equalsIgnoreCase(key)) {
+                config.setAlgorithm(params.get(key));
+            } else if (EncryptionService.ENCODING.equalsIgnoreCase(key)) {
+                config.setStringOutputType(params.get(key));
+            } else if ("providerName".equalsIgnoreCase(key)) {
+                config.setProviderName(params.get(key));
+            } else if ("saltSizeBytes".equalsIgnoreCase(key)) {
+                config.setSaltSizeBytes(params.get(key));
+            } else if ("iterations".equalsIgnoreCase(key)) {
+                config.setIterations(params.get(key));
+            } else if ("providerClassName".equalsIgnoreCase(key)) {
+                config.setProviderClassName(params.get(key));
+            } else if ("saltGeneratorClassName".equalsIgnoreCase(key)) {
+                config.setSaltGeneratorClassName(params.get(key));
+            } else {
+                throw new IllegalArgumentException("Unsupported encryption parameter: " + key);
+            }
+        }
+        this.passwordEncryptor = new ConfigurablePasswordEncryptor();
+        this.passwordEncryptor.setConfig(config);
+        try {
+            this.passwordEncryptor.encryptPassword("test");
+        } catch (EncryptionInitializationException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.karaf.jaas.modules.Encryption#encryptPassword(java.lang.String)
+     */
+    public String encryptPassword(String plain) {
+        return this.passwordEncryptor.encryptPassword(plain);
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see org.apache.karaf.jaas.modules.Encryption#checkPassword(java.lang.String, java.lang.String)
+     */
+    public boolean checkPassword(String input, String password) {
+        return passwordEncryptor.checkPassword(input, password);
+    }
+    
+}
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionService.java b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionService.java
new file mode 100644
index 0000000..24c49af
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionService.java
@@ -0,0 +1,27 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.jasypt.impl;
+
+import java.util.Map;
+
+import org.apache.karaf.jaas.modules.Encryption;
+import org.apache.karaf.jaas.modules.EncryptionService;
+
+public class JasyptEncryptionService implements EncryptionService {
+
+    public Encryption createEncryption(Map<String, String> params) throws IllegalArgumentException {
+        return new JasyptEncryption(params);
+    }
+}
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/resources/OSGI-INF/blueprint/karaf-jaas-jasypt.xml b/karaf-2.2.x/jaas/jasypt/src/main/resources/OSGI-INF/blueprint/karaf-jaas-jasypt.xml
new file mode 100644
index 0000000..e74ee76
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/resources/OSGI-INF/blueprint/karaf-jaas-jasypt.xml
@@ -0,0 +1,40 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <service interface="org.apache.karaf.jaas.modules.EncryptionService">
+        <service-properties>
+            <entry key="name" value="jasypt" />
+        </service-properties>
+        <bean class="org.apache.karaf.jaas.jasypt.impl.JasyptEncryptionService"/>
+    </service>
+
+    <service interface="org.apache.aries.blueprint.NamespaceHandler">
+        <service-properties>
+            <entry key="osgi.service.blueprint.namespace">
+                <array>
+                    <value>http://karaf.apache.org/xmlns/jasypt/v1.0.0</value>
+                </array>
+            </entry>
+        </service-properties>
+        <bean class="org.apache.karaf.jaas.jasypt.handler.NamespaceHandler"/>
+    </service>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/jaas/jasypt/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..d191ded
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,26 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle uses the Jasypt tool to provide encryption support in the JAAS security framework.
+
+    Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects
+    with minimum effort, and without the need of having deep knowledge on how cryptography works.
+
+    * High-security, standards-based encryption techniques, both for unidirectional and bidirectional encryption.
+      Encrypt passwords, texts, numbers, binaries...
+    * Transparent integration with Hibernate.
+    * Suitable for integration into Spring-based applications and also transparently integrable with Spring Security.
+    * Integrated capabilities for encrypting the configuration of applications (i.e. datasources).
+    * Specific features for high-performance encryption in multi-processor/multi-core systems.
+    * Open API for use with any JCE provider.
+    * ...and much more
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mSecurity Framework\u001B[0m section of the Karaf Developer Guide.
+    \u001B[36mhttp://www.jasypt.org/\u001B[0m
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/jasypt/src/main/resources/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd b/karaf-2.2.x/jaas/jasypt/src/main/resources/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd
new file mode 100644
index 0000000..f5e6921
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/main/resources/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd
@@ -0,0 +1,43 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault='qualified'
+           targetNamespace='http://karaf.apache.org/xmlns/jasypt/v1.0.0'
+           xmlns:xs='http://www.w3.org/2001/XMLSchema'
+           xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:tns='http://karaf.apache.org/xmlns/jasypt/v1.0.0'>
+
+    <xs:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+    <xs:element name="property-placeholder">
+        <xs:complexType>
+            <xs:complexContent>
+                <xs:extension base="bp:Tcomponent">
+                    <xs:sequence>
+                        <xs:element maxOccurs="1" minOccurs="0" name="encryptor" type="bp:Tbean"/>
+                    </xs:sequence>
+                    <xs:attribute name="placeholder-prefix" type="xs:string" use="optional" default="ENC("/>
+                    <xs:attribute name="placeholder-suffix" type="xs:string" use="optional" default=")"/>
+                    <xs:attribute name="encryptor-ref" type="bp:Tidref" use="optional"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
diff --git a/karaf-2.2.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholderTest.java b/karaf-2.2.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholderTest.java
new file mode 100644
index 0000000..0e7c274
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholderTest.java
@@ -0,0 +1,228 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.jasypt.handler;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarInputStream;
+
+import de.kalpatec.pojosr.framework.PojoServiceRegistryFactoryImpl;
+import de.kalpatec.pojosr.framework.launch.BundleDescriptor;
+import de.kalpatec.pojosr.framework.launch.ClasspathScanner;
+import de.kalpatec.pojosr.framework.launch.PojoServiceRegistry;
+import de.kalpatec.pojosr.framework.launch.PojoServiceRegistryFactory;
+import junit.framework.TestCase;
+import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
+import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundle;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle;
+
+public class EncryptablePropertyPlaceholderTest extends TestCase {
+
+    public static final long DEFAULT_TIMEOUT = 30000;
+
+    private BundleContext bundleContext;
+
+    @Before
+    public void setUp() throws Exception {
+
+        StandardPBEStringEncryptor enc = new StandardPBEStringEncryptor();
+        EnvironmentStringPBEConfig env = new EnvironmentStringPBEConfig();
+        env.setAlgorithm("PBEWithMD5AndDES");
+        env.setPassword("password");
+        enc.setConfig(env);
+        String val = enc.encrypt("bar");
+        System.setProperty("foo", val);
+
+        System.setProperty("org.osgi.framework.storage", "target/osgi/" + System.currentTimeMillis());
+        System.setProperty("karaf.name", "root");
+
+        List<BundleDescriptor> bundles = new ClasspathScanner().scanForBundles("(Bundle-SymbolicName=*)");
+        bundles.add(getBundleDescriptor(
+                "target/jasypt.jar",
+                newBundle().add("OSGI-INF/blueprint/karaf-jaas-jasypt.xml", getClass().getResource("/OSGI-INF/blueprint/karaf-jaas-jasypt.xml"))
+                           .set("Manifest-Version", "2")
+                           .set("Bundle-ManifestVersion", "2")
+                           .set("Bundle-SymbolicName", "jasypt")
+                           .set("Bundle-Version", "0.0.0")));
+        bundles.add(getBundleDescriptor(
+                "target/test.jar",
+                newBundle().add("OSGI-INF/blueprint/test.xml", getClass().getResource("test.xml"))
+                           .set("Manifest-Version", "2")
+                           .set("Bundle-ManifestVersion", "2")
+                           .set("Bundle-SymbolicName", "test")
+                           .set("Bundle-Version", "0.0.0")));
+
+        Map config = new HashMap();
+        config.put(PojoServiceRegistryFactory.BUNDLE_DESCRIPTORS, bundles);
+        PojoServiceRegistry reg = new PojoServiceRegistryFactoryImpl().newPojoServiceRegistry(config);
+        bundleContext = reg.getBundleContext();
+    }
+
+    private BundleDescriptor getBundleDescriptor(String path, TinyBundle bundle) throws Exception {
+        File file = new File(path);
+        FileOutputStream fos = new FileOutputStream(file);
+        copy(bundle.build(), fos);
+        fos.close();
+        JarInputStream jis = new JarInputStream(new FileInputStream(file));
+        Map<String, String> headers = new HashMap<String, String>();
+        for (Map.Entry entry : jis.getManifest().getMainAttributes().entrySet()) {
+            headers.put(entry.getKey().toString(), entry.getValue().toString());
+        }
+        return new BundleDescriptor(
+                getClass().getClassLoader(),
+                new URL("jar:" + file.toURI().toString() + "!/"),
+                headers);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        bundleContext.getBundle().stop();
+    }
+
+    @Test
+    public void testPlaceholder() throws Exception {
+
+        for (Bundle bundle: bundleContext.getBundles()) {
+            System.out.println(bundle.getSymbolicName() + " / " + bundle.getVersion());
+        }
+
+        String encoded = getOsgiService(String.class, "(encoded=*)");
+        assertEquals("bar", encoded);
+    }
+
+
+    protected <T> T getOsgiService(Class<T> type, long timeout) {
+        return getOsgiService(type, null, timeout);
+    }
+
+    protected <T> T getOsgiService(Class<T> type) {
+        return getOsgiService(type, null, DEFAULT_TIMEOUT);
+    }
+
+    protected <T> T getOsgiService(Class<T> type, String filter) {
+        return getOsgiService(type, filter, DEFAULT_TIMEOUT);
+    }
+
+    protected <T> T getOsgiService(Class<T> type, String filter, long timeout) {
+        ServiceTracker tracker = null;
+        try {
+            String flt;
+            if (filter != null) {
+                if (filter.startsWith("(")) {
+                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")" + filter + ")";
+                } else {
+                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")(" + filter + "))";
+                }
+            } else {
+                flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")";
+            }
+            Filter osgiFilter = FrameworkUtil.createFilter(flt);
+            tracker = new ServiceTracker(bundleContext, osgiFilter, null);
+            tracker.open(true);
+            // Note that the tracker is not closed to keep the reference
+            // This is buggy, as the service reference may change i think
+            Object svc = type.cast(tracker.waitForService(timeout));
+            if (svc == null) {
+                Dictionary dic = bundleContext.getBundle().getHeaders();
+                System.err.println("Test bundle headers: " + explode(dic));
+
+                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, null))) {
+                    System.err.println("ServiceReference: " + ref);
+                }
+
+                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, flt))) {
+                    System.err.println("Filtered ServiceReference: " + ref);
+                }
+
+                throw new RuntimeException("Gave up waiting for service " + flt);
+            }
+            return type.cast(svc);
+        } catch (InvalidSyntaxException e) {
+            throw new IllegalArgumentException("Invalid filter", e);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /*
+     * Explode the dictionary into a ,-delimited list of key=value pairs
+     */
+    private static String explode(Dictionary dictionary) {
+        Enumeration keys = dictionary.keys();
+        StringBuffer result = new StringBuffer();
+        while (keys.hasMoreElements()) {
+            Object key = keys.nextElement();
+            result.append(String.format("%s=%s", key, dictionary.get(key)));
+            if (keys.hasMoreElements()) {
+                result.append(", ");
+            }
+        }
+        return result.toString();
+    }
+
+    /*
+     * Provides an iterable collection of references, even if the original array is null
+     */
+    private static final Collection<ServiceReference> asCollection(ServiceReference[] references) {
+        List<ServiceReference> result = new LinkedList<ServiceReference>();
+        if (references != null) {
+            for (ServiceReference reference : references) {
+                result.add(reference);
+            }
+        }
+        return result;
+    }
+
+    public static long copy(final InputStream input, final OutputStream output) throws IOException {
+        return copy(input, output, 8024);
+    }
+
+    public static long copy(final InputStream input, final OutputStream output, int buffersize) throws IOException {
+        final byte[] buffer = new byte[buffersize];
+        int n;
+        long count=0;
+        while (-1 != (n = input.read(buffer))) {
+            output.write(buffer, 0, n);
+            count += n;
+        }
+        return count;
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionTest.java b/karaf-2.2.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionTest.java
new file mode 100644
index 0000000..a118ef9
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionTest.java
@@ -0,0 +1,53 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.jasypt.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+import org.apache.karaf.jaas.modules.EncryptionService;
+
+/**
+ * Test <code>JasyptEncryption</code>.
+ */
+public class JasyptEncryptionTest extends TestCase {
+    
+    private JasyptEncryption encryption;
+    
+    /*
+     * (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    public void setUp() {
+        Map<String,String> props = new HashMap<String,String>();
+        props.put(EncryptionService.ALGORITHM, "MD5");
+        this.encryption = new JasyptEncryption(props);
+    }
+    
+    /**
+     * <p>
+     * Test <code>checkPassword()</p> method.
+     * </p>
+     * 
+     * @throws Exception in case of test error.
+     */
+    public void testCheckPassword() throws Exception {
+        String password = this.encryption.encryptPassword("test");
+        
+        assertEquals(true, this.encryption.checkPassword("test", password));
+    }
+    
+}
diff --git a/karaf-2.2.x/jaas/jasypt/src/test/resources/log4j.properties b/karaf-2.2.x/jaas/jasypt/src/test/resources/log4j.properties
new file mode 100644
index 0000000..e1cbdd1
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/test/resources/log4j.properties
@@ -0,0 +1,34 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=DEBUG, console, file
+
+# Console will only display warnnings
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+#log4j.appender.console.threshold=WARN
+
+# File appender will contain all info messages
+log4j.appender.file=org.apache.log4j.FileAppender
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d | %-5p | %m | %c | %t%n
+log4j.appender.file.file=target/test.log
+log4j.appender.file.append=true
diff --git a/karaf-2.2.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/test.xml b/karaf-2.2.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/test.xml
new file mode 100644
index 0000000..7e72dde
--- /dev/null
+++ b/karaf-2.2.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/test.xml
@@ -0,0 +1,28 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+        xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+        xmlns:enc="http://karaf.apache.org/xmlns/jasypt/v1.0.0">
+
+
+    <ext:property-placeholder />
+
+    <enc:property-placeholder>
+        <enc:encryptor class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
+            <property name="config">
+                <bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
+                    <property name="algorithm" value="PBEWithMD5AndDES" />
+                    <property name="password" value="password" />
+                </bean>
+            </property>
+        </enc:encryptor>
+    </enc:property-placeholder>
+
+    <service auto-export="all-classes">
+        <service-properties>
+            <entry key="encoded" value="ENC(${foo})" />
+        </service-properties>
+        <bean class="java.lang.String">
+            <argument value="ENC(${foo})" />
+        </bean>
+    </service>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/modules/NOTICE b/karaf-2.2.x/jaas/modules/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/jaas/modules/pom.xml b/karaf-2.2.x/jaas/modules/pom.xml
new file mode 100644
index 0000000..6e9ecf5
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/pom.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.jaas</groupId>
+        <artifactId>jaas</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.jaas.modules</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: JAAS :: Modules</name>
+    <description>This bundle provides JAAS modules which can be used in Karaf (LDAP, JDBC, etc).</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.boot</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.aries.blueprint</groupId>
+            <artifactId>org.apache.aries.blueprint</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.karaf.jaas.config,
+                            org.apache.aries.blueprint.ext,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.util;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/AbstractKarafLoginModule.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/AbstractKarafLoginModule.java
new file mode 100644
index 0000000..9c608ec
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/AbstractKarafLoginModule.java
@@ -0,0 +1,130 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules;
+
+import org.apache.karaf.jaas.modules.encryption.EncryptionSupport;
+import org.osgi.framework.BundleContext;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.spi.LoginModule;
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * <p>
+ * Abstract JAAS login module extended by all Karaf Login Modules.
+ * </p>
+ *
+ * @author iocanel, jbonofre
+ */
+public abstract class AbstractKarafLoginModule implements LoginModule {
+
+    protected Set<Principal> principals = new HashSet<Principal>();
+    protected Subject subject;
+    protected String user;
+    protected CallbackHandler callbackHandler;
+    protected boolean debug;
+    protected Map<String, ?> options;
+   
+    protected String rolePolicy;
+    protected String roleDiscriminator;
+    protected boolean detailedLoginExcepion;
+
+    /**
+     * the bundle context is required to use the encryption service
+     */
+    protected BundleContext bundleContext;
+
+    private EncryptionSupport encryptionSupport;
+
+    public boolean commit() throws LoginException {
+        RolePolicy policy = RolePolicy.getPolicy(rolePolicy);
+        if (policy != null && roleDiscriminator != null) {
+            policy.handleRoles(subject, principals, roleDiscriminator);
+        } else {
+            subject.getPrincipals().addAll(principals);
+        }
+        return true;
+    }
+
+    protected void clear() {
+        user = null;
+    }
+
+    public void initialize(Subject sub, CallbackHandler handler, Map options) {
+        this.subject = sub;
+        this.callbackHandler = handler;
+        this.options = options;
+        this.rolePolicy = (String) options.get("role.policy");
+        this.roleDiscriminator = (String) options.get("role.discriminator");
+        this.debug = Boolean.parseBoolean((String) options.get("debug"));
+        this.detailedLoginExcepion = Boolean.parseBoolean((String) options.get("detailed.login.exception"));
+        // the bundle context is set in the Config JaasRealm by default
+        this.bundleContext = (BundleContext) options.get(BundleContext.class.getName());
+        encryptionSupport = new EncryptionSupport(options);
+    }
+
+
+    public String getEncryptedPassword(String password) {
+        Encryption encryption = encryptionSupport.getEncryption();
+        String encryptionPrefix = encryptionSupport.getEncryptionPrefix();
+        String encryptionSuffix = encryptionSupport.getEncryptionSuffix();
+
+        if (encryption == null) {
+            return password;
+        } else {
+            boolean prefix = encryptionPrefix == null || password.startsWith(encryptionPrefix);
+            boolean suffix = encryptionSuffix == null || password.endsWith(encryptionSuffix);
+            if (prefix && suffix) {
+                return password;
+            } else {
+                String p = encryption.encryptPassword(password);
+                if (encryptionPrefix != null) {
+                    p = encryptionPrefix + p;
+                }
+                if (encryptionSuffix != null) {
+                    p = p + encryptionSuffix;
+                }
+                return p;
+            }
+        }
+    }
+
+    public boolean checkPassword(String plain, String encrypted) {
+        Encryption encryption = encryptionSupport.getEncryption();
+        String encryptionPrefix = encryptionSupport.getEncryptionPrefix();
+        String encryptionSuffix = encryptionSupport.getEncryptionSuffix();
+
+        if (encryption == null) {
+            return plain.equals(encrypted);
+        } else {
+            boolean prefix = encryptionPrefix == null || encrypted.startsWith(encryptionPrefix);
+            boolean suffix = encryptionSuffix == null || encrypted.endsWith(encryptionSuffix);
+            if (prefix && suffix) {
+                encrypted = encrypted.substring(encryptionPrefix != null ? encryptionPrefix.length() : 0,
+                        encrypted.length() - (encryptionSuffix != null ? encryptionSuffix.length() : 0));
+                return encryption.checkPassword(plain, encrypted);
+            } else {
+                return plain.equals(encrypted);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngine.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngine.java
new file mode 100644
index 0000000..971691b
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngine.java
@@ -0,0 +1,69 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules;
+
+import java.util.List;
+
+/**
+ * @author iocanel
+ */
+public interface BackingEngine {
+
+
+    /**
+     * Create a new User.
+     *
+     * @param username
+     * @param password
+     */
+    void addUser(String username, String password);
+
+    /**
+     * Delete User
+     *
+     * @param username
+     */
+    void deleteUser(String username);
+
+    /**
+     * List Users
+     */
+    List<UserPrincipal> listUsers();
+
+    /**
+     * List Roles for {@param user}.
+     *
+     * @param user
+     * @return
+     */
+    List<RolePrincipal> listRoles(UserPrincipal user);
+
+    /**
+     * Add a role to the user
+     *
+     * @param username
+     * @param role
+     */
+    void addRole(String username, String role);
+
+    /**
+     * Remove a role from a user.
+     *
+     * @param username
+     * @param role
+     */
+    void deleteRole(String username, String role);
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineFactory.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineFactory.java
new file mode 100644
index 0000000..ec4daaf
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineFactory.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.karaf.jaas.modules;
+
+import java.util.Map;
+
+/**
+ * @author iocanel
+ */
+public interface BackingEngineFactory {
+
+    /**
+     * Returns the corresponding module class.
+     *
+     * @return
+     */
+    String getModuleClass();
+
+
+    /**
+     * Backing engine factory method.
+     *
+     * @param options
+     * @return
+     */
+    BackingEngine build(Map options);
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineService.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineService.java
new file mode 100644
index 0000000..124b512
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineService.java
@@ -0,0 +1,51 @@
+/*
+ * 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.karaf.jaas.modules;
+
+import org.apache.karaf.jaas.boot.ProxyLoginModule;
+
+import javax.security.auth.login.AppConfigurationEntry;
+import java.util.List;
+
+/**
+ * @author iocanel
+ */
+public class BackingEngineService {
+
+    private List<BackingEngineFactory> engineFactories;
+
+    public BackingEngine get(AppConfigurationEntry entry) {
+
+        if (engineFactories != null) {
+            for (BackingEngineFactory factory : engineFactories) {
+                String loginModuleClass = (String) entry.getOptions().get(ProxyLoginModule.PROPERTY_MODULE);
+                if (factory.getModuleClass().equals(loginModuleClass)) {
+                    return factory.build(entry.getOptions());
+                }
+            }
+        }
+        return null;
+    }
+
+    public List<BackingEngineFactory> getEngineFactories() {
+        return engineFactories;
+    }
+
+    public void setEngineFactories(List<BackingEngineFactory> engineFactories) {
+        this.engineFactories = engineFactories;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java
new file mode 100644
index 0000000..09a7800
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java
@@ -0,0 +1,47 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules;
+
+/**
+ * <p>
+ * Interface describing the password encryption service.
+ * </>
+ * 
+ * @author jbonofre
+ */
+public interface Encryption {
+    
+    /**
+     * <p>
+     * Encrypt a password.
+     * </p>
+     * 
+     * @param plain the password in plain format.
+     * @return the encrypted password format.
+     */
+    public String encryptPassword(String plain);
+    
+    /**
+     * <p>
+     * Check password.
+     * </p>
+     * 
+     * @param input password provided in plain format.
+     * @param password the encrypted format to compare with.
+     * @return true if the password match, false else.
+     */
+    public boolean checkPassword(String input, String password);
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java
new file mode 100644
index 0000000..a1438a5
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java
@@ -0,0 +1,48 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules;
+
+import java.util.Map;
+
+/**
+ */
+public interface EncryptionService {
+
+    String ALGORITHM = "algorithm";
+
+    String ALGORITHM_MD2 = "MD2";
+    String ALGORITHM_MD5 = "MD5";
+    String ALGORITHM_SHA1 = "SHA-1";
+    String ALGORITHM_SHA256 = "SHA-256";
+    String ALGORITHM_SHA384 = "SHA-384";
+    String ALGORITHM_SHA512 = "SHA-512";
+
+    String ENCODING = "encoding";
+
+    String ENCODING_HEXADECIMAL = "hexadecimal";
+    String ENCODING_BASE64 = "base64";
+
+    /**
+     * Create an encryption service with the specified parameters.
+     * If the parameters are not supported, a <code>null</code> should
+     * be returned or an IllegalArgumentException thrown.
+     *
+     * @param params
+     * @return
+     * @throws IllegalArgumentException
+     */
+    Encryption createEncryption(Map<String,String> params) throws IllegalArgumentException;
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/GroupPrincipal.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/GroupPrincipal.java
new file mode 100644
index 0000000..a00f88d
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/GroupPrincipal.java
@@ -0,0 +1,57 @@
+/*
+ *  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.
+ *  under the License.
+ */
+
+package org.apache.karaf.jaas.modules;
+
+import java.security.Principal;
+import java.security.acl.Group;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+/**
+ *
+ * @author iocanel
+ */
+public class GroupPrincipal implements Group {
+
+    private String name;
+    private Hashtable<String,Principal> members = new Hashtable<String, Principal>();
+
+    public GroupPrincipal(String name) {
+        this.name = name;
+    }
+    
+    public boolean addMember(Principal user) {
+        members.put(user.getName(), user);
+        return true;
+    }
+
+    public boolean removeMember(Principal user) {
+        members.remove(user.getName());
+        return true;
+    }
+
+    public boolean isMember(Principal member) {
+        return members.contains(member.getName());
+    }
+
+    public Enumeration<? extends Principal> members() {
+        return members.elements();
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/RolePolicy.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/RolePolicy.java
new file mode 100644
index 0000000..c3aabea
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/RolePolicy.java
@@ -0,0 +1,80 @@
+/*
+ *  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.
+ *  under the License.
+ */
+
+package org.apache.karaf.jaas.modules;
+
+import java.security.Principal;
+import java.security.acl.Group;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import javax.security.auth.Subject;
+
+/**
+ *
+ * @author iocanel
+ */
+public enum RolePolicy {
+
+    PREFIXED_ROLES("prefix") {
+        public void handleRoles(Subject subject,Set<Principal> principals,String discriminator) {
+            for(Principal p:principals) {
+                if(p instanceof RolePrincipal){
+                    RolePrincipal rolePrincipal = new RolePrincipal(discriminator+p.getName());
+                    subject.getPrincipals().add(rolePrincipal);
+                } else {
+                    subject.getPrincipals().add(p);
+                }
+            }
+        }
+    },
+    GROUP_ROLES("group") {
+        public void handleRoles(Subject subject,Set<Principal> principals,String discriminator) {
+            Group group = new GroupPrincipal(discriminator);
+            for(Principal p:principals) {
+                if(p instanceof RolePrincipal) {
+                    group.addMember(p);
+                } else {
+                    subject.getPrincipals().add(p);
+                }
+            }
+            subject.getPrincipals().add(group);
+        }
+    };
+
+    private String value;
+
+    private static final Map<String, RolePolicy> policies = new HashMap<String, RolePolicy>();
+
+    static {
+        for (RolePolicy s : EnumSet.allOf(RolePolicy.class)) {
+            policies.put(s.getValue(), s);
+        }
+    }
+
+    private RolePolicy(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+    public static RolePolicy getPolicy(String code) {
+        return policies.get(code);
+    }
+
+    public abstract void handleRoles(Subject subject,Set<Principal> principals,String discriminator);
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/RolePrincipal.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/RolePrincipal.java
new file mode 100644
index 0000000..39d8dfe
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/RolePrincipal.java
@@ -0,0 +1,55 @@
+/*
+ * 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.karaf.jaas.modules;
+
+import java.security.Principal;
+
+public class RolePrincipal implements Principal {
+
+    private final String name;
+
+    public RolePrincipal(String name) {
+        assert name != null;
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof RolePrincipal)) return false;
+
+        RolePrincipal that = (RolePrincipal) o;
+
+        if (name != null ? !name.equals(that.name) : that.name != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return name != null ? name.hashCode() : 0;
+    }
+
+    @Override
+    public String toString() {
+        return "RolePrincipal[" + name + "]";
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/UserPrincipal.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/UserPrincipal.java
new file mode 100644
index 0000000..fd926ac
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/UserPrincipal.java
@@ -0,0 +1,55 @@
+/*
+ * 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.karaf.jaas.modules;
+
+import java.security.Principal;
+
+public class UserPrincipal implements Principal {
+
+    private final String name;
+
+    public UserPrincipal(String name) {
+        assert name != null;
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof UserPrincipal)) return false;
+
+        UserPrincipal that = (UserPrincipal) o;
+
+        if (name != null ? !name.equals(that.name) : that.name != null) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return name != null ? name.hashCode() : 0;
+    }
+
+    @Override
+    public String toString() {
+        return "UserPrincipal[" + name + "]";
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryption.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryption.java
new file mode 100644
index 0000000..28fcbb0
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryption.java
@@ -0,0 +1,199 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules.encryption;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Map;
+
+import org.apache.karaf.jaas.modules.Encryption;
+import org.apache.karaf.jaas.modules.EncryptionService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BasicEncryption implements Encryption {
+
+    private static final Logger log = LoggerFactory.getLogger(BasicEncryption.class);
+
+    private String algorithm;
+    private String encoding;
+    private MessageDigest md;
+
+    public BasicEncryption(Map<String, String> params) {
+        for (String key : params.keySet()) {
+            if (EncryptionService.ALGORITHM.equalsIgnoreCase(key)) {
+                algorithm = params.get(key);
+            } else if (EncryptionService.ENCODING.equalsIgnoreCase(key)) {
+                encoding = params.get(key);
+            } else {
+                throw new IllegalArgumentException("Unsupported encryption parameter: " + key);
+            }
+        }
+        if (algorithm == null) {
+            throw new IllegalArgumentException("Digest algorithm must be specified");
+        }
+        // Check if the algorithm algorithm is available
+        try {
+            md = MessageDigest.getInstance(algorithm);
+        } catch (NoSuchAlgorithmException e) {
+            log.error("Initialization failed. Digest algorithm " + algorithm + " is not available.", e);
+            throw new IllegalArgumentException("Unable to configure login module: " + e.getMessage(), e);
+        }
+        if (encoding != null && encoding.length() > 0
+                && !EncryptionService.ENCODING_HEXADECIMAL.equalsIgnoreCase(encoding)
+                && !EncryptionService.ENCODING_BASE64.equalsIgnoreCase(encoding)) {
+            log.error("Initialization failed. Digest encoding " + encoding + " is not supported.");
+            throw new IllegalArgumentException(
+                    "Unable to configure login module. Digest Encoding " + encoding + " not supported.");
+        }
+    }
+
+    public String encryptPassword(String password) {
+        if (password == null) {
+            return null;
+        }
+        // Digest the user provided password
+        byte[] data = md.digest(password.getBytes());
+        if (encoding == null || encoding.length() == 0 || EncryptionService.ENCODING_HEXADECIMAL.equalsIgnoreCase(encoding)) {
+            return hexEncode(data);
+        } else if (EncryptionService.ENCODING_BASE64.equalsIgnoreCase(encoding)) {
+            return base64Encode(data);
+        } else {
+            throw new IllegalArgumentException(
+                    "Unable to configure login module. Digest Encoding " + encoding + " not supported.");
+        }
+    }
+
+    public boolean checkPassword(String provided, String real) {
+        if (real == null && provided == null) {
+            return true;
+        }
+        if (real == null || provided == null) {
+            return false;
+        }
+        // both are non-null
+        String encoded = encryptPassword(provided);
+        if (encoding == null || encoding.length() == 0 || EncryptionService.ENCODING_HEXADECIMAL.equalsIgnoreCase(encoding)) {
+            return real.equalsIgnoreCase(encoded);
+        } else if (EncryptionService.ENCODING_BASE64.equalsIgnoreCase(encoding)) {
+            return real.equals(encoded);
+        }
+        return false;
+    }
+
+    private static final byte[] hexTable = {
+        (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7',
+        (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f'
+    };
+
+    public static String hexEncode(byte[] in) {
+        int inOff = 0;
+        int length = in.length;
+        byte[] out = new byte[length * 2];
+        for (int i = 0, j = 0; i < length; i++, j += 2) {
+            out[j] = hexTable[(in[inOff] >> 4) & 0x0f];
+            out[j + 1] = hexTable[in[inOff] & 0x0f];
+            inOff++;
+        }
+        return new String(out);
+    }
+
+    private static final byte[] encodingTable = {
+        (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
+        (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
+        (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+        (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+        (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
+        (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
+        (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
+        (byte)'v',
+        (byte)'w', (byte)'x', (byte)'y', (byte)'z',
+        (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6',
+        (byte)'7', (byte)'8', (byte)'9',
+        (byte)'+', (byte)'/'
+    };
+
+    private static byte padding = (byte)'=';
+
+    /**
+     * encode the input data producing a base 64 encoded byte array.
+     *
+     * @return a byte array containing the base 64 encoded data.
+     */
+    public static String base64Encode(byte[] data) {
+        ByteArrayOutputStream    bOut = new ByteArrayOutputStream();
+        try {
+            base64Encode(data, 0, data.length, bOut);
+        } catch (IOException e) {
+            throw new RuntimeException("exception encoding base64 string: " + e.getMessage(), e);
+        }
+        return new String(bOut.toByteArray());
+    }
+
+    /**
+     * encode the input data producing a base 64 output stream.
+     *
+     * @return the number of bytes produced.
+     */
+    public static int base64Encode(byte[] data, int off, int length, OutputStream out) throws IOException {
+        int modulus = length % 3;
+        int dataLength = (length - modulus);
+        int a1, a2, a3;
+        for (int i = off; i < off + dataLength; i += 3) {
+            a1 = data[i] & 0xff;
+            a2 = data[i + 1] & 0xff;
+            a3 = data[i + 2] & 0xff;
+            out.write(encodingTable[(a1 >>> 2) & 0x3f]);
+            out.write(encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]);
+            out.write(encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]);
+            out.write(encodingTable[a3 & 0x3f]);
+        }
+        /*
+         * process the tail end.
+         */
+        int b1, b2, b3;
+        int d1, d2;
+        switch (modulus) {
+            case 0:        /* nothing left to do */
+                break;
+            case 1:
+                d1 = data[off + dataLength] & 0xff;
+                b1 = (d1 >>> 2) & 0x3f;
+                b2 = (d1 << 4) & 0x3f;
+                out.write(encodingTable[b1]);
+                out.write(encodingTable[b2]);
+                out.write(padding);
+                out.write(padding);
+                break;
+            case 2:
+                d1 = data[off + dataLength] & 0xff;
+                d2 = data[off + dataLength + 1] & 0xff;
+                b1 = (d1 >>> 2) & 0x3f;
+                b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f;
+                b3 = (d2 << 2) & 0x3f;
+                out.write(encodingTable[b1]);
+                out.write(encodingTable[b2]);
+                out.write(encodingTable[b3]);
+                out.write(padding);
+                break;
+        }
+        return (dataLength / 3) * 4 + ((modulus == 0) ? 0 : 4);
+    }
+
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryptionService.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryptionService.java
new file mode 100644
index 0000000..505eb6f
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryptionService.java
@@ -0,0 +1,27 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules.encryption;
+
+import java.util.Map;
+
+import org.apache.karaf.jaas.modules.Encryption;
+import org.apache.karaf.jaas.modules.EncryptionService;
+
+public class BasicEncryptionService implements EncryptionService {
+
+    public Encryption createEncryption(Map<String, String> params) throws IllegalArgumentException {
+        return new BasicEncryption(params);
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/EncryptionSupport.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/EncryptionSupport.java
new file mode 100644
index 0000000..6824131
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/EncryptionSupport.java
@@ -0,0 +1,135 @@
+/*
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules.encryption;
+
+import org.apache.karaf.jaas.modules.Encryption;
+import org.apache.karaf.jaas.modules.EncryptionService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author iocanel
+ */
+public class EncryptionSupport {
+
+    private final Logger logger = LoggerFactory.getLogger(EncryptionSupport.class);
+
+    private BundleContext bundleContext;
+
+    private Encryption encryption;
+    private String encryptionPrefix;
+    private String encryptionSuffix;
+    protected Map<String, ?> options;
+
+    protected boolean debug;
+
+
+    public EncryptionSupport(Map<String, ?> options) {
+        this.options = options;
+        this.debug = Boolean.parseBoolean((String) options.get("debug"));
+        // the bundle context is set in the Config JaasRealm by default
+        this.bundleContext = (BundleContext) options.get(BundleContext.class.getName());
+    }
+
+    public Encryption getEncryption() {
+        if (encryption == null) {
+            Map<String, String> encOpts = new HashMap<String, String>();
+            for (String key : options.keySet()) {
+                if (key.startsWith("encryption.")) {
+                    encOpts.put(key.substring("encryption.".length()), options.get(key).toString());
+                }
+            }
+            encryptionPrefix = encOpts.remove("prefix");
+            encryptionSuffix = encOpts.remove("suffix");
+            boolean enabled = Boolean.parseBoolean(encOpts.remove("enabled"));
+
+            if (!enabled) {
+                if (debug) {
+                    logger.debug("Encryption is disabled.");
+                }
+            } else {
+                String name = encOpts.remove("name");
+                if (debug) {
+                    if (name != null && name.length() > 0) {
+                        logger.debug("Encryption is enabled. Using service " + name + " with options " + encOpts);
+                    } else {
+                        logger.debug("Encryption is enabled. Using options " + encOpts);
+                    }
+                }
+                // lookup the encryption service reference
+                ServiceReference[] encryptionServiceReferences;
+                try {
+                    encryptionServiceReferences = bundleContext.getServiceReferences(
+                            EncryptionService.class.getName(),
+                            name != null && name.length() > 0 ? "(name=" + name + ")" : null);
+                } catch (InvalidSyntaxException e) {
+                    throw new IllegalStateException("The encryption service filter is not well formed.", e);
+                }
+                if (encryptionServiceReferences == null || encryptionServiceReferences.length == 0) {
+                    if (name != null && name.length() > 0) {
+                        throw new IllegalStateException("Encryption service " + name + " not found. Please check that the encryption service is correctly set up.");
+                    } else {
+                        throw new IllegalStateException("No encryption service found. Please install the Karaf encryption feature and check that the encryption algorithm is supported..");
+                    }
+                }
+                Arrays.sort(encryptionServiceReferences);
+                for (ServiceReference ref : encryptionServiceReferences) {
+                    try {
+                        EncryptionService encryptionService = (EncryptionService) bundleContext.getService(ref);
+                        if (encryptionService != null) {
+                            try {
+                                encryption = encryptionService.createEncryption(encOpts);
+                                if (encryption != null) {
+                                    break;
+                                }
+                            } finally {
+                                bundleContext.ungetService(ref);
+                            }
+                        }
+                    } catch (IllegalStateException e) {
+                        // continue
+                    }
+                }
+                if (encryption == null) {
+                    throw new IllegalStateException("No EncryptionService supporting the required options could be found.");
+                }
+            }
+        }
+        return encryption;
+    }
+
+    public String getEncryptionSuffix() {
+        return encryptionSuffix;
+    }
+
+    public void setEncryptionSuffix(String encryptionSuffix) {
+        this.encryptionSuffix = encryptionSuffix;
+    }
+
+    public String getEncryptionPrefix() {
+        return encryptionPrefix;
+    }
+
+    public void setEncryptionPrefix(String encryptionPrefix) {
+        this.encryptionPrefix = encryptionPrefix;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
new file mode 100644
index 0000000..1ee10c9
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
@@ -0,0 +1,412 @@
+/*
+ * 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.karaf.jaas.modules.jdbc;
+
+import org.apache.karaf.jaas.modules.BackingEngine;
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.apache.karaf.jaas.modules.encryption.EncryptionSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author iocanel, jbonofre
+ */
+public class JDBCBackingEngine implements BackingEngine {
+
+    private final Logger logger = LoggerFactory.getLogger(JDBCBackingEngine.class);
+
+    private DataSource dataSource;
+    private EncryptionSupport encryptionSupport;
+
+    private static final String MSG_CONNECTION_CLOSE_FAILED = "Failed to clearly close connection to the database:";
+
+    private String addUserStatement = "INSERT INTO USERS VALUES(?,?)";
+    private String addRoleStatement = "INSERT INTO ROLES VALUES(?,?)";
+    private String deleteRoleStatement = "DELETE FROM ROLES WHERE USERNAME=? AND ROLE=?";
+    private String deleteAllUserRolesStatement = "DELETE FROM ROLES WHERE USERNAME=?";
+    private String deleteUserStatement = "DELETE FROM USERS WHERE USERNAME=?";
+    private String selectUsersQuery = "SELECT USERNAME FROM USERS";
+    private String selectRolesQuery = "SELECT ROLE FROM ROLES WHERE USERNAME=?";
+
+
+    /**
+     * Constructor
+     *
+     * @param dataSource
+     */
+    public JDBCBackingEngine(DataSource dataSource) {
+        this.dataSource = dataSource;
+    }
+
+    public JDBCBackingEngine(DataSource dataSource, EncryptionSupport encryptionSupport) {
+        this.dataSource = dataSource;
+        this.encryptionSupport = encryptionSupport;
+    }
+
+    /**
+     * Adds a new user.
+     *
+     * @param username
+     * @param password
+     */
+    public void addUser(String username, String password) {
+        Connection connection = null;
+        PreparedStatement statement = null;
+
+        String newPassword = password;
+
+        //If encryption support is enabled, encrypt password
+        if (encryptionSupport != null && encryptionSupport.getEncryption() != null) {
+            newPassword = encryptionSupport.getEncryption().encryptPassword(password);
+            if (encryptionSupport.getEncryptionPrefix() != null) {
+                newPassword = encryptionSupport.getEncryptionPrefix() + newPassword;
+            }
+            if (encryptionSupport.getEncryptionSuffix() != null) {
+                newPassword = newPassword + encryptionSupport.getEncryptionSuffix();
+            }
+        }
+
+        if (dataSource != null) {
+
+            try {
+                connection = dataSource.getConnection();
+                statement = connection.prepareStatement(addUserStatement);
+                statement.setString(1, username);
+                statement.setString(2, newPassword);
+                int rows = statement.executeUpdate();
+
+                if (!connection.getAutoCommit()) {
+                    connection.commit();
+                }
+                if (logger.isDebugEnabled()) {
+                    logger.debug(String.format("Executiong [%s], USERNAME=%s, PASSWORD=%s. %i rows affected.", addUserStatement, username, newPassword, rows));
+                }
+            } catch (SQLException e) {
+                logger.error("Error executiong statement", e);
+            } finally {
+                try {
+                    if (statement != null) {
+                        statement.close();
+                    }
+                    if (connection != null) {
+                        connection.close();
+                    }
+                } catch (SQLException e) {
+                    logger.warn(MSG_CONNECTION_CLOSE_FAILED, e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Delete user by username.
+     *
+     * @param username
+     */
+    public void deleteUser(String username) {
+        Connection connection = null;
+        PreparedStatement userStatement = null;
+        PreparedStatement roleStatement = null;
+
+        if (dataSource != null) {
+
+            try {
+                connection = dataSource.getConnection();
+
+                //Remove from roles
+                roleStatement = connection.prepareStatement(deleteAllUserRolesStatement);
+                roleStatement.setString(1, username);
+                roleStatement.executeUpdate();
+
+                //Remove from users
+                userStatement = connection.prepareStatement(deleteUserStatement);
+                userStatement.setString(1, username);
+                int userRows = userStatement.executeUpdate();
+
+                if (!connection.getAutoCommit()) {
+                    connection.commit();
+                }
+
+                if (logger.isDebugEnabled()) {
+                    logger.debug(String.format("Executiong [%s], USERNAME=%s. %i userRows affected.", deleteUserStatement, username, userRows));
+                }
+            } catch (SQLException e) {
+                logger.error("Error executiong statement", e);
+            } finally {
+                try {
+                    if (userStatement != null) {
+                        userStatement.close();
+                    }
+                    if (roleStatement != null) {
+                        roleStatement.close();
+                    }
+                    if (connection != null) {
+                        connection.close();
+                    }
+                } catch (SQLException e) {
+                    logger.warn(MSG_CONNECTION_CLOSE_FAILED, e);
+                }
+            }
+        }
+    }
+
+    /**
+     * List all Users
+     *
+     * @return
+     */
+    public List<UserPrincipal> listUsers() {
+        List<UserPrincipal> users = new ArrayList<UserPrincipal>();
+
+        Connection connection = null;
+        PreparedStatement listUserStatement = null;
+        ResultSet usersResultSet = null;
+
+
+        if (dataSource != null) {
+
+            try {
+                connection = dataSource.getConnection();
+
+                //Remove from users
+                listUserStatement = connection.prepareStatement(selectUsersQuery);
+                usersResultSet = listUserStatement.executeQuery();
+                while (!usersResultSet.next()) {
+                    String username = usersResultSet.getString("USERNAME");
+                    users.add(new UserPrincipal(username));
+                }
+            } catch (SQLException e) {
+                logger.error("Error executiong statement", e);
+            } finally {
+                try {
+                    if (usersResultSet != null) {
+                        usersResultSet.close();
+                    }
+                    if (listUserStatement != null) {
+                        listUserStatement.close();
+                    }
+                    if (connection != null) {
+                        connection.close();
+                    }
+                } catch (SQLException e) {
+                    logger.warn(MSG_CONNECTION_CLOSE_FAILED, e);
+                }
+            }
+        }
+        return users;
+    }
+
+    /**
+     * List the roles of the {@param user}.
+     *
+     * @param user
+     * @return
+     */
+    public List<RolePrincipal> listRoles(UserPrincipal user) {
+        List<RolePrincipal> roles = new ArrayList<RolePrincipal>();
+
+        Connection connection = null;
+        PreparedStatement listRolesStatement = null;
+        ResultSet rolesResultSet = null;
+
+
+        if (dataSource != null) {
+
+            try {
+                connection = dataSource.getConnection();
+
+                //Remove from roles
+                listRolesStatement = connection.prepareStatement(selectRolesQuery);
+                listRolesStatement.setString(1, user.getName());
+
+                rolesResultSet = listRolesStatement.executeQuery();
+
+                while (!rolesResultSet.next()) {
+                    String role = rolesResultSet.getString(1);
+                    roles.add(new RolePrincipal(role));
+                }
+
+            } catch (SQLException e) {
+                logger.error("Error executiong statement", e);
+            } finally {
+                try {
+                    if (rolesResultSet != null) {
+                        rolesResultSet.close();
+                    }
+                    if (listRolesStatement != null) {
+                        listRolesStatement.close();
+                    }
+                    if (connection != null) {
+                        connection.close();
+                    }
+                } catch (SQLException e) {
+                    logger.warn(MSG_CONNECTION_CLOSE_FAILED, e);
+                }
+            }
+        }
+        return roles;
+    }
+
+    /**
+     * Add a role to a user.
+     *
+     * @param username
+     * @param role
+     */
+    public void addRole(String username, String role) {
+        Connection connection = null;
+        PreparedStatement statement = null;
+
+        if (dataSource != null) {
+
+            try {
+                connection = dataSource.getConnection();
+                statement = connection.prepareStatement(addRoleStatement);
+                statement.setString(1, username);
+                statement.setString(2, role);
+                int rows = statement.executeUpdate();
+
+                if (!connection.getAutoCommit()) {
+                    connection.commit();
+                }
+                if (logger.isDebugEnabled()) {
+                    logger.debug(String.format("Executiong [%s], USERNAME=%s, ROLE=%s. %i rows affected.", addRoleStatement, username, role, rows));
+                }
+            } catch (SQLException e) {
+                logger.error("Error executiong statement", e);
+            } finally {
+                try {
+                    if (statement != null) {
+                        statement.close();
+                    }
+                    if (connection != null) {
+                        connection.close();
+                    }
+                } catch (SQLException e) {
+                    logger.warn(MSG_CONNECTION_CLOSE_FAILED, e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Remove role from user.
+     *
+     * @param username
+     * @param role
+     */
+    public void deleteRole(String username, String role) {
+        Connection connection = null;
+        PreparedStatement statement = null;
+
+        if (dataSource != null) {
+
+            try {
+                connection = dataSource.getConnection();
+                statement = connection.prepareStatement(deleteRoleStatement);
+                statement.setString(1, username);
+                statement.setString(2, role);
+                int rows = statement.executeUpdate();
+
+                if (!connection.getAutoCommit()) {
+                    connection.commit();
+                }
+                if (logger.isDebugEnabled()) {
+                    logger.debug(String.format("Executiong [%s], USERNAME=%s, ROLE=%s. %i rows affected.", deleteRoleStatement, username, role, rows));
+                }
+            } catch (SQLException e) {
+                logger.error("Error executing statement", e);
+            } finally {
+                try {
+                    if (statement != null) {
+                        statement.close();
+                    }
+                    if (connection != null) {
+                        connection.close();
+                    }
+                } catch (SQLException e) {
+                    logger.warn(MSG_CONNECTION_CLOSE_FAILED, e);
+                }
+            }
+        }
+    }
+
+    public String getAddUserStatement() {
+        return addUserStatement;
+    }
+
+    public void setAddUserStatement(String addUserStatement) {
+        this.addUserStatement = addUserStatement;
+    }
+
+    public String getAddRoleStatement() {
+        return addRoleStatement;
+    }
+
+    public void setAddRoleStatement(String addRoleStatement) {
+        this.addRoleStatement = addRoleStatement;
+    }
+
+    public String getDeleteRoleStatement() {
+        return deleteRoleStatement;
+    }
+
+    public void setDeleteRoleStatement(String deleteRoleStatement) {
+        this.deleteRoleStatement = deleteRoleStatement;
+    }
+
+    public String getDeleteAllUserRolesStatement() {
+        return deleteAllUserRolesStatement;
+    }
+
+    public void setDeleteAllUserRolesStatement(String deleteAllUserRolesStatement) {
+        this.deleteAllUserRolesStatement = deleteAllUserRolesStatement;
+    }
+
+    public String getDeleteUserStatement() {
+        return deleteUserStatement;
+    }
+
+    public void setDeleteUserStatement(String deleteUserStatement) {
+        this.deleteUserStatement = deleteUserStatement;
+    }
+
+    public String getSelectUsersQuery() {
+        return selectUsersQuery;
+    }
+
+    public void setSelectUsersQuery(String selectUsersQuery) {
+        this.selectUsersQuery = selectUsersQuery;
+    }
+
+    public String getSelectRolesQuery() {
+        return selectRolesQuery;
+    }
+
+    public void setSelectRolesQuery(String selectRolesQuery) {
+        this.selectRolesQuery = selectRolesQuery;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngineFactory.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngineFactory.java
new file mode 100644
index 0000000..ab5df65
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngineFactory.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.karaf.jaas.modules.jdbc;
+
+import org.apache.karaf.jaas.modules.BackingEngine;
+import org.apache.karaf.jaas.modules.BackingEngineFactory;
+import org.apache.karaf.jaas.modules.encryption.EncryptionSupport;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.sql.DataSource;
+import java.util.Map;
+
+/**
+ * @author iocanel
+ */
+public class JDBCBackingEngineFactory implements BackingEngineFactory {
+
+    private final Logger logger = LoggerFactory.getLogger(JDBCBackingEngineFactory.class);
+
+    /**
+     * Build a Backing engine for the JDBCLoginModule.
+     *
+     * @param options
+     * @return
+     */
+    public BackingEngine build(Map options) {
+        JDBCBackingEngine instance = null;
+        String datasourceURL = (String) options.get(JDBCUtils.DATASOURCE);
+        BundleContext bundleContext = (BundleContext) options.get(BundleContext.class.getName());
+
+        String addUserStatement = (String) options.get(JDBCLoginModule.INSERT_USER_STATEMENT);
+        String addRoleStatement = (String) options.get(JDBCLoginModule.INSERT_ROLE_STATEMENT);
+        String deleteRoleStatement = (String) options.get(JDBCLoginModule.DELETE_ROLE_STATEMENT);
+        String deleteAllUserRolesStatement = (String) options.get(JDBCLoginModule.DELETE_ROLES_STATEMENT);
+        String deleteUserStatement = (String) options.get(JDBCLoginModule.DELETE_USER_STATEMENT);
+        String selectUsersQuery = (String) options.get(JDBCLoginModule.PASSWORD_QUERY);
+        String selectRolesQuery = (String) options.get(JDBCLoginModule.ROLE_QUERY);
+
+        try {
+            DataSource dataSource = (DataSource) JDBCUtils.createDatasource(bundleContext, datasourceURL);
+            EncryptionSupport encryptionSupport = new EncryptionSupport(options);
+            instance = new JDBCBackingEngine(dataSource, encryptionSupport);
+            if(addUserStatement != null) {
+                instance.setAddUserStatement(addUserStatement);
+            }
+            if(addRoleStatement != null) {
+                instance.setAddRoleStatement(addRoleStatement);
+            }
+            if(deleteRoleStatement != null) {
+                instance.setDeleteRoleStatement(deleteRoleStatement);
+            }
+            if(deleteAllUserRolesStatement != null) {
+                instance.setDeleteAllUserRolesStatement(deleteAllUserRolesStatement);
+            }
+            if(deleteUserStatement != null) {
+                instance.setDeleteUserStatement(deleteUserStatement);
+            }
+            if(selectUsersQuery != null) {
+                instance.setSelectUsersQuery(selectUsersQuery);
+            }
+            if(selectRolesQuery != null) {
+                instance.setSelectRolesQuery(selectRolesQuery);
+            }
+        } catch (Exception e) {
+            logger.error("Error creating JDBCBackingEngine.", e);
+        }
+        return instance;
+    }
+
+    /**
+     * Returns the login module class, that this factory can build.
+     *
+     * @return
+     */
+    public String getModuleClass() {
+        return JDBCLoginModule.class.getName();
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCLoginModule.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCLoginModule.java
new file mode 100644
index 0000000..fe4b4fb
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCLoginModule.java
@@ -0,0 +1,185 @@
+/*
+ * 
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules.jdbc;
+
+import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.apache.karaf.jaas.modules.properties.PropertiesLoginModule;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.*;
+import javax.security.auth.login.LoginException;
+import javax.sql.DataSource;
+import javax.sql.XADataSource;
+import java.io.IOException;
+import java.security.Principal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashSet;
+import java.util.Map;
+
+/**
+ * @author iocanel
+ */
+public class JDBCLoginModule extends AbstractKarafLoginModule {
+
+    private final Logger logger = LoggerFactory.getLogger(PropertiesLoginModule.class);
+
+    public static final String PASSWORD_QUERY = "query.password";
+    public static final String ROLE_QUERY = "query.role";
+    public static final String INSERT_USER_STATEMENT = "insert.user";
+    public static final String INSERT_ROLE_STATEMENT = "insert.role";
+    public static final String DELETE_ROLE_STATEMENT = "delete.role";
+    public static final String DELETE_ROLES_STATEMENT = "delete.roles";
+    public static final String DELETE_USER_STATEMENT = "delete.roles";
+
+    private String datasourceURL;
+    protected String passwordQuery = "SELECT PASSWORD FROM USERS WHERE USERNAME=?";
+    protected String roleQuery = "SELECT ROLE FROM ROLES WHERE USERNAME=?";
+
+    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
+        super.initialize(subject, callbackHandler, options);
+        datasourceURL = (String) options.get(JDBCUtils.DATASOURCE);
+        passwordQuery = (String) options.get(PASSWORD_QUERY);
+        roleQuery = (String) options.get(ROLE_QUERY);
+        if (datasourceURL == null || datasourceURL.trim().length() == 0) {
+            logger.error("No datasource was specified ");
+        } else if (!datasourceURL.startsWith(JDBCUtils.JNDI) && !datasourceURL.startsWith(JDBCUtils.OSGI)) {
+            logger.error("Invalid datasource lookup protocol");
+        }
+    }
+
+
+    public boolean login() throws LoginException {
+        Connection connection = null;
+
+        PreparedStatement passwordStatement = null;
+        PreparedStatement roleStatement = null;
+
+        ResultSet passwordResultSet = null;
+        ResultSet roleResultSet = null;
+
+        Callback[] callbacks = new Callback[2];
+        callbacks[0] = new NameCallback("Username: ");
+        callbacks[1] = new PasswordCallback("Password: ", false);
+
+        try {
+            callbackHandler.handle(callbacks);
+        } catch (IOException ioe) {
+            throw new LoginException(ioe.getMessage());
+        } catch (UnsupportedCallbackException uce) {
+            throw new LoginException(uce.getMessage() + " not available to obtain information from user");
+        }
+
+        user = ((NameCallback) callbacks[0]).getName();
+
+        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
+        if (tmpPassword == null) {
+            tmpPassword = new char[0];
+        }
+
+        String password = new String(tmpPassword);
+        principals = new HashSet<Principal>();
+
+        try {
+            Object credentialsDatasource = JDBCUtils.createDatasource(bundleContext, datasourceURL);
+
+            if (credentialsDatasource == null) {
+                throw new LoginException("Cannot obtain data source:" + datasourceURL);
+            } else if (credentialsDatasource instanceof DataSource) {
+                connection = ((DataSource) credentialsDatasource).getConnection();
+            } else if (credentialsDatasource instanceof XADataSource) {
+                connection = ((XADataSource) credentialsDatasource).getXAConnection().getConnection();
+            } else {
+                throw new LoginException("Unknow dataSource type " + credentialsDatasource.getClass());
+            }
+
+            //Retrieve user credentials from database.
+            passwordStatement = connection.prepareStatement(passwordQuery);
+            passwordStatement.setString(1, user);
+            passwordResultSet = passwordStatement.executeQuery();
+
+            if (!passwordResultSet.next()) {
+            	if (!this.detailedLoginExcepion) {
+            		throw new LoginException("login failed");
+            	} else {
+            		throw new LoginException("User " + user + " does not exist");
+            	}
+            } else {
+                String storedPassword = passwordResultSet.getString(1);
+
+                if (!checkPassword(password, storedPassword)) {
+                	if (!this.detailedLoginExcepion) {
+                		throw new LoginException("login failed");
+                	} else {
+                		throw new LoginException("Password for " + user + " does not match");
+                	}
+                }
+                principals.add(new UserPrincipal(user));
+            }
+
+            //Retrieve user roles from database
+            roleStatement = connection.prepareStatement(roleQuery);
+            roleStatement.setString(1, user);
+            roleResultSet = roleStatement.executeQuery();
+            while (roleResultSet.next()) {
+                String role = roleResultSet.getString(1);
+                principals.add(new RolePrincipal(role));
+            }
+        } catch (Exception ex) {
+            throw new LoginException("Error has occured while retrieving credentials from database:" + ex.getMessage());
+        } finally {
+            try {
+                if (passwordResultSet != null) {
+                    passwordResultSet.close();
+                }
+                if (passwordStatement != null) {
+                    passwordStatement.close();
+                }
+                if (roleResultSet != null) {
+                    roleResultSet.close();
+                }
+                if (roleStatement != null) {
+                    roleStatement.close();
+                }
+                if (connection != null) {
+                    connection.close();
+                }
+            } catch (SQLException ex) {
+                logger.warn("Failed to clearly close connection to the database:", ex);
+            }
+        }
+        return true;
+    }
+
+    public boolean abort() throws LoginException {
+        return true;
+    }
+
+    public boolean logout() throws LoginException {
+        subject.getPrincipals().removeAll(principals);
+        principals.clear();
+        if (debug) {
+            logger.debug("logout");
+        }
+        return true;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCUtils.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCUtils.java
new file mode 100644
index 0000000..5979740
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCUtils.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.karaf.jaas.modules.jdbc;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+import javax.naming.InitialContext;
+
+/**
+ * @author iocanel
+ */
+public final class JDBCUtils {
+
+    public static final String DATASOURCE = "datasource";
+    public static final String JNDI = "jndi:";
+    public static final String OSGI = "osgi:";
+
+    private JDBCUtils() {
+
+    }
+
+    /**
+     * Looks up a datasource from the url. The datasource can be passed either as jndi name or osgi ldap filter.
+     *
+     * @param url
+     * @return
+     * @throws Exception
+     */
+    public static Object createDatasource(BundleContext bc, String url) throws Exception {
+        if (url == null) {
+            throw new Exception("Illegal datasource url format. Datasource URL cannot be null.");
+        } else if (url.trim().length() == 0) {
+            throw new Exception("Illegal datasource url format. Datasource URL cannot be empty.");
+        } else if (url.startsWith(JNDI)) {
+            String jndiName = url.substring(JNDI.length());
+            InitialContext ic = new InitialContext();
+            return ic.lookup(jndiName);
+        } else if (url.startsWith(OSGI)) {
+            String osgiFilter = url.substring(OSGI.length());
+            String clazz = null;
+            String filter = null;
+            String[] tokens = osgiFilter.split("/", 2);
+            if (tokens != null) {
+                if (tokens.length > 0) {
+                    clazz = tokens[0];
+                }
+                if (tokens.length > 1) {
+                    filter = tokens[1];
+                }
+            }
+            ServiceReference[] references = bc.getServiceReferences(clazz, filter);
+            if (references != null) {
+                ServiceReference ref = references[0];
+                Object ds = bc.getService(ref);
+                bc.ungetService(ref);
+                return ds;
+            } else {
+                throw new Exception("Unable to find service reference for datasource: " + clazz + "/" + filter);
+            }
+        } else {
+            throw new Exception("Illegal datasource url format");
+        }
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/ldap/LDAPLoginModule.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/ldap/LDAPLoginModule.java
new file mode 100644
index 0000000..b3b8a5f
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/ldap/LDAPLoginModule.java
@@ -0,0 +1,318 @@
+/*
+ *
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.jaas.modules.ldap;
+
+import org.apache.karaf.jaas.config.KeystoreManager;
+import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.*;
+import javax.net.ssl.SSLSocketFactory;
+import javax.security.auth.Subject;
+import javax.security.auth.callback.*;
+import javax.security.auth.login.LoginException;
+import java.io.IOException;
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Map;
+
+/**
+ * Karaf JAAS login module which uses a LDAP backend.
+ */
+public class LDAPLoginModule extends AbstractKarafLoginModule {
+
+    private static Logger logger = LoggerFactory.getLogger(LDAPLoginModule.class);
+
+    public final static String CONNECTION_URL = "connection.url";
+    public final static String CONNECTION_USERNAME = "connection.username";
+    public final static String CONNECTION_PASSWORD = "connection.password";
+    public final static String USER_BASE_DN = "user.base.dn";
+    public final static String USER_FILTER = "user.filter";
+    public final static String USER_SEARCH_SUBTREE = "user.search.subtree";
+    public final static String ROLE_BASE_DN = "role.base.dn";
+    public final static String ROLE_FILTER = "role.filter";
+    public final static String ROLE_NAME_ATTRIBUTE = "role.name.attribute";
+    public final static String ROLE_SEARCH_SUBTREE = "role.search.subtree";
+    public final static String AUTHENTICATION = "authentication";
+    public final static String INITIAL_CONTEXT_FACTORY = "initial.context.factory";
+    public final static String SSL = "ssl";
+    public final static String SSL_PROVIDER = "ssl.provider";
+    public final static String SSL_PROTOCOL = "ssl.protocol";
+    public final static String SSL_ALGORITHM = "ssl.algorithm";
+    public final static String SSL_KEYSTORE = "ssl.keystore";
+    public final static String SSL_KEYALIAS = "ssl.keyalias";
+    public final static String SSL_TRUSTSTORE = "ssl.truststore";
+
+    public final static String DEFAULT_INITIAL_CONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
+
+    private String connectionURL;
+    private String connectionUsername;
+    private String connectionPassword;
+    private String userBaseDN;
+    private String userFilter;
+    private boolean userSearchSubtree = true;
+    private String roleBaseDN;
+    private String roleFilter;
+    private String roleNameAttribute;
+    private boolean roleSearchSubtree = true;
+    private String authentication = "simple";
+    private String initialContextFactory = null;
+    private boolean ssl;
+    private String sslProvider;
+    private String sslProtocol;
+    private String sslAlgorithm;
+    private String sslKeystore;
+    private String sslKeyAlias;
+    private String sslTrustStore;
+
+    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
+        super.initialize(subject, callbackHandler, options);
+        connectionURL = (String) options.get(CONNECTION_URL);
+        connectionUsername = (String) options.get(CONNECTION_USERNAME);
+        connectionPassword = (String) options.get(CONNECTION_PASSWORD);
+        userBaseDN =  (String) options.get(USER_BASE_DN);
+        userFilter = (String) options.get(USER_FILTER);
+        userSearchSubtree = Boolean.parseBoolean((String) options.get(USER_SEARCH_SUBTREE));
+        roleBaseDN = (String) options.get(ROLE_BASE_DN);
+        roleFilter = (String) options.get(ROLE_FILTER);
+        roleNameAttribute = (String) options.get(ROLE_NAME_ATTRIBUTE);
+        roleSearchSubtree = Boolean.parseBoolean((String) options.get(ROLE_SEARCH_SUBTREE));
+        initialContextFactory = (String) options.get(INITIAL_CONTEXT_FACTORY);
+        if (initialContextFactory == null) {
+            initialContextFactory = DEFAULT_INITIAL_CONTEXT_FACTORY;
+        }
+        authentication = (String) options.get(AUTHENTICATION);
+        if (connectionURL == null || connectionURL.trim().length() == 0) {
+            logger.error("No LDAP URL specified.");
+        } else if (!connectionURL.startsWith("ldap:") && !connectionURL.startsWith("ldaps:")) {
+            logger.error("Invalid LDAP URL: " + connectionURL);
+        }
+        if (options.get(SSL) != null) {
+            ssl = Boolean.parseBoolean((String) options.get(SSL));
+        } else {
+            ssl = connectionURL.startsWith("ldaps:");
+        }
+        sslProvider = (String) options.get(SSL_PROVIDER);
+        sslProtocol = (String) options.get(SSL_PROTOCOL);
+        sslAlgorithm = (String) options.get(SSL_ALGORITHM);
+        sslKeystore = (String) options.get(SSL_KEYSTORE);
+        sslKeyAlias = (String) options.get(SSL_KEYALIAS);
+        sslTrustStore = (String) options.get(SSL_TRUSTSTORE);
+    }
+
+    public boolean login() throws LoginException {
+        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+        try {
+            return doLogin();
+        } finally {
+            ManagedSSLSocketFactory.setSocketFactory(null);
+            Thread.currentThread().setContextClassLoader(tccl);
+        }
+    }
+
+    protected boolean doLogin() throws LoginException {
+        Callback[] callbacks = new Callback[2];
+        callbacks[0] = new NameCallback("Username: ");
+        callbacks[1] = new PasswordCallback("Password: ", false);
+
+        try {
+            callbackHandler.handle(callbacks);
+        } catch (IOException ioException) {
+            throw new LoginException(ioException.getMessage());
+        } catch (UnsupportedCallbackException unsupportedCallbackException) {
+            throw new LoginException(unsupportedCallbackException.getMessage() + " not available to obtain information from user.");
+        }
+
+        user = ((NameCallback) callbacks[0]).getName();
+
+        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
+        if (tmpPassword == null) {
+            tmpPassword = new char[0];
+        }
+        String password = new String(tmpPassword);
+        principals = new HashSet<Principal>();
+
+        // step 1: get the user DN
+        Hashtable env = new Hashtable();
+        logger.debug("Create the LDAP initial context.");
+        env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
+        env.put(Context.PROVIDER_URL, connectionURL);
+        if (connectionUsername != null && connectionUsername.trim().length() > 0) {
+            logger.debug("Bound access requested.");
+            env.put(Context.SECURITY_AUTHENTICATION, authentication);
+            env.put(Context.SECURITY_PRINCIPAL, connectionUsername);
+            env.put(Context.SECURITY_CREDENTIALS, connectionPassword);
+        }
+        if (ssl) {
+            setupSsl(env);
+        }
+        logger.debug("Get the user DN.");
+        String userDN;
+        DirContext context = null;
+        try {
+            logger.debug("Initialize the JNDI LDAP Dir Context.");
+            context = new InitialDirContext(env);
+            logger.debug("Define the subtree scope search control.");
+            SearchControls controls = new SearchControls();
+            if (userSearchSubtree) {
+                controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            } else {
+                controls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+            }
+            logger.debug("Looking for the user in LDAP with ");
+            logger.debug("  base DN: " + userBaseDN);
+            userFilter = userFilter.replaceAll("%u", user);
+            logger.debug("  filter: " + userFilter);
+            NamingEnumeration namingEnumeration = context.search(userBaseDN, userFilter, controls);
+            if (!namingEnumeration.hasMore()) {
+                logger.warn("User " + user + " not found in LDAP.");
+                return false;
+            }
+            logger.debug("Get the user DN.");
+            SearchResult result = (SearchResult) namingEnumeration.next();
+            userDN = (String) result.getName();
+            namingEnumeration.close();
+        } catch (Exception e) {
+            throw new LoginException("Can't connect to the LDAP server: " + e.getMessage());
+        } finally {
+            if (context != null) {
+                try {
+                    context.close();
+                } catch (Exception e) {
+                    // ignore
+                }
+            }
+        }
+        // step 2: bind the user using the DN
+        context = null;
+        try {
+            logger.debug("Bind user (authentication).");
+            env.put(Context.SECURITY_AUTHENTICATION, authentication);
+            logger.debug("Set the security principal for " + userDN + "," + userBaseDN);
+            env.put(Context.SECURITY_PRINCIPAL, userDN + "," + userBaseDN);
+            env.put(Context.SECURITY_CREDENTIALS, password);
+            logger.debug("Binding the user.");
+            context = new InitialDirContext(env);
+            logger.debug("User " + user + " successfully bound.");
+            context.close();
+        } catch (Exception e) {
+            logger.warn("User " + user + " authentication failed.", e);
+            return false;
+        } finally {
+            if (context != null) {
+                try {
+                    context.close();
+                } catch (Exception e) {
+                    // ignore
+                }
+            }
+        }
+        principals.add(new UserPrincipal(user));
+        // step 3: retrieving user roles
+        context = null;
+        try {
+            logger.debug("Get user roles.");
+            context = new InitialDirContext(env);
+            SearchControls controls = new SearchControls();
+            if (roleSearchSubtree) {
+                controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+            } else {
+                controls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
+            }
+            if (roleNameAttribute != null) {
+                controls.setReturningAttributes(new String[]{ roleNameAttribute });
+            }
+            logger.debug("Looking for the user roles in LDAP with ");
+            logger.debug("  base DN: " + roleBaseDN);
+            roleFilter = roleFilter.replaceAll("%u", user);
+            logger.debug("  filter: " + roleFilter);
+            NamingEnumeration namingEnumeration = context.search(roleBaseDN, roleFilter, controls);
+            while (namingEnumeration.hasMore()) {
+                SearchResult result = (SearchResult) namingEnumeration.next();
+                Attributes attributes = result.getAttributes();
+                String role = (String) attributes.get(roleNameAttribute).get();
+                if (role != null) {
+                    principals.add(new RolePrincipal(role));
+                }
+            }
+        } catch (Exception e) {
+            throw new LoginException("Can't get user " + user + " roles: " + e.getMessage());
+        } finally {
+            if (context != null) {
+                try {
+                    context.close();
+                } catch (Exception e) {
+                    // ignore
+                }
+            }
+        }
+        return true;
+    }
+
+    protected void setupSsl(Hashtable env) throws LoginException {
+        ServiceReference ref = null;
+        try {
+            logger.debug("Setting up SSL");
+            env.put(Context.SECURITY_PROTOCOL, "ssl");
+            env.put("java.naming.ldap.factory.socket", ManagedSSLSocketFactory.class.getName());
+            ref = bundleContext.getServiceReference(KeystoreManager.class.getName());
+            KeystoreManager manager = (KeystoreManager) bundleContext.getService(ref);
+            SSLSocketFactory factory = manager.createSSLFactory(sslProvider, sslProtocol, sslAlgorithm, sslKeystore, sslKeyAlias, sslTrustStore);
+            ManagedSSLSocketFactory.setSocketFactory(factory);
+            Thread.currentThread().setContextClassLoader(ManagedSSLSocketFactory.class.getClassLoader());
+        } catch (Exception e) {
+            throw new LoginException("Unable to setup SSL support for LDAP: " + e.getMessage());
+        } finally {
+            bundleContext.ungetService(ref);
+        }
+    }
+
+    public boolean abort() throws LoginException {
+        return true;
+    }
+
+    public boolean logout() throws LoginException {
+        subject.getPrincipals().removeAll(principals);
+        principals.clear();
+        return true;
+    }
+
+    public static abstract class ManagedSSLSocketFactory extends SSLSocketFactory {
+
+        private static final ThreadLocal<SSLSocketFactory> factories = new ThreadLocal<SSLSocketFactory>();
+
+        public static void setSocketFactory(SSLSocketFactory factory) {
+            factories.set(factory);
+        }
+
+        public static SSLSocketFactory getDefault() {
+            SSLSocketFactory factory = factories.get();
+            if (factory == null) {
+                throw new IllegalStateException("No SSLSocketFactory parameters have been set!");
+            }
+            return factory;
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/ConfigAdminHolder.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/ConfigAdminHolder.java
new file mode 100644
index 0000000..417b971
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/ConfigAdminHolder.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.karaf.jaas.modules.osgi;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+
+public class ConfigAdminHolder {
+
+    private static ConfigurationAdmin configAdmin;
+
+    public static ConfigurationAdmin getService() {
+        return configAdmin;
+    }
+
+    public void setService(ConfigurationAdmin configAdmin) {
+        ConfigAdminHolder.configAdmin = configAdmin;
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java
new file mode 100644
index 0000000..9f622d5
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java
@@ -0,0 +1,124 @@
+/*
+ * 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.karaf.jaas.modules.osgi;
+
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Map;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginException;
+
+import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
+
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.osgi.service.cm.Configuration;
+
+public class OsgiConfigLoginModule extends AbstractKarafLoginModule {
+
+    public static final String PID = "pid";
+    public static final String USER_PREFIX = "user.";
+
+    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
+        super.initialize(subject, callbackHandler, options);
+    }
+
+    public boolean login() throws LoginException {
+        try {
+            String pid = (String) options.get(PID);
+            Configuration config = ConfigAdminHolder.getService().getConfiguration(pid);
+            Dictionary properties = config.getProperties();
+
+            Callback[] callbacks = new Callback[2];
+
+            callbacks[0] = new NameCallback("Username: ");
+            callbacks[1] = new PasswordCallback("Password: ", false);
+            try {
+                callbackHandler.handle(callbacks);
+            } catch (IOException ioe) {
+                throw new LoginException(ioe.getMessage());
+            } catch (UnsupportedCallbackException uce) {
+                throw new LoginException(uce.getMessage() + " not available to obtain information from user");
+            }
+            String user = ((NameCallback) callbacks[0]).getName();
+            String password = new String(((PasswordCallback) callbacks[1]).getPassword());
+
+            String userInfos = (String) properties.get(USER_PREFIX + user);
+            if (userInfos == null) {
+            	if (!this.detailedLoginExcepion) {
+            		throw new FailedLoginException("login failed");
+            	} else {
+            		throw new FailedLoginException("User does not exist");
+            	}
+            }
+            String[] infos = userInfos.split(",");
+            String storedPassword = infos[0];
+
+            // check the provided password
+            if (!checkPassword(password, storedPassword)) {
+            	if (!this.detailedLoginExcepion) {
+            		throw new FailedLoginException("login failed");
+            	} else {
+            		throw new FailedLoginException("Password for " + user + " does not match");
+            	}
+            }
+
+            principals = new HashSet<Principal>();
+            principals.add(new UserPrincipal(user));
+            for (int i = 1; i < infos.length; i++) {
+                principals.add(new RolePrincipal(infos[i]));
+            }
+
+            return true;
+        } catch (LoginException e) {
+            throw e;
+        } catch (Exception e) {
+            throw (LoginException) new LoginException("Unable to authenticate user").initCause(e);
+        } finally {
+            callbackHandler = null;
+            options = null;
+        }
+    }
+
+
+    public boolean abort() throws LoginException {
+        subject = null;
+        principals = null;
+        return true;
+    }
+
+    public boolean logout() throws LoginException {
+        try {
+            subject.getPrincipals().removeAll(principals);
+            principals.clear();
+            return true;
+        } finally {
+            subject = null;
+            principals = null;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
new file mode 100644
index 0000000..5a00362
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
@@ -0,0 +1,201 @@
+/*
+ * 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.karaf.jaas.modules.properties;
+
+import org.apache.karaf.jaas.modules.BackingEngine;
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.apache.karaf.jaas.modules.encryption.EncryptionSupport;
+import org.apache.karaf.util.Properties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author iocanel
+ */
+public class PropertiesBackingEngine implements BackingEngine {
+
+    private final Logger logger = LoggerFactory.getLogger(PropertiesBackingEngine.class);
+
+    private Properties users;
+    private EncryptionSupport encryptionSupport;
+
+    /**
+     * Constructor
+     *
+     * @param users
+     */
+    public PropertiesBackingEngine(Properties users) {
+        this.users = users;
+    }
+
+    public PropertiesBackingEngine(Properties users, EncryptionSupport encryptionSupport) {
+        this.users = users;
+        this.encryptionSupport = encryptionSupport;
+    }
+
+    /**
+     * Add a user.
+     *
+     * @param username
+     * @param password
+     */
+    public void addUser(String username, String password) {
+        String[] infos = null;
+        StringBuffer userInfoBuffer = new StringBuffer();
+
+        String newPassword = password;
+
+        //If encryption support is enabled, encrypt password
+        if (encryptionSupport != null && encryptionSupport.getEncryption() != null) {
+            newPassword = encryptionSupport.getEncryption().encryptPassword(password);
+            if (encryptionSupport.getEncryptionPrefix() != null) {
+                newPassword = encryptionSupport.getEncryptionPrefix() + newPassword;
+            }
+            if (encryptionSupport.getEncryptionSuffix() != null) {
+                newPassword = newPassword + encryptionSupport.getEncryptionSuffix();
+            }
+        }
+
+        String userInfos = users.get(username);
+
+        //If user already exists, update password
+        if (userInfos != null && userInfos.length() > 0) {
+            infos = userInfos.split(",");
+            userInfoBuffer.append(newPassword);
+
+            for (int i = 1; i < infos.length; i++) {
+                userInfoBuffer.append(",");
+                userInfoBuffer.append(infos[i]);
+            }
+            String newUserInfo = userInfoBuffer.toString();
+            users.put(username, newUserInfo);
+        } else {
+            users.put(username, newPassword);
+        }
+
+        try {
+            users.save();
+        } catch (Exception ex) {
+            logger.error("Cannot update users file,", ex);
+        }
+    }
+
+    /**
+     * Delete a User.
+     *
+     * @param username
+     */
+    public void deleteUser(String username) {
+        users.remove(username);
+
+        try {
+            users.save();
+        } catch (Exception ex) {
+            logger.error("Cannot remove users file,", ex);
+        }
+    }
+
+    /**
+     * List Users
+     *
+     * @return
+     */
+    public List<UserPrincipal> listUsers() {
+        List<UserPrincipal> result = new ArrayList<UserPrincipal>();
+
+        for (String userNames : users.keySet()) {
+            UserPrincipal userPrincipal = new UserPrincipal(userNames);
+            result.add(userPrincipal);
+        }
+        return result;
+    }
+
+    /**
+     * List the Roles of the {@param user}
+     *
+     * @param user
+     * @return
+     */
+    public List<RolePrincipal> listRoles(UserPrincipal user) {
+        List<RolePrincipal> result = new ArrayList<RolePrincipal>();
+        String userInfo = users.get(user.getName());
+        String[] infos = userInfo.split(",");
+        for (int i = 1; i < infos.length; i++) {
+            result.add(new RolePrincipal(infos[i]));
+        }
+        return result;
+    }
+
+    /**
+     * Add a role to a User.
+     *
+     * @param username
+     * @param role
+     */
+    public void addRole(String username, String role) {
+        String userInfos = users.get(username);
+        if (userInfos != null) {
+            String newUserInfos = userInfos + "," + role;
+            users.put(username, newUserInfos);
+        }
+        try {
+            users.save();
+        } catch (Exception ex) {
+            logger.error("Cannot update users file,", ex);
+        }
+    }
+
+    /**
+     * Delete a Role form User.
+     *
+     * @param username
+     * @param role
+     */
+    public void deleteRole(String username, String role) {
+        String[] infos = null;
+        StringBuffer userInfoBuffer = new StringBuffer();
+
+        String userInfos = users.get(username);
+
+        //If user already exists, remove the role
+        if (userInfos != null && userInfos.length() > 0) {
+            infos = userInfos.split(",");
+            String password = infos[0];
+            userInfoBuffer.append(password);
+
+            for (int i = 1; i < infos.length; i++) {
+                if (infos[i] != null && !infos[i].equals(role)) {
+                    userInfoBuffer.append(",");
+                    userInfoBuffer.append(infos[i]);
+                }
+            }
+            String newUserInfo = userInfoBuffer.toString();
+            users.put(username, newUserInfo);
+        }
+
+        try {
+            users.save();
+        } catch (Exception ex) {
+            logger.error("Cannot update users file,", ex);
+        }
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngineFactory.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngineFactory.java
new file mode 100644
index 0000000..3dbf91b
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngineFactory.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.karaf.jaas.modules.properties;
+
+import org.apache.karaf.jaas.modules.BackingEngine;
+import org.apache.karaf.jaas.modules.BackingEngineFactory;
+import org.apache.karaf.jaas.modules.encryption.EncryptionSupport;
+import org.apache.karaf.util.Properties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * @author iocanel
+ */
+public class PropertiesBackingEngineFactory implements BackingEngineFactory {
+
+    private final Logger logger = LoggerFactory.getLogger(PropertiesBackingEngineFactory.class);
+
+    private static final String USER_FILE = "users";
+
+    /**
+     * Builds the Backing Engine
+     *
+     * @param options
+     * @return
+     */
+    public BackingEngine build(Map options) {
+        PropertiesBackingEngine engine = null;
+        String usersFile = (String) options.get(USER_FILE);
+
+        File f = new File(usersFile);
+        Properties users;
+        try {
+            users = new Properties(f);
+            EncryptionSupport encryptionSupport = new EncryptionSupport(options);
+            engine = new PropertiesBackingEngine(users, encryptionSupport);
+        } catch (IOException ioe) {
+            logger.warn("Cannot open users file:" + usersFile);
+        } finally {
+            return engine;
+        }
+    }
+
+    /**
+     * Returns the login module class, that this factory can build.
+     *
+     * @return
+     */
+    public String getModuleClass() {
+        return PropertiesLoginModule.class.getName();
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesConverter.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesConverter.java
new file mode 100644
index 0000000..5be9cfa
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesConverter.java
@@ -0,0 +1,50 @@
+/*
+ * 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.karaf.jaas.modules.properties;
+
+import org.osgi.service.blueprint.container.Converter;
+import org.osgi.service.blueprint.container.ReifiedType;
+
+import java.util.Properties;
+
+/**
+ * Custom converter to transform a string into a Properties instance.
+ * (to avoid removing \ from the values as is done by the default blueprint converter)
+ */
+public class PropertiesConverter implements Converter {
+
+    public boolean canConvert(Object from, ReifiedType type) {
+        return String.class.isAssignableFrom(from.getClass())
+                && Properties.class.equals(type.getRawClass());
+    }
+
+    public Object convert(Object from, ReifiedType type) throws Exception {
+        Properties properties = new Properties();
+
+        String text = (String) from;
+        for (String line : text.split("[\\r\\n]+")) {
+            int index = line.indexOf('=');
+            if (index > 0) {
+                String key = line.substring(0, index).trim();
+                String value = line.substring(index + 1).trim();
+                properties.put(key, value.replaceAll("\\\\", "/"));
+            }
+        }
+
+        return properties;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesLoginModule.java b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesLoginModule.java
new file mode 100644
index 0000000..08e3565
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesLoginModule.java
@@ -0,0 +1,180 @@
+/*
+ * 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.karaf.jaas.modules.properties;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.Principal;
+import java.util.HashSet;
+import java.util.Map;
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginException;
+
+import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
+import org.apache.karaf.jaas.modules.RolePrincipal;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.apache.karaf.util.Properties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <p>
+ * JAAS Login module for user / password, based on two properties files.
+ * </p>
+ *
+ * @author gnodet, jbonofre
+ */
+public class PropertiesLoginModule extends AbstractKarafLoginModule {
+
+    private final Logger LOG = LoggerFactory.getLogger(PropertiesLoginModule.class);
+
+    private static final String USER_FILE = "users";
+
+    private String usersFile;
+
+    public void initialize(Subject sub, CallbackHandler handler, Map sharedState, Map options) {
+        super.initialize(sub,handler,options);
+        usersFile = (String) options.get(USER_FILE) + "";
+
+        if (debug) {
+            LOG.debug("Initialized debug=" + debug + " usersFile=" + usersFile);
+        }
+    }
+
+    public boolean login() throws LoginException {
+        File f = new File(usersFile);
+        Properties users;
+        try {
+            users = new Properties(f);
+        } catch (IOException ioe) {
+            throw new LoginException("Unable to load user properties file " + f);
+        }
+
+        Callback[] callbacks = new Callback[2];
+
+        callbacks[0] = new NameCallback("Username: ");
+        callbacks[1] = new PasswordCallback("Password: ", false);
+        try {
+            callbackHandler.handle(callbacks);
+        } catch (IOException ioe) {
+            throw new LoginException(ioe.getMessage());
+        } catch (UnsupportedCallbackException uce) {
+            throw new LoginException(uce.getMessage() + " not available to obtain information from user");
+        }
+        // user callback get value
+        user = ((NameCallback) callbacks[0]).getName();
+        // password callback get value
+        String password = new String(((PasswordCallback) callbacks[1]).getPassword());
+
+        // user infos container read from the users properties file
+        String userInfos = null;
+
+        try {
+            userInfos = users.get(user);
+        } catch (NullPointerException e) {
+            //error handled in the next statement
+        }
+        if (userInfos == null) {
+        	if (!this.detailedLoginExcepion) {
+        		throw new FailedLoginException("login failed");
+        	} else {
+        		throw new FailedLoginException("User " + user + " does not exist");
+        	}
+        }
+        
+        // the password is in the first position
+        String[] infos = userInfos.split(",");
+        String storedPassword = infos[0];
+        
+        // check if the stored password is flagged as encrypted
+        String encryptedPassword = getEncryptedPassword(storedPassword);
+        if (!storedPassword.equals(encryptedPassword)) {
+            if (debug) {
+                LOG.debug("The password isn't flagged as encrypted, encrypt it.");
+            }
+            if (debug) {
+                LOG.debug("Rebuild the user informations string.");
+            }
+            userInfos = encryptedPassword + ",";
+            for (int i = 1; i < infos.length; i++) {
+                if (i == (infos.length - 1)) {
+                    userInfos = userInfos + infos[i];
+                } else {
+                    userInfos = userInfos + infos[i] + ",";
+                }
+            }
+            if (debug) {
+                LOG.debug("Push back the user informations in the users properties.");
+            }
+            users.put(user, userInfos);
+            try {
+                if (debug) {
+                    LOG.debug("Store the users properties file.");
+                }
+                users.save();
+            } catch (IOException ioe) {
+                LOG.warn("Unable to write user properties file " + f, ioe);
+            }
+            storedPassword = encryptedPassword;
+        }
+
+        // check the provided password
+        if (!checkPassword(password, storedPassword)) {
+        	if (!this.detailedLoginExcepion) {
+        		throw new FailedLoginException("login failed");
+        	} else {
+        		throw new FailedLoginException("Password for " + user + " does not match");
+        	}
+        }
+
+        principals = new HashSet<Principal>();
+        principals.add(new UserPrincipal(user));
+        for (int i = 1; i < infos.length; i++) {
+            principals.add(new RolePrincipal(infos[i]));
+        }
+
+        users.clear();
+
+        if (debug) {
+            LOG.debug("Successfully logged in " + user);
+        }
+        return true;
+    }
+
+    public boolean abort() throws LoginException {
+        clear();
+        if (debug) {
+            LOG.debug("abort");
+        }
+        return true;
+    }
+
+    public boolean logout() throws LoginException {
+        subject.getPrincipals().removeAll(principals);
+        principals.clear();
+        if (debug) {
+            LOG.debug("logout");
+        }
+        return true;
+    }
+}
diff --git a/karaf-2.2.x/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml b/karaf-2.2.x/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml
new file mode 100644
index 0000000..76a9e51
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml
@@ -0,0 +1,71 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <type-converters>
+        <bean class="org.apache.karaf.jaas.modules.properties.PropertiesConverter"/>
+    </type-converters>
+
+    <!-- Allow usage of System properties, especially the karaf.base property -->
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/>
+
+    <!-- AdminConfig property place holder for the org.apache.karaf.jaas  -->
+    <cm:property-placeholder persistent-id="org.apache.karaf.jaas" update-strategy="reload">
+        <cm:default-properties>
+            <cm:property name="detailed.login.exception" value="false"/>
+            <cm:property name="encryption.name" value=""/>
+            <cm:property name="encryption.enabled" value="false"/>
+            <cm:property name="encryption.prefix" value="{CRYPT}"/>
+            <cm:property name="encryption.suffix" value="{CRYPT}"/>
+            <cm:property name="encryption.algorithm" value="MD5"/>
+            <cm:property name="encryption.encoding" value="hexadecimal"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+    <jaas:config name="karaf">
+        <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" flags="required">
+            users = $[karaf.base]/etc/users.properties
+            detailed.login.exception = ${detailed.login.exception}
+            encryption.name = ${encryption.name}
+            encryption.enabled = ${encryption.enabled}
+            encryption.prefix = ${encryption.prefix}
+            encryption.suffix = ${encryption.suffix}
+            encryption.algorithm = ${encryption.algorithm}
+            encryption.encoding = ${encryption.encoding}
+        </jaas:module>
+    </jaas:config>
+
+
+    <!-- The Backing Engine Factory Service for the PropertiesLoginModule -->
+    <service interface="org.apache.karaf.jaas.modules.BackingEngineFactory">
+        <bean class="org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory"/>
+    </service>
+
+    <service interface="org.apache.karaf.jaas.modules.EncryptionService" ranking="-1">
+        <service-properties>
+            <entry key="name" value="basic"/>
+        </service-properties>
+        <bean class="org.apache.karaf.jaas.modules.encryption.BasicEncryptionService"/>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/jaas/modules/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/jaas/modules/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..f65cb6e
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,20 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides several JAAS modules depending of the target backend that you want to use.
+
+    Currently, Karaf provides login modules for:
+    - JDBC to use a database backend
+    - LDAP to use a LDAP backend
+    - Properties to use a simple properties file
+
+    The default encryption facility is also provided by this bundle.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mSecurity Framework\u001B[0m section of the Karaf Developer Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/properties/PropertiesConverterTest.java b/karaf-2.2.x/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/properties/PropertiesConverterTest.java
new file mode 100644
index 0000000..0156ef8
--- /dev/null
+++ b/karaf-2.2.x/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/properties/PropertiesConverterTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.karaf.jaas.modules.properties;
+
+import junit.framework.TestCase;
+import org.osgi.service.blueprint.container.ReifiedType;
+
+import java.util.Properties;
+import java.util.List;
+
+/**
+ * Test cases for {@link org.apache.karaf.jaas.modules.properties.PropertiesConverter}
+ */
+public class PropertiesConverterTest extends TestCase {
+
+    private PropertiesConverter converter;
+
+    public void setUp() {
+        converter = new PropertiesConverter();
+    }
+
+    /*
+     * Test the canConvert method
+     */
+    public void testCanConvert() {
+        assertTrue(converter.canConvert("a string", new ReifiedType(Properties.class)));
+        assertFalse(converter.canConvert(new Object(), new ReifiedType(Properties.class)));
+        assertFalse(converter.canConvert("a string", new ReifiedType(List.class)));
+    }
+
+    /*
+     * Test the convert method when dealing with unix paths (no \)
+     */
+    public void testConvertWithUnixPathNames() throws Exception {
+        Properties properties =
+                (Properties) converter.convert("users = /opt/karaf/etc/users.properties",
+                        new ReifiedType(Properties.class));
+        assertNotNull(properties);
+        assertEquals("/opt/karaf/etc/users.properties", properties.get("users"));
+    }
+
+    /*
+     * Test the convert method when dealing with windows paths (avoid escaping \)
+     */
+    public void testConvertWithWindowsPathNames() throws Exception {
+        Properties properties =
+                (Properties) converter.convert("users = c:\\opt\\karaf/etc/users.properties",
+                        new ReifiedType(Properties.class));
+        assertNotNull(properties);
+        assertEquals("c:/opt/karaf/etc/users.properties", properties.get("users"));
+    }
+}
diff --git a/karaf-2.2.x/jaas/pom.xml b/karaf-2.2.x/jaas/pom.xml
new file mode 100644
index 0000000..0021a52
--- /dev/null
+++ b/karaf-2.2.x/jaas/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.jaas</groupId>
+    <artifactId>jaas</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: JAAS</name>
+
+    <modules>
+        <module>boot</module>
+        <module>config</module>
+        <module>modules</module>
+        <module>jasypt</module>
+        <module>command</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/main/NOTICE b/karaf-2.2.x/main/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/main/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/main/pom.xml b/karaf-2.2.x/main/pom.xml
new file mode 100644
index 0000000..047286d
--- /dev/null
+++ b/karaf-2.2.x/main/pom.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.main</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Main</name>
+    <description>This bundle is the main Karaf launcher. It's responsible of the Karaf startup including the console, branding, etc bootstrap.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse</groupId>
+            <artifactId>osgi</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.framework</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.swissbox</groupId>
+            <artifactId>pax-swissbox-tinybundles</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <_donotcopy>(CVS|.svn|config.properties)</_donotcopy>
+                        <Main-Class>org.apache.karaf.main.Main</Main-Class>
+                        <Bundle-Name>Apache Karaf</Bundle-Name>
+                        <Bundle-Description>OSGi R4 framework.</Bundle-Description>
+                        <Export-Package />
+                        <!--
+                        <Private-Package>
+                            org.apache.felix.*;-split-package:=merge-first,
+                            org.eclipse.*;-split-package:=merge-first,
+                            org.osgi.*;-split-package:=merge-first,
+                            META-INF;-split-package:=merge-first
+                        </Private-Package>
+                        <Import-Package>!*</Import-Package>
+                        -->
+                        <Private-Package>
+                            org.apache.karaf.main*;-split-package:=merge-first,
+                            org.osgi.*;-split-package:=merge-first
+                        </Private-Package>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
+            </plugin>
+            <!--
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <artifactSet>
+                                <includes>
+                                    <include>org.eclipse:osgi</include>
+                                    <include>org.apache.felix:org.apache.felix.framework</include>
+                                    <include>${project.groupId}:${project.artifactId}</include>
+                                </includes>
+                            </artifactSet>
+                            <filters>
+                                <filter>
+                                    <artifact>org.eclipse:osgi</artifact>
+                                    <includes>
+                                        <include>org/osgi/**</include>
+                                        <include>org/eclipse/**</include>
+                                        <include>hookconfigurators.properties</include>
+                                    </includes>
+                                </filter>
+                                <filter>
+                                    <artifact>org.apache.felix:org.apache.felix.framework</artifact>
+                                    <includes>
+                                        <include>org/apache/felix/**</include>
+                                    </includes>
+                                </filter>
+                            </filters>
+                            <createSourcesJar>${createSourcesJar}</createSourcesJar>
+                            <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+                            <createDependencyReducedPom>true</createDependencyReducedPom>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        -->
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>deploy</id>
+            <properties>
+                <createSourcesJar>true</createSourcesJar>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>unpack-sources</id>
+                                <phase>generate-sources</phase>
+                                <goals>
+                                    <goal>unpack</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>org.eclipse</groupId>
+                                            <artifactId>osgi</artifactId>
+                                            <classifier>sources</classifier>
+                                        </artifactItem>
+                                        <artifactItem>
+                                            <groupId>org.osgi</groupId>
+                                            <artifactId>org.osgi.core</artifactId>
+                                            <classifier>sources</classifier>
+                                        </artifactItem>
+                                        <artifactItem>
+                                            <groupId>org.apache.felix</groupId>
+                                            <artifactId>org.apache.felix.framework</artifactId>
+                                            <classifier>sources</classifier>
+                                        </artifactItem>
+                                    </artifactItems>
+                                    <outputDirectory>${project.build.directory}/sources</outputDirectory>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <phase>process-classes</phase>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>package</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <minmemory>128m</minmemory>
+                            <maxmemory>512m</maxmemory>
+                            <sourcepath>${project.build.directory}/sources</sourcepath>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Bootstrap.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Bootstrap.java
new file mode 100644
index 0000000..77c895d
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Bootstrap.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.main;
+
+/**
+ * The Bootstrap class is used by the wrapper shell to bootstrap Karaf.
+ * Given JSW is using introspection to launch the main method, it would cause
+ * a CNFE on the OSGi related classes.  Using an indirection solves this problem.
+ */
+public class Bootstrap {
+
+    public static void main(String[] args) throws Exception {
+        Main.main(args);
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/BootstrapLogManager.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/BootstrapLogManager.java
new file mode 100644
index 0000000..2eb1185
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/BootstrapLogManager.java
@@ -0,0 +1,130 @@
+/*
+ * 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.karaf.main;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import java.util.logging.StreamHandler;
+
+/**
+ * Convenience class for configuring java.util.logging to append to
+ * the configured log4j log.  This could be used for bootstrap logging
+ * prior to start of the framework.
+ * 
+ */
+public class BootstrapLogManager {
+    private static Handler handler;
+    private static final String KARAF_BOOTSTRAP_LOG = "karaf.bootstrap.log";
+
+    private static Properties configProps;
+
+    public static synchronized Handler getDefaultHandler () {
+        if (handler != null) {
+            return handler;
+        }
+        String filename;
+        File log;
+        Properties props = new Properties();
+        filename = configProps.getProperty(KARAF_BOOTSTRAP_LOG);
+
+        if (filename != null) {
+            log = new File(filename);
+        } else {
+            // Make a best effort to log to the default file appender configured for log4j
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(System.getProperty("karaf.base") + "/etc/org.ops4j.pax.logging.cfg");
+                props.load(fis);
+            } catch (IOException e) {
+                props.setProperty("log4j.appender.out.file", "${karaf.data}/log/karaf.log");
+            } finally {
+                if (fis != null) { 
+                    try {
+                        fis.close(); 
+                    } catch (IOException ioe) {
+                        ioe.printStackTrace();
+                    }
+                }
+            }
+
+            if (props.getProperty("log4j.appender.out.file") == null) {
+                // manage if the log4j.appender.out.file property is not present in
+                // the etc/org.ops4j.pax.logging.cfg file
+                props.setProperty("log4j.appender.out.file", "${karaf.data}/log/karaf.log");
+            }
+            filename = Main.substVars(props.getProperty("log4j.appender.out.file"),"log4j.appender.out.file", null, null);
+            log = new File(filename);
+        }
+
+
+        try {
+            handler = new BootstrapLogManager.SimpleFileHandler(log);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return handler;
+    }
+
+    public static void setProperties(Properties configProps) {
+        BootstrapLogManager.configProps = configProps;
+    }
+
+
+    /**
+     * Implementation of java.util.logging.Handler that does simple appending
+     * to a named file.  Should be able to use this for bootstrap logging
+     * via java.util.logging prior to startup of pax logging.
+     */
+    public static class SimpleFileHandler extends StreamHandler {
+
+        public SimpleFileHandler (File file) throws IOException {
+            open(file, true);
+        }
+
+        private void open (File logfile, boolean append) throws IOException {
+            if (!logfile.getParentFile().exists()) {
+                try {
+                    logfile.getParentFile().mkdirs();
+                } catch (SecurityException se) {
+                    throw new IOException(se.getMessage());
+                }
+            }
+            FileOutputStream fout = new FileOutputStream(logfile, append);
+            BufferedOutputStream out = new BufferedOutputStream(fout);
+            setOutputStream(out);
+        }
+
+        public synchronized void publish (LogRecord record) {
+            if (!isLoggable(record)) {
+                return;
+            }
+            super.publish(record);
+            flush();
+        }
+    }
+
+
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java
new file mode 100644
index 0000000..b4319af
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java
@@ -0,0 +1,303 @@
+/*
+ * 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.karaf.main;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+/**
+ * Represents an exclusive lock on a database,
+ * used to avoid multiple Karaf instances attempting
+ * to become master.
+ * 
+ * @version $Revision: $
+ */
+public class DefaultJDBCLock implements Lock {
+
+    final Logger LOG = Logger.getLogger(this.getClass().getName());
+    
+    private static final String PROPERTY_LOCK_URL               = "karaf.lock.jdbc.url";
+    private static final String PROPERTY_LOCK_JDBC_DRIVER       = "karaf.lock.jdbc.driver";
+    private static final String PROPERTY_LOCK_JDBC_USER         = "karaf.lock.jdbc.user";
+    private static final String PROPERTY_LOCK_JDBC_PASSWORD     = "karaf.lock.jdbc.password";
+    private static final String PROPERTY_LOCK_JDBC_TABLE        = "karaf.lock.jdbc.table";
+    private static final String PROPERTY_LOCK_JDBC_CLUSTERNAME  = "karaf.lock.jdbc.clustername";
+    private static final String PROPERTY_LOCK_JDBC_TIMEOUT      = "karaf.lock.jdbc.timeout";
+    
+    private static final String DEFAULT_PASSWORD = "";
+    private static final String DEFAULT_USER = "";
+    private static final String DEFAULT_TABLE = "KARAF_LOCK";
+    private static final String DEFAULT_CLUSTERNAME = "karaf";
+    private static final String DEFAULT_TIMEOUT = "10"; // in seconds
+
+    final Statements statements;
+    Connection lockConnection;
+    String url;
+    String driver;
+    String user; 
+    String password;
+    String table;
+    String clusterName;
+    int timeout;
+
+    public DefaultJDBCLock(Properties props) {
+        LOG.addHandler(BootstrapLogManager.getDefaultHandler());
+        
+        this.url = props.getProperty(PROPERTY_LOCK_URL);
+        this.driver = props.getProperty(PROPERTY_LOCK_JDBC_DRIVER);
+        this.user = props.getProperty(PROPERTY_LOCK_JDBC_USER, DEFAULT_USER);
+        this.password = props.getProperty(PROPERTY_LOCK_JDBC_PASSWORD, DEFAULT_PASSWORD);
+        this.table = props.getProperty(PROPERTY_LOCK_JDBC_TABLE, DEFAULT_TABLE);
+        this.clusterName = props.getProperty(PROPERTY_LOCK_JDBC_CLUSTERNAME, DEFAULT_CLUSTERNAME);
+        this.timeout = Integer.parseInt(props.getProperty(PROPERTY_LOCK_JDBC_TIMEOUT, DEFAULT_TIMEOUT));
+        
+        this.statements = createStatements();
+        
+        init();
+    }
+    
+    Statements createStatements() {
+        Statements statements = new Statements();
+        statements.setTableName(table);
+        statements.setNodeName(clusterName);
+        return statements;
+    }
+    
+    void init() {
+        try {
+            createDatabase();
+            createSchema();
+        } catch (Exception e) {
+            LOG.severe("Error occured while attempting to obtain connection: " + e);
+        }
+    }
+    
+    void createDatabase() {
+        // do nothing in the default implementation
+    }
+
+    void createSchema() {
+        if (schemaExists()) {
+            return;
+        }
+        
+        String[] createStatments = this.statements.getLockCreateSchemaStatements(getCurrentTimeMillis());
+        Statement statement = null;
+        
+        try {
+            statement = getConnection().createStatement();
+            
+            for (String stmt : createStatments) {
+                statement.execute(stmt);
+            }
+            
+            getConnection().commit();
+        } catch (Exception e) {
+            LOG.severe("Could not create schema: " + e );
+        } finally {
+            closeSafely(statement);
+        }
+    }
+
+    boolean schemaExists() {
+        ResultSet rs = null;
+        boolean schemaExists = false;
+        
+        try {
+            rs = getConnection().getMetaData().getTables(null, null, statements.getFullLockTableName(), new String[] {"TABLE"});
+            schemaExists = rs.next();
+        } catch (Exception ignore) {
+            LOG.severe("Error testing for db table: " + ignore);
+        } finally {
+            closeSafely(rs);
+        }
+        
+        return schemaExists;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.karaf.main.Lock#lock()
+     */
+    public boolean lock() {
+        boolean result = aquireLock();
+        
+        if (result) {
+            result = updateLock();
+        }
+        
+        return result;
+    }
+    
+    boolean aquireLock() {
+        String lockCreateStatement = statements.getLockCreateStatement();
+        PreparedStatement preparedStatement = null;
+        boolean lockAquired = false;
+        
+        try {
+            preparedStatement = getConnection().prepareStatement(lockCreateStatement);
+            preparedStatement.setQueryTimeout(timeout);
+            lockAquired = preparedStatement.execute();
+        } catch (Exception e) {
+            LOG.warning("Failed to acquire database lock: " + e);
+        }finally {
+            closeSafely(preparedStatement);
+        }
+        
+        return lockAquired;
+    }
+
+    boolean updateLock() {
+        String lockUpdateStatement = statements.getLockUpdateStatement(getCurrentTimeMillis());
+        PreparedStatement preparedStatement = null;
+        boolean lockUpdated = false;
+        
+        try {
+            preparedStatement = getConnection().prepareStatement(lockUpdateStatement);
+            preparedStatement.setQueryTimeout(timeout);
+            int rows = preparedStatement.executeUpdate();
+            lockUpdated = (rows == 1);
+        } catch (Exception e) {
+            LOG.warning("Failed to update database lock: " + e);
+        }finally {
+            closeSafely(preparedStatement);
+        }
+        
+        return lockUpdated;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.karaf.main.Lock#release()
+     */
+    public void release() throws Exception {
+        if (isConnected()) {
+            try {
+                getConnection().rollback();
+            } catch (SQLException e) {
+                LOG.severe("Exception while rollbacking the connection on release: " + e);
+            } finally {
+                try {
+                    getConnection().close();
+                } catch (SQLException ignored) {
+                    LOG.fine("Exception while closing connection on release: " + ignored);
+                }
+            }
+        }
+        
+        lockConnection = null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.karaf.main.Lock#isAlive()
+     */
+    public boolean isAlive() throws Exception {
+        if (!isConnected()) { 
+            LOG.severe("Lost lock!");
+            return false; 
+        }
+
+        return updateLock();
+    }
+    
+    boolean isConnected() throws SQLException {
+        return lockConnection != null && !lockConnection.isClosed();
+    }
+    
+    void closeSafely(Statement preparedStatement) {
+        if (preparedStatement != null) {
+            try {
+                preparedStatement.close();
+            } catch (SQLException e) {
+                LOG.severe("Failed to close statement: " + e);
+            }
+        }
+    }
+    
+    void closeSafely(ResultSet rs) {
+        if (rs != null) {
+            try {
+                rs.close();
+            } catch (SQLException e) {
+                LOG.severe("Error occured while releasing ResultSet: " + e);
+            }
+        }
+    }
+    
+    Connection getConnection() throws Exception {
+        if (!isConnected()) {
+            lockConnection = createConnection(driver, url, user, password);
+            lockConnection.setAutoCommit(false);
+        }
+        
+        return lockConnection;
+    }
+
+    /**
+     * Create a new jdbc connection.
+     * 
+     * @param driver
+     * @param url
+     * @param username
+     * @param password
+     * @return a new jdbc connection
+     * @throws Exception 
+     */
+    Connection createConnection(String driver, String url, String username, String password) throws Exception {
+        if (url.toLowerCase().startsWith("jdbc:derby")) {
+            url = (url.toLowerCase().contains("create=true")) ? url : url + ";create=true";
+        }
+        
+        try {
+            return doCreateConnection(driver, url, username, password);
+        } catch (Exception e) {
+            LOG.severe("Error occured while setting up JDBC connection: " + e);
+            throw e; 
+        }
+    }
+
+    /**
+     * This method could be used to inject a mock jdbc connection for testing purposes.
+     * 
+     * @param driver
+     * @param url
+     * @param username
+     * @param password
+     * @return
+     * @throws ClassNotFoundException
+     * @throws SQLException
+     */
+    Connection doCreateConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException {
+        Class.forName(driver);
+        // results in a closed connection in Derby if the update lock table request timed out
+        // DriverManager.setLoginTimeout(timeout);
+        return DriverManager.getConnection(url, username, password);
+    }
+    
+    long getCurrentTimeMillis() {
+        return System.currentTimeMillis();
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java
new file mode 100644
index 0000000..921a0d1
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java
@@ -0,0 +1,43 @@
+/*
+ * 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.karaf.main;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+/**
+ * Represents an exclusive lock on a database,
+ * used to avoid multiple Karaf instances attempting
+ * to become master.
+ * 
+ * @version $Revision: $
+ */
+public class DerbyJDBCLock extends DefaultJDBCLock {
+
+    public DerbyJDBCLock(Properties props) {
+        super(props);
+    }
+
+    @Override
+    Connection createConnection(String driver, String url, String username, String password) throws Exception {
+        url = (url.toLowerCase().contains("create=true")) ? url : url + ";create=true";
+        
+        return super.createConnection(driver, url, username, password);
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Lock.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Lock.java
new file mode 100644
index 0000000..6c2d84f
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Lock.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.main;
+
+public interface Lock {
+
+    /**
+     * A KeepAlive function to maintain the lock. 
+     * Indicates whether or not the lock could be aquired.
+     * 
+     * @return true if connection lock retained, false otherwise.
+     * @throws Exception
+     */
+    boolean lock() throws Exception;
+
+    /**
+     * Terminate the lock connection safely.
+     * 
+     * @throws Exception
+     */
+    void release() throws Exception;
+
+    /**
+     * Indicates whether or not the lock still exists.
+     * 
+     * @return true, if the lock still exists, otherwise false.
+     * @throws Exception
+     */
+    boolean isAlive() throws Exception;
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Main.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Main.java
new file mode 100644
index 0000000..630b71e
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Main.java
@@ -0,0 +1,1459 @@
+/*
+ * 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.karaf.main;
+
+import java.io.*;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessControlException;
+import java.security.Provider;
+import java.security.Security;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Random;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.launch.Framework;
+import org.osgi.framework.launch.FrameworkFactory;
+import org.osgi.service.startlevel.StartLevel;
+
+/**
+ * <p>
+ * This class is the default way to instantiate and execute the framework. It is not
+ * intended to be the only way to instantiate and execute the framework; rather, it is
+ * one example of how to do so. When embedding the framework in a host application,
+ * this class can serve as a simple guide of how to do so. It may even be
+ * worthwhile to reuse some of its property handling capabilities. This class
+ * is completely static and is only intended to start a single instance of
+ * the framework.
+ * </p>
+ */
+public class Main {
+    /**
+     * The default name used for the system properties file.
+     */
+    public static final String SYSTEM_PROPERTIES_FILE_NAME = "system.properties";
+    /**
+     * The default name used for the configuration properties file.
+     */
+    public static final String CONFIG_PROPERTIES_FILE_NAME = "config.properties";
+    /**
+     * The default name used for the startup properties file.
+     */
+    public static final String STARTUP_PROPERTIES_FILE_NAME = "startup.properties";
+    /**
+     * The property name prefix for the launcher's auto-install property.
+     */
+    public static final String PROPERTY_AUTO_INSTALL = "karaf.auto.install";
+    /**
+     * The property for auto-discovering the bundles
+     */
+    public static final String PROPERTY_AUTO_START = "karaf.auto.start";
+    /**
+     * The system property for specifying the Karaf home directory.  The home directory
+     * hold the binary install of Karaf.
+     */
+    public static final String PROP_KARAF_HOME = "karaf.home";
+    /**
+     * The environment variable for specifying the Karaf home directory.  The home directory
+     * hold the binary install of Karaf.
+     */
+    public static final String ENV_KARAF_HOME = "KARAF_HOME";
+    /**
+     * The system property for specifying the Karaf base directory.  The base directory
+     * holds the configuration and data for a Karaf instance.
+     */
+    public static final String PROP_KARAF_BASE = "karaf.base";
+    /**
+     * The environment variable for specifying the Karaf base directory.  The base directory
+     * holds the configuration and data for a Karaf instance.
+     */
+    public static final String ENV_KARAF_BASE = "KARAF_BASE";
+    /**
+     * The system property for specifying the Karaf data directory. The data directory
+     * holds the bundles data and cache for a Karaf instance.
+     */
+    public static final String PROP_KARAF_DATA = "karaf.data";
+    /**
+     * The environment variable for specifying the Karaf data directory. The data directory
+     * holds the bundles data and cache for a Karaf instance.
+     */
+    public static final String ENV_KARAF_DATA = "KARAF_DATA";
+    /**
+     * The system property for specifying the Karaf data directory. The data directory
+     * holds the bundles data and cache for a Karaf instance.
+     */
+    public static final String PROP_KARAF_INSTANCES = "karaf.instances";
+    /**
+     * The system property for specifying the Karaf data directory. The data directory
+     * holds the bundles data and cache for a Karaf instance.
+     */
+    public static final String ENV_KARAF_INSTANCES = "KARAF_INSTANCES";
+    /**
+     * The system property for holding the Karaf version.
+     */
+    public static final String PROP_KARAF_VERSION = "karaf.version";
+
+    /**
+     * Config property which identifies directories which contain bundles to be loaded by SMX
+     */
+    public static final String BUNDLE_LOCATIONS = "bundle.locations";
+
+    /**
+     * Config property that indicates we want to convert bundles locations
+     * to Maven style URLs
+     */
+    public static final String PROPERTY_CONVERT_TO_MAVEN_URL = "karaf.maven.convert";
+
+    /**
+     * If a lock should be used before starting the runtime
+     */
+    public static final String PROPERTY_USE_LOCK = "karaf.lock";
+
+    /**
+     * The lock implementation
+     */
+    public static final String PROPERTY_LOCK_CLASS = "karaf.lock.class";
+
+    public static final String PROPERTY_LOCK_DELAY = "karaf.lock.delay";
+
+    public static final String PROPERTY_LOCK_LEVEL = "karaf.lock.level";
+
+    public static final String DEFAULT_REPO = "karaf.default.repository";
+    
+    public static final String KARAF_FRAMEWORK = "karaf.framework";
+
+    public static final String KARAF_FRAMEWORK_FACTORY = "karaf.framework.factory";
+
+    public static final String KARAF_SHUTDOWN_TIMEOUT = "karaf.shutdown.timeout";
+
+    public static final String KARAF_SHUTDOWN_PORT = "karaf.shutdown.port";
+
+    public static final String KARAF_SHUTDOWN_HOST = "karaf.shutdown.host";
+
+    public static final String KARAF_SHUTDOWN_PORT_FILE = "karaf.shutdown.port.file";
+
+    public static final String KARAF_SHUTDOWN_COMMAND = "karaf.shutdown.command";
+
+    public static final String KARAF_SHUTDOWN_PID_FILE = "karaf.shutdown.pid.file";
+
+    public static final String DEFAULT_SHUTDOWN_COMMAND = "SHUTDOWN";
+
+    public static final String PROPERTY_LOCK_CLASS_DEFAULT = SimpleFileLock.class.getName();
+
+    public static final String INCLUDES_PROPERTY = "${includes}"; // mandatory includes
+
+    public static final String OPTIONALS_PROPERTY = "${optionals}"; // optionals includes
+
+    Logger LOG = Logger.getLogger(this.getClass().getName());
+
+    private File karafHome;
+    private File karafBase;
+    private File karafData;
+    private File karafInstances;
+    private Properties configProps = null;
+    private Framework framework = null;
+    private final String[] args;
+    private int exitCode;
+    private Lock lock;
+    private int defaultStartLevel = 100;
+    private int lockStartLevel = 1;
+    private int lockDelay = 1000;
+    private int shutdownTimeout = 5 * 60 * 1000;
+    private boolean exiting = false;
+    private ShutdownCallback shutdownCallback;
+
+    public Main(String[] args) {
+        this.args = args;
+    }
+
+    public void setShutdownCallback(ShutdownCallback shutdownCallback) {
+        this.shutdownCallback = shutdownCallback;
+    }
+
+    public void launch() throws Exception {
+        karafHome = Utils.getKarafHome();
+        karafBase = Utils.getKarafDirectory(Main.PROP_KARAF_BASE, Main.ENV_KARAF_BASE, karafHome, false, true);
+        karafData = Utils.getKarafDirectory(Main.PROP_KARAF_DATA, Main.ENV_KARAF_DATA, new File(karafBase, "data"), true, true);
+        karafInstances = Utils.getKarafDirectory(Main.PROP_KARAF_INSTANCES, Main.ENV_KARAF_INSTANCES, new File(karafHome, "instances"), false, false);
+
+        Package p = Package.getPackage("org.apache.karaf.main");
+        if (p != null && p.getImplementationVersion() != null) {
+            System.setProperty(PROP_KARAF_VERSION, p.getImplementationVersion());
+        }
+        System.setProperty(PROP_KARAF_HOME, karafHome.getPath());
+        System.setProperty(PROP_KARAF_BASE, karafBase.getPath());
+        System.setProperty(PROP_KARAF_DATA, karafData.getPath());
+        System.setProperty(PROP_KARAF_INSTANCES, karafInstances.getPath());
+
+        // Load system properties.
+        loadSystemProperties(karafBase);
+
+        updateInstancePid();
+
+        // Read configuration properties.
+        configProps = loadConfigProperties();
+        BootstrapLogManager.setProperties(configProps);
+        LOG.addHandler(BootstrapLogManager.getDefaultHandler());
+        
+        // Copy framework properties from the system properties.
+        Main.copySystemProperties(configProps);
+
+        ClassLoader classLoader = createClassLoader(configProps);
+
+        processSecurityProperties(configProps);
+
+        if (configProps.getProperty(Constants.FRAMEWORK_STORAGE) == null) {
+            File storage = new File(karafData.getPath(), "cache");
+            try {
+                storage.mkdirs();
+            } catch (SecurityException se) {
+                throw new Exception(se.getMessage()); 
+            }
+            configProps.setProperty(Constants.FRAMEWORK_STORAGE, storage.getAbsolutePath());
+        }
+        
+        defaultStartLevel = Integer.parseInt(configProps.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
+        lockStartLevel = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_LEVEL, Integer.toString(lockStartLevel)));
+        lockDelay = Integer.parseInt(configProps.getProperty(PROPERTY_LOCK_DELAY, Integer.toString(lockDelay)));
+        configProps.setProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL, Integer.toString(lockStartLevel));
+        shutdownTimeout = Integer.parseInt(configProps.getProperty(KARAF_SHUTDOWN_TIMEOUT, Integer.toString(shutdownTimeout)));
+        // Start up the OSGI framework
+
+        String factoryClass = configProps.getProperty(KARAF_FRAMEWORK_FACTORY);
+        if (factoryClass == null) {
+            InputStream is = classLoader.getResourceAsStream("META-INF/services/" + FrameworkFactory.class.getName());
+            BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+            factoryClass = br.readLine();
+            br.close();
+        }
+        FrameworkFactory factory = (FrameworkFactory) classLoader.loadClass(factoryClass).newInstance();
+        framework = factory.newFramework(new StringMap(configProps, false));
+        framework.init();
+        // Process properties
+        loadStartupProperties(configProps);
+        processAutoProperties(framework.getBundleContext());
+        framework.start();
+        // Start lock monitor
+        new Thread() {
+            public void run() {
+                lock(configProps);
+            }
+        }.start();
+    }
+
+    public void awaitShutdown() throws Exception {
+        if (framework == null) {
+            return;
+        }
+        while (true) {
+            FrameworkEvent event = framework.waitForStop(0);
+            if (event.getType() != FrameworkEvent.STOPPED_UPDATE) {
+                return;
+            }
+        }
+    }
+
+	public boolean destroy() throws Exception {
+        if (framework == null) {
+            return true;
+        }
+        try {
+            int step = 5000;
+
+            // Notify the callback asap
+            if (shutdownCallback != null) {
+                shutdownCallback.waitingForShutdown(step);
+            }
+
+            // Stop the framework in case it's still active
+            exiting = true;
+            if (framework.getState() == Bundle.ACTIVE || framework.getState() == Bundle.STARTING) {
+                new Thread() {
+                    public void run() {
+                        try {
+                            framework.stop();
+                        } catch (BundleException e) {
+                            System.err.println("Error stopping karaf: " + e.getMessage());
+                        }
+                    }
+                }.start();
+            }
+
+            int timeout = shutdownTimeout;
+            if (shutdownTimeout <= 0) {
+                timeout = Integer.MAX_VALUE;
+            }
+            while (timeout > 0) {
+                timeout -= step;
+                if (shutdownCallback != null) {
+                    shutdownCallback.waitingForShutdown(step * 2);
+                }
+                FrameworkEvent event = framework.waitForStop(step);
+                if (event.getType() != FrameworkEvent.WAIT_TIMEDOUT) {
+                    return true;
+                }
+            }
+            return false;
+        } finally {
+            unlock();
+        }
+    }
+
+    /**
+     * <p>
+     * This method performs the main task of constructing an framework instance
+     * and starting its execution. The following functions are performed
+     * when invoked:
+     * </p>
+     * <ol>
+     *   <li><i><b>Read the system properties file.<b></i> This is a file
+     *       containing properties to be pushed into <tt>System.setProperty()</tt>
+     *       before starting the framework. This mechanism is mainly shorthand
+     *       for people starting the framework from the command line to avoid having
+     *       to specify a bunch of <tt>-D</tt> system property definitions.
+     *       The only properties defined in this file that will impact the framework's
+     *       behavior are the those concerning setting HTTP proxies, such as
+     *       <tt>http.proxyHost</tt>, <tt>http.proxyPort</tt>, and
+     *       <tt>http.proxyAuth</tt>.
+     *   </li>
+     *   <li><i><b>Perform system property variable substitution on system
+     *       properties.</b></i> Any system properties in the system property
+     *       file whose value adheres to <tt>${&lt;system-prop-name&gt;}</tt>
+     *       syntax will have their value substituted with the appropriate
+     *       system property value.
+     *   </li>
+     *   <li><i><b>Read the framework's configuration property file.</b></i> This is
+     *       a file containing properties used to configure the framework
+     *       instance and to pass configuration information into
+     *       bundles installed into the framework instance. The configuration
+     *       property file is called <tt>config.properties</tt> by default
+     *       and is located in the <tt>conf/</tt> directory of the Felix
+     *       installation directory, which is the parent directory of the
+     *       directory containing the <tt>felix.jar</tt> file. It is possible
+     *       to use a different location for the property file by specifying
+     *       the desired URL using the <tt>felix.config.properties</tt>
+     *       system property; this should be set using the <tt>-D</tt> syntax
+     *       when executing the JVM. Refer to the
+     *       <a href="Felix.html#Felix(java.util.Map, java.util.List)">
+     *       <tt>Felix</tt></a> constructor documentation for more
+     *       information on the framework configuration options.
+     *   </li>
+     *   <li><i><b>Perform system property variable substitution on configuration
+     *       properties.</b></i> Any configuration properties whose value adheres to
+     *       <tt>${&lt;system-prop-name&gt;}</tt> syntax will have their value
+     *       substituted with the appropriate system property value.
+     *   </li>
+     *   <li><i><b>Ensure the default bundle cache has sufficient information to
+     *       initialize.</b></i> The default implementation of the bundle cache
+     *       requires either a profile name or a profile directory in order to
+     *       start. The configuration properties are checked for at least one
+     *       of the <tt>felix.cache.profile</tt> or <tt>felix.cache.profiledir</tt>
+     *       properties. If neither is found, the user is asked to supply a profile
+     *       name that is added to the configuration property set. See the
+     *       <a href="cache/DefaultBundleCache.html"><tt>DefaultBundleCache</tt></a>
+     *       documentation for more details its configuration options.
+     *   </li>
+     *   <li><i><b>Creates and starts a framework instance.</b></i> A
+     *       case insensitive
+     *       <a href="util/StringMap.html"><tt>StringMap</tt></a>
+     *       is created for the configuration property file and is passed
+     *       into the framework.
+     *   </li>
+     * </ol>
+     * <p>
+     * It should be noted that simply starting an instance of the framework is not enough
+     * to create an interactive session with it. It is necessary to install
+     * and start bundles that provide an interactive impl; this is generally
+     * done by specifying an "auto-start" property in the framework configuration
+     * property file. If no interactive impl bundles are installed or if
+     * the configuration property file cannot be found, the framework will appear to
+     * be hung or deadlocked. This is not the case, it is executing correctly,
+     * there is just no way to interact with it. Refer to the
+     * <a href="Felix.html#Felix(java.util.Map, java.util.List)">
+     * <tt>Felix</tt></a> constructor documentation for more information on
+     * framework configuration options.
+     * </p>
+     * @param args An array of arguments, all of which are ignored.
+     * @throws Exception If an error occurs.
+     **/
+    public static void main(String[] args) throws Exception {
+        while (true) {
+            boolean restart = false;
+            System.setProperty("karaf.restart", "false");
+            if (Boolean.getBoolean("karaf.restart.clean")) {
+                File karafHome = Utils.getKarafHome();
+                File karafBase = Utils.getKarafDirectory(Main.PROP_KARAF_BASE, Main.ENV_KARAF_BASE, karafHome, false, true);
+                File karafData = Utils.getKarafDirectory(Main.PROP_KARAF_DATA, Main.ENV_KARAF_DATA, new File(karafBase, "data"), true, true);
+                Utils.deleteDirectory(karafData);
+            }
+            final Main main = new Main(args);
+            try {
+                main.launch();
+            } catch (Throwable ex) {
+                main.destroy();
+                main.setExitCode(-1);
+                System.err.println("Could not create framework: " + ex);
+                ex.printStackTrace();
+            }
+            try {
+                main.awaitShutdown();
+                boolean stopped = main.destroy();
+                restart = Boolean.getBoolean("karaf.restart");
+                if (!stopped) {
+                    if (restart) {
+                        System.err.println("Timeout waiting for framework to stop.  Restarting now.");
+                    } else {
+                        System.err.println("Timeout waiting for framework to stop.  Exiting VM.");
+                        main.setExitCode(-3);
+                    }
+                }
+            } catch (Throwable ex) {
+                main.setExitCode(-2);
+                System.err.println("Error occured shutting down framework: " + ex);
+                ex.printStackTrace();
+            } finally {
+                if (!restart) {
+                    System.exit(main.getExitCode());
+                }
+            }
+        }
+    }
+
+    private static void processSecurityProperties(Properties m_configProps) {
+        String prop = m_configProps.getProperty("org.apache.karaf.security.providers");
+        if (prop != null) {
+            String[] providers = prop.split(",");
+            for (String provider : providers) {
+                addProvider(provider);
+            }
+        }
+    }
+
+    private static void addProvider(String provider) {
+        try {
+            Security.addProvider((Provider) Class.forName(provider).newInstance());
+        } catch (Throwable t) {
+            System.err.println("Unable to register security provider: " + t);
+        }
+    }
+
+    private void updateInstancePid() {
+        try {
+            String instanceName = System.getProperty("karaf.name");
+            String pid = ManagementFactory.getRuntimeMXBean().getName();
+            if (pid.indexOf('@') > 0) {
+                pid = pid.substring(0, pid.indexOf('@'));
+            }
+            
+            boolean isRoot = karafHome.equals(karafBase);
+            
+            if (instanceName != null) {
+                String storage = System.getProperty("karaf.instances");
+                if (storage == null) {
+                    throw new Exception("System property 'karaf.instances' is not set. \n" +
+                        "This property needs to be set to the full path of the instance.properties file.");
+                }
+                File storageFile = new File(storage);
+                File propertiesFile = new File(storageFile, "instance.properties");
+                Properties props = new Properties();
+                if (propertiesFile.exists()) {
+                    FileInputStream fis = new FileInputStream(propertiesFile);
+                    props.load(fis);
+                    int count = Integer.parseInt(props.getProperty("count"));
+                    for (int i = 0; i < count; i++) {
+                        String name = props.getProperty("item." + i + ".name");
+                        if (name.equals(instanceName)) {
+                            props.setProperty("item." + i + ".pid", pid);
+                            FileOutputStream fos = new FileOutputStream(propertiesFile);
+                            props.store(fos, null);
+                            fis.close();
+                            fos.close();
+                            return;
+                        }
+                    }
+                    fis.close();
+                    if (!isRoot) {
+                        throw new Exception("Instance " + instanceName + " not found");
+                    } 
+                } else if (isRoot) {
+                    if (!propertiesFile.getParentFile().exists()) {
+                        try {
+                            propertiesFile.getParentFile().mkdirs();
+                        } catch (SecurityException se) {
+                            throw new Exception(se.getMessage());
+                        }
+                    }
+                    props.setProperty("count", "1");
+                    props.setProperty("item.0.name", instanceName);
+                    props.setProperty("item.0.loc", karafHome.getAbsolutePath());
+                    props.setProperty("item.0.pid", pid);
+                    props.setProperty("item.0.root", "true");
+                    FileOutputStream fos = new FileOutputStream(propertiesFile);
+                    props.store(fos, null);
+                    fos.close();
+                }
+            }
+        } catch (Exception e) {
+            System.err.println("Unable to update instance pid: " + e.getMessage());
+        }
+    }
+
+    /**
+     * <p/>
+     * Processes the auto-install and auto-start properties from the
+     * specified configuration properties.
+     *
+     * @param context the system bundle context
+     */
+    private void processAutoProperties(BundleContext context) {
+        // Check if we want to convert URLs to maven style
+        boolean convertToMavenUrls = Boolean.parseBoolean(configProps.getProperty(PROPERTY_CONVERT_TO_MAVEN_URL, "true"));
+
+        // Retrieve the Start Level service, since it will be needed
+        // to set the start level of the installed bundles.
+        StartLevel sl = (StartLevel) context.getService(
+                context.getServiceReference(org.osgi.service.startlevel.StartLevel.class.getName()));
+
+        // Set the default bundle start level
+        int ibsl = 60;
+        try {
+            String str = configProps.getProperty("karaf.startlevel.bundle");
+            if (str != null) {
+                ibsl = Integer.parseInt(str);
+            }
+        } catch (Throwable t) {
+        }
+        sl.setInitialBundleStartLevel(ibsl);
+
+        // If we have a clean state, install everything
+        if (framework.getBundleContext().getBundles().length == 1) {
+            // The auto-install property specifies a space-delimited list of
+            // bundle URLs to be automatically installed into each new profile;
+            // the start level to which the bundles are assigned is specified by
+            // appending a ".n" to the auto-install property name, where "n" is
+            // the desired start level for the list of bundles.
+            autoInstall(PROPERTY_AUTO_INSTALL, context, sl, convertToMavenUrls, false);
+
+            // The auto-start property specifies a space-delimited list of
+            // bundle URLs to be automatically installed and started into each
+            // new profile; the start level to which the bundles are assigned
+            // is specified by appending a ".n" to the auto-start property name,
+            // where "n" is the desired start level for the list of bundles.
+            // The following code starts bundles in one pass, installing bundles
+            // for a given level, then starting them, then moving to the next level.
+            autoInstall(PROPERTY_AUTO_START, context, sl, convertToMavenUrls, true);
+        }
+    }
+
+    private List<Bundle> autoInstall(String propertyPrefix, BundleContext context, StartLevel sl, boolean convertToMavenUrls, boolean start) {
+        Map<Integer, String> autoStart = new TreeMap<Integer, String>();
+        List<Bundle> bundles = new ArrayList<Bundle>();
+        for (Object o : configProps.keySet()) {
+            String key = (String) o;
+            // Ignore all keys that are not the auto-start property.
+            if (!key.startsWith(propertyPrefix)) {
+                continue;
+            }
+            // If the auto-start property does not have a start level,
+            // then assume it is the default bundle start level, otherwise
+            // parse the specified start level.
+            int startLevel = sl.getInitialBundleStartLevel();
+            if (!key.equals(propertyPrefix)) {
+                try {
+                    startLevel = Integer.parseInt(key.substring(key.lastIndexOf('.') + 1));
+                } catch (NumberFormatException ex) {
+                    System.err.println("Invalid property: " + key);
+                }
+            }
+            autoStart.put(startLevel, configProps.getProperty(key));
+        }
+        for (Integer startLevel : autoStart.keySet()) {
+            StringTokenizer st = new StringTokenizer(autoStart.get(startLevel), "\" ", true);
+            if (st.countTokens() > 0) {
+                String location;
+                do {
+                    location = nextLocation(st);
+                    if (location != null) {
+                        try {
+                            String[] parts = convertToMavenUrlsIfNeeded(location, convertToMavenUrls);
+                            Bundle b = context.installBundle(parts[0], new URL(parts[1]).openStream());
+                            sl.setBundleStartLevel(b, startLevel);
+                            bundles.add(b);
+                        }
+                        catch (Exception ex) {
+                            System.err.println("Error installing bundle  " + location + ": " + ex);
+                        }
+                    }
+                }
+                while (location != null);
+            }
+        }
+        // Now loop through and start the installed bundles.
+        if (start) {
+            for (Bundle b : bundles) {
+                try {
+                    String fragmentHostHeader = (String) b.getHeaders().get(Constants.FRAGMENT_HOST);
+                    if (fragmentHostHeader == null || fragmentHostHeader.trim().length() == 0) {
+                        b.start();
+                    }
+                }
+                catch (Exception ex) {
+                    System.err.println("Error starting bundle " + b.getSymbolicName() + ": " + ex);
+                }
+            }
+        }
+        return bundles;
+    }
+
+    private static String[] convertToMavenUrlsIfNeeded(String location, boolean convertToMavenUrls) {
+        String[] parts = location.split("\\|");
+        if (convertToMavenUrls) {
+            String[] p = parts[1].split("/");
+            if (p.length >= 4 && p[p.length-1].startsWith(p[p.length-3] + "-" + p[p.length-2])) {
+                String artifactId = p[p.length-3];
+                String version = p[p.length-2];
+                String classifier;
+                String type;
+                String artifactIdVersion = artifactId + "-" + version;
+                StringBuffer sb = new StringBuffer();
+                if (p[p.length-1].charAt(artifactIdVersion.length()) == '-') {
+                    classifier = p[p.length-1].substring(artifactIdVersion.length() + 1, p[p.length-1].lastIndexOf('.'));
+                } else {
+                    classifier = null;
+                }
+                type = p[p.length-1].substring(p[p.length-1].lastIndexOf('.') + 1);
+                sb.append("mvn:");
+                for (int j = 0; j < p.length - 3; j++) {
+                    if (j > 0) {
+                        sb.append('.');
+                    }
+                    sb.append(p[j]);
+                }
+                sb.append('/').append(artifactId).append('/').append(version);
+                if (!"jar".equals(type) || classifier != null) {
+                    sb.append('/');
+                    if (!"jar".equals(type)) {
+                        sb.append(type);
+                    }
+                    if (classifier != null) {
+                        sb.append('/').append(classifier);
+                    }
+                }
+                parts[1] = parts[0];
+                parts[0] = sb.toString();
+            } else {
+                parts[1] = parts[0];
+            }
+        } else {
+            parts[1] = parts[0];
+        }
+        return parts;
+    }
+
+    private static String nextLocation(StringTokenizer st) {
+        String retVal = null;
+
+        if (st.countTokens() > 0) {
+            String tokenList = "\" ";
+            StringBuffer tokBuf = new StringBuffer(10);
+            String tok;
+            boolean inQuote = false;
+            boolean tokStarted = false;
+            boolean exit = false;
+            while ((st.hasMoreTokens()) && (!exit)) {
+                tok = st.nextToken(tokenList);
+                if (tok.equals("\"")) {
+                    inQuote = !inQuote;
+                    if (inQuote) {
+                        tokenList = "\"";
+                    } else {
+                        tokenList = "\" ";
+                    }
+
+                } else if (tok.equals(" ")) {
+                    if (tokStarted) {
+                        retVal = tokBuf.toString();
+                        tokStarted = false;
+                        tokBuf = new StringBuffer(10);
+                        exit = true;
+                    }
+                } else {
+                    tokStarted = true;
+                    tokBuf.append(tok.trim());
+                }
+            }
+
+            // Handle case where end of token stream and
+            // still got data
+            if ((!exit) && (tokStarted)) {
+                retVal = tokBuf.toString();
+            }
+        }
+
+        return retVal;
+    }
+
+    /**
+     * <p>
+     * Loads the properties in the system property file associated with the
+     * framework installation into <tt>System.setProperty()</tt>. These properties
+     * are not directly used by the framework in anyway. By default, the system
+     * property file is located in the <tt>conf/</tt> directory of the Felix
+     * installation directory and is called "<tt>system.properties</tt>". The
+     * installation directory of Felix is assumed to be the parent directory of
+     * the <tt>felix.jar</tt> file as found on the system class path property.
+     * The precise file from which to load system properties can be set by
+     * initializing the "<tt>felix.system.properties</tt>" system property to an
+     * arbitrary URL.
+     * </p>
+     *
+     * @param karafBase the karaf base folder
+     */
+    protected static void loadSystemProperties(File karafBase) {
+        // The system properties file is either specified by a system
+        // property or it is in the same directory as the Felix JAR file.
+        // Try to load it from one of these places.
+
+        // See if the property URL was specified as a property.
+        URL propURL;
+        try {
+            File file = new File(new File(karafBase, "etc"), SYSTEM_PROPERTIES_FILE_NAME);
+            propURL = file.toURI().toURL();
+        }
+        catch (MalformedURLException ex) {
+            System.err.print("Main: " + ex);
+            return;
+        }
+
+        // Read the properties file.
+        Properties props = new Properties();
+        InputStream is = null;
+        try {
+            is = propURL.openConnection().getInputStream();
+            props.load(is);
+            is.close();
+        }
+        catch (FileNotFoundException ex) {
+            // Ignore file not found.
+        }
+        catch (Exception ex) {
+            System.err.println(
+                    "Main: Error loading system properties from " + propURL);
+            System.err.println("Main: " + ex);
+            try {
+                if (is != null) is.close();
+            }
+            catch (IOException ex2) {
+                // Nothing we can do.
+            }
+            return;
+        }
+
+        // Perform variable substitution on specified properties.
+        for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            String value = System.getProperty(name, props.getProperty(name));
+            System.setProperty(name, substVars(value, name, null, props));
+        }
+    }
+
+    /**
+     * <p>
+     * Loads the configuration properties in the configuration property file
+     * associated with the framework installation; these properties
+     * are accessible to the framework and to bundles and are intended
+     * for configuration purposes. By default, the configuration property
+     * file is located in the <tt>conf/</tt> directory of the Felix
+     * installation directory and is called "<tt>config.properties</tt>".
+     * The installation directory of Felix is assumed to be the parent
+     * directory of the <tt>felix.jar</tt> file as found on the system class
+     * path property. The precise file from which to load configuration
+     * properties can be set by initializing the "<tt>felix.config.properties</tt>"
+     * system property to an arbitrary URL.
+     * </p>
+     *
+     * @return A <tt>Properties</tt> instance or <tt>null</tt> if there was an error.
+     * @throws Exception if something wrong occurs
+     */
+    private Properties loadConfigProperties() throws Exception {
+        // See if the property URL was specified as a property.
+        URL configPropURL;
+
+        try {
+            File etcFolder = new File(karafBase, "etc");
+            if (!etcFolder.exists()) {
+                throw new FileNotFoundException("etc folder not found: " + etcFolder.getAbsolutePath());
+            }
+            File file = new File(etcFolder, CONFIG_PROPERTIES_FILE_NAME);
+            configPropURL = file.toURI().toURL();
+        }
+        catch (MalformedURLException ex) {
+            System.err.print("Main: " + ex);
+            return null;
+        }
+
+
+        Properties configProps = loadPropertiesFile(configPropURL, false);
+
+        // Perform variable substitution for system properties.
+        for (Enumeration e = configProps.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            configProps.setProperty(name,
+                    substVars(configProps.getProperty(name), name, null, configProps));
+        }
+
+        return configProps;
+    }
+
+    private void loadStartupProperties(Properties configProps) throws Exception {
+        // The config properties file is either specified by a system
+        // property or it is in the conf/ directory of the Felix
+        // installation directory.  Try to load it from one of these
+        // places.
+
+        List<File> bundleDirs = new ArrayList<File>();
+
+        // See if the property URL was specified as a property.
+        URL startupPropURL;
+
+        File etcFolder = new File(karafBase, "etc");
+        if (!etcFolder.exists()) {
+            throw new FileNotFoundException("etc folder not found: " + etcFolder.getAbsolutePath());
+        }
+        File file = new File(etcFolder, STARTUP_PROPERTIES_FILE_NAME);
+        startupPropURL = file.toURI().toURL();
+        Properties startupProps = loadPropertiesFile(startupPropURL, true);
+
+        String defaultRepo = System.getProperty(DEFAULT_REPO, "system");
+        if (karafBase.equals(karafHome)) {
+            File systemRepo = new File(karafHome, defaultRepo);
+            if (!systemRepo.exists()) {
+                throw new FileNotFoundException("system repo not found: " + systemRepo.getAbsolutePath());
+            }
+            bundleDirs.add(systemRepo);
+        } else {
+            File baseSystemRepo = new File(karafBase, defaultRepo);
+            File homeSystemRepo = new File(karafHome, defaultRepo);
+            if (!baseSystemRepo.exists() && !homeSystemRepo.exists()) {
+                throw new FileNotFoundException("system repos not found: " + baseSystemRepo.getAbsolutePath() + " " + homeSystemRepo.getAbsolutePath());
+            }
+            bundleDirs.add(baseSystemRepo);
+            bundleDirs.add(homeSystemRepo);
+        }
+        String locations = configProps.getProperty(BUNDLE_LOCATIONS);
+        if (locations != null) {
+            StringTokenizer st = new StringTokenizer(locations, "\" ", true);
+            if (st.countTokens() > 0) {
+                String location;
+                do {
+                    location = nextLocation(st);
+                    if (location != null) {
+                        File f;
+                        if (karafBase.equals(karafHome)) {
+                        	f = new File(karafHome, location);
+                        } else {
+                        	f = new File(karafBase, location);
+                        }
+                        if (f.exists() && f.isDirectory()) {
+                            bundleDirs.add(f);
+                        } else {
+                            System.err.println("Bundle location " + location
+                                    + " does not exist or is not a directory.");
+                        }
+                    }
+                }
+
+                while (location != null);
+            }
+        }
+
+        // Mutate properties
+        Main.processConfigurationProperties(configProps, startupProps, bundleDirs);
+    }
+
+    protected static Properties loadPropertiesFile(URL configPropURL, boolean failIfNotFound) throws Exception {
+        // Read the properties file.
+        Properties configProps = new Properties();
+        InputStream is = null;
+        try {
+            is = configPropURL.openConnection().getInputStream();
+            configProps.load(is);
+            is.close();
+        } catch (FileNotFoundException ex) {
+            if (failIfNotFound) {
+                throw ex;
+            } else {
+                System.err.println("WARN: " + configPropURL + " is not found, so not loaded");
+            }
+        } catch (Exception ex) {
+            System.err.println("Error loading config properties from " + configPropURL);
+            System.err.println("Main: " + ex);
+            return configProps;
+        } finally {
+            try {
+                if (is != null) {
+                    is.close();
+                }
+            }
+            catch (IOException ex2) {
+                // Nothing we can do.
+            }
+        }
+        String includes = configProps.getProperty(INCLUDES_PROPERTY);
+        if (includes != null) {
+            StringTokenizer st = new StringTokenizer(includes, "\" ", true);
+            if (st.countTokens() > 0) {
+                String location;
+                do {
+                    location = nextLocation(st);
+                    if (location != null) {
+                        URL url = new URL(configPropURL, location);
+                        Properties props = loadPropertiesFile(url, true);
+                        configProps.putAll(props);
+                    }
+                }
+                while (location != null);
+            }
+            configProps.remove(INCLUDES_PROPERTY);
+        }
+        String optionals = configProps.getProperty(OPTIONALS_PROPERTY);
+        if (optionals != null) {
+            StringTokenizer st = new StringTokenizer(optionals, "\" ", true);
+            if (st.countTokens() > 0) {
+                String location;
+                do {
+                    location = nextLocation(st);
+                    if (location != null) {
+                        URL url = new URL(configPropURL, location);
+                        Properties props = loadPropertiesFile(url, false);
+                        configProps.putAll(props);
+                    }
+                } while (location != null);
+            }
+            configProps.remove(OPTIONALS_PROPERTY);
+        }
+        for (Enumeration e = configProps.propertyNames(); e.hasMoreElements();) {
+            Object key = e.nextElement();
+            if (key instanceof String) {
+                String v = configProps.getProperty((String) key);
+                configProps.put(key, v.trim());
+            }
+        }
+        return configProps;
+    }
+
+    protected static void copySystemProperties(Properties configProps) {
+        for (Enumeration e = System.getProperties().propertyNames();
+             e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            if (key.startsWith("felix.") ||
+                    key.startsWith("karaf.") ||
+                    key.startsWith("org.osgi.framework.")) {
+                configProps.setProperty(key, System.getProperty(key));
+            }
+        }
+    }
+    
+    private ClassLoader createClassLoader(Properties configProps) throws Exception {
+    	String framework = configProps.getProperty(KARAF_FRAMEWORK);
+        if (framework == null) {
+            throw new IllegalArgumentException("Property " + KARAF_FRAMEWORK + " must be set in the etc/" + CONFIG_PROPERTIES_FILE_NAME + " configuration file");
+        }
+        String bundle = configProps.getProperty(KARAF_FRAMEWORK + "." + framework);
+        if (bundle == null) {
+            throw new IllegalArgumentException("Property " + KARAF_FRAMEWORK + "." + framework + " must be set in the etc/" + CONFIG_PROPERTIES_FILE_NAME + " configuration file");
+        }
+        File bundleFile = new File(karafBase, bundle);
+        if (!bundleFile.exists()) {
+            bundleFile = new File(karafHome, bundle);
+        }
+        if (!bundleFile.exists()) {
+            throw new FileNotFoundException(bundleFile.getAbsolutePath());
+        }
+
+        List<URL> urls = new ArrayList<URL>();
+        urls.add( bundleFile.toURI().toURL() );
+        File[] libs = new File(karafHome, "lib").listFiles();
+        if (libs != null) {
+            for (File f : libs) {
+                if (f.isFile() && f.canRead() && f.getName().endsWith(".jar")) {
+                    urls.add(f.toURI().toURL());
+                }
+            }
+        }
+
+        return new URLClassLoader(urls.toArray(new URL[urls.size()]), Main.class.getClassLoader());
+    }
+
+    /**
+     * Process properties to customize default felix behavior
+     *
+     * @param configProps properties loaded from etc/config.properties
+     * @param startupProps properties loaded from etc/startup.properties
+     * @param bundleDirs location to load bundles from (usually system/)
+     */
+    private static void processConfigurationProperties(Properties configProps, Properties startupProps, List<File> bundleDirs) throws Exception {
+        if (bundleDirs == null) {
+            return;
+        }
+        boolean hasErrors = false;
+        if ("all".equals(configProps.getProperty(PROPERTY_AUTO_START, "").trim())) {
+            configProps.remove(PROPERTY_AUTO_START);
+            ArrayList<File> jars = new ArrayList<File>();
+
+            // We should start all the bundles in the system dir.
+            for (File bundleDir : bundleDirs) {
+                findJars(bundleDir, jars);
+            }
+
+            StringBuffer sb = new StringBuffer();
+
+            for (File jar : jars) {
+                try {
+                    sb.append("\"").append(jar.toURI().toURL().toString()).append("\" ");
+                } catch (MalformedURLException e) {
+                    System.err.print("Ignoring " + jar.toString() + " (" + e + ")");
+                }
+            }
+
+            configProps.setProperty(PROPERTY_AUTO_START, sb.toString());
+
+        } else if (STARTUP_PROPERTIES_FILE_NAME.equals(configProps.getProperty(PROPERTY_AUTO_START, "").trim())) {
+            configProps.remove(PROPERTY_AUTO_START);
+            // We should start the bundles in the startup.properties file.
+            HashMap<Integer, StringBuffer> levels = new HashMap<Integer, StringBuffer>();
+            for (Object o : startupProps.keySet()) {
+                String name = (String) o;
+                File file = findFile(bundleDirs, name);
+
+                if (file != null) {
+                    Integer level;
+                    try {
+                        level = new Integer(startupProps.getProperty(name).trim());
+                    } catch (NumberFormatException e1) {
+                        System.err.print("Ignoring " + file.toString() + " (run level must be an integer)");
+                        continue;
+                    }
+                    StringBuffer sb = levels.get(level);
+                    if (sb == null) {
+                        sb = new StringBuffer(256);
+                        levels.put(level, sb);
+                    }
+                    try {
+                        sb.append("\"").append(file.toURI().toURL().toString()).append("|").append(name).append("\" ");
+                    } catch (MalformedURLException e) {
+                        System.err.print("Ignoring " + file.toString() + " (" + e + ")");
+                    }
+                } else {
+                    System.err.println("Bundle listed in " + STARTUP_PROPERTIES_FILE_NAME + " configuration not found: " + name);
+                    hasErrors = true;
+                }
+            }
+
+            for (Map.Entry<Integer, StringBuffer> entry : levels.entrySet()) {
+                configProps.setProperty(PROPERTY_AUTO_START + "." + entry.getKey(), entry.getValue().toString());
+            }
+        }
+        if (hasErrors) {
+            throw new Exception("Aborting due to missing startup bundles");
+        }
+    }
+
+    private static File findFile(List<File> bundleDirs, String name) {
+        for (File bundleDir : bundleDirs) {
+            File file = findFile(bundleDir, name);
+            if (file != null) {
+                return file;
+            }
+        }
+        return null;
+    }
+
+    private static File findFile(File dir, String name) {
+        File theFile = new File(dir, name);
+
+        if (theFile.exists() && !theFile.isDirectory()) {
+            return theFile;
+        }
+
+        for (File file : dir.listFiles()) {
+            if (file.isDirectory()) {
+                return findFile(file, name);
+            }
+        }
+
+        return null;
+    }
+
+    private static void findJars(File dir, ArrayList<File> jars) {
+        for (File file : dir.listFiles()) {
+            if (file.isDirectory()) {
+                findJars(file, jars);
+            } else {
+                if (file.toString().endsWith(".jar")) {
+                    jars.add(file);
+                }
+            }
+        }
+    }
+
+    private static final String DELIM_START = "${";
+    private static final String DELIM_STOP = "}";
+
+    /**
+     * <p>
+     * This method performs property variable substitution on the
+     * specified value. If the specified value contains the syntax
+     * <tt>${&lt;prop-name&gt;}</tt>, where <tt>&lt;prop-name&gt;</tt>
+     * refers to either a configuration property or a system property,
+     * then the corresponding property value is substituted for the variable
+     * placeholder. Multiple variable placeholders may exist in the
+     * specified value as well as nested variable placeholders, which
+     * are substituted from inner most to outer most. Configuration
+     * properties override system properties.
+     * </p>
+     *
+     * @param val         The string on which to perform property substitution.
+     * @param currentKey  The key of the property being evaluated used to
+     *                    detect cycles.
+     * @param cycleMap    Map of variable references used to detect nested cycles.
+     * @param configProps Set of configuration properties.
+     * @return The value of the specified string after system property substitution.
+     * @throws IllegalArgumentException If there was a syntax error in the
+     *                                  property placeholder syntax or a recursive variable reference.
+     */
+    public static String substVars(String val, String currentKey,
+                                    Map<String, String> cycleMap, Properties configProps)
+            throws IllegalArgumentException {
+        // If there is currently no cycle map, then create
+        // one for detecting cycles for this invocation.
+        if (cycleMap == null) {
+            cycleMap = new HashMap<String, String>();
+        }
+
+        // Put the current key in the cycle map.
+        cycleMap.put(currentKey, currentKey);
+
+        // Assume we have a value that is something like:
+        // "leading ${foo.${bar}} middle ${baz} trailing"
+
+        // Find the first ending '}' variable delimiter, which
+        // will correspond to the first deepest nested variable
+        // placeholder.
+        int stopDelim = val.indexOf(DELIM_STOP);
+
+        // Find the matching starting "${" variable delimiter
+        // by looping until we find a start delimiter that is
+        // greater than the stop delimiter we have found.
+        int startDelim = val.indexOf(DELIM_START);
+        while (stopDelim >= 0) {
+            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
+            if ((idx < 0) || (idx > stopDelim)) {
+                break;
+            } else if (idx < stopDelim) {
+                startDelim = idx;
+            }
+        }
+
+        // If we do not have a start or stop delimiter, then just
+        // return the existing value.
+        if ((startDelim < 0) && (stopDelim < 0)) {
+            return val;
+        }
+        // At this point, we found a stop delimiter without a start,
+        // so throw an exception.
+        else if (((startDelim < 0) || (startDelim > stopDelim))
+                && (stopDelim >= 0)) {
+            throw new IllegalArgumentException(
+                    "stop delimiter with no start delimiter: "
+                            + val);
+        }
+
+        // At this point, we have found a variable placeholder so
+        // we must perform a variable substitution on it.
+        // Using the start and stop delimiter indices, extract
+        // the first, deepest nested variable placeholder.
+        String variable =
+                val.substring(startDelim + DELIM_START.length(), stopDelim);
+
+        // Verify that this is not a recursive variable reference.
+        if (cycleMap.get(variable) != null) {
+            throw new IllegalArgumentException(
+                    "recursive variable reference: " + variable);
+        }
+
+        // Get the value of the deepest nested variable placeholder.
+        // Try to configuration properties first.
+        String substValue = (configProps != null)
+                ? configProps.getProperty(variable, null)
+                : null;
+        if (substValue == null) {
+            // Ignore unknown property values.
+            substValue = System.getProperty(variable, "");
+        }
+
+        // Remove the found variable from the cycle map, since
+        // it may appear more than once in the value and we don't
+        // want such situations to appear as a recursive reference.
+        cycleMap.remove(variable);
+
+        // Append the leading characters, the substituted value of
+        // the variable, and the trailing characters to get the new
+        // value.
+        val = val.substring(0, startDelim)
+                + substValue
+                + val.substring(stopDelim + DELIM_STOP.length(), val.length());
+
+        // Now perform substitution again, since there could still
+        // be substitutions to make.
+        val = substVars(val, currentKey, cycleMap, configProps);
+
+        // Return the value.
+        return val;
+    }
+
+    /**
+     * Retrieve the arguments used when launching Karaf
+     *
+     * @return the arguments of the main karaf process
+     */
+    public String[] getArgs() {
+        return args;
+    }
+
+    public int getExitCode() {
+        return exitCode;
+    }
+
+    public void setExitCode(int exitCode) {
+        this.exitCode = exitCode;
+    }
+
+    public Framework getFramework() {
+        return framework;
+    }
+    
+    public void lock(Properties props) {
+        try {
+            if (Boolean.parseBoolean(props.getProperty(PROPERTY_USE_LOCK, "true"))) {
+                doLock(props);
+            } else {
+                setStartLevel(defaultStartLevel);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void doLock(Properties props) throws Exception {
+        String clz = props.getProperty(PROPERTY_LOCK_CLASS, PROPERTY_LOCK_CLASS_DEFAULT);
+        lock = (Lock) Class.forName(clz).getConstructor(Properties.class).newInstance(props);
+        boolean lockLogged = false;
+        setStartLevel(lockStartLevel);
+        while (!exiting) {
+            if (lock.lock()) {
+                if (lockLogged) {
+                    LOG.info("Lock acquired.");
+                }
+                setupShutdown(props);
+                setStartLevel(defaultStartLevel);
+                for (;;) {
+                    if (!lock.isAlive()) {
+                        break;
+                    }
+                    Thread.sleep(lockDelay);
+                }
+                if (framework.getState() == Bundle.ACTIVE && !exiting) {
+                    LOG.info("Lost the lock, stopping this instance ...");
+                    setStartLevel(lockStartLevel);
+                }
+            } else if (!lockLogged) {
+                LOG.info("Waiting for the lock ...");
+                lockLogged = true;
+            }
+            Thread.sleep(lockDelay);
+        }
+    }
+
+    public void unlock() throws Exception {
+        if (lock != null) {
+            lock.release();
+        }
+    }
+
+    protected void setStartLevel(int level) throws Exception {
+        BundleContext ctx = framework.getBundleContext();
+        ServiceReference[] refs = ctx.getServiceReferences(StartLevel.class.getName(), null);
+        StartLevel sl = (StartLevel) ctx.getService(refs[0]);
+        sl.setStartLevel(level);
+    }
+
+
+    private Random random = null;
+    private ServerSocket shutdownSocket;
+
+    protected void setupShutdown(Properties props) {
+        writePid(props);
+        try {
+            int port = Integer.parseInt(props.getProperty(KARAF_SHUTDOWN_PORT, "0"));
+            String host = props.getProperty(KARAF_SHUTDOWN_HOST, "localhost");
+            String portFile = props.getProperty(KARAF_SHUTDOWN_PORT_FILE);
+            final String shutdown = props.getProperty(KARAF_SHUTDOWN_COMMAND, DEFAULT_SHUTDOWN_COMMAND);
+            if (port >= 0) {
+                shutdownSocket = new ServerSocket(port, 1, InetAddress.getByName(host));
+                if (port == 0) {
+                    port = shutdownSocket.getLocalPort();
+                }
+                if (portFile != null) {
+                    Writer w = new OutputStreamWriter(new FileOutputStream(portFile));
+                    w.write(Integer.toString(port));
+                    w.close();
+                }
+                Thread thread = new ShutdownSocketThread(shutdown);
+                thread.setDaemon(true);
+                thread.start();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void writePid(Properties props) {
+        try {
+            String pidFile = props.getProperty(KARAF_SHUTDOWN_PID_FILE);
+            if (pidFile != null) {
+                RuntimeMXBean rtb = ManagementFactory.getRuntimeMXBean();
+                String processName = rtb.getName();
+                Pattern pattern = Pattern.compile("^([0-9]+)@.+$", Pattern.CASE_INSENSITIVE);
+                Matcher matcher = pattern.matcher(processName);
+                if (matcher.matches()) {
+                    int pid = Integer.parseInt(matcher.group(1));
+                    Writer w = new OutputStreamWriter(new FileOutputStream(pidFile));
+                    w.write(Integer.toString(pid));
+                    w.close();
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private class ShutdownSocketThread extends Thread {
+
+        private final String shutdown;
+
+        public ShutdownSocketThread(String shutdown) {
+            this.shutdown = shutdown;
+        }
+
+        public void run() {
+            try {
+                while (true) {
+                    // Wait for the next connection
+                    Socket socket = null;
+                    InputStream stream = null;
+                    try {
+                        socket = shutdownSocket.accept();
+                        socket.setSoTimeout(10 * 1000);  // Ten seconds
+                        stream = socket.getInputStream();
+                    } catch (AccessControlException ace) {
+                        LOG.log(Level.WARNING, "Karaf shutdown socket: security exception: "
+                                           + ace.getMessage(), ace);
+                        continue;
+                    } catch (IOException e) {
+                        LOG.log(Level.SEVERE, "Karaf shutdown socket: accept: ", e);
+                        System.exit(1);
+                    }
+
+                    // Read a set of characters from the socket
+                    StringBuilder command = new StringBuilder();
+                    int expected = 1024; // Cut off to avoid DoS attack
+                    while (expected < shutdown.length()) {
+                        if (random == null) {
+                            random = new Random();
+                        }
+                        expected += (random.nextInt() % 1024);
+                    }
+                    while (expected > 0) {
+                        int ch;
+                        try {
+                            ch = stream.read();
+                        } catch (IOException e) {
+                            LOG.log(Level.WARNING, "Karaf shutdown socket:  read: ", e);
+                            ch = -1;
+                        }
+                        if (ch < 32) {  // Control character or EOF terminates loop
+                            break;
+                        }
+                        command.append((char) ch);
+                        expected--;
+                    }
+
+                    // Close the socket now that we are done with it
+                    try {
+                        socket.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+
+                    // Match against our command string
+                    boolean match = command.toString().equals(shutdown);
+                    if (match) {
+                        LOG.log(Level.INFO, "Karaf shutdown socket: received shutdown command. Stopping framework...");
+                        framework.stop();
+                        break;
+                    } else {
+                        LOG.log(Level.WARNING, "Karaf shutdown socket:  Invalid command '" +
+                                           command.toString() + "' received");
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                try {
+                    shutdownSocket.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java
new file mode 100644
index 0000000..e871454
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.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.karaf.main;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+/**
+ * Represents an exclusive lock on a database,
+ * used to avoid multiple Karaf instances attempting
+ * to become master.
+ * 
+ * @version $Revision: $
+ */
+public class MySQLJDBCLock extends DefaultJDBCLock {
+
+    public MySQLJDBCLock(Properties props) {
+        super(props);
+    }
+
+    Statements createStatements() {
+        Statements statements = new Statements();
+        statements.setTableName(table);
+        statements.setNodeName(clusterName);
+        String[] lockCreateSchemaStatements = statements.getLockCreateSchemaStatements(getCurrentTimeMillis());
+        for (int index = 0; index < lockCreateSchemaStatements.length; index++) {
+            if (lockCreateSchemaStatements[index].toUpperCase().startsWith("CREATE TABLE")) {
+                lockCreateSchemaStatements[index] = lockCreateSchemaStatements[index] + " ENGINE=INNODB";
+            }
+        }
+        return statements;
+    }
+    
+    @Override
+    Connection createConnection(String driver, String url, String username, String password) throws Exception {
+        url = (url.toLowerCase().contains("createDatabaseIfNotExist=true")) ? 
+            url : 
+            ((url.contains("?")) ? 
+                url + "&createDatabaseIfNotExist=true" : 
+                url + "?createDatabaseIfNotExist=true");
+        
+        return super.createConnection(driver, url, username, password);
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java
new file mode 100644
index 0000000..aba9d44
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java
@@ -0,0 +1,105 @@
+/*
+ * 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.karaf.main;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Properties;
+
+/**
+ * Represents an exclusive lock on a database,
+ * used to avoid multiple Karaf instances attempting
+ * to become master.
+ * 
+ * @version $Revision: $
+ */
+public class OracleJDBCLock extends DefaultJDBCLock {
+    
+    private static final String MOMENT_COLUMN_DATA_TYPE = "NUMBER(20)";
+
+    public OracleJDBCLock(Properties props) {
+        super(props);
+    }
+
+    @Override
+    Statements createStatements() {
+        Statements statements = new Statements();
+        statements.setTableName(table);
+        statements.setNodeName(clusterName);
+        statements.setMomentColumnDataType(MOMENT_COLUMN_DATA_TYPE);
+        return statements;
+    }
+    
+    /**
+     * When we perform an update on a long lived locked table, Oracle will save
+     * a copy of the transaction in it's UNDO table space. Eventually this can
+     * cause the UNDO table to become full, disrupting all locks in the DB instance.
+     * A select query just touches the table, ensuring we can still read the DB but
+     * doesn't add to the UNDO. 
+     */
+    @Override
+    public boolean lock() {
+        return aquireLock();
+    }
+    
+    /**
+     * When we perform an update on a long lived locked table, Oracle will save
+     * a copy of the transaction in it's UNDO table space. Eventually this can
+     * cause the UNDO table to become full, disrupting all locks in the DB instance.
+     * A select query just touches the table, ensuring we can still read the DB but
+     * doesn't add to the UNDO. 
+     */
+    @Override
+    boolean updateLock() {
+        return aquireLock();
+    }
+    
+    /**
+     * A SELECT FOR UPDATE does not create a database lock when the SELECT FOR UPDATE is performed
+     * on an empty selection. So a succesfull call to {@link DefaultJDBCLock#aquireLock()} is not sufficient to 
+     * ensure that we are the only one who have acquired the lock.
+     */
+    @Override
+    boolean aquireLock() {
+    	return super.aquireLock() && lockAcquiredOnNonEmptySelection();
+    }
+    
+    //Verify that we have a non empty record set.
+    private boolean lockAcquiredOnNonEmptySelection() {
+        String verifySelectionNotEmpytStatement = statements.getLockVerifySelectionNotEmptyStatement();
+        PreparedStatement preparedStatement = null;
+        boolean lockAquired = false;
+        
+        try {
+            preparedStatement = getConnection().prepareStatement(verifySelectionNotEmpytStatement);
+            preparedStatement.setQueryTimeout(timeout);
+            ResultSet rs = preparedStatement.executeQuery();
+            if (rs.next()) {
+            	lockAquired = rs.getInt(1) > 0;
+            } else {
+            	LOG.warning("Failed to acquire database lock. Missing database lock record.");
+            }
+        } catch (Exception e) {
+            LOG.warning("Failed to acquire database lock: " + e);
+        }finally {
+            closeSafely(preparedStatement);
+        }        
+        return lockAquired;
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/ShutdownCallback.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/ShutdownCallback.java
new file mode 100644
index 0000000..bd0bf30
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/ShutdownCallback.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.karaf.main;
+
+
+/**
+ * <p>
+ * This interface is a callback interface for the stoping process. 
+ * It's main purpose is to give the ServiceWrapper a way of waiting 
+ * for the Framework to gracefully stop the Server. 
+ * <p>
+ */
+public interface ShutdownCallback {
+
+	/**
+	 * The callback method invoked to inform anyone listening that the 
+	 * Main class is still waiting for the completion of the shutdown. 
+	 */
+	void waitingForShutdown(int delay);
+
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java
new file mode 100644
index 0000000..f2fe098
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileLock;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+public class SimpleFileLock implements Lock {
+
+    private static final Logger LOG = Logger.getLogger(SimpleFileLock.class.getName());
+    private static final String PROPERTY_LOCK_DIR = "karaf.lock.dir";
+    private static final String PROP_KARAF_BASE = "karaf.base";
+    private RandomAccessFile lockFile;
+    private FileLock lock;
+
+    public SimpleFileLock(Properties props) {
+        try {
+
+            LOG.addHandler( BootstrapLogManager.getDefaultHandler() );
+            String lock = props.getProperty(PROPERTY_LOCK_DIR);
+
+            if (lock != null) {
+                File karafLock = getKarafLock(new File(lock), props);
+                props.setProperty(PROPERTY_LOCK_DIR, karafLock.getPath());
+            } else {
+                props.setProperty(PROPERTY_LOCK_DIR, System.getProperty(PROP_KARAF_BASE));
+            }
+
+            File base = new File(props.getProperty(PROPERTY_LOCK_DIR));
+            lockFile = new RandomAccessFile(new File(base, "lock"), "rw");
+        } catch (IOException e) {
+            throw new RuntimeException("Could not create file lock", e);
+        }
+    }
+
+    public boolean lock() throws Exception {
+        LOG.info("locking");
+        if (lock == null) {
+            lock = lockFile.getChannel().tryLock();
+        }
+        return lock != null;
+    }
+
+    public void release() throws Exception {
+        LOG.info("releasing");
+        if (lock != null && lock.isValid()) {
+            lock.release();
+            lock.channel().close();
+        }
+        lock = null;
+    }
+ 
+    public boolean isAlive() throws Exception {
+        return lock != null;
+    }
+
+    private static File getKarafLock(File lock,Properties props) {
+        File rc = null;
+
+        String path = lock.getPath();
+        if (path != null) {
+            rc = validateDirectoryExists(path, "Invalid " + PROPERTY_LOCK_DIR + " system property");
+        }
+
+        if (rc == null) {
+            path = props.getProperty(PROP_KARAF_BASE);
+            if (path != null) {
+                rc = validateDirectoryExists(path, "Invalid " + PROP_KARAF_BASE + " property");
+            }
+        }
+
+        if (rc == null) {
+            rc = lock;
+        }
+        return rc;
+    }
+
+    private static File validateDirectoryExists(String path, String errPrefix) {
+        File rc;
+        try {
+            rc = new File(path).getCanonicalFile();
+        } catch (IOException e) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : " + e.getMessage());
+        }
+        if (!rc.exists()) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : does not exist");
+        }
+        if (!rc.isDirectory()) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : is not a directory");
+        }
+        return rc;
+    }
+
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Statements.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Statements.java
new file mode 100644
index 0000000..04623e4
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Statements.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.karaf.main;
+
+
+public class Statements {
+    
+    protected String tablePrefix = "";
+    protected String tableName = "KARAF_LOCK";
+    protected String nodeName = "karaf";
+    protected String momentColumnDataType = "BIGINT";
+    protected String nodeColumnDataType = "VARCHAR(20)";
+    
+    private String[] lockCreateSchemaStatements;
+    private String lockCreateStatement;
+    private String lockUpdateStatement;
+    private String lockVerifySelectionNotEmptyStatement;
+    
+    public String[] getLockCreateSchemaStatements(long moment) {
+        if (lockCreateSchemaStatements == null) {
+            lockCreateSchemaStatements = new String[] {
+                "CREATE TABLE " + getFullLockTableName() + " (MOMENT " + getMomentColumnDataType() + ", NODE " + getNodeColumnDataType() + ")",
+                "INSERT INTO " + getFullLockTableName() + " (MOMENT, NODE) VALUES (" + moment + ", '" + getNodeName() + "')", 
+            };
+        }
+        return lockCreateSchemaStatements;
+    }
+    
+    public void setLockCreateSchemaStatements(String[] lockCreateSchemaStatements) {
+        this.lockCreateSchemaStatements = lockCreateSchemaStatements;
+    }
+    
+    public String getLockCreateStatement() {
+        if (lockCreateStatement == null) {
+            lockCreateStatement = "SELECT * FROM " + getFullLockTableName() + " FOR UPDATE";
+        }
+        return lockCreateStatement;
+    }
+    
+    public void setLockCreateStatement(String lockCreateStatement) {
+        this.lockCreateStatement = lockCreateStatement;
+    }
+    
+    public String getLockUpdateStatement(long moment) {
+        if (lockUpdateStatement == null) {
+            lockUpdateStatement = "UPDATE " + getFullLockTableName() + " SET MOMENT = " + moment;
+        }
+        return lockUpdateStatement;
+    }
+    
+    public void setLockUpdateStatement(String lockUpdateStatement) {
+        this.lockUpdateStatement = lockUpdateStatement;
+    }
+
+	public void setLockVerifySelectionNotEmptyStatement(String lockVerifySelectionNotEmptyStatement) {
+		this.lockVerifySelectionNotEmptyStatement = lockVerifySelectionNotEmptyStatement;
+	}
+
+	public String getLockVerifySelectionNotEmptyStatement() {
+		if (lockVerifySelectionNotEmptyStatement == null) {
+			 //The lock create and lock update are perfomed on the whole table instead of 
+			 //the cluster. So not taking the node into account for now.
+			lockVerifySelectionNotEmptyStatement = "SELECT COUNT(*) FROM " + getFullLockTableName();
+		}
+		return lockVerifySelectionNotEmptyStatement;
+	}
+    
+    
+    long getCurrentTimeMillis() {
+        return System.currentTimeMillis();
+    }
+
+    public String getFullLockTableName() {
+        return getTablePrefix() + getTableName();
+    }
+    
+    public void setMomentColumnDataType(String momentColumnDataType) {
+        this.momentColumnDataType = momentColumnDataType;
+    }
+    
+    public String getMomentColumnDataType() {
+        return momentColumnDataType;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public String getNodeColumnDataType() {
+        return nodeColumnDataType;
+    }
+
+    public void setNodeColumnDataType(String nodeColumnDataType) {
+        this.nodeColumnDataType = nodeColumnDataType;
+    }
+
+    public String getTablePrefix() {
+        return tablePrefix;
+    }
+
+    public void setTablePrefix(String tablePrefix) {
+        this.tablePrefix = tablePrefix;
+    }
+    
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Stop.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Stop.java
new file mode 100644
index 0000000..2370b20
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Stop.java
@@ -0,0 +1,78 @@
+/*
+ * 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.karaf.main;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.net.Socket;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+
+/**
+ * Main class used to stop the root Karaf instance
+ */
+public class Stop {
+
+    public static void main(String[] args) throws Exception {
+        File karafHome = Utils.getKarafHome();
+        File karafBase = Utils.getKarafDirectory(Main.PROP_KARAF_BASE, Main.ENV_KARAF_BASE, karafHome, false, true);
+        File karafData = Utils.getKarafDirectory(Main.PROP_KARAF_DATA, Main.ENV_KARAF_DATA, new File(karafBase.getPath(), "data"), true, true);
+
+        System.setProperty(Main.PROP_KARAF_HOME, karafHome.getPath());
+        System.setProperty(Main.PROP_KARAF_BASE, karafBase.getPath());
+        System.setProperty(Main.PROP_KARAF_DATA, karafData.getPath());
+
+        // Load system properties.
+        Main.loadSystemProperties(karafBase);
+
+        File file = new File(new File(karafBase, "etc"), Main.CONFIG_PROPERTIES_FILE_NAME);
+        URL configPropURL = file.toURI().toURL();
+        Properties props = Main.loadPropertiesFile(configPropURL, false);
+        Main.copySystemProperties(props);
+
+        // Perform variable substitution for system properties.
+        for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            props.setProperty(name,
+                    Main.substVars(props.getProperty(name), name, null, props));
+        }
+
+        int port = Integer.parseInt(props.getProperty(Main.KARAF_SHUTDOWN_PORT, "0"));
+        String host = props.getProperty(Main.KARAF_SHUTDOWN_HOST, "localhost");
+        String portFile = props.getProperty(Main.KARAF_SHUTDOWN_PORT_FILE);
+        String shutdown = props.getProperty(Main.KARAF_SHUTDOWN_COMMAND, Main.DEFAULT_SHUTDOWN_COMMAND);
+        if (port == 0 && portFile != null) {
+            BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(portFile)));
+            String portStr = r.readLine();
+            port = Integer.parseInt(portStr);
+            r.close();
+        }
+        if (port > 0) {
+            Socket s = new Socket(host, port);
+            s.getOutputStream().write(shutdown.getBytes());
+            s.close();
+        } else {
+            System.err.println("Unable to find port...");
+        }
+
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/StringMap.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/StringMap.java
new file mode 100644
index 0000000..c14f8ea
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/StringMap.java
@@ -0,0 +1,97 @@
+/*
+ * 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.karaf.main;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Simple utility class that creates a map for string-based keys by
+ * extending <tt>TreeMap</tt>. This map can be set to use case-sensitive
+ * or case-insensitive comparison when searching for the key.
+ * Any keys put into this map will be converted to
+ * a <tt>String</tt> using the <tt>toString()</tt> method,
+ * since it is only intended to compare strings.
+**/
+public class StringMap extends TreeMap
+{
+    public StringMap()
+    {
+        this(true);
+    }
+
+    public StringMap(boolean caseSensitive)
+    {
+        super(new StringComparator(caseSensitive));
+    }
+
+    public StringMap(Map map, boolean caseSensitive)
+    {
+        this(caseSensitive);
+        putAll(map);
+    }
+
+    public Object put(Object key, Object value)
+    {
+        return super.put(key.toString(), value);
+    }
+
+    public boolean isCaseSensitive()
+    {
+        return ((StringComparator) comparator()).isCaseSensitive();
+    }
+
+    public void setCaseSensitive(boolean b)
+    {
+        ((StringComparator) comparator()).setCaseSensitive(b);
+    }
+
+    private static class StringComparator implements Comparator
+    {
+        private boolean m_isCaseSensitive = true;
+
+        public StringComparator(boolean b)
+        {
+            m_isCaseSensitive = b;
+        }
+
+        public int compare(Object o1, Object o2)
+        {
+            if (m_isCaseSensitive)
+            {
+                return o1.toString().compareTo(o2.toString());
+            }
+            else
+            {
+                return o1.toString().compareToIgnoreCase(o2.toString());
+            }
+        }
+
+        public boolean isCaseSensitive()
+        {
+            return m_isCaseSensitive;
+        }
+
+        public void setCaseSensitive(boolean b)
+        {
+            m_isCaseSensitive = b;
+        }
+    }
+}
diff --git a/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Utils.java b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Utils.java
new file mode 100644
index 0000000..f3354a9
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/java/org/apache/karaf/main/Utils.java
@@ -0,0 +1,210 @@
+/*
+ * 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.karaf.main;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.net.JarURLConnection;
+import java.net.URI;
+
+import org.apache.karaf.main.Main;
+
+public class Utils {
+
+    public static File getKarafHome() throws IOException {
+        File rc = null;
+
+        // Use the system property if specified.
+        String path = System.getProperty(Main.PROP_KARAF_HOME);
+        if (path != null) {
+            rc = validateDirectoryExists(path, "Invalid " + Main.PROP_KARAF_HOME + " system property", false, true);
+        }
+
+        if (rc == null) {
+            path = System.getenv(Main.ENV_KARAF_HOME);
+            if (path != null) {
+                rc = validateDirectoryExists(path, "Invalid " + Main.ENV_KARAF_HOME + " environment variable", false, true);
+            }
+        }
+
+        // Try to figure it out using the jar file this class was loaded from.
+        if (rc == null) {
+            // guess the home from the location of the jar
+            URL url = Main.class.getClassLoader().getResource(Main.class.getName().replace(".", "/") + ".class");
+            if (url != null) {
+                try {
+                    JarURLConnection jarConnection = (JarURLConnection) url.openConnection();
+                    url = jarConnection.getJarFileURL();
+                    rc = new File(new URI(url.toString())).getCanonicalFile().getParentFile().getParentFile();
+                } catch (Exception ignored) {
+                }
+            }
+        }
+
+        if (rc == null) {
+            // Dig into the classpath to guess the location of the jar
+            String classpath = System.getProperty("java.class.path");
+            int index = classpath.toLowerCase().indexOf("karaf.jar");
+            int start = classpath.lastIndexOf(File.pathSeparator, index) + 1;
+            if (index >= start) {
+                String jarLocation = classpath.substring(start, index);
+                rc = new File(jarLocation).getCanonicalFile().getParentFile();
+            }
+        }
+        if (rc == null) {
+            throw new IOException("The Karaf install directory could not be determined.  Please set the " + Main.PROP_KARAF_HOME + " system property or the " + Main.ENV_KARAF_HOME + " environment variable.");
+        }
+
+        return rc;
+    }
+
+    public static File validateDirectoryExists(String path, String errPrefix, boolean createDirectory, boolean validate) {
+        File rc;
+        try {
+            rc = new File(path).getCanonicalFile();
+        } catch (IOException e) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : " + e.getMessage());
+        }
+        if (!rc.exists() && !createDirectory && validate) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : does not exist");
+        }
+        if (!rc.exists() && createDirectory) {
+            try {
+                rc.mkdirs();
+            } catch (SecurityException se) {
+                throw new IllegalArgumentException(errPrefix + " '" + path + "' : " + se.getMessage());
+            }
+        }
+        if (rc.exists() && !rc.isDirectory()) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : is not a directory");
+        }
+        return rc;
+    }
+    
+    public static File getKarafDirectory(String directoryProperty, String directoryEnvironmentVariable, File defaultValue, boolean create, boolean validate) {
+        File rc = null;
+        
+        String path = System.getProperty(directoryProperty);
+        if (path != null) {
+            rc = validateDirectoryExists(path, "Invalid " + directoryProperty + " system property", create, validate);
+        }
+        
+        if (rc == null) {
+            path = System.getenv(directoryEnvironmentVariable);
+            if (path != null && validate) {
+                rc = validateDirectoryExists(path, "Invalid " + directoryEnvironmentVariable  + " environment variable", create, validate);
+            }
+        }
+        
+        if (rc == null) {
+            rc = defaultValue;
+        }
+        
+        return rc;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Recursively delete a directory.
+     * @param directory directory to delete
+     * @throws IOException in case deletion is unsuccessful
+     */
+    public static void deleteDirectory(File directory)
+        throws IOException {
+        if (!directory.exists()) {
+            return;
+        }
+
+        cleanDirectory(directory);
+        if (!directory.delete()) {
+            String message =
+                "Unable to delete directory " + directory + ".";
+            throw new IOException(message);
+        }
+    }
+
+    /**
+     * Clean a directory without deleting it.
+     * @param directory directory to clean
+     * @throws IOException in case cleaning is unsuccessful
+     */
+    public static void cleanDirectory(File directory) throws IOException {
+        if (!directory.exists()) {
+            String message = directory + " does not exist";
+            throw new IllegalArgumentException(message);
+        }
+
+        if (!directory.isDirectory()) {
+            String message = directory + " is not a directory";
+            throw new IllegalArgumentException(message);
+        }
+
+        File[] files = directory.listFiles();
+        if (files == null) {  // null if security restricted
+            throw new IOException("Failed to list contents of " + directory);
+        }
+
+        IOException exception = null;
+        for (int i = 0; i < files.length; i++) {
+            File file = files[i];
+            try {
+                forceDelete(file);
+            } catch (IOException ioe) {
+                exception = ioe;
+            }
+        }
+
+        if (null != exception) {
+            throw exception;
+        }
+    }
+
+    /**
+     * <p>
+     * Delete a file. If file is a directory, delete it and all sub-directories.
+     * </p>
+     * <p>
+     * The difference between File.delete() and this method are:
+     * </p>
+     * <ul>
+     * <li>A directory to be deleted does not have to be empty.</li>
+     * <li>You get exceptions when a file or directory cannot be deleted.
+     *      (java.io.File methods returns a boolean)</li>
+     * </ul>
+     * @param file file or directory to delete.
+     * @throws IOException in case deletion is unsuccessful
+     */
+    public static void forceDelete(File file) throws IOException {
+        if (file.isDirectory()) {
+            deleteDirectory(file);
+        } else {
+            if (!file.exists()) {
+                throw new FileNotFoundException("File does not exist: " + file);
+            }
+            if (!file.delete()) {
+                String message =
+                    "Unable to delete file: " + file;
+                throw new IOException(message);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/main/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/main/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..9a02230
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle is responsible for the main Karaf startup.
+
+    In particular, it manages the bootstrap of low level Karaf services such as the embedded Derby database, locking
+    facilities, etc.
+
+\u001B[1mSEE ALSO\u001B[0m
diff --git a/karaf-2.2.x/main/src/main/resources/config.properties b/karaf-2.2.x/main/src/main/resources/config.properties
new file mode 100644
index 0000000..6fe20f9
--- /dev/null
+++ b/karaf-2.2.x/main/src/main/resources/config.properties
@@ -0,0 +1,529 @@
+# 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.
+
+#
+# Framework config properties.
+#
+org.osgi.framework.system.packages=org.osgi.framework; version=1.4.0, \
+ org.osgi.service.packageadmin; version=1.2.0, \
+ org.osgi.service.startlevel; version=1.1.0, \
+ org.osgi.service.url; version=1.0.0, \
+ org.osgi.util.tracker; version=1.3.2 \
+ ${jre-${java.specification.version}}
+
+#org.osgi.framework.bootdelegation=sun.*,com.sun.*
+#felix.cache.profile=foo
+felix.auto.start.1= \
+ file:bundle/org.apache.felix.shell-1.0.0.jar \
+ file:bundle/org.apache.felix.shell.tui-1.0.0.jar \
+ file:bundle/org.apache.felix.bundlerepository-1.0.0.jar 
+felix.log.level=4
+felix.startlevel.framework=1
+felix.startlevel.bundle=1
+#framework.service.urlhandlers=false
+
+#
+# Bundle config properties.
+#
+org.osgi.service.http.port=8080
+osgi.shell.telnet=on
+#obr.repository.url=http://bundles.osgi.org/obr/browse?_xml=1&cmd=repository
+
+karaf.default.repository=system
+#list of directories containing bundles to be loaded by SMX
+#bundle.locations=
+
+#
+# Java platform package export properties.
+#
+jre-1.3=, \
+ javax.accessibility; \
+ javax.accessibility.resources; \
+ javax.naming; \
+ javax.naming.directory; \
+ javax.naming.event; \
+ javax.naming.ldap; \
+ javax.naming.spi; \
+ javax.rmi; \
+ javax.rmi.CORBA; \
+ javax.sound.midi; \
+ javax.sound.midi.spi; \
+ javax.sound.sampled; \
+ javax.sound.sampled.spi; \
+ javax.swing; \
+ javax.swing.border; \
+ javax.swing.colorchooser; \
+ javax.swing.event; \
+ javax.swing.filechooser; \
+ javax.swing.plaf; \
+ javax.swing.plaf.basic; \
+ javax.swing.plaf.basic.resources; \
+ javax.swing.plaf.metal; \
+ javax.swing.plaf.metal.resources; \
+ javax.swing.plaf.multi; \
+ javax.swing.table; \
+ javax.swing.text; \
+ javax.swing.text.html; \
+ javax.swing.text.html.parser; \
+ javax.swing.text.rtf; \
+ javax.swing.tree; \
+ javax.swing.undo; \
+ javax.transaction; \
+ org.omg.CORBA; \
+ org.omg.CORBA_2_3; \
+ org.omg.CORBA_2_3.portable; \
+ org.omg.CORBA.DynAnyPackage; \
+ org.omg.CORBA.ORBPackage; \
+ org.omg.CORBA.portable; \
+ org.omg.CORBA.TypeCodePackage; \
+ org.omg.CosNaming; \
+ org.omg.CosNaming.NamingContextPackage; \
+ org.omg.SendingContext; \
+ org.omg.stub.java.rmi; \
+ version="1.3.0"
+
+jre-1.4=, \
+ javax.accessibility; \
+ javax.imageio; \
+ javax.imageio.event; \
+ javax.imageio.metadata; \
+ javax.imageio.plugins.jpeg; \
+ javax.imageio.spi; \
+ javax.imageio.stream; \
+ javax.naming; \
+ javax.naming.directory; \
+ javax.naming.event; \
+ javax.naming.ldap; \
+ javax.naming.spi; \
+ javax.net; \
+ javax.net.ssl; \
+ javax.print; \
+ javax.print.attribute; \
+ javax.print.attribute.standard; \
+ javax.print.event; \
+ javax.rmi; \
+ javax.rmi.CORBA; \
+ javax.security.auth; \
+ javax.security.auth.callback; \
+ javax.security.auth.kerberos; \
+ javax.security.auth.login; \
+ javax.security.auth.spi; \
+ javax.security.auth.x500; \
+ javax.sound.midi; \
+ javax.sound.midi.spi; \
+ javax.sound.sampled; \
+ javax.sound.sampled.spi; \
+ javax.sql; \
+ javax.swing; \
+ javax.swing.border; \
+ javax.swing.colorchooser; \
+ javax.swing.event; \
+ javax.swing.filechooser; \
+ javax.swing.plaf; \
+ javax.swing.plaf.basic; \
+ javax.swing.plaf.metal; \
+ javax.swing.plaf.multi; \
+ javax.swing.table; \
+ javax.swing.text; \
+ javax.swing.text.html; \
+ javax.swing.text.html.parser; \
+ javax.swing.text.rtf; \
+ javax.swing.tree; \
+ javax.swing.undo; \
+ javax.transaction; \
+ javax.transaction.xa; \
+ javax.xml.parsers; \
+ javax.xml.transform; \
+ javax.xml.transform.dom; \
+ javax.xml.transform.sax; \
+ javax.xml.transform.stream; \
+ org.ietf.jgss; \
+ org.omg.CORBA; \
+ org.omg.CORBA_2_3; \
+ org.omg.CORBA_2_3.portable; \
+ org.omg.CORBA.DynAnyPackage; \
+ org.omg.CORBA.ORBPackage; \
+ org.omg.CORBA.portable; \
+ org.omg.CORBA.TypeCodePackage; \
+ org.omg.CosNaming; \
+ org.omg.CosNaming.NamingContextExtPackage; \
+ org.omg.CosNaming.NamingContextPackage; \
+ org.omg.Dynamic; \
+ org.omg.DynamicAny; \
+ org.omg.DynamicAny.DynAnyFactoryPackage; \
+ org.omg.DynamicAny.DynAnyPackage; \
+ org.omg.IOP; \
+ org.omg.IOP.CodecFactoryPackage; \
+ org.omg.IOP.CodecPackage; \
+ org.omg.Messaging; \
+ org.omg.PortableInterceptor; \
+ org.omg.PortableInterceptor.ORBInitInfoPackage; \
+ org.omg.PortableServer; \
+ org.omg.PortableServer.CurrentPackage; \
+ org.omg.PortableServer.POAManagerPackage; \
+ org.omg.PortableServer.POAPackage; \
+ org.omg.PortableServer.portable; \
+ org.omg.PortableServer.ServantLocatorPackage; \
+ org.omg.SendingContext; \
+ org.omg.stub.java.rmi; \
+ org.w3c.dom; \
+ org.w3c.dom.css; \
+ org.w3c.dom.events; \
+ org.w3c.dom.html; \
+ org.w3c.dom.stylesheets; \
+ org.w3c.dom.traversal; \
+ org.w3c.dom.views; \
+ org.xml.sax; \
+ org.xml.sax.ext; \
+ org.xml.sax.helpers; \
+ version="1.4.0"
+
+jre-1.5=, \
+ javax.accessibility; \
+ javax.activity; \
+ javax.imageio; \
+ javax.imageio.event; \
+ javax.imageio.metadata; \
+ javax.imageio.plugins.bmp; \
+ javax.imageio.plugins.jpeg; \
+ javax.imageio.spi; \
+ javax.imageio.stream; \
+ javax.management; \
+ javax.management.loading; \
+ javax.management.modelmbean; \
+ javax.management.monitor; \
+ javax.management.openmbean; \
+ javax.management.relation; \
+ javax.management.remote; \
+ javax.management.remote.rmi; \
+ javax.management.timer; \
+ javax.naming; \
+ javax.naming.directory; \
+ javax.naming.event; \
+ javax.naming.ldap; \
+ javax.naming.spi; \
+ javax.net; \
+ javax.net.ssl; \
+ javax.print; \
+ javax.print.attribute; \
+ javax.print.attribute.standard; \
+ javax.print.event; \
+ javax.rmi; \
+ javax.rmi.CORBA; \
+ javax.rmi.ssl; \
+ javax.security.auth; \
+ javax.security.auth.callback; \
+ javax.security.auth.kerberos; \
+ javax.security.auth.login; \
+ javax.security.auth.spi; \
+ javax.security.auth.x500; \
+ javax.security.sasl; \
+ javax.sound.midi; \
+ javax.sound.midi.spi; \
+ javax.sound.sampled; \
+ javax.sound.sampled.spi; \
+ javax.sql; \
+ javax.sql.rowset; \
+ javax.sql.rowset.serial; \
+ javax.sql.rowset.spi; \
+ javax.swing; \
+ javax.swing.border; \
+ javax.swing.colorchooser; \
+ javax.swing.event; \
+ javax.swing.filechooser; \
+ javax.swing.plaf; \
+ javax.swing.plaf.basic; \
+ javax.swing.plaf.metal; \
+ javax.swing.plaf.multi; \
+ javax.swing.plaf.synth; \
+ javax.swing.table; \
+ javax.swing.text; \
+ javax.swing.text.html; \
+ javax.swing.text.html.parser; \
+ javax.swing.text.rtf; \
+ javax.swing.tree; \
+ javax.swing.undo; \
+ javax.transaction; \
+ javax.transaction.xa; \
+ javax.xml; \
+ javax.xml.datatype; \
+ javax.xml.namespace; \
+ javax.xml.parsers; \
+ javax.xml.transform; \
+ javax.xml.transform.dom; \
+ javax.xml.transform.sax; \
+ javax.xml.transform.stream; \
+ javax.xml.validation; \
+ javax.xml.xpath; \
+ org.ietf.jgss; \
+ org.omg.CORBA; \
+ org.omg.CORBA_2_3; \
+ org.omg.CORBA_2_3.portable; \
+ org.omg.CORBA.DynAnyPackage; \
+ org.omg.CORBA.ORBPackage; \
+ org.omg.CORBA.portable; \
+ org.omg.CORBA.TypeCodePackage; \
+ org.omg.CosNaming; \
+ org.omg.CosNaming.NamingContextExtPackage; \
+ org.omg.CosNaming.NamingContextPackage; \
+ org.omg.Dynamic; \
+ org.omg.DynamicAny; \
+ org.omg.DynamicAny.DynAnyFactoryPackage; \
+ org.omg.DynamicAny.DynAnyPackage; \
+ org.omg.IOP; \
+ org.omg.IOP.CodecFactoryPackage; \
+ org.omg.IOP.CodecPackage; \
+ org.omg.Messaging; \
+ org.omg.PortableInterceptor; \
+ org.omg.PortableInterceptor.ORBInitInfoPackage; \
+ org.omg.PortableServer; \
+ org.omg.PortableServer.CurrentPackage; \
+ org.omg.PortableServer.POAManagerPackage; \
+ org.omg.PortableServer.POAPackage; \
+ org.omg.PortableServer.portable; \
+ org.omg.PortableServer.ServantLocatorPackage; \
+ org.omg.SendingContext; \
+ org.omg.stub.java.rmi; \
+ org.omg.stub.javax.management.remote.rmi; \
+ org.w3c.dom; \
+ org.w3c.dom.bootstrap; \
+ org.w3c.dom.css; \
+ org.w3c.dom.events; \
+ org.w3c.dom.html; \
+ org.w3c.dom.ls; \
+ org.w3c.dom.ranges; \
+ org.w3c.dom.stylesheets; \
+ org.w3c.dom.traversal; \
+ org.w3c.dom.views; \
+ org.xml.sax; \
+ org.xml.sax.ext; \
+ org.xml.sax.helpers; \
+ version="1.5.0"
+
+jre-1.6=, \
+ java.applet; \
+ java.awt; \
+ java.awt.color; \
+ java.awt.datatransfer; \
+ java.awt.dnd; \
+ java.awt.dnd.peer; \
+ java.awt.event; \
+ java.awt.font; \
+ java.awt.geom; \
+ java.awt.im; \
+ java.awt.image; \
+ java.awt.image.renderable; \
+ java.awt.im.spi; \
+ java.awt.peer; \
+ java.awt.print; \
+ java.beans; \
+ java.beans.beancontext; \
+ java.io; \
+ java.lang; \
+ java.lang.annotation; \
+ java.lang.instrument; \
+ java.lang.management; \
+ java.lang.ref; \
+ java.lang.reflect; \
+ java.math; \
+ java.net; \
+ java.nio; \
+ java.nio.channels; \
+ java.nio.channels.spi; \
+ java.nio.charset; \
+ java.nio.charset.spi; \
+ java.rmi; \
+ java.rmi.activation; \
+ java.rmi.dgc; \
+ java.rmi.registry; \
+ java.rmi.server; \
+ java.security; \
+ java.security.acl; \
+ java.security.cert; \
+ java.security.interfaces; \
+ java.security.spec; \
+ java.sql; \
+ java.text; \
+ java.text.spi; \
+ java.util; \
+ java.util.concurrent; \
+ java.util.concurrent.atomic; \
+ java.util.concurrent.locks; \
+ java.util.jar; \
+ java.util.logging; \
+ java.util.prefs; \
+ java.util.regex; \
+ java.util.spi; \
+ java.util.zip; \
+ javax.accessibility; \
+ javax.activation; \
+ javax.activity; \
+ javax.annotation; \
+ javax.annotation.processing; \
+ javax.imageio; \
+ javax.imageio.event; \
+ javax.imageio.metadata; \
+ javax.imageio.plugins.bmp; \
+ javax.imageio.plugins.jpeg; \
+ javax.imageio.spi; \
+ javax.imageio.stream; \
+ javax.jws; \
+ javax.jws.soap; \
+ javax.lang.model; \
+ javax.lang.model.element; \
+ javax.lang.model.type; \
+ javax.lang.model.util; \
+ javax.management; \
+ javax.management.loading; \
+ javax.management.modelmbean; \
+ javax.management.monitor; \
+ javax.management.openmbean; \
+ javax.management.relation; \
+ javax.management.remote; \
+ javax.management.remote.rmi; \
+ javax.management.timer; \
+ javax.naming; \
+ javax.naming.directory; \
+ javax.naming.event; \
+ javax.naming.ldap; \
+ javax.naming.spi; \
+ javax.net; \
+ javax.net.ssl; \
+ javax.print; \
+ javax.print.attribute; \
+ javax.print.attribute.standard; \
+ javax.print.event; \
+ javax.rmi; \
+ javax.rmi.CORBA; \
+ javax.rmi.ssl; \
+ javax.script; \
+ javax.security.auth; \
+ javax.security.auth.callback; \
+ javax.security.auth.kerberos; \
+ javax.security.auth.login; \
+ javax.security.auth.spi; \
+ javax.security.auth.x500; \
+ javax.security.sasl; \
+ javax.smartcardio; \
+ javax.sound.midi; \
+ javax.sound.midi.spi; \
+ javax.sound.sampled; \
+ javax.sound.sampled.spi; \
+ javax.sql; \
+ javax.sql.rowset; \
+ javax.sql.rowset.serial; \
+ javax.sql.rowset.spi; \
+ javax.swing; \
+ javax.swing.border; \
+ javax.swing.colorchooser; \
+ javax.swing.event; \
+ javax.swing.filechooser; \
+ javax.swing.plaf; \
+ javax.swing.plaf.basic; \
+ javax.swing.plaf.metal; \
+ javax.swing.plaf.multi; \
+ javax.swing.plaf.synth; \
+ javax.swing.table; \
+ javax.swing.text; \
+ javax.swing.text.html; \
+ javax.swing.text.html.parser; \
+ javax.swing.text.rtf; \
+ javax.swing.tree; \
+ javax.swing.undo; \
+ javax.tools; \
+ javax.transaction; \
+ javax.transaction.xa; \
+ javax.xml; \
+ javax.xml.bind; \
+ javax.xml.bind.annotation; \
+ javax.xml.bind.annotation.adapters; \
+ javax.xml.bind.attachment; \
+ javax.xml.bind.helpers; \
+ javax.xml.bind.util; \
+ javax.xml.crypto; \
+ javax.xml.crypto.dom; \
+ javax.xml.crypto.dsig; \
+ javax.xml.crypto.dsig.dom; \
+ javax.xml.crypto.dsig.keyinfo; \
+ javax.xml.crypto.dsig.spec; \
+ javax.xml.datatype; \
+ javax.xml.namespace; \
+ javax.xml.parsers; \
+ javax.xml.soap; \
+ javax.xml.stream; \
+ javax.xml.stream.events; \
+ javax.xml.stream.util; \
+ javax.xml.transform; \
+ javax.xml.transform.dom; \
+ javax.xml.transform.sax; \
+ javax.xml.transform.stax; \
+ javax.xml.transform.stream; \
+ javax.xml.validation; \
+ javax.xml.ws; \
+ javax.xml.ws.handler; \
+ javax.xml.ws.handler.soap; \
+ javax.xml.ws.http; \
+ javax.xml.ws.soap; \
+ javax.xml.ws.spi; \
+ javax.xml.xpath; \
+ org.ietf.jgss; \
+ org.jcp.xml.dsig.internal; \
+ org.jcp.xml.dsig.internal.dom; \
+ org.omg.CORBA; \
+ org.omg.CORBA_2_3; \
+ org.omg.CORBA_2_3.portable; \
+ org.omg.CORBA.DynAnyPackage; \
+ org.omg.CORBA.ORBPackage; \
+ org.omg.CORBA.portable; \
+ org.omg.CORBA.TypeCodePackage; \
+ org.omg.CosNaming; \
+ org.omg.CosNaming.NamingContextExtPackage; \
+ org.omg.CosNaming.NamingContextPackage; \
+ org.omg.Dynamic; \
+ org.omg.DynamicAny; \
+ org.omg.DynamicAny.DynAnyFactoryPackage; \
+ org.omg.DynamicAny.DynAnyPackage; \
+ org.omg.IOP; \
+ org.omg.IOP.CodecFactoryPackage; \
+ org.omg.IOP.CodecPackage; \
+ org.omg.Messaging; \
+ org.omg.PortableInterceptor; \
+ org.omg.PortableInterceptor.ORBInitInfoPackage; \
+ org.omg.PortableServer; \
+ org.omg.PortableServer.CurrentPackage; \
+ org.omg.PortableServer.POAManagerPackage; \
+ org.omg.PortableServer.POAPackage; \
+ org.omg.PortableServer.portable; \
+ org.omg.PortableServer.ServantLocatorPackage; \
+ org.omg.SendingContext; \
+ org.omg.stub.java.rmi; \
+ org.omg.stub.javax.management.remote.rmi; \
+ org.w3c.dom; \
+ org.w3c.dom.bootstrap; \
+ org.w3c.dom.css; \
+ org.w3c.dom.events; \
+ org.w3c.dom.html; \
+ org.w3c.dom.ls; \
+ org.w3c.dom.ranges; \
+ org.w3c.dom.stylesheets; \
+ org.w3c.dom.traversal; \
+ org.w3c.dom.views; \
+ org.w3c.dom.xpath; \
+ org.xml.sax; \
+ org.xml.sax.ext; \
+ org.xml.sax.helpers; \
+ version=\"1.6.0\"
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java
new file mode 100644
index 0000000..c57825e
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java
@@ -0,0 +1,383 @@
+/*
+ * 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.karaf.main;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public abstract class BaseJDBCLockIntegrationTest {
+    
+    private final Logger LOG = Logger.getLogger(this.getClass().getName());
+
+    DefaultJDBCLock lock;
+    Properties props;
+    String user = "root";
+    String password = "";
+    String driver;
+    String url;
+    String tableName = "LOCK_TABLE";
+    String clustername = "karaf_cluster";
+    int timeout = 10;
+    String momentDatatype = "BIGINT";
+    String nodeDatatype = "VARCHAR(20)";
+
+    abstract DefaultJDBCLock createLock(Properties props);
+    
+    @BeforeClass
+    public static void setUpTestSuite() {
+        Properties properties = new Properties();
+        properties.put("karaf.bootstrap.log", "target/karaf.log");
+        BootstrapLogManager.setProperties(properties);        
+    }
+    
+    @Before
+    public void setUp() throws Exception {
+        props = new Properties();
+        props.put("karaf.lock.jdbc.url", url);
+        props.put("karaf.lock.jdbc.driver", driver);
+        props.put("karaf.lock.jdbc.user", user);
+        props.put("karaf.lock.jdbc.password", password);
+        props.put("karaf.lock.jdbc.table", tableName);
+        props.put("karaf.lock.jdbc.clustername", clustername);
+        props.put("karaf.lock.jdbc.timeout", String.valueOf(timeout));
+        
+        try {
+            executeStatement("DROP TABLE " + tableName);
+        } catch (Exception e) {
+            // expected if the table dosn't exist
+        }
+    }
+    
+    @After
+    public void tearDown() throws Exception {
+        if (lock != null) {
+            lock.release();
+        }
+    }
+    
+    @Test
+    @Ignore
+    public void lockShouldRestoreTheLockAfterADbFailure() throws Exception {
+        Lock lock1 = createLock(props);
+        assertTrue(lock1.lock());
+        assertTrue(lock1.isAlive());
+        
+        // shut down the database
+        
+        assertFalse(lock1.isAlive());
+        
+        // start the database
+        
+        assertTrue(lock1.lock());
+        assertTrue(lock1.isAlive());
+    }
+    
+    @Test
+    public void initShouldCreateTheSchemaIfItNotExists() throws Exception {
+        long start = System.currentTimeMillis();
+        lock = createLock(props);
+        long end = System.currentTimeMillis();
+        
+        long moment = queryDatabaseSingleResult("SELECT MOMENT FROM " + tableName);
+    
+        assertTrue(moment >= start);
+        assertTrue(moment <= end);
+    }
+
+    @Test
+    public void initShouldNotCreateTheSchemaIfItAlreadyExists() throws Exception {
+        executeStatement("CREATE TABLE " + tableName + " (MOMENT " + momentDatatype + ", NODE " + nodeDatatype + ")");
+        executeStatement("INSERT INTO " + tableName + " (MOMENT, NODE) VALUES (1, '" + clustername + "')");
+        
+        lock = createLock(props);
+        
+        long moment = queryDatabaseSingleResult("SELECT MOMENT FROM " + tableName);
+    
+        assertEquals(1, moment);
+    }
+
+    @Test
+    public void lockShouldReturnTrueItTheTableIsNotLocked() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        assertTableIsLocked();
+    }
+
+    @Test
+    public void lockShouldReturnFalseIfAnotherRowIsLocked() throws Exception {
+        Connection connection = null;
+        try {
+            lock = createLock(props);
+            
+            executeStatement("INSERT INTO " + tableName + " (MOMENT, NODE) VALUES (1, '" + clustername + "_2')");
+            connection = lock(tableName, clustername + "_2");
+            
+            // we can't lock only one row for the cluster
+            assertFalse(lock.lock());
+        } finally {
+            close(connection);
+        }
+    }
+    
+    @Test
+    public void lockShouldReturnFalseIfTheRowIsAlreadyLocked() throws Exception {
+        Connection connection = null;
+        try {
+            lock = createLock(props);
+            connection = lock(tableName, clustername);
+            
+            assertFalse(lock.lock());
+        } finally {
+            close(connection);
+        }
+    }
+    
+    @Test
+    public void lockShouldReturnFalseIfTheTableIsEmpty() throws Exception {
+        Connection connection = null;
+        try {
+            lock = createLock(props);
+            truncateTable(); //Empty the table
+            connection = lock(tableName, clustername);
+            
+            assertFalse(lock.lock());
+        } finally {
+            close(connection);
+        }
+    }
+    
+    @Test
+    public void release() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        
+        lock.release();
+        
+        assertNull(lock.lockConnection);
+        assertTableIsUnlocked();
+    }
+
+    @Test
+    public void releaseShouldSucceedForAnAlreadyClosedConnection() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        
+        lock.lockConnection.rollback(); // release the lock
+        lock.lockConnection.close();
+        lock.release();
+        
+        assertTableIsUnlocked();
+    }
+
+    @Test
+    public void releaseShouldSucceedForANullConnectionReference() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        
+        lock.lockConnection.rollback(); // release the lock
+        lock.lockConnection.close();
+        lock.lockConnection = null;
+        lock.release();
+        
+        assertTableIsUnlocked();
+    }
+
+    @Test
+    public void isAliveShouldReturnTrueIfItHoldsTheLock() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        assertTrue(lock.isAlive());
+    }
+
+    @Test
+    public void isAliveShouldReturnFalseIfTheConnectionIsClosed() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        
+        lock.lockConnection.rollback(); // release the lock
+        lock.lockConnection.close();
+        
+        assertFalse(lock.isAlive());
+    }
+
+    @Test
+    public void isAliveShouldReturnFalseIfTheConnectionIsNull() throws Exception {
+        lock = createLock(props);
+        
+        assertTrue(lock.lock());
+        
+        lock.lockConnection.rollback(); // release the lock
+        lock.lockConnection.close();
+        lock.lockConnection = null;
+        
+        assertFalse(lock.isAlive());
+    }
+
+    @Test
+    public void isAliveShouldReturnFalseIfItNotHoldsTheLock() throws Exception {
+        Connection connection = null;
+        try {
+            lock = createLock(props);
+            
+            assertTrue(lock.lock());
+            
+            lock.lockConnection.rollback(); // release the lock
+            connection = lock(tableName, clustername); // another connection locks the table
+            
+            assertFalse(lock.isAlive());
+        } finally {
+            close(connection);            
+        }
+    }
+
+    Connection getConnection(String url, String user, String password) throws ClassNotFoundException, SQLException {
+        Class.forName(driver);
+        Connection connection = DriverManager.getConnection(url, user, password);
+        connection.setAutoCommit(false);
+        return connection;
+    }
+
+    void executeStatement(String stmt) throws SQLException, ClassNotFoundException {
+        Connection connection = null;
+        Statement statement = null;
+        
+        try {
+            connection = getConnection(url, user, password);
+            statement = connection.createStatement();
+            statement.setQueryTimeout(timeout);
+            statement.execute(stmt);    
+            connection.commit();
+        } finally {
+            close(statement);
+            close(connection);
+        }
+    }
+
+    Long queryDatabaseSingleResult(String query) throws ClassNotFoundException, SQLException {
+        Connection connection = null;
+        Statement statement = null;
+        ResultSet rs = null;
+        
+        try {
+            connection = getConnection(url, user, password);
+            statement = connection.createStatement();
+            rs = statement.executeQuery(query);
+            rs.next();
+            return rs.getLong(1);
+        } finally {
+            close(rs);
+            close(statement);
+            close(connection);
+        }
+    }
+
+    void assertTableIsLocked() throws ClassNotFoundException, SQLException {
+        try {
+            executeStatement("UPDATE " + tableName + " SET MOMENT = " + System.currentTimeMillis());
+            fail("SQLException for timeout expected because the table should be already locked");
+        } catch (SQLException sqle) {
+            // expected
+        }
+    }
+
+    void assertTableIsUnlocked() throws ClassNotFoundException, SQLException {
+        executeStatement("UPDATE " + tableName + " SET MOMENT = " + System.currentTimeMillis());
+    }
+
+    void truncateTable() throws SQLException, ClassNotFoundException {
+	    executeStatement("TRUNCATE TABLE " + tableName);
+    }
+    
+    
+    Connection lock(String table, String node) throws ClassNotFoundException, SQLException {
+        Connection connection = null;
+        Statement statement = null;
+        
+        try {
+            connection = getConnection(url, user, password);
+            statement = connection.createStatement();
+            //statement.execute("SELECT * FROM " + table + " WHERE NODE = '" + node + "' FOR UPDATE");
+            //statement.execute("UPDATE " + table + " SET MOMENT = " + System.currentTimeMillis() + " WHERE NODE = '" + node + "'");
+            statement.execute("SELECT * FROM " + table + " FOR UPDATE");
+            statement.execute("UPDATE " + table + " SET MOMENT = " + System.currentTimeMillis());
+        } finally {
+            close(statement);
+            // connection must not be closed!
+        }
+        
+        return connection;
+    }
+
+    void close(ResultSet rs) throws SQLException {
+        if (rs != null) {
+            try {
+                rs.close();
+            } catch (Exception e) {
+            }
+        }
+    }
+
+    void close(Statement statement) throws SQLException {
+        if (statement != null) {
+            try {
+                statement.close();
+            } catch (Exception e) {
+                LOG.severe("Can't close the statement: " + e);
+            }
+        }
+    }
+
+    void close(Connection connection) throws SQLException {
+        if (connection != null) {
+            try {
+                connection.rollback();
+            } catch (Exception e) {
+                LOG.severe("Can't rollback the connection: " + e);
+            }
+            try {
+                connection.close();
+            } catch (Exception e) {
+                LOG.severe("Can't close the connection: " + e);
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java
new file mode 100644
index 0000000..6589860
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java
@@ -0,0 +1,334 @@
+/*
+ * 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.karaf.main;
+
+import static org.easymock.EasyMock.*;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import org.easymock.EasyMock;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public abstract class BaseJDBCLockTest {
+    
+    DefaultJDBCLock lock;
+    Properties props;
+    String user = "root";
+    String password = "";
+    String driver;
+    String url;
+    String tableName = "LOCK_TABLE";
+    String clustername = "karaf_cluster";
+    int timeout = 10;
+    String momentDatatype = "BIGINT";
+    String nodeDatatype = "VARCHAR(20)";
+    String createTableStmtSuffix = "";
+    
+    Connection connection;
+    DatabaseMetaData metaData;
+    ResultSet resultSet;
+    PreparedStatement preparedStatement;
+    Statement statement;
+    
+    abstract DefaultJDBCLock createLock(Properties props);
+    
+    @BeforeClass
+    public static void setUpTestSuite() {
+        Properties properties = new Properties();
+        properties.put("karaf.bootstrap.log", "target/karaf.log");
+        BootstrapLogManager.setProperties(properties);        
+    }
+    
+    @Before
+    public void setUp() throws Exception {
+        connection = EasyMock.createMock(Connection.class);
+        metaData = EasyMock.createMock(DatabaseMetaData.class);
+        resultSet = EasyMock.createMock(ResultSet.class);
+        preparedStatement = EasyMock.createMock(PreparedStatement.class);
+        statement = EasyMock.createMock(Statement.class);
+        
+        props = new Properties();
+        props.put("karaf.lock.jdbc.url", url);
+        props.put("karaf.lock.jdbc.driver", driver);
+        props.put("karaf.lock.jdbc.user", user);
+        props.put("karaf.lock.jdbc.password", password);
+        props.put("karaf.lock.jdbc.table", tableName);
+        props.put("karaf.lock.jdbc.clustername", clustername);
+        props.put("karaf.lock.jdbc.timeout", timeout);
+    }
+    
+    @Test
+    public void initShouldCreateTheSchemaIfItNotExists() throws Exception {
+        expect(connection.isClosed()).andReturn(false);
+        connection.setAutoCommit(false);
+        expect(connection.getMetaData()).andReturn(metaData);
+        expect(metaData.getTables((String) isNull(), (String) isNull(), eq("LOCK_TABLE"), aryEq(new String[] {"TABLE"}))).andReturn(resultSet);
+        expect(resultSet.next()).andReturn(false);
+        resultSet.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.createStatement()).andReturn(statement);
+        expect(statement.execute("CREATE TABLE " + tableName + " (MOMENT " + momentDatatype + ", NODE " + nodeDatatype + ")" + createTableStmtSuffix)).andReturn(false);
+        expect(statement.execute("INSERT INTO " + tableName + " (MOMENT, NODE) VALUES (1, '" + clustername + "')")).andReturn(false);
+        statement.close();
+        connection.commit();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock = createLock(props);
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+    }
+    
+    @Test
+    public void initShouldNotCreateTheSchemaIfItAlreadyExists() throws Exception {
+        connection.setAutoCommit(false);
+        expect(connection.getMetaData()).andReturn(metaData);
+        expect(metaData.getTables((String) isNull(), (String) isNull(), eq("LOCK_TABLE"), aryEq(new String[] {"TABLE"}))).andReturn(resultSet);
+        expect(resultSet.next()).andReturn(true);
+        resultSet.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock = createLock(props);
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+    }
+    
+    @Test
+    public void lockShouldReturnTrueItTheTableIsNotLocked() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeUpdate()).andReturn(1);
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertTrue(lockAquired);
+    }
+    
+    @Test
+    public void lockShouldReturnFalseIfAnotherRowIsLocked() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeUpdate()).andThrow(new SQLException());
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(lockAquired);
+    }
+    
+    @Test
+    public void lockShouldReturnFalseIfTheRowIsAlreadyLocked() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeUpdate()).andThrow(new SQLException());
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(lockAquired);
+    }
+    
+    @Test
+    public void release() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.isClosed()).andReturn(false);
+        connection.rollback();
+        connection.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock.release();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+    }
+    
+    @Test
+    public void releaseShouldSucceedForAnAlreadyClosedConnection() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(true);
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock.release();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+    }
+    
+    @Test
+    public void releaseShouldSucceedForANullConnectionReference() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock.lockConnection = null;
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock.release();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+    }
+    
+    @Test
+    public void isAliveShouldReturnTrueIfItHoldsTheLock() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeUpdate()).andReturn(1);
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean alive = lock.isAlive();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertTrue(alive);
+    }
+    
+    @Test
+    public void isAliveShouldReturnFalseIfTheConnectionIsClosed() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(true);
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean alive = lock.isAlive();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(alive);
+    }
+    
+    @Test
+    public void isAliveShouldReturnFalseIfTheConnectionIsNull() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        lock.lockConnection = null;
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean alive = lock.isAlive();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(alive);
+    }
+    
+    @Test
+    public void isAliveShouldReturnFalseIfItNotHoldsTheLock() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeUpdate()).andThrow(new SQLException());
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean alive = lock.isAlive();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(alive);
+    }
+    
+    @Test
+    public void lockShouldReturnFalseIfTableIsEmpty() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeUpdate()).andReturn(0);
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(lockAquired);
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java
new file mode 100644
index 0000000..7620528
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.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.karaf.main;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+@Ignore
+public class DefaultJDBCLockIntegrationTest extends BaseJDBCLockIntegrationTest {
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        password = "root";
+        driver = "org.apache.derby.jdbc.ClientDriver";
+        url = "jdbc:derby://127.0.0.1:1527/test";
+        
+        super.setUp();
+    }
+    
+    @Override
+    DefaultJDBCLock createLock(Properties props) {
+        return new DefaultJDBCLock(props);
+    }
+    
+    @Test
+    public void initShouldCreateTheDatabaseIfItNotExists() throws Exception {
+        String database = "test" + System.currentTimeMillis();
+        url = "jdbc:derby://127.0.0.1:1527/" + database;
+        props.put("karaf.lock.jdbc.url", url);
+        lock = createLock(props);
+        lock.lock();
+        
+        assertTrue(lock.lockConnection.getMetaData().getURL().contains(database));
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java
new file mode 100644
index 0000000..08b2508
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.main;
+
+import static org.junit.Assert.assertEquals;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class DefaultJDBCLockTest extends BaseJDBCLockTest {
+    
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        password = "root";
+        driver = "org.apache.derby.jdbc.ClientDriver";
+        url = "jdbc:derby://127.0.0.1:1527/test";
+        
+        super.setUp();
+    }
+    
+    DefaultJDBCLock createLock(Properties props) {
+        return new DefaultJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url + ";create=true", url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+    
+    @Test
+    public void createConnectionShouldConcatinateOptionsCorrect() {
+        props.put("karaf.lock.jdbc.url", this.url + ";dataEncryption=false");
+        
+        lock = new DefaultJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url + ";create=true", url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java
new file mode 100644
index 0000000..61a0429
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.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.karaf.main;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+@Ignore
+public class DerbyJDBCLockIntegrationTest extends BaseJDBCLockIntegrationTest {
+
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        password = "root";
+        driver = "org.apache.derby.jdbc.ClientDriver";
+        url = "jdbc:derby://127.0.0.1:1527/test";
+        
+        super.setUp();
+    }
+    
+    @Override
+    DefaultJDBCLock createLock(Properties props) {
+        return new DerbyJDBCLock(props);
+    }
+    
+    @Test
+    public void initShouldCreateTheDatabaseIfItNotExists() throws Exception {
+        String database = "test" + System.currentTimeMillis();
+        url = "jdbc:derby://127.0.0.1:1527/" + database;
+        props.put("karaf.lock.jdbc.url", url);
+        lock = createLock(props);
+        lock.lock();
+        
+        assertTrue(lock.lockConnection.getMetaData().getURL().contains(database));
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java
new file mode 100644
index 0000000..f041214
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.main;
+
+import static org.junit.Assert.assertEquals;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class DerbyJDBCLockTest extends BaseJDBCLockTest {
+    
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        password = "root";
+        driver = "org.apache.derby.jdbc.ClientDriver";
+        url = "jdbc:derby://127.0.0.1:1527/test";
+        
+        super.setUp();
+    }
+    
+    DerbyJDBCLock createLock(Properties props) {
+        return new DerbyJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url + ";create=true", url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+    
+    @Test
+    public void createConnectionShouldConcatinateOptionsCorrect() {
+        props.put("karaf.lock.jdbc.url", this.url + ";dataEncryption=false");
+        
+        lock = new DerbyJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url + ";create=true", url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MainStartTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MainStartTest.java
new file mode 100644
index 0000000..6ccfef8
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MainStartTest.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main;
+
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.withBnd;
+
+import java.io.File;
+import java.net.URI;
+
+import junit.framework.Assert;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.launch.Framework;
+
+public class MainStartTest {
+
+	@Test
+    @Ignore("Unit test for KARAF-334 disabled for now")
+    public void testAutoStart() throws Exception {
+        File basedir = new File(getClass().getClassLoader().getResource("foo").getPath()).getParentFile();
+        File home = new File(basedir, "test-karaf-home");
+        File data = new File(home, "data");
+
+        Utils.deleteDirectory(data);
+
+		String[] args = new String[0];
+		String fileMVNbundle = new File(home, "bundles/pax-url-mvn.jar").toURI().toURL().toExternalForm();
+		String mvnUrl = "mvn:org.osgi/org.osgi.compendium/4.2.0";
+		System.setProperty("karaf.home", home.toString());
+		System.setProperty("karaf.data", data.toString());
+		System.setProperty("karaf.auto.start.1", "\""+fileMVNbundle+"|unused\"");
+		System.setProperty("karaf.auto.start.2", "\""+mvnUrl+"|unused\"");
+		System.setProperty("karaf.maven.convert", "false");
+
+		Main main = new Main(args);
+		main.launch();
+		Thread.sleep(1000);
+		Framework framework = main.getFramework();
+		Bundle[] bundles = framework.getBundleContext().getBundles();
+		Assert.assertEquals(3, bundles.length);
+		Assert.assertEquals(fileMVNbundle, bundles[1].getLocation());
+		Assert.assertEquals(mvnUrl, bundles[2].getLocation());
+		Assert.assertEquals(Bundle.ACTIVE, bundles[1].getState());
+		Assert.assertEquals(Bundle.ACTIVE, bundles[2].getState());
+		main.destroy();
+	}
+
+    @Test
+    public void testStopWithTimeout() throws Exception {
+        File basedir = new File(getClass().getClassLoader().getResource("foo").getPath()).getParentFile();
+        File home = new File(basedir, "test-karaf-home");
+        File data = new File(home, "data");
+
+        Utils.deleteDirectory(data);
+
+        String[] args = new String[0];
+        System.setProperty("karaf.home", home.toString());
+        System.setProperty("karaf.data", data.toString());
+        System.setProperty("karaf.framework.factory", "org.apache.felix.framework.FrameworkFactory");
+
+
+        Main main = new Main(args);
+        main.launch();
+        Thread.sleep(1000);
+        Framework framework = main.getFramework();
+        String activatorName = TimeoutShutdownActivator.class.getName().replace('.', '/') + ".class";
+        Bundle bundle = framework.getBundleContext().installBundle("foo",
+                TinyBundles.newBundle()
+                    .set( Constants.BUNDLE_ACTIVATOR, TimeoutShutdownActivator.class.getName() )
+                    .add( activatorName, getClass().getClassLoader().getResourceAsStream( activatorName ) )
+                    .build( withBnd() )
+        );
+        bundle.start();
+
+        long t0 = System.currentTimeMillis();
+        main.destroy();
+        long t1 = System.currentTimeMillis();
+//        System.err.println("Shutdown duration: " + (t1 - t0) + " ms");
+        Assert.assertTrue((t1 - t0) > TimeoutShutdownActivator.TIMEOUT / 2);
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java
new file mode 100644
index 0000000..db5409f
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main;
+
+
+import static org.junit.Assert.assertFalse;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+@Ignore
+public class MySQLJDBCLockIntegrationTest extends BaseJDBCLockIntegrationTest {
+
+    @Before
+    public void setUp() throws Exception {
+        driver = "com.mysql.jdbc.Driver";
+        url = "jdbc:mysql://127.0.0.1:3306/test";
+        
+        super.setUp();
+    }
+    
+    @Override
+    MySQLJDBCLock createLock(Properties props) {
+        return new MySQLJDBCLock(props);
+    }
+    
+    @Test
+    public void initShouldCreateTheDatabaseIfItNotExists() throws Exception {
+        String database = "test" + System.currentTimeMillis();
+        
+        try {
+            executeStatement("DROP DATABASE " + database);
+        } catch (Exception e) {
+            // expected if table dosn't exist
+        }
+        
+        url = "jdbc:mysql://127.0.0.1:3306/" + database;
+        props.put("karaf.lock.jdbc.url", url);
+        lock = createLock(props);
+        
+        
+        // should throw an exeption, if the database doesn't exists
+        Connection connection = getConnection("jdbc:mysql://127.0.0.1:3306/" + database, user, password);
+        assertFalse(connection.isClosed());
+        
+        executeStatement("DROP DATABASE " + database);
+        close(connection);
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java
new file mode 100644
index 0000000..021c82a
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.main;
+
+import static org.junit.Assert.assertEquals;
+
+import java.sql.Connection;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class MySQLJDBCLockTest extends BaseJDBCLockTest {
+    
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        driver = "com.mysql.jdbc.Driver";
+        url = "jdbc:mysql://127.0.0.1:3306/test";
+        createTableStmtSuffix = " ENGINE=INNODB";
+        
+        super.setUp();
+    }
+    
+    MySQLJDBCLock createLock(Properties props) {
+        return new MySQLJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url + "?createDatabaseIfNotExist=true", url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+    
+    @Test
+    public void createConnectionShouldConcatinateOptionsCorrect() {
+        props.put("karaf.lock.jdbc.url", this.url + "?connectTimeout=10000");
+        
+        lock = new MySQLJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url + "&createDatabaseIfNotExist=true", url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java
new file mode 100644
index 0000000..cd2c55b
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.main;
+
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Ignore;
+
+
+@Ignore
+public class OracleJDBCLockIntegrationTest extends BaseJDBCLockIntegrationTest {
+    
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        password = "root";
+        driver = "oracle.jdbc.driver.OracleDriver";
+        url = "jdbc:oracle:thin:@172.16.16.133:1521:XE";
+        momentDatatype = "NuMBER(20)";
+        
+        super.setUp();
+    }
+
+    OracleJDBCLock createLock(Properties props) {
+        return new OracleJDBCLock(props);
+    }
+    
+    @Override
+    Connection lock(String table, String node) throws ClassNotFoundException, SQLException {
+        Connection connection = null;
+        Statement statement = null;
+        
+        try {
+            connection = getConnection(url, user, password);
+            statement = connection.createStatement();
+            statement.execute("SELECT * FROM " + table + " FOR UPDATE");
+        } finally {
+            close(statement);
+            // connection must not be closed!
+        }
+        
+        return connection;
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java
new file mode 100644
index 0000000..fa27edf
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java
@@ -0,0 +1,205 @@
+/*
+ * 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.karaf.main;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.*;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class OracleJDBCLockTest extends BaseJDBCLockTest {
+    
+    @Before
+    @Override
+    public void setUp() throws Exception {
+        password = "root";
+        driver = "oracle.jdbc.driver.OracleDriver";
+        url = "jdbc:oracle:thin:@172.16.16.132:1521:XE";
+        momentDatatype = "NUMBER(20)";
+        
+        super.setUp();
+    }
+    
+    OracleJDBCLock createLock(Properties props) {
+        return new OracleJDBCLock(props) {
+            @Override
+            Connection doCreateConnection(String driver, String url, String username, String password) {
+                assertEquals(this.driver, driver);
+                assertEquals(this.url, url);
+                assertEquals(this.user, username);
+                assertEquals(this.password, password);
+                return connection;
+            }
+
+            @Override
+            long getCurrentTimeMillis() {
+                return 1;
+            }
+        };
+    }
+    
+    @Test
+    @Override
+    public void lockShouldReturnTrueItTheTableIsNotLocked() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT COUNT(*) FROM " + tableName)).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeQuery()).andReturn(resultSet);
+        expect(resultSet.next()).andReturn(Boolean.TRUE);
+        expect(resultSet.getInt(1)).andReturn(1);
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertTrue(lockAquired);
+    }
+    
+    @Test
+    @Override
+    public void lockShouldReturnFalseIfAnotherRowIsLocked() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andThrow(new SQLException());
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(lockAquired);
+    }
+    
+    @Test
+    @Override
+    public void lockShouldReturnFalseIfTheRowIsAlreadyLocked() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andThrow(new SQLException());
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(lockAquired);
+    }
+    
+    @Test
+    public void isAliveShouldReturnTrueIfItHoldsTheLock() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT COUNT(*) FROM " + tableName)).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeQuery()).andReturn(resultSet);
+        expect(resultSet.next()).andReturn(Boolean.TRUE);
+        expect(resultSet.getInt(1)).andReturn(1);
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean alive = lock.isAlive();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertTrue(alive);
+    }
+    
+    @Test
+    public void isAliveShouldReturnFalseIfItNotHoldsTheLock() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andThrow(new SQLException());
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean alive = lock.isAlive();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(alive);
+    }
+    
+    @Test
+    public void lockShouldReturnFalseIfTableIsEmpty() throws Exception {
+        initShouldNotCreateTheSchemaIfItAlreadyExists();
+        reset(connection, metaData, statement, preparedStatement, resultSet);
+        
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT * FROM " + tableName + " FOR UPDATE")).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.execute()).andReturn(true);
+        preparedStatement.close();
+        expect(connection.isClosed()).andReturn(false);
+        expect(connection.prepareStatement("SELECT COUNT(*) FROM " + tableName)).andReturn(preparedStatement);
+        preparedStatement.setQueryTimeout(10);
+        expect(preparedStatement.executeQuery()).andReturn(resultSet);
+        expect(resultSet.next()).andReturn(Boolean.TRUE);
+        expect(resultSet.getInt(1)).andReturn(0);
+        preparedStatement.close();
+        
+        replay(connection, metaData, statement, preparedStatement, resultSet);
+        
+        boolean lockAquired = lock.lock();
+        
+        verify(connection, metaData, statement, preparedStatement, resultSet);
+        assertFalse(lockAquired);
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/StatementsTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/StatementsTest.java
new file mode 100644
index 0000000..b03e1d3
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/StatementsTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.karaf.main;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class StatementsTest {
+    
+    private static final String DEFAULT_CREATE_TABLE_STMT = "CREATE TABLE KARAF_LOCK (MOMENT BIGINT, NODE VARCHAR(20))";
+    private static final String DEFAULT_POPULATE_TABLE_STMT = "INSERT INTO KARAF_LOCK (MOMENT, NODE) VALUES (1, 'karaf')";
+    
+    private Statements statements;
+    
+    @Before
+    public void setUp() {
+        statements = new Statements();
+    }
+
+    @Test
+    public void getDefaultLockCreateSchemaStatements() {
+        assertArrayEquals(new String[] {DEFAULT_CREATE_TABLE_STMT, DEFAULT_POPULATE_TABLE_STMT}, statements.getLockCreateSchemaStatements(1));
+    }
+    
+    @Test
+    public void getCustomLockCreateSchemaStatements() {
+        customizeStatements();
+        String[] expectedCreateSchemaStmts = new String[] {
+                "CREATE TABLE test.LOCK_TABLE (MOMENT NUMBER(20), NODE VARCHAR2(30))", 
+                "INSERT INTO test.LOCK_TABLE (MOMENT, NODE) VALUES (2, 'node_1')"};
+        
+        assertArrayEquals(expectedCreateSchemaStmts, statements.getLockCreateSchemaStatements(2));
+    }
+
+    @Test
+    public void getDefaultLockCreateStatement() {
+        assertEquals("SELECT * FROM KARAF_LOCK FOR UPDATE", statements.getLockCreateStatement());
+    }
+    
+    @Test
+    public void getCustomLockCreateStatement() {
+        customizeStatements();
+        
+        assertEquals("SELECT * FROM test.LOCK_TABLE FOR UPDATE", statements.getLockCreateStatement());
+    }
+
+    @Test
+    public void getDefaultLockUpdateStatement() {
+        assertEquals("UPDATE KARAF_LOCK SET MOMENT = 1", statements.getLockUpdateStatement(1));
+    }
+    
+    @Test
+    public void getCustomLockUpdateStatement() {
+        customizeStatements();
+        
+        assertEquals("UPDATE test.LOCK_TABLE SET MOMENT = 2", statements.getLockUpdateStatement(2));
+    }
+    
+    private void customizeStatements() {
+        statements.setTablePrefix("test.");
+        statements.setTableName("LOCK_TABLE");
+        statements.setNodeName("node_1");
+        statements.setMomentColumnDataType("NUMBER(20)");
+        statements.setNodeColumnDataType("VARCHAR2(30)");
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/StringMapTest.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/StringMapTest.java
new file mode 100644
index 0000000..f3c2933
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/StringMapTest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.karaf.main;
+
+import junit.framework.TestCase;
+
+/**
+ * Test cased for {@link org.apache.karaf.main.StringMap}
+ */
+public class StringMapTest extends TestCase {
+
+    public void testPut() throws Exception {
+        StringMap sm = new StringMap();
+        Object key = new String("key");
+        Object value = new String("value");
+        sm.put(key, value);
+        Object result = sm.get(key);
+        assertFalse(result == null);
+        assertTrue(result.equals(value));
+    }
+
+}
diff --git a/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/TimeoutShutdownActivator.java b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/TimeoutShutdownActivator.java
new file mode 100644
index 0000000..32d73c2
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/java/org/apache/karaf/main/TimeoutShutdownActivator.java
@@ -0,0 +1,34 @@
+/*
+ * 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.karaf.main;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class TimeoutShutdownActivator implements BundleActivator {
+
+    public static int TIMEOUT = 10000;
+
+    public void start(BundleContext context) throws Exception {
+    }
+
+    public void stop(BundleContext context) throws Exception {
+        Thread.sleep(TIMEOUT);
+    }
+}
diff --git a/karaf-2.2.x/main/src/test/resources/foo b/karaf-2.2.x/main/src/test/resources/foo
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/resources/foo
diff --git a/karaf-2.2.x/main/src/test/resources/test-karaf-home/bundles/pax-url-mvn.jar b/karaf-2.2.x/main/src/test/resources/test-karaf-home/bundles/pax-url-mvn.jar
new file mode 100755
index 0000000..54d77bd
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/resources/test-karaf-home/bundles/pax-url-mvn.jar
Binary files differ
diff --git a/karaf-2.2.x/main/src/test/resources/test-karaf-home/etc/config.properties b/karaf-2.2.x/main/src/test/resources/test-karaf-home/etc/config.properties
new file mode 100755
index 0000000..4089252
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/resources/test-karaf-home/etc/config.properties
@@ -0,0 +1,43 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# Properties file inclusions (as a space separated list of relative paths)
+# Included files will override the values specified in this file
+#
+${includes} =
+
+#
+# Framework selection properties
+#
+karaf.framework=felix
+
+#
+# Location of the OSGi frameworks
+#
+karaf.framework.felix=${karaf.default.repository}/org/apache/felix/org.apache.felix.framework/3.0.6/org.apache.felix.framework-3.0.6.jar
+
+# To enable the use of the startup.properties file to control the start level:
+karaf.auto.start=
+
+org.osgi.framework.startlevel.beginning=100
+karaf.startlevel.bundle=60
+karaf.name=root
+karaf.default.repository=system
+
diff --git a/karaf-2.2.x/main/src/test/resources/test-karaf-home/etc/startup.properties b/karaf-2.2.x/main/src/test/resources/test-karaf-home/etc/startup.properties
new file mode 100644
index 0000000..f894430
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/resources/test-karaf-home/etc/startup.properties
@@ -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.
+#
+################################################################################
+
+# This file allows you to control the start level of each bundle.
+#
+
+#
+# Startup core services like logging
+#
diff --git a/karaf-2.2.x/main/src/test/resources/test-karaf-home/system/org/apache/felix/org.apache.felix.framework/3.0.6/org.apache.felix.framework-3.0.6.jar b/karaf-2.2.x/main/src/test/resources/test-karaf-home/system/org/apache/felix/org.apache.felix.framework/3.0.6/org.apache.felix.framework-3.0.6.jar
new file mode 100755
index 0000000..41c3821
--- /dev/null
+++ b/karaf-2.2.x/main/src/test/resources/test-karaf-home/system/org/apache/felix/org.apache.felix.framework/3.0.6/org.apache.felix.framework-3.0.6.jar
Binary files differ
diff --git a/karaf-2.2.x/management/mbeans/bundles/NOTICE b/karaf-2.2.x/management/mbeans/bundles/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/bundles/pom.xml b/karaf-2.2.x/management/mbeans/bundles/pom.xml
new file mode 100644
index 0000000..bedfcf5
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.bundles</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Bundles</name>
+    <description>The Bundles MBean bundle provides a JMX MBean to manipulate OSGi bundles.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.bundles;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.bundles.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java b/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
new file mode 100644
index 0000000..0e8e9f8
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
@@ -0,0 +1,51 @@
+/*
+ * 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.karaf.management.mbeans.bundles;
+
+import javax.management.openmbean.TabularData;
+
+/**
+ * Bundles MBean.
+ */
+public interface BundlesMBean {
+
+    TabularData list() throws Exception;
+
+    int getStartLevel(String bundleId) throws Exception;
+    void setStartLevel(String bundleId, int bundleStartLevel) throws Exception;
+
+    void refresh() throws Exception;
+    void refresh(String bundleId) throws Exception;
+
+    void update(String bundleId) throws Exception;
+    void update(String bundleId, String location) throws Exception;
+
+    void resolve() throws Exception;
+    void resolve(String bundleId) throws Exception;
+
+    void restart(String bundleId) throws Exception;
+
+    long install(String url) throws Exception;
+    long install(String url, boolean start) throws Exception;
+
+    void start(String bundleId) throws Exception;
+
+    void stop(String bundleId) throws Exception;
+
+    void uninstall(String bundleId) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java b/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
new file mode 100644
index 0000000..4546c6c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
@@ -0,0 +1,280 @@
+/*
+ * 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.karaf.management.mbeans.bundles.internal;
+
+import org.apache.karaf.management.mbeans.bundles.BundlesMBean;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.service.startlevel.StartLevel;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.*;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.List;
+
+/**
+ * Bundles MBean implementation.
+ */
+public class BundlesMBeanImpl extends StandardMBean implements BundlesMBean {
+
+    private BundleContext bundleContext;
+
+    public BundlesMBeanImpl() throws NotCompliantMBeanException {
+        super(BundlesMBean.class);
+    }
+
+    public TabularData list() throws Exception {
+        ServiceReference startLevelReference = bundleContext.getServiceReference(StartLevel.class.getName());
+        StartLevel startLevel = null;
+        if (startLevelReference != null) {
+            startLevel = (StartLevel) bundleContext.getService(startLevelReference);
+        }
+
+        CompositeType bundleType = new CompositeType("Bundle", "OSGi Bundle",
+                new String[]{"ID", "Name", "Version", "Start Level", "State"},
+                new String[]{"ID of the Bundle", "Name of the Bundle", "Version of the Bundle", "Start Level of the Bundle", "Current State of the Bundle"},
+                new OpenType[]{SimpleType.LONG, SimpleType.STRING, SimpleType.STRING, SimpleType.INTEGER, SimpleType.STRING});
+        TabularType tableType = new TabularType("Bundles", "Tables of all Bundles", bundleType, new String[]{"ID"});
+        TabularData table = new TabularDataSupport(tableType);
+
+        Bundle[] bundles = bundleContext.getBundles();
+
+        for (int i = 0; i < bundles.length; i++) {
+            try {
+                int bundleStartLevel = 1;
+                if (startLevel != null) {
+                    bundleStartLevel = startLevel.getBundleStartLevel(bundles[i]);
+                }
+                int bundleState = bundles[i].getState();
+                String bundleStateString;
+                if (bundleState == Bundle.ACTIVE)
+                    bundleStateString = "ACTIVE";
+                else if (bundleState == Bundle.INSTALLED)
+                    bundleStateString = "INSTALLED";
+                else if (bundleState == Bundle.RESOLVED)
+                    bundleStateString = "RESOLVED";
+                else if (bundleState == Bundle.STARTING)
+                    bundleStateString = "STARTING";
+                else if (bundleState == Bundle.STOPPING)
+                    bundleStateString = "STOPPING";
+                else bundleStateString = "UNKNOWN";
+                CompositeData data = new CompositeDataSupport(bundleType,
+                        new String[]{"ID", "Name", "Version", "Start Level", "State"},
+                        new Object[]{bundles[i].getBundleId(), bundles[i].getSymbolicName(), bundles[i].getVersion().toString(), bundleStartLevel, bundleStateString});
+                table.put(data);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        bundleContext.ungetService(startLevelReference);
+
+        return table;
+    }
+
+    public int getStartLevel(String bundleId) throws Exception {
+        ServiceReference startLevelReference = bundleContext.getServiceReference(StartLevel.class.getName());
+        if (startLevelReference == null) {
+            throw new IllegalStateException("StartLevel service is not available");
+        }
+        StartLevel startLevel = (StartLevel) bundleContext.getService(startLevelReference);
+        if (startLevel == null) {
+            throw new IllegalStateException("StartLevel service is not available");
+        }
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        if (bundles.size() != 1) {
+            throw new IllegalArgumentException("Provided bundle Id doesn't return any bundle or more than one bundle selected");
+        }
+
+        int bundleStartLevel = startLevel.getBundleStartLevel(bundles.get(0));
+        bundleContext.ungetService(startLevelReference);
+        return bundleStartLevel;
+    }
+
+    public void setStartLevel(String bundleId, int bundleStartLevel) throws Exception {
+        ServiceReference startLevelReference = bundleContext.getServiceReference(StartLevel.class.getName());
+        if (startLevelReference == null) {
+            throw new IllegalStateException("StartLevel service is not available");
+        }
+        StartLevel startLevel = (StartLevel) bundleContext.getService(startLevelReference);
+        if (startLevel == null) {
+            throw new IllegalStateException("StartLevel service is not available");
+        }
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            startLevel.setBundleStartLevel(bundle, bundleStartLevel);
+        }
+
+        bundleContext.ungetService(startLevelReference);
+    }
+
+    public void refresh() throws Exception {
+        ServiceReference packageAdminReference = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (packageAdminReference == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminReference);
+        if (packageAdmin == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+        packageAdmin.refreshPackages(null);
+        getBundleContext().ungetService(packageAdminReference);
+    }
+
+    public void refresh(String bundleId) throws Exception {
+        ServiceReference packageAdminReference = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (packageAdminReference == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminReference);
+        if (packageAdmin == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        Bundle[] bundlesArray = new Bundle[bundles.size()];
+        packageAdmin.refreshPackages(bundles.toArray(bundlesArray));
+
+        getBundleContext().ungetService(packageAdminReference);
+    }
+
+    public void update(String bundleId) throws Exception {
+        update(bundleId, null);
+    }
+
+    public void update(String bundleId, String location) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        if (location == null) {
+            for (Bundle bundle : bundles) {
+                bundle.update();
+            }
+            return;
+        }
+
+        if (bundles.size() != 1) {
+            throw new IllegalArgumentException("Provided bundle Id doesn't return any bundle or more than one bundle selected");
+        }
+
+        InputStream is = new URL(location).openStream();
+        bundles.get(0).update(is);
+    }
+
+    public void resolve() throws Exception {
+        ServiceReference packageAdminReference = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (packageAdminReference == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminReference);
+        if (packageAdmin == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+        packageAdmin.resolveBundles(null);
+        getBundleContext().ungetService(packageAdminReference);
+    }
+
+    public void resolve(String bundleId) throws Exception {
+        ServiceReference packageAdminReference = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (packageAdminReference == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(packageAdminReference);
+        if (packageAdmin == null) {
+            throw new IllegalStateException("PackageAdmin service is not available");
+        }
+
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        Bundle[] bundlesArray = new Bundle[bundles.size()];
+        packageAdmin.resolveBundles(bundles.toArray(bundlesArray));
+
+        getBundleContext().ungetService(packageAdminReference);
+    }
+
+    public void restart(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.stop();
+            bundle.start();
+        }
+        ;
+    }
+
+    public long install(String url) throws Exception {
+        return install(url, false);
+    }
+
+    public long install(String url, boolean start) throws Exception {
+        Bundle bundle = bundleContext.installBundle(url, null);
+        if (start) {
+            bundle.start();
+        }
+        return bundle.getBundleId();
+    }
+
+    public void start(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.start();
+        }
+    }
+
+    public void stop(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.stop();
+        }
+    }
+
+    public void uninstall(String bundleId) throws Exception {
+        BundlesSelector selector = new BundlesSelector(bundleContext);
+        List<Bundle> bundles = selector.selectBundles(bundleId);
+
+        for (Bundle bundle : bundles) {
+            bundle.uninstall();
+        }
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java b/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java
new file mode 100644
index 0000000..91b222e
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java
@@ -0,0 +1,169 @@
+/*
+ * 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.karaf.management.mbeans.bundles.internal;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Bundles selector which is able to get a bundle by ID, ID range, name, and version.
+ */
+public class BundlesSelector {
+
+    private BundleContext bundleContext;
+
+    public BundlesSelector(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    /**
+     * Select bundles with ID, ID range, name, and version.
+     *
+     * @param bundleId the bundles ID for selection.
+     * @return the corresponding bundles found.
+     * @throws Exception in case of selection
+     */
+    public List<Bundle> selectBundles(String bundleId) throws Exception {
+        List<Bundle> bundles = new ArrayList<Bundle>();
+        if (bundleId != null && bundleId.length() > 0) {
+
+            // bundle ID is a number
+            Pattern pattern = Pattern.compile("^\\d+$");
+            Matcher matcher = pattern.matcher(bundleId);
+            if (matcher.find()) {
+                Bundle bundle = this.getBundleById(bundleId);
+                bundles.add(bundle);
+                return bundles;
+            }
+
+            // bundle is an ID range
+            pattern = Pattern.compile("^(\\d+)-(\\d+)$");
+            matcher = pattern.matcher(bundleId);
+            if (matcher.find()) {
+                int index = bundleId.indexOf('-');
+                long startId = Long.parseLong(bundleId.substring(0, index));
+                long stopId = Long.parseLong(bundleId.substring(index + 1));
+                if (startId < stopId) {
+                    for (long i = startId; i <= stopId; i++) {
+                        Bundle bundle = bundleContext.getBundle(i);
+                        bundles.add(bundle);
+                    }
+                }
+                return bundles;
+            }
+
+            // bundle ID is name/version
+            int index = bundleId.indexOf('/');
+            if (index != -1) {
+                // user has provided name and version
+                return this.getBundleByNameAndVersion(bundleId.substring(0, index), bundleId.substring(index + 1));
+            } else {
+                // user has provided only name
+                return this.getBundleByName(bundleId);
+            }
+
+
+        }
+        return bundles;
+    }
+
+    /**
+     * Get a bundle with the bundle ID.
+     *
+     * @param id the bundle ID.
+     * @return the corresponding bundle.
+     */
+    private Bundle getBundleById(String id) {
+        Bundle bundle = null;
+        try {
+            long idNumber = Long.parseLong(id);
+            bundle = bundleContext.getBundle(idNumber);
+        } catch (Exception e) {
+            // ignore
+        }
+        return bundle;
+    }
+
+    /**
+     * Get a bundles list with the name or symbolic name matching the pattern.
+     *
+     * @param name the bundle name or symbolic name pattern to match.
+     * @return the bundles list.
+     */
+    private List<Bundle> getBundleByName(String name) {
+        return getBundleByNameAndVersion(name, null);
+    }
+
+    /**
+     * Get a bundles list with the name or symbolic name matching the name pattern and version matching the version pattern.
+     *
+     * @param name    the bundle name or symbolic name regex to match.
+     * @param version the bundle version regex to match.
+     * @return the bundles list.
+     */
+    private List<Bundle> getBundleByNameAndVersion(String name, String version) {
+        Bundle[] bundles = bundleContext.getBundles();
+
+        ArrayList<Bundle> result = new ArrayList<Bundle>();
+
+        Pattern namePattern = Pattern.compile(name);
+
+        for (int i = 0; i < bundles.length; i++) {
+
+            String bundleSymbolicName = bundles[i].getSymbolicName();
+            // skip bundles without Bundle-SymbolicName header
+            if (bundleSymbolicName == null) {
+                continue;
+            }
+
+            Matcher symbolicNameMatcher = namePattern.matcher(bundleSymbolicName);
+
+            Matcher nameMatcher = null;
+            String bundleName = (String) bundles[i].getHeaders().get(Constants.BUNDLE_NAME);
+            if (bundleName != null) {
+                nameMatcher = namePattern.matcher(bundleName);
+            }
+
+            if (version != null) {
+                String bundleVersion = (String) bundles[i].getHeaders().get(Constants.BUNDLE_VERSION);
+                if (bundleVersion != null) {
+                    boolean nameMatch = (nameMatcher != null && nameMatcher.find()) || symbolicNameMatcher.find();
+                    if (nameMatch) {
+                        Pattern versionPattern = Pattern.compile(version);
+                        Matcher versionMatcher = versionPattern.matcher(bundleVersion);
+                        if (versionMatcher.find()) {
+                            result.add(bundles[i]);
+                        }
+                    }
+                }
+            } else {
+                boolean nameMatch = (nameMatcher != null && nameMatcher.find()) || symbolicNameMatcher.find();
+                if (nameMatch) {
+                    result.add(bundles[i]);
+                }
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/bundles/src/main/resources/OSGI-INF/blueprint/bundles-management.xml b/karaf-2.2.x/management/mbeans/bundles/src/main/resources/OSGI-INF/blueprint/bundles-management.xml
new file mode 100644
index 0000000..627c3fe
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/src/main/resources/OSGI-INF/blueprint/bundles-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Bundles MBean -->
+    <bean id="bundlesMBean" class="org.apache.karaf.management.mbeans.bundles.internal.BundlesMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- MBean Registrer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=bundles,name=${karaf.name}" key-ref="bundlesMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/bundles/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/bundles/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..bc836a0
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/bundles/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,32 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The bundles mbean management bundle exposes a Bundles MBean that can be used with any JMX client (for instance JConsole).
+
+    The bundles MBean allows quite the same actions that can be performed using osgi:* (and bundles:*) commands:
+    \u001B[36mlist()\u001B[0m
+    \u001B[36mgetStartLevel(bundleId)\u001B[0m
+    \u001B[36msetStartLevel(bundleId, startLevel)\u001B[0m
+    \u001B[36mrefresh()\u001B[0m
+    \u001B[36mrefresh(bundleId)\u001B[0m
+    \u001B[36mupdate(bundleId)\u001B[0m
+    \u001B[36mupdate(bundleId, location)\u001B[0m
+    \u001B[36mresolve()\u001B[0m
+    \u001B[36mresolve(bundleId)\u001B[0m
+    \u001B[36mrestart(bundleId)\u001B[0m
+    \u001B[36minstall(url)\u001B[0m
+    \u001B[36minstall(url, start)\u001B[0m
+    \u001B[36mstart(bundleId)\u001B[0m
+    \u001B[36mstop(bundleId)\u001B[0m
+    \u001B[36muninstall(bundleId)\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/config/NOTICE b/karaf-2.2.x/management/mbeans/config/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/config/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/config/pom.xml b/karaf-2.2.x/management/mbeans/config/pom.xml
new file mode 100644
index 0000000..6db818c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/config/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.config</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Config</name>
+    <description>This bundle provides a JMX MBean to manipulate the Karaf ConfigAdmin layer.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${project.basedir}/../../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.config*;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.config.internal,
+                            org.apache.felix.utils.properties;-split-package:=merge-first,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/ConfigMBean.java b/karaf-2.2.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/ConfigMBean.java
new file mode 100644
index 0000000..aee50ac
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/ConfigMBean.java
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+package org.apache.karaf.management.mbeans.config;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * MBean to manipulate the Config layer.
+ */
+public interface ConfigMBean {
+
+    /**
+     * Get the list of all configuration PIDs.
+     *
+     * @return the list of all configuration PIDs.
+     * @throws Exception
+     */
+    List<String> list() throws Exception;
+
+    /**
+     * Create a new configuration for the given PID.
+     *
+     * @param pid the configuration PID.
+     * @throws Exception
+     */
+    void create(String pid) throws Exception;
+
+    /**
+     * Delete a configuration identified by the given PID.
+     *
+     * @param pid the configuration PID to delete.
+     * @throws Exception
+     */
+    void delete(String pid) throws Exception;
+
+    /**
+     * Get the list of properties for a configuration PID.
+     *
+     * @param pid the configuration PID.
+     * @return the list of properties.
+     * @throws Exception
+     */
+    Map<String, String> proplist(String pid) throws Exception;
+
+    /**
+     * Remove the configuration property identified by the given key.
+     *
+     * @param pid the configuration PID.
+     * @param key the property key.
+     * @throws Exception
+     */
+    void propdel(String pid, String key) throws Exception;
+
+    /**
+     * Append (or add) a value for the given configuration key.
+     *
+     * @param pid the configuration PID.
+     * @param key the property key.
+     * @param value the value to append to the current property value.
+     * @throws Exception
+     */
+    void propappend(String pid, String key, String value) throws Exception;
+
+    /**
+     * Set a configuration property.
+     *
+     * @param pid the configuration PID.
+     * @param key the property key.
+     * @param value the property value.
+     * @throws Exception
+     */
+    void propset(String pid, String key, String value) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java b/karaf-2.2.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
new file mode 100644
index 0000000..6f4e8a5
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
@@ -0,0 +1,266 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.management.mbeans.config.internal;
+
+import org.apache.felix.fileinstall.ArtifactInstaller;
+import org.apache.felix.utils.properties.Properties;
+import org.apache.karaf.management.mbeans.config.ConfigMBean;
+import org.osgi.framework.Constants;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * Implementation of the ConfigMBean.
+ */
+public class ConfigMBeanImpl extends StandardMBean implements ConfigMBean {
+    private static final Logger LOG = LoggerFactory.getLogger(ConfigMBeanImpl.class);
+    
+    private final String FELIX_FILEINSTALL_FILENAME = "felix.fileinstall.filename";
+
+    private ConfigurationAdmin configurationAdmin;
+    private List<ArtifactInstaller> artifactInstallers;
+    private File storage;
+
+    public ConfigurationAdmin getConfigurationAdmin() {
+        return this.configurationAdmin;
+    }
+
+    public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
+        this.configurationAdmin = configurationAdmin;
+    }
+
+    public File getStorage() {
+        return this.storage;
+    }
+
+    public void setStorage(File storage) {
+        this.storage = storage;
+    }
+
+    public void setArtifactInstallers(List<ArtifactInstaller> artifactInstallers) {
+        this.artifactInstallers = artifactInstallers;
+    }
+
+    public ConfigMBeanImpl() throws NotCompliantMBeanException {
+        super(ConfigMBean.class);
+    }
+
+    public List<String> list() throws Exception {
+        Configuration[] configurations = configurationAdmin.listConfigurations(null);
+        List<String> pids = new ArrayList<String>();
+        for (int i = 0; i < configurations.length; i++) {
+            pids.add(configurations[i].getPid());
+        }
+        return pids;
+    }
+
+    public void create(String pid) throws Exception {
+        store(pid, new Hashtable(), false);
+    }
+
+    public void delete(String pid) throws Exception {
+        Configuration configuration = configurationAdmin.getConfiguration(pid);
+        if (configuration == null) {
+            throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
+        }
+        configuration.delete();
+        if (storage != null) {
+            File cfgFile = new File(storage, pid + ".cfg");
+            cfgFile.delete();
+        }
+    }
+
+    public Map<String, String> proplist(String pid) throws Exception {
+        Configuration configuration = configurationAdmin.getConfiguration(pid);
+        if (configuration == null) {
+            throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
+        }
+        Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
+        Map<String, String> propertiesMap = new HashMap<String, String>();
+        for (Enumeration e = dictionary.keys(); e.hasMoreElements(); ) {
+            Object key = e.nextElement();
+            Object value = dictionary.get(key);
+            propertiesMap.put(key.toString(), value.toString());
+        }
+        return propertiesMap;
+    }
+
+    public void propdel(String pid, String key) throws Exception {
+        Configuration configuration = configurationAdmin.getConfiguration(pid);
+        if (configuration == null) {
+            throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
+        }
+        Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
+        dictionary.remove(key);
+        store(pid, dictionary, false);
+    }
+
+    public void propappend(String pid, String key, String value) throws Exception {
+        Configuration configuration = configurationAdmin.getConfiguration(pid);
+        if (configuration == null) {
+            throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
+        }
+        Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
+        Object currentValue = dictionary.get(key);
+        if (currentValue == null) {
+            dictionary.put(key, value);
+        } else if (currentValue instanceof String) {
+            dictionary.put(key, currentValue + value);
+        } else {
+            throw new IllegalStateException("Current value is not a String");
+        }
+        store(pid, dictionary, false);
+    }
+
+    public void propset(String pid, String key, String value) throws Exception {
+        Configuration configuration = configurationAdmin.getConfiguration(pid);
+        if (configuration == null) {
+            throw new IllegalArgumentException("Configuration PID " + pid + " doesn't exist");
+        }
+        Dictionary dictionary = configuration.getProperties();
+
+        if (dictionary == null) {
+            dictionary = new java.util.Properties();
+        }
+
+        dictionary.put(key, value);
+        store(pid, dictionary, false);
+    }
+
+    /**
+     * Store/flush a configuration PID into the configuration file.
+     *
+     * @param pid        the configuration PID.
+     * @param properties the configuration properties.
+     * @throws Exception
+     */
+    private void store(String pid, Dictionary properties, boolean bypassStorage) throws Exception {
+        if (!bypassStorage && storage != null) {
+            File storageFile = new File(storage, pid + ".cfg");
+            Configuration configuration = configurationAdmin.getConfiguration(pid, null);
+            if (configuration != null && configuration.getProperties() != null) {
+                Object val = configuration.getProperties().get(FELIX_FILEINSTALL_FILENAME);
+                try {
+                    if (val instanceof URL) {
+                        storageFile = new File(((URL) val).toURI());
+                    }
+                    if (val instanceof URI) {
+                        storageFile = new File((URI) val);
+                    }
+                    if (val instanceof String) {
+                        storageFile = new File(new URL((String) val).toURI());
+                    }
+                } catch (Exception e) {
+                    throw (IOException) new IOException(e.getMessage()).initCause(e);
+                }
+            }
+            Properties p = new Properties(storageFile);
+            p.clear();
+            for (Enumeration keys = properties.keys(); keys.hasMoreElements(); ) {
+                Object key = keys.nextElement();
+                if (!Constants.SERVICE_PID.equals(key)
+                        && !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
+                        && !FELIX_FILEINSTALL_FILENAME.equals(key)) {
+                    p.put((String) key, (String) properties.get(key));
+                }
+            }
+            // remove "removed" properties from the file
+            ArrayList<String> propertiesToRemove = new ArrayList<String>();
+            for (Object key : p.keySet()) {
+                if (properties.get(key) == null
+                        && !Constants.SERVICE_PID.equals(key)
+                        && !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
+                        && !FELIX_FILEINSTALL_FILENAME.equals(key)) {
+                    propertiesToRemove.add(key.toString());
+                }
+            }
+            for (String key : propertiesToRemove) {
+                p.remove(key);
+            }
+            // save the cfg file
+            storage.mkdirs();
+            p.save();
+            updateFileInstall(storageFile);
+        } else {
+            Configuration cfg = configurationAdmin.getConfiguration(pid, null);
+            if (cfg.getProperties() == null) {
+                String[] pids = parsePid(pid);
+                if (pids[1] != null) {
+                    cfg = configurationAdmin.createFactoryConfiguration(pids[0], null);
+                }
+            }
+            if (cfg.getBundleLocation() != null) {
+                cfg.setBundleLocation(null);
+            }
+            cfg.update(properties);
+        }
+    }
+    
+    /**
+     * Trigger felix fileinstall to update the config so there is no delay till it polls the file
+     * 
+     * @param storageFile
+     * @throws Exception
+     */
+    private void updateFileInstall(File storageFile) {
+        if (artifactInstallers != null) {
+            for (ArtifactInstaller installer : artifactInstallers) {
+                if (installer.canHandle(storageFile)) {
+                    try {
+                        installer.update(storageFile);
+                    } catch (Exception e) {
+                        LOG.warn("Error updating config " + storageFile + " in felix fileinstall" + e.getMessage(), e);
+                    }
+                }
+            }
+        }
+    }
+
+    private String[] parsePid(String pid) {
+        int n = pid.indexOf('-');
+        if (n > 0) {
+            String factoryPid = pid.substring(n + 1);
+            pid = pid.substring(0, n);
+            return new String[] { pid, factoryPid };
+        } else {
+            return new String[] { pid, null };
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/config/src/main/resources/OSGI-INF/blueprint/config-management.xml b/karaf-2.2.x/management/mbeans/config/src/main/resources/OSGI-INF/blueprint/config-management.xml
new file mode 100644
index 0000000..0b8716b
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/config/src/main/resources/OSGI-INF/blueprint/config-management.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <!-- Reference to the MBean server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Reference to the configuration admin -->
+    <reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"  />
+
+    <!-- Config MBean -->
+    <bean id="configMBean" class="org.apache.karaf.management.mbeans.config.internal.ConfigMBeanImpl">
+        <property name="configurationAdmin" ref="configurationAdmin"/>
+        <property name="storage" value="${storage}"/>
+        <property name="artifactInstallers" ref="artifactInstallers" />
+    </bean>
+    
+    <reference-list id="artifactInstallers" interface="org.apache.felix.fileinstall.ArtifactInstaller" availability="optional" />
+
+    <!-- Register MBean in the MBeanServer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=config,name=${karaf.name}" key-ref="configMBean"/>
+            </map>
+        </property>
+    </bean>
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" />
+
+    <cm:property-placeholder persistent-id="org.apache.karaf.management.mbeans.config">
+        <cm:default-properties>
+            <cm:property name="storage" value="$[karaf.base]/etc/"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/config/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/config/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..19c54db
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/config/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,25 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The config mbean management bundle exposes a Config MBean that can used with any JMX client (for instance JConsole).
+
+    The config MBean allows quite the same actions that can be performed using config:* commands:
+    \u001B[36mlist()\u001B[0m
+    \u001B[36mcreate(pid)\u001B[0m
+    \u001B[36mdelete(pid)\u001B[0m
+    \u001B[36mrproplist(pid)\u001B[0m
+    \u001B[36mrpropdel(pid,key,bypassStorage)\u001B[0m
+    \u001B[36mrpropappend(pid,key,value,bypassStorage)\u001B[0m
+    \u001B[36mrpropset(pid,key,value,bypassStorage)\u001B[0m
+
+    Just as with the config:* commands, the Config MBean is able to flush changes into the etc files.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
diff --git a/karaf-2.2.x/management/mbeans/dev/NOTICE b/karaf-2.2.x/management/mbeans/dev/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/dev/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/dev/pom.xml b/karaf-2.2.x/management/mbeans/dev/pom.xml
new file mode 100644
index 0000000..9d7ac16
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/dev/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.dev</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Dev</name>
+    <description>This bundle provides a JMX MBean for dev utils actions.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.dev;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.dev,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.dev.internal,
+                            org.apache.felix.utils.properties,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/DevMBean.java b/karaf-2.2.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/DevMBean.java
new file mode 100644
index 0000000..6adb4b1
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/DevMBean.java
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.management.mbeans.dev;
+
+import java.util.List;
+
+/**
+ * MBean providing dev actions.
+ */
+public interface DevMBean {
+
+    /**
+     * Get the current OSGi framework in use.
+     *
+     * @return the name of the OSGi framework in use.
+     * @throws Exception
+     */
+    String framework() throws Exception;
+
+    /**
+     * OSGi framework options.
+     *
+     * @param debug enable debug of the OSGi framework to use.
+     * @param framework name of the OSGI framework to use.
+     * @throws Exception
+     */
+    void frameworkOptions(boolean debug, String framework) throws Exception;
+
+    /**
+     * Restart Karaf, with eventually a cleanup.
+     *
+     * @param clean if true, Karaf is cleanup, false else.
+     * @throws Exception
+     */
+    void restart(boolean clean) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/internal/DevMBeanImpl.java b/karaf-2.2.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/internal/DevMBeanImpl.java
new file mode 100644
index 0000000..117a6d8
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/internal/DevMBeanImpl.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.management.mbeans.dev.internal;
+
+import org.apache.felix.utils.properties.Properties;
+import org.apache.karaf.management.mbeans.dev.DevMBean;
+import org.osgi.framework.BundleContext;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.Scanner;
+
+/**
+ * Implementation of the DevMBean.
+ */
+public class DevMBeanImpl extends StandardMBean implements DevMBean {
+
+    private BundleContext bundleContext;
+
+    public DevMBeanImpl() throws NotCompliantMBeanException {
+        super(DevMBean.class);
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public String framework() throws Exception {
+        if (bundleContext.getBundle(0).getSymbolicName().contains("felix")) {
+            return "Felix";
+        } else {
+            return "Equinox";
+        }
+    }
+
+    public void frameworkOptions(boolean debug, String framework) throws Exception {
+        Properties properties = new Properties(new File(System.getProperty("karaf.base"), "etc/config.properties"));
+        if (framework != null) {
+            // swtich the framework is use
+            if (!framework.equalsIgnoreCase("felix") && !framework.equalsIgnoreCase("equinox")) {
+                throw new IllegalArgumentException("Unsupported framework " + framework);
+            }
+            properties.put("karaf.framework", framework.toLowerCase());
+        }
+        if (framework == null) {
+            if (bundleContext.getBundle(0).getSymbolicName().contains("felix")) {
+                framework = "felix";
+            } else {
+                framework = "equinox";
+            }
+        }
+        if (framework.equals("felix")) {
+            properties.put("felix.log.level", "4");
+        } else {
+            properties.put("osgi.debug", "etc/equinox-debug.properties");
+            // TODO populate the equinox-debug.properties file with the one provided in shell/dev module
+        }
+        properties.save();
+    }
+
+    public void restart(boolean clean) throws Exception {
+        System.setProperty("karaf.restart", "true");
+        System.setProperty("karaf.restart.clean", Boolean.toString(clean));
+        bundleContext.getBundle(0).stop();
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/dev/src/main/resources/OSGI-INF/blueprint/dev-management.xml b/karaf-2.2.x/management/mbeans/dev/src/main/resources/OSGI-INF/blueprint/dev-management.xml
new file mode 100644
index 0000000..1852791
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/dev/src/main/resources/OSGI-INF/blueprint/dev-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Dev MBean -->
+    <bean id="devMBean" class="org.apache.karaf.management.mbeans.dev.internal.DevMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- Register Dev MBean in the MBean Server -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=dev,name=${karaf.name}" key-ref="devMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/dev/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/dev/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..25423ef
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/dev/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,20 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The dev mbean management bundle exposes a Dev MBean that can be used with any JMX client (for instance JConsole).
+
+    The dev MBean allows quite the same actions that can be performed using dev:* commands:
+    \u001B[36mframework()\u001B[0m
+    \u001B[36mframeworkOptions(debug, framework)\u001B[0m
+    \u001B[36mrestart(clean)\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/log/NOTICE b/karaf-2.2.x/management/mbeans/log/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/log/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/log/pom.xml b/karaf-2.2.x/management/mbeans/log/pom.xml
new file mode 100644
index 0000000..5db82f1
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/log/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.log</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Log</name>
+    <description>The log mbean bundle provides a Log JMX MBean which allow you to manipulate the Karaf log layer.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-service</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-api</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.log;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.log,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.log.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/LogMBean.java b/karaf-2.2.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/LogMBean.java
new file mode 100644
index 0000000..7adb49c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/LogMBean.java
@@ -0,0 +1,32 @@
+/*
+ * 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.karaf.management.mbeans.log;
+
+import java.util.List;
+
+/**
+ * Log MBean.
+ */
+public interface LogMBean {
+
+    void set(String level) throws Exception;
+    void set(String level, String logger) throws Exception;
+
+    String get() throws Exception;
+    String get(String logger) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java b/karaf-2.2.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java
new file mode 100644
index 0000000..e125307
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java
@@ -0,0 +1,194 @@
+/*
+ * 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.karaf.management.mbeans.log.internal;
+
+import org.apache.karaf.management.mbeans.log.LogMBean;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * Implementation of the Log MBean.
+ */
+public class LogMBeanImpl extends StandardMBean implements LogMBean {
+
+    static final String CONFIGURATION_PID = "org.ops4j.pax.logging";
+    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
+    static final String LOGGER_PREFIX = "log4j.logger.";
+    static final String ROOT_LOGGER = "ROOT";
+
+    private BundleContext bundleContext;
+
+    public LogMBeanImpl() throws NotCompliantMBeanException {
+        super(LogMBean.class);
+    }
+
+    public void set(String level) throws Exception {
+        set(level, null);
+    }
+
+    public void set(String level, String logger) throws Exception {
+        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            logger = null;
+        }
+
+        // make sure both uppercase and lowercase levels are supported
+        level = level.toUpperCase();
+
+        if (!level.equals("TRACE") && !level.equals("DEBUG") && !level.equals("INFO")
+                && !level.equals("WARN") && !level.equals("ERROR") && !level.equals("DEFAULT")) {
+            throw new IllegalArgumentException("level must be set to TRACE, DEBUG, INFO, WARN or ERROR (or DEFAULT to unset it)");
+        }
+
+        Configuration cfg = getConfiguration();
+        Dictionary props = cfg.getProperties();
+
+        String val;
+        String prop;
+        if (logger == null) {
+            prop = ROOT_LOGGER_PREFIX;
+        } else {
+            prop = LOGGER_PREFIX + logger;
+        }
+        val = (String) props.get(prop);
+        if (level.equals("DEFAULT")) {
+            if (val != null) {
+                val = val.trim();
+                int idx = val.indexOf(",");
+                if (idx < 0) {
+                    val = null;
+                } else {
+                    val = val.substring(idx);
+                }
+            }
+        } else {
+            if (val == null) {
+                val = level;
+            } else {
+                val = val.trim();
+                int idx = val.indexOf(",");
+                if (idx < 0) {
+                    val = level;
+                } else {
+                    val = level + val.substring(idx);
+                }
+            }
+        }
+        if (val == null) {
+            props.remove(prop);
+        } else {
+            props.put(prop, val);
+        }
+        cfg.update(props);
+    }
+
+    public String get() throws Exception {
+        return get(null);
+    }
+
+    public String get(String logger) throws Exception {
+        ConfigurationAdmin cfgAdmin = getConfigAdmin();
+        Configuration cfg = cfgAdmin.getConfiguration(CONFIGURATION_PID, null);
+        Dictionary props = cfg.getProperties();
+
+        if (ROOT_LOGGER.equalsIgnoreCase(logger)) {
+            logger = null;
+        }
+
+        String val;
+        for (; ; ) {
+            String prop;
+            if (logger == null) {
+                prop = ROOT_LOGGER_PREFIX;
+            } else {
+                prop = LOGGER_PREFIX + logger;
+            }
+            val = (String) props.get(prop);
+            val = getLevel(val);
+            if (val != null || logger == null) {
+                break;
+            }
+            int idx = logger.lastIndexOf('.');
+            if (idx < 0) {
+                logger = null;
+            } else {
+                logger = logger.substring(0, idx);
+            }
+        }
+        String st = "Level: " + val;
+        return st;
+    }
+
+    private boolean checkIfFromRequestedLog(PaxLoggingEvent event, String logger) {
+        return (event.getLoggerName().lastIndexOf(logger) >= 0) ? true : false;
+    }
+
+    private String render(PaxLoggingEvent event) {
+        StringBuffer sb = new StringBuffer();
+        sb.setLength(0);
+        if (event.getThrowableStrRep() != null) {
+            for (String r : event.getThrowableStrRep()) {
+                sb.append(r).append('\n');
+            }
+        }
+        return sb.toString();
+    }
+
+    private String getLevel(String prop) {
+        if (prop == null) {
+            return null;
+        } else {
+            String val = prop.trim();
+            int idx = val.indexOf(",");
+            if (idx == 0) {
+                val = null;
+            } else if (idx > 0) {
+                val = val.substring(0, idx);
+            }
+            return val;
+        }
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    protected Configuration getConfiguration() throws IOException {
+        Configuration cfg = getConfigAdmin().getConfiguration(CONFIGURATION_PID, null);
+        return cfg;
+    }
+
+    protected ConfigurationAdmin getConfigAdmin() {
+        ServiceReference ref = bundleContext.getServiceReference(ConfigurationAdmin.class.getName());
+        if (ref != null) {
+            return (ConfigurationAdmin) bundleContext.getService(ref);
+        }
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml b/karaf-2.2.x/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml
new file mode 100644
index 0000000..a130e95
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Log MBean -->
+    <bean id="logMBean" class="org.apache.karaf.management.mbeans.log.internal.LogMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- Register MBean in the MBean Server -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=log,name=${karaf.name}" key-ref="logMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/log/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/log/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..4550dcc
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/log/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,23 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The log mbean management bundle exposes a Log MBean that can be used with any JMX client (for instance JConsole).
+
+    The Log MBean allows quite the same actions that can performed using log:* commands:
+    \u001B[36mdisplay()\u001B[0m
+    \u001B[36mdisplay(logger)\u001B[0m
+    \u001B[36mget()\u001B[0m
+    \u001B[36mget(logger)\u001B[0m
+    \u001B[36mset(level)\u001B[0m
+    \u001B[36mlist(level, logger)\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/obr/NOTICE b/karaf-2.2.x/management/mbeans/obr/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/obr/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/obr/pom.xml b/karaf-2.2.x/management/mbeans/obr/pom.xml
new file mode 100644
index 0000000..f50a592
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/obr/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.obr</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: OBR</name>
+    <description>The OBR MBean bundle provides a JMX MBean which allows you to manipulate the Karaf OBR layer.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.obr;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.obr,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.obr.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/ObrMBean.java b/karaf-2.2.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/ObrMBean.java
new file mode 100644
index 0000000..8f38748
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/ObrMBean.java
@@ -0,0 +1,36 @@
+/*
+ * 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.karaf.management.mbeans.obr;
+
+import javax.management.openmbean.TabularData;
+import java.util.List;
+
+/**
+ * OBR MBean.
+ */
+public interface ObrMBean {
+
+    List<String> listUrls() throws Exception;
+    void addUrl(String url) throws Exception;
+    void removeUrl(String url) throws Exception;
+    void refreshUrl(String url) throws Exception;
+
+    TabularData list() throws Exception;
+    void deploy(String bundle) throws Exception;
+    void deploy(String bundle, boolean start) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/internal/ObrMBeanImpl.java b/karaf-2.2.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/internal/ObrMBeanImpl.java
new file mode 100644
index 0000000..38a774c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/internal/ObrMBeanImpl.java
@@ -0,0 +1,189 @@
+/*
+ * 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.karaf.management.mbeans.obr.internal;
+
+import org.apache.felix.bundlerepository.*;
+import org.apache.karaf.management.mbeans.obr.ObrMBean;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.Version;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Implementation of the OBR MBean.
+ */
+public class ObrMBeanImpl extends StandardMBean implements ObrMBean {
+
+    private static final char VERSION_DELIM = ',';
+
+    private BundleContext bundleContext;
+    private RepositoryAdmin repositoryAdmin;
+
+    public ObrMBeanImpl() throws NotCompliantMBeanException {
+        super(ObrMBean.class);
+    }
+
+    public List<String> listUrls() throws Exception {
+        Repository[] repositories = repositoryAdmin.listRepositories();
+        List<String> urls = new ArrayList<String>();
+        for (int i = 0; i < repositories.length; i++) {
+            urls.add(repositories[i].getURI());
+        }
+        return urls;
+    }
+
+    public void addUrl(String url) throws Exception {
+        repositoryAdmin.addRepository(url);
+    }
+
+    public void removeUrl(String url) throws Exception {
+        repositoryAdmin.removeRepository(url);
+    }
+
+    public void refreshUrl(String url) throws Exception {
+        repositoryAdmin.addRepository(url);
+    }
+
+    public TabularData list() throws Exception {
+        CompositeType bundleType = new CompositeType("OBR Resource", "Bundle available in the OBR",
+                new String[]{"presentationname", "symbolicname", "version"},
+                new String[]{"Presentation Name", "Symbolic Name", "Version"},
+                new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING});
+        TabularType tableType = new TabularType("OBR Resources", "Table of all resources/bundles available in the OBR",
+                bundleType, new String[]{"presentationname"});
+        TabularData table = new TabularDataSupport(tableType);
+
+        Resource[] resources = repositoryAdmin.discoverResources("(|(presentationname=*)(symbolicname=*))");
+        for (int i = 0; i < resources.length; i++) {
+            try {
+                CompositeData data = new CompositeDataSupport(bundleType,
+                        new String[]{"presentationname", "symbolicname", "version"},
+                        new Object[]{resources[i].getPresentationName(), resources[i].getSymbolicName(), resources[i].getVersion()});
+                table.put(data);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+
+        return table;
+    }
+
+    public void deploy(String bundle) throws Exception {
+        deploy(bundle, false);
+    }
+
+    public void deploy(String bundle, boolean start) throws Exception {
+        Resolver resolver = repositoryAdmin.resolver();
+        String[] target = getTarget(bundle);
+        Resource resource = selectNewestVersion(searchRepository(repositoryAdmin, target[0], target[1]));
+        if (resource == null) {
+            throw new IllegalArgumentException("Unknown bundle " + target[0]);
+        }
+        resolver.add(resource);
+        if ((resolver.getAddedResources() != null) &&
+                (resolver.getAddedResources().length > 0)) {
+        }
+        if (resolver.resolve()) {
+            Resource[] resources = resolver.getAddedResources();
+            resources = resolver.getRequiredResources();
+            resources = resolver.getOptionalResources();
+
+            try {
+                resolver.deploy(start ? Resolver.START : 0);
+            } catch (IllegalStateException ex) {
+                throw new IllegalStateException("Can't deploy using OBR", ex);
+            }
+        }
+    }
+
+    private Resource[] searchRepository(RepositoryAdmin admin, String targetId, String targetVersion) throws InvalidSyntaxException {
+        // Try to see if the targetId is a bundle ID.
+        try {
+            Bundle bundle = getBundleContext().getBundle(Long.parseLong(targetId));
+            targetId = bundle.getSymbolicName();
+        } catch (NumberFormatException ex) {
+            // It was not a number, so ignore.
+        }
+
+        // The targetId may be a bundle name or a bundle symbolic name,
+        // so create the appropriate LDAP query.
+        StringBuffer sb = new StringBuffer("(|(presentationname=");
+        sb.append(targetId);
+        sb.append(")(symbolicname=");
+        sb.append(targetId);
+        sb.append("))");
+        if (targetVersion != null) {
+            sb.insert(0, "(&");
+            sb.append("(version=");
+            sb.append(targetVersion);
+            sb.append("))");
+        }
+        return admin.discoverResources(sb.toString());
+    }
+
+    private Resource selectNewestVersion(Resource[] resources) {
+        int idx = -1;
+        Version v = null;
+        for (int i = 0; (resources != null) && (i < resources.length); i++) {
+            if (i == 0) {
+                idx = 0;
+                v = resources[i].getVersion();
+            } else {
+                Version vtmp = resources[i].getVersion();
+                if (vtmp.compareTo(v) > 0) {
+                    idx = i;
+                    v = vtmp;
+                }
+            }
+        }
+        return (idx < 0) ? null : resources[idx];
+    }
+
+    private String[] getTarget(String bundle) {
+        String[] target;
+        int idx = bundle.indexOf(VERSION_DELIM);
+        if (idx > 0) {
+            target = new String[]{bundle.substring(0, idx), bundle.substring(idx + 1)};
+        } else {
+            target = new String[]{bundle, null};
+        }
+        return target;
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public RepositoryAdmin getRepositoryAdmin() {
+        return this.repositoryAdmin;
+    }
+
+    public void setRepositoryAdmin(RepositoryAdmin repositoryAdmin) {
+        this.repositoryAdmin = repositoryAdmin;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/obr/src/main/resources/OSGI-INF/blueprint/obr-management.xml b/karaf-2.2.x/management/mbeans/obr/src/main/resources/OSGI-INF/blueprint/obr-management.xml
new file mode 100644
index 0000000..277e13f
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/obr/src/main/resources/OSGI-INF/blueprint/obr-management.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- OBR MBean -->
+    <bean id="obrMBean" class="org.apache.karaf.management.mbeans.obr.internal.ObrMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="repositoryAdmin" ref="repositoryAdmin"/>
+    </bean>
+
+    <!-- MBean Registrer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=obr,name=${karaf.name}" key-ref="obrMBean"/>
+            </map>
+        </property>
+    </bean>
+
+    <!-- Reference to the OBR RepositoryAdmin service -->
+    <reference id="repositoryAdmin" interface="org.apache.felix.bundlerepository.RepositoryAdmin"/>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/obr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/obr/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..3e8431b
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/obr/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,24 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The obr mbean management bundle exposes an OBR MBean that can used with any JMX client (for instance JConsole).
+
+    The OBR MBean allows quite the same actions that can performed using obr:* commands:
+    \u001B[36mlistUrls()\u001B[0m
+    \u001B[36maddUrl(url)\u001B[0m
+    \u001B[36mremoveUrl(url)\u001B[0m
+    \u001B[36mrefreshUrl(url)\u001B[0m
+    \u001B[36mlist()\u001B[0m
+    \u001B[36mdeploy(bundle)\u001B[0m
+    \u001B[36mdeploy(bundle, start)\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/packages/NOTICE b/karaf-2.2.x/management/mbeans/packages/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/packages/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/packages/pom.xml b/karaf-2.2.x/management/mbeans/packages/pom.xml
new file mode 100644
index 0000000..a10b3ae
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/packages/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.packages</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Packages</name>
+    <description>The Packages MBean bundle provides a Packages MBean to manipulate the PackageAdmin service.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.packages;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.packages,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.packages.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/PackagesMBean.java b/karaf-2.2.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/PackagesMBean.java
new file mode 100644
index 0000000..39aa799
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/PackagesMBean.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.karaf.management.mbeans.packages;
+
+import javax.management.openmbean.TabularData;
+import java.util.List;
+
+/**
+ * Packages MBean
+ */
+public interface PackagesMBean {
+
+    List<String> exportedPackages() throws Exception;
+    List<String> exportedPackages(long bundleId) throws Exception;
+
+    List<String> importedPackages() throws Exception;
+    List<String> importedPackages(long bundleId) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/internal/PackagesMBeanImpl.java b/karaf-2.2.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/internal/PackagesMBeanImpl.java
new file mode 100644
index 0000000..9718da1
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/internal/PackagesMBeanImpl.java
@@ -0,0 +1,117 @@
+/*
+ * 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.karaf.management.mbeans.packages.internal;
+
+import org.apache.karaf.management.mbeans.packages.PackagesMBean;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Packages MBean implementation.
+ */
+public class PackagesMBeanImpl extends StandardMBean implements PackagesMBean {
+
+    private BundleContext bundleContext;
+
+    public PackagesMBeanImpl() throws NotCompliantMBeanException {
+        super(PackagesMBean.class);
+    }
+
+    public List<String> exportedPackages() throws Exception {
+        return exportedPackages(-1);
+    }
+
+    public List<String> exportedPackages(long bundleId) throws Exception {
+        List<String> exportPackages = new ArrayList<String>();
+        ServiceReference ref = bundleContext.getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            throw new IllegalStateException("PackageAdmin is not available");
+        }
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(ref);
+        if (packageAdmin == null) {
+            throw new IllegalStateException("PackageAdmin is not available");
+        }
+
+        Bundle[] bundles;
+        if (bundleId >= 0) {
+            bundles = new Bundle[]{ bundleContext.getBundle(bundleId) };
+        } else {
+            bundles = bundleContext.getBundles();
+        }
+
+        for (Bundle bundle : bundles) {
+            ExportedPackage[] packages = packageAdmin.getExportedPackages(bundle);
+            if (packages != null) {
+                for (ExportedPackage exportedPackage : packages) {
+                    exportPackages.add(exportedPackage.getName());
+                }
+            }
+        }
+
+        return exportPackages;
+    }
+
+    public List<String> importedPackages() throws Exception {
+        return importedPackages(-1);
+    }
+
+    public List<String> importedPackages(long bundleId) throws Exception {
+        List<String> importPackages = new ArrayList<String>();
+        ServiceReference ref = bundleContext.getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            throw new IllegalStateException("PackageAdmin is not available");
+        }
+        PackageAdmin packageAdmin = (PackageAdmin) bundleContext.getService(ref);
+        if (packageAdmin == null) {
+            throw new IllegalStateException("PackageAdmin is not available");
+        }
+
+        ExportedPackage[] exportedPackages;
+        if (bundleId >= 0) {
+            exportedPackages = packageAdmin.getExportedPackages(bundleContext.getBundle(bundleId));
+        } else {
+            exportedPackages = packageAdmin.getExportedPackages((Bundle) null);
+        }
+        if (exportedPackages != null) {
+            for (ExportedPackage exportedPackage : exportedPackages) {
+                Bundle[] bundles = exportedPackage.getImportingBundles();
+                if (bundles != null && bundles.length > 0) {
+                    importPackages.add(exportedPackage.getName());
+                }
+            }
+        }
+
+        return importPackages;
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/packages/src/main/resources/OSGI-INF/blueprint/packages-management.xml b/karaf-2.2.x/management/mbeans/packages/src/main/resources/OSGI-INF/blueprint/packages-management.xml
new file mode 100644
index 0000000..ee17231
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/packages/src/main/resources/OSGI-INF/blueprint/packages-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Packages MBean -->
+    <bean id="packagesMBean" class="org.apache.karaf.management.mbeans.packages.internal.PackagesMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- MBean Registrer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=packages,name=${karaf.name}" key-ref="packagesMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/packages/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/packages/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..f669f36
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/packages/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,21 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The Packages MBean management bundle exposes a Package MBean that can be used with any JMX client (for instance JConsole).
+
+    The Packages MBean allows quite the same action that can be performed using packages:* commands:
+    \u001B[36mexportPackages()\u001B[0m
+    \u001B[36mexportPackages(bundleId)\u001B[0m
+    \u001B[36mimportPackages()\u001B[0m
+    \u001B[36mimportPackages(bundleId)\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/pom.xml b/karaf-2.2.x/management/mbeans/pom.xml
new file mode 100644
index 0000000..6e1cd02
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management</groupId>
+        <artifactId>management</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.management.mbeans</groupId>
+    <artifactId>mbeans</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Management :: MBeans</name>
+
+    <modules>
+        <module>bundles</module>
+        <module>services</module>
+        <module>system</module>
+        <module>packages</module>
+        <module>config</module>
+        <module>dev</module>
+        <module>log</module>
+        <module>obr</module>
+        <module>web</module>
+    </modules>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/services/NOTICE b/karaf-2.2.x/management/mbeans/services/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/services/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/services/pom.xml b/karaf-2.2.x/management/mbeans/services/pom.xml
new file mode 100644
index 0000000..a1c125e
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/services/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.services</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Services</name>
+    <description>The Services MBean bundle provides a JMX MBean to manipulate the OSGi services.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.services;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.services,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.services.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/ServicesMBean.java b/karaf-2.2.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/ServicesMBean.java
new file mode 100644
index 0000000..1066924
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/ServicesMBean.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.management.mbeans.services;
+
+import javax.management.openmbean.TabularData;
+
+/**
+ * Services MBean.
+ */
+public interface ServicesMBean {
+
+    TabularData list() throws Exception;
+    TabularData list(boolean inUse) throws Exception;
+    TabularData list(long bundleId) throws Exception;
+    TabularData list(long bundleId, boolean inUse) throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/internal/ServicesMBeanImpl.java b/karaf-2.2.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/internal/ServicesMBeanImpl.java
new file mode 100644
index 0000000..48e0442
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/internal/ServicesMBeanImpl.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.karaf.management.mbeans.services.internal;
+
+import org.apache.karaf.management.mbeans.services.ServicesMBean;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Implementation of the Services MBean.
+ */
+public class ServicesMBeanImpl extends StandardMBean implements ServicesMBean {
+
+    private BundleContext bundleContext;
+
+    public ServicesMBeanImpl() throws NotCompliantMBeanException {
+        super(ServicesMBean.class);
+    }
+
+    public TabularData list() throws Exception {
+        return list(-1, false);
+    }
+
+    public TabularData list(boolean inUse) throws Exception {
+        return list(-1, inUse);
+    }
+
+    public TabularData list(long bundleId) throws Exception {
+        return list(bundleId, false);
+    }
+
+    public TabularData list(long bundleId, boolean inUse) throws Exception {
+        CompositeType serviceType = new CompositeType("Service", "OSGi Service",
+                new String[]{"Interfaces", "Properties"},
+                new String[]{"Interfaces class name of the service", "Properties of the service"},
+                new OpenType[]{new ArrayType(1, SimpleType.STRING), new ArrayType(1, SimpleType.STRING)});
+        TabularType tableType = new TabularType("Services", "Table of OSGi Services", serviceType,
+                new String[]{"Interfaces"});
+        TabularData table = new TabularDataSupport(tableType);
+
+        Bundle[] bundles;
+        if (bundleId >= 0) {
+            bundles = new Bundle[]{bundleContext.getBundle(bundleId)};
+        } else {
+            bundles = bundleContext.getBundles();
+        }
+        for (Bundle bundle : bundles) {
+            try {
+                ServiceReference[] serviceReferences;
+                if (inUse) {
+                    serviceReferences = bundle.getServicesInUse();
+                } else {
+                    serviceReferences = bundle.getRegisteredServices();
+                }
+                if (serviceReferences != null) {
+                    for (ServiceReference reference : serviceReferences) {
+                        String[] interfaces = (String[]) reference.getProperty("objectClass");
+                        List<String> properties = new ArrayList<String>();
+                        for (String key : reference.getPropertyKeys()) {
+                            properties.add(key + " = " + reference.getProperty(key));
+                        }
+                        CompositeData data = new CompositeDataSupport(serviceType,
+                                new String[]{"Interfaces", "Properties"},
+                                new Object[]{interfaces, properties.toArray(new String[0])});
+                        table.put(data);
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return table;
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/services/src/main/resources/OSGI-INF/blueprint/services-management.xml b/karaf-2.2.x/management/mbeans/services/src/main/resources/OSGI-INF/blueprint/services-management.xml
new file mode 100644
index 0000000..708e2e3
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/services/src/main/resources/OSGI-INF/blueprint/services-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Services MBean -->
+    <bean id="servicesMBean" class="org.apache.karaf.management.mbeans.services.internal.ServicesMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- MBean Registrer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=services,name=${karaf.name}" key-ref="servicesMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/services/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/services/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..5f52639
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/services/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,18 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The services mbean management bundle exposes a Services MBean that can used with any JMX client (for instance JConsole).
+
+    The Services MBean allows quite the same action that can be performed using osgi:ls (and services:*) commands:
+    \u001B[36mlist()\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/system/NOTICE b/karaf-2.2.x/management/mbeans/system/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/system/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/system/pom.xml b/karaf-2.2.x/management/mbeans/system/pom.xml
new file mode 100644
index 0000000..a49b5c4
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/system/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.system</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: System</name>
+    <description>The System MBean bundle provides a JMX MBean to manipulate the Karaf system container.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.system;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.system,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.system.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/SystemMBean.java b/karaf-2.2.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/SystemMBean.java
new file mode 100644
index 0000000..5730e09
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/SystemMBean.java
@@ -0,0 +1,26 @@
+/*
+ * 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.karaf.management.mbeans.system;
+
+/**
+ * System MBean.
+ */
+public interface SystemMBean {
+
+    void shutdown() throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/internal/SystemMBeanImpl.java b/karaf-2.2.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/internal/SystemMBeanImpl.java
new file mode 100644
index 0000000..d1b572f
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/internal/SystemMBeanImpl.java
@@ -0,0 +1,48 @@
+/*
+ * 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.karaf.management.mbeans.system.internal;
+
+import org.apache.karaf.management.mbeans.system.SystemMBean;
+import org.osgi.framework.BundleContext;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+
+/**
+ * System MBean implementation.
+ */
+public class SystemMBeanImpl extends StandardMBean implements SystemMBean {
+
+    private BundleContext bundleContext;
+
+    public SystemMBeanImpl() throws NotCompliantMBeanException {
+        super(SystemMBean.class);
+    }
+
+    public void shutdown() throws Exception {
+        bundleContext.getBundle(0).stop();
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/system/src/main/resources/OSGI-INF/blueprint/system-management.xml b/karaf-2.2.x/management/mbeans/system/src/main/resources/OSGI-INF/blueprint/system-management.xml
new file mode 100644
index 0000000..db2c9de
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/system/src/main/resources/OSGI-INF/blueprint/system-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- System MBean -->
+    <bean id="systemMBean" class="org.apache.karaf.management.mbeans.system.internal.SystemMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- MBean Registrer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=system,name=${karaf.name}" key-ref="systemMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/system/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/system/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..8c96394
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/system/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,19 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The System MBean management bundle exposes a System MBean that can used with any JMX client (for instance JConsole).
+
+    The System MBean allows quite the same action that can be performed using osgi:shutdown, etc commands:
+    \u001B[36mshutdown()\u001B[0m
+    \u001B[36mshutdown(time)\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/mbeans/web/NOTICE b/karaf-2.2.x/management/mbeans/web/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/web/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/mbeans/web/pom.xml b/karaf-2.2.x/management/mbeans/web/pom.xml
new file mode 100644
index 0000000..0b14f79
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/web/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management.mbeans</groupId>
+        <artifactId>mbeans</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.mbeans.web</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management :: MBeans :: Web</name>
+    <description>The Web MBean bundle provides a JMX MBean to manipulate to manipulate web application bundles.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../../etc/appended-resources/</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management.mbeans.web;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.management.mbeans.system,
+                            javax.management,
+                            javax.management.loading,
+                            org.apache.karaf.management;version=${project.version},
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.management.mbeans.web.internal,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/WebMBean.java b/karaf-2.2.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/WebMBean.java
new file mode 100644
index 0000000..7e353df
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/WebMBean.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.karaf.management.mbeans.web;
+
+import javax.management.openmbean.TabularData;
+
+/**
+ * Web MBean.
+ */
+public interface WebMBean {
+
+    TabularData list() throws Exception;
+
+}
diff --git a/karaf-2.2.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/internal/WebMBeanImpl.java b/karaf-2.2.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/internal/WebMBeanImpl.java
new file mode 100644
index 0000000..5009f77
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/internal/WebMBeanImpl.java
@@ -0,0 +1,85 @@
+/*
+ * 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.karaf.management.mbeans.web.internal;
+
+import org.apache.karaf.management.mbeans.web.WebMBean;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+import javax.management.NotCompliantMBeanException;
+import javax.management.StandardMBean;
+import javax.management.openmbean.*;
+
+/**
+ * Web MBean implementation.
+ */
+public class WebMBeanImpl extends StandardMBean implements WebMBean {
+
+    private BundleContext bundleContext;
+
+    public WebMBeanImpl() throws NotCompliantMBeanException {
+        super(WebMBean.class);
+    }
+
+    public TabularData list() throws Exception {
+        CompositeType webType = new CompositeType("Web Bundle", "An OSGi Web bundle",
+                new String[]{"ID", "Name", "Context"},
+                new String[]{"ID of the bundle", "Name of the bundle", "Web Context"},
+                new OpenType[]{SimpleType.STRING, SimpleType.STRING, SimpleType.STRING});
+        TabularType tableType = new TabularType("Web Bundles", "Table of web bundles", webType,
+                new String[]{"ID"});
+        TabularData table = new TabularDataSupport(tableType);
+        for (Bundle bundle : bundleContext.getBundles()) {
+            try {
+                String webContext = (String) bundle.getHeaders().get("Web-ContextPath");
+                if (webContext == null)
+                    webContext = (String) bundle.getHeaders().get("Webapp-Context");
+                if (webContext == null)
+                    continue;
+
+                webContext.trim();
+                if (!webContext.startsWith("/")) {
+                    webContext = "/" + webContext;
+                }
+
+                String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
+                name = (name == null) ? bundle.getSymbolicName() : name;
+                // If there is no symbolic name, resort to location.
+                name = (name == null) ? bundle.getLocation() : name;
+
+                CompositeData data = new CompositeDataSupport(webType,
+                        new String[]{"ID", "Name", "Context"},
+                        new Object[]{bundle.getBundleId(), name, webContext});
+                table.put(data);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return table;
+    }
+
+    public BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+}
diff --git a/karaf-2.2.x/management/mbeans/web/src/main/resources/OSGI-INF/blueprint/web-management.xml b/karaf-2.2.x/management/mbeans/web/src/main/resources/OSGI-INF/blueprint/web-management.xml
new file mode 100644
index 0000000..09d3efb
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/web/src/main/resources/OSGI-INF/blueprint/web-management.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <!-- Reference to the MBean Server -->
+    <reference id="mbeanServer" interface="javax.management.MBeanServer">
+        <reference-listener ref="mbeanRegistrer" bind-method="registerMBeanServer" unbind-method="unregisterMBeanServer"/>
+    </reference>
+
+    <!-- Web MBean -->
+    <bean id="webMBean" class="org.apache.karaf.management.mbeans.web.internal.WebMBeanImpl">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+    </bean>
+
+    <!-- MBean Registrer -->
+    <bean id="mbeanRegistrer" class="org.apache.karaf.management.MBeanRegistrer">
+        <property name="mbeans">
+            <map>
+                <entry value="org.apache.karaf:type=web,name=${karaf.name}" key-ref="webMBean"/>
+            </map>
+        </property>
+    </bean>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/mbeans/web/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/mbeans/web/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..40e7dc9
--- /dev/null
+++ b/karaf-2.2.x/management/mbeans/web/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,18 @@
+PSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    The Web MBean management bundle exposes a Web MBean that can be used with any JMX client (for instance JConsole).
+
+    The Web MBean allows quite the same action that can be performed using web:* commands:
+    \u001B[36mlist()\u001B[0m
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDiagnostic\u001B[0m and \u001B[36mRemote Management via JMX\u001B[0m for the Karaf User Guide.
+
+
diff --git a/karaf-2.2.x/management/pom.xml b/karaf-2.2.x/management/pom.xml
new file mode 100644
index 0000000..a6dd78c
--- /dev/null
+++ b/karaf-2.2.x/management/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.management</groupId>
+    <artifactId>management</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Management</name>
+
+    <modules>
+        <module>server</module>
+        <module>mbeans</module>
+    </modules>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/management/server/NOTICE b/karaf-2.2.x/management/server/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/management/server/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/management/server/pom.xml b/karaf-2.2.x/management/server/pom.xml
new file mode 100644
index 0000000..079ad4d
--- /dev/null
+++ b/karaf-2.2.x/management/server/pom.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.management</groupId>
+        <artifactId>management</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.management.server</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Management</name>
+    <description>This bundle starts the Karaf embedded MBean server and RMI registry allowing users to use JMX to manage Karaf.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.config</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymockclassextension</artifactId>
+            <version>${easymock.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.apache.karaf.management;version=${project.version}
+                        </Export-Package>
+                        <Import-Package>
+                            javax.management,
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+       </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/ConnectorServerFactory.java b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/ConnectorServerFactory.java
new file mode 100644
index 0000000..809a12f
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/ConnectorServerFactory.java
@@ -0,0 +1,295 @@
+/*
+ * 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.karaf.management;
+
+import org.apache.karaf.jaas.config.KeystoreManager;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.rmi.server.RMIClientSocketFactory;
+import java.rmi.server.RMIServerSocketFactory;
+import java.security.GeneralSecurityException;
+import java.util.Map;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXConnectorServerFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.management.remote.rmi.RMIConnectorServer;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+import javax.rmi.ssl.SslRMIClientSocketFactory;
+
+public class ConnectorServerFactory {
+
+    private enum AuthenticatorType { NONE, PASSWORD, CERTIFICATE };
+
+    private MBeanServer server;
+    private String serviceUrl;
+    private Map environment;
+    private ObjectName objectName;
+    private boolean threaded = false;
+    private boolean daemon = false;
+    private JMXConnectorServer connectorServer;
+
+    private long keyStoreAvailabilityTimeout = 5000;
+    private AuthenticatorType authenticatorType = AuthenticatorType.PASSWORD;
+    private boolean secured;
+    private KeystoreManager keystoreManager;
+    private String algorithm;
+    private String secureProtocol;
+    private String keyStore;
+    private String trustStore;
+    private String keyAlias;
+
+    public MBeanServer getServer() {
+        return server;
+    }
+
+    public void setServer(MBeanServer server) {
+        this.server = server;
+    }
+
+    public String getServiceUrl() {
+        return serviceUrl;
+    }
+
+    public void setServiceUrl(String serviceUrl) {
+        this.serviceUrl = serviceUrl;
+    }
+
+    public Map getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(Map environment) {
+        this.environment = environment;
+    }
+
+    public ObjectName getObjectName() {
+        return objectName;
+    }
+
+    public void setObjectName(ObjectName objectName) {
+        this.objectName = objectName;
+    }
+
+    public boolean isThreaded() {
+        return threaded;
+    }
+
+    public void setThreaded(boolean threaded) {
+        this.threaded = threaded;
+    }
+
+    public boolean isDaemon() {
+        return daemon;
+    }
+
+    public void setDaemon(boolean daemon) {
+        this.daemon = daemon;
+    }
+
+    public String getAuthenticatorType() {
+        return this.authenticatorType.name().toLowerCase();
+    }
+
+    /**
+     * Authenticator type to use. Acceptable values are "none", "password", and "certificate".
+     *
+     * @param value the authenticator type to use.
+     */
+    public void setAuthenticatorType(String value) {
+        this.authenticatorType = AuthenticatorType.valueOf(value.toUpperCase());
+    }
+
+    /**
+     * Use this param to allow the KeystoreManager to wait for expected keystores to be loaded by other bundle
+     *
+     * @param keyStoreAvailabilityTimeout the keystore availability timeout in milliseconds
+     */
+    public void setKeyStoreAvailabilityTimeout(long keyStoreAvailabilityTimeout) {
+        this.keyStoreAvailabilityTimeout = keyStoreAvailabilityTimeout;
+    }
+
+    public boolean isSecured() {
+        return this.secured;
+    }
+
+    public void setSecured(boolean secured) {
+        this.secured = secured;
+    }
+
+    public void setKeystoreManager(KeystoreManager keystoreManager) {
+        this.keystoreManager = keystoreManager;
+    }
+
+    public KeystoreManager getKeystoreManager() {
+        return this.keystoreManager;
+    }
+
+    public String getKeyStore() {
+        return this.keyStore;
+    }
+
+    public void setKeyStore(String keyStore) {
+        this.keyStore = keyStore;
+    }
+
+    public String getTrustStore() {
+        return this.trustStore;
+    }
+
+    public void setTrustStore(String trustStore) {
+        this.trustStore = trustStore;
+    }
+
+    public String getKeyAlias() {
+        return this.keyAlias;
+    }
+
+    public void setKeyAlias(String keyAlias) {
+        this.keyAlias = keyAlias;
+    }
+
+    public String getAlgorithm() {
+        return this.algorithm;
+    }
+
+    /**
+     * Algorithm to use.
+     * As different JVMs have different implementation available, the default algorithm can be used by supplying the value "Default".
+     *
+     * @param algorithm the algorithm to use, or "Default" to use the default from {@link javax.net.ssl.KeyManagerFactory#getDefaultAlgorithm()}
+     */
+    public void setAlgorithm(String algorithm) {
+        if ("default".equalsIgnoreCase(algorithm)) {
+            this.algorithm = KeyManagerFactory.getDefaultAlgorithm();
+        } else {
+            this.algorithm = algorithm;
+        }
+    }
+
+    public String getSecureProtocol() {
+        return this.secureProtocol;
+    }
+
+    public void setSecureProtocol(String secureProtocol) {
+        this.secureProtocol = secureProtocol;
+    }
+
+    private boolean isClientAuth() {
+        return this.authenticatorType.equals(AuthenticatorType.CERTIFICATE);
+    }
+
+    public void init() throws Exception {
+        if (this.server == null) {
+            throw new IllegalArgumentException("server must be set");
+        }
+        JMXServiceURL url = new JMXServiceURL(this.serviceUrl);
+
+        if (isClientAuth()) {
+            this.secured = true;
+        }
+
+        if (this.secured) {
+            this.setupSsl();
+        }
+
+        if (!AuthenticatorType.PASSWORD.equals(this.authenticatorType)) {
+            this.environment.remove("jmx.remote.authenticator");
+        }
+
+        this.connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, this.environment, this.server);
+        if (this.objectName != null) {
+            this.server.registerMBean(this.connectorServer, this.objectName);
+        }
+
+        try {
+            if (this.threaded) {
+                Thread connectorThread = new Thread() {
+                    public void run() {
+                        try {
+                            Thread.currentThread().setContextClassLoader(ConnectorServerFactory.class.getClassLoader());
+                            connectorServer.start();
+                        } catch (IOException ex) {
+                            throw new RuntimeException("Could not start JMX connector server", ex);
+                        }
+                    }
+                };
+                connectorThread.setName("JMX Connector Thread [" + this.serviceUrl + "]");
+                connectorThread.setDaemon(this.daemon);
+                connectorThread.start();
+            }
+            else {
+                this.connectorServer.start();
+            }
+        } catch (Exception ex) {
+            doUnregister(this.objectName);
+            throw ex;
+        }
+    }
+
+    public void destroy() throws Exception {
+        try {
+            this.connectorServer.stop();
+        } finally {
+            doUnregister(this.objectName);
+        }
+    }
+
+    protected void doUnregister(ObjectName objectName) {
+        try {
+            if (this.objectName != null && this.server.isRegistered(objectName)) {
+                this.server.unregisterMBean(objectName);
+            }
+        }
+        catch (JMException ex) {
+            // Ignore
+        }
+    }
+
+    private void setupSsl() throws GeneralSecurityException {
+        SSLServerSocketFactory sslServerSocketFactory = keystoreManager.createSSLServerFactory(null, secureProtocol, algorithm, keyStore, keyAlias, trustStore, keyStoreAvailabilityTimeout);
+        RMIServerSocketFactory rmiServerSocketFactory = new KarafSslRMIServerSocketFactory(sslServerSocketFactory, this.isClientAuth());
+        RMIClientSocketFactory rmiClientSocketFactory = new SslRMIClientSocketFactory();
+        environment.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, rmiServerSocketFactory);
+        environment.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, rmiClientSocketFactory);
+        // TODO secure RMI connector as well ?
+        // environment.put("com.sun.jndi.rmi.factory.socket", rmiClientSocketFactory);
+    }
+
+    private static class KarafSslRMIServerSocketFactory implements RMIServerSocketFactory {
+        private SSLServerSocketFactory sslServerSocketFactory;
+        private boolean clientAuth;
+
+        public KarafSslRMIServerSocketFactory(SSLServerSocketFactory sslServerSocketFactory, boolean clientAuth) {
+            this.sslServerSocketFactory = sslServerSocketFactory;
+            this.clientAuth = clientAuth;
+        }
+
+        public ServerSocket createServerSocket(int port) throws IOException {
+            SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
+            sslServerSocket.setNeedClientAuth(clientAuth);
+            return sslServerSocket;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/JaasAuthenticator.java b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/JaasAuthenticator.java
new file mode 100644
index 0000000..c2d1e9b
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/JaasAuthenticator.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.karaf.management;
+
+import java.io.IOException;
+import java.security.Principal;
+
+import javax.management.remote.JMXAuthenticator;
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+public class JaasAuthenticator implements JMXAuthenticator {
+
+    private String realm;
+    private String role;
+
+    public String getRealm() {
+        return realm;
+    }
+
+    public void setRealm(String realm) {
+        this.realm = realm;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public Subject authenticate(Object credentials) throws SecurityException {
+        if (!(credentials instanceof String[])) {
+            throw new IllegalArgumentException("Expected String[2], got "
+                            + (credentials != null ? credentials.getClass().getName() : null));
+        }
+        final String[] params = (String[]) credentials;
+        if (params.length != 2) {
+            throw new IllegalArgumentException("Expected String[2] but length was " + params.length);
+        }
+        try {
+            Subject subject = new Subject();
+            LoginContext loginContext = new LoginContext(realm, subject, new CallbackHandler() {
+                public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+                    for (int i = 0; i < callbacks.length; i++) {
+                        if (callbacks[i] instanceof NameCallback) {
+                            ((NameCallback) callbacks[i]).setName(params[0]);
+                        } else if (callbacks[i] instanceof PasswordCallback) {
+                            ((PasswordCallback) callbacks[i]).setPassword((params[1].toCharArray()));
+                        } else {
+                            throw new UnsupportedCallbackException(callbacks[i]);
+                        }
+                    }
+                }
+            });
+            loginContext.login();
+            if (role != null && role.length() > 0) {
+                String clazz = "org.apache.karaf.jaas.modules.RolePrincipal";
+                String name = role;
+                int idx = role.indexOf(':');
+                if (idx > 0) {
+                    clazz = role.substring(0, idx);
+                    name = role.substring(idx + 1);
+                }
+                boolean found = false;
+                for (Principal p : subject.getPrincipals()) {
+                    if (p.getClass().getName().equals(clazz)
+                            && p.getName().equals(name)) {
+                        found = true;
+                        break;
+                    }
+                }
+                if (!found) {
+                    throw new FailedLoginException("User does not have the required role " + role);
+                }
+            }
+            return subject;
+        } catch (LoginException e) {
+            throw new SecurityException("Authentication failed", e);
+        }
+    }
+}
diff --git a/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/MBeanRegistrer.java b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/MBeanRegistrer.java
new file mode 100644
index 0000000..1aa1794
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/MBeanRegistrer.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.management;
+
+import java.util.Map;
+
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+public class MBeanRegistrer {
+
+    private MBeanServer mbeanServer;
+
+    private Map<Object, String> mbeans;
+
+    public void setMbeans(Map<Object, String> mbeans) {
+        this.mbeans = mbeans;
+    }
+
+    public void registerMBeanServer(MBeanServer mbeanServer) throws JMException {
+        if (this.mbeanServer != mbeanServer) {
+            unregisterMBeans();
+        }
+        this.mbeanServer = mbeanServer;
+        registerMBeans();
+    }
+
+    public void unregisterMBeanServer(MBeanServer mbeanServer) throws JMException {
+        unregisterMBeans();
+        this.mbeanServer = null;
+    }
+
+    public void init() throws Exception {
+        registerMBeans();
+    }
+
+    protected void registerMBeans() throws JMException {
+        if (mbeanServer != null && mbeans != null) {
+            for (Map.Entry<Object, String> entry : mbeans.entrySet()) {
+                String value = parseProperty(entry.getValue());
+                mbeanServer.registerMBean(entry.getKey(), new ObjectName(value));
+            }
+        }
+    }
+
+    protected void unregisterMBeans() throws JMException {
+        if (mbeanServer != null && mbeans != null) {
+            for (Map.Entry<Object, String> entry : mbeans.entrySet()) {
+                String value = parseProperty(entry.getValue());
+                mbeanServer.unregisterMBean(new ObjectName(value));
+            }
+        }
+    }
+
+    protected String parseProperty(String raw) {
+        if (raw.indexOf("${") > -1 && raw.indexOf("}", raw.indexOf("${")) > -1) {
+            String var = raw.substring(raw.indexOf("${") + 2, raw.indexOf("}"));
+            String val = System.getProperty(var);
+            if (val != null) {
+                raw = raw.replace("${" + var + "}", val);
+            }
+        }
+        return raw;
+    }
+}
diff --git a/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/MBeanServerFactory.java b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/MBeanServerFactory.java
new file mode 100644
index 0000000..f89aa09
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/MBeanServerFactory.java
@@ -0,0 +1,116 @@
+/*
+ * 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.karaf.management;
+
+import java.lang.management.ManagementFactory;
+import java.util.List;
+
+import javax.management.MBeanServer;
+
+public class MBeanServerFactory {
+
+    private boolean locateExistingServerIfPossible = false;
+    private String agentId;
+    private String defaultDomain;
+    private boolean registerWithFactory = true;
+    private MBeanServer server;
+    private boolean newlyRegistered = false;
+
+    public boolean isLocateExistingServerIfPossible() {
+        return locateExistingServerIfPossible;
+    }
+
+    public void setLocateExistingServerIfPossible(boolean locateExistingServerIfPossible) {
+        this.locateExistingServerIfPossible = locateExistingServerIfPossible;
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId;
+    }
+
+    public String getDefaultDomain() {
+        return defaultDomain;
+    }
+
+    public void setDefaultDomain(String defaultDomain) {
+        this.defaultDomain = defaultDomain;
+    }
+
+    public boolean isRegisterWithFactory() {
+        return registerWithFactory;
+    }
+
+    public void setRegisterWithFactory(boolean registerWithFactory) {
+        this.registerWithFactory = registerWithFactory;
+    }
+
+    public boolean isNewlyRegistered() {
+        return newlyRegistered;
+    }
+
+    public void setNewlyRegistered(boolean newlyRegistered) {
+        this.newlyRegistered = newlyRegistered;
+    }
+
+    public MBeanServer getServer() throws Exception {
+        if (this.server == null) {
+            init();
+        }
+        return server;
+    }
+
+    public void init() throws Exception {
+        if (this.locateExistingServerIfPossible || this.agentId != null) {
+            try {
+                List servers = javax.management.MBeanServerFactory.findMBeanServer(agentId);
+                MBeanServer server = null;
+                if (servers != null && servers.size() > 0) {
+                    this.server = (MBeanServer) servers.get(0);
+                }
+                if (server == null && agentId == null) {
+                    this.server = ManagementFactory.getPlatformMBeanServer();
+                }
+                if (this.server == null) {
+                    throw new Exception("Unable to locate MBeanServer");
+                }
+            } catch (Exception ex) {
+                if (this.agentId != null) {
+                    throw ex;
+                }
+            }
+        }
+        if (this.server == null) {
+            if (this.registerWithFactory) {
+                this.server = javax.management.MBeanServerFactory.createMBeanServer(this.defaultDomain);
+            } else {
+                this.server = javax.management.MBeanServerFactory.newMBeanServer(this.defaultDomain);
+            }
+            this.newlyRegistered = this.registerWithFactory;
+        }
+    }
+
+    public void destroy() throws Exception {
+        if (this.newlyRegistered) {
+            javax.management.MBeanServerFactory.releaseMBeanServer(this.server);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/RmiRegistryFactory.java b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/RmiRegistryFactory.java
new file mode 100644
index 0000000..3abca11
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/java/org/apache/karaf/management/RmiRegistryFactory.java
@@ -0,0 +1,102 @@
+/*
+ * 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.karaf.management;
+
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+
+public class RmiRegistryFactory {
+
+    private int port = Registry.REGISTRY_PORT;
+    private Registry registry;
+    private boolean locate;
+    private boolean create = true;
+    private boolean locallyCreated;
+    
+    /**
+     * @return the create
+     */
+    public boolean isCreate() {
+        return create;
+    }
+
+    /**
+     * @param create the create to set
+     */
+    public void setCreate(boolean create) {
+        this.create = create;
+    }
+
+    /**
+     * @return the locate
+     */
+    public boolean isLocate() {
+        return locate;
+    }
+
+    /**
+     * @param locate the locate to set
+     */
+    public void setLocate(boolean locate) {
+        this.locate = locate;
+    }
+
+    /**
+     * @return the port
+     */
+    public int getPort() {
+        return port;
+    }
+
+    /**
+     * @param port the port to set
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public Object getObject() throws Exception {
+        return registry;
+    }
+
+    public void init() throws RemoteException {
+        if (registry == null && locate) {
+            try {
+                Registry reg = LocateRegistry.getRegistry(getPort());
+                reg.list();
+                registry = reg;
+            } catch (RemoteException e) {
+                // ignore
+            }
+        }
+        if (registry == null && create) {
+            registry = LocateRegistry.createRegistry(getPort());
+            locallyCreated = true;
+        }
+    }
+
+    public void destroy() throws RemoteException {
+        if (registry != null && locallyCreated) {
+            Registry reg = registry;
+            registry = null;
+            UnicastRemoteObject.unexportObject(reg, true);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/blueprint/karaf-management.xml b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/blueprint/karaf-management.xml
new file mode 100644
index 0000000..6e06c13
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/blueprint/karaf-management.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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0">
+
+    <!-- Allow the use of system properties -->
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]">
+        <ext:default-properties>
+            <ext:property name="karaf.admin.role" value="admin" />
+        </ext:default-properties>
+    </ext:property-placeholder>
+
+    <!-- Property place holder -->
+    <cm:property-placeholder persistent-id="org.apache.karaf.management" update-strategy="reload">
+        <cm:default-properties>
+            <cm:property name="rmiRegistryPort" value="1099"/>
+            <cm:property name="rmiServerPort" value="44444"/>
+            <cm:property name="jmxRealm" value="karaf"/>
+            <cm:property name="jmxRole" value="$[karaf.admin.role]"/>
+            <cm:property name="serviceUrl" value="service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/karaf-$[karaf.name]"/>
+            <cm:property name="daemon" value="true"/>
+            <cm:property name="threaded" value="true"/>
+            <cm:property name="objectName" value="connector:name=rmi"/>
+            <!-- SSL support -->
+            <cm:property name="keyStoreAvailabilityTimeout" value="5000"/>
+            <cm:property name="authenticatorType" value="password"/>
+            <cm:property name="secured" value="false"/>
+            <cm:property name="secureAlgorithm" value="default"/>
+            <cm:property name="secureProtocol" value="TLS"/>
+            <cm:property name="keyStore" value="karaf.ks"/>
+            <cm:property name="keyAlias" value="karaf"/>
+            <cm:property name="trustStore" value="karaf.ts"/>
+            <cm:property name="clientAuth" value="false"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+    <!-- MBeanServer bean -->
+    <bean id="mbeanServerFactory" class="org.apache.karaf.management.MBeanServerFactory" init-method="init"
+          destroy-method="destroy" depends-on="rmiRegistryFactory">
+        <property name="locateExistingServerIfPossible" value="true"/>
+    </bean>
+    <bean id="mbeanServer" factory-ref="mbeanServerFactory" factory-method="getServer"/>
+
+    <!-- Export the MBeanServer as an OSGi service -->
+    <service ref="mbeanServer" interface="javax.management.MBeanServer"/>
+
+    <!-- Create a RMI registry -->
+    <bean id="rmiRegistryFactory" class="org.apache.karaf.management.RmiRegistryFactory" init-method="init"
+          destroy-method="destroy">
+        <property name="create" value="true"/>
+        <property name="locate" value="true"/>
+        <property name="port" value="${rmiRegistryPort}"/>
+    </bean>
+
+    <!-- Create a JMX connector ServiceFactory -->
+    <reference id="keystoreManager" interface="org.apache.karaf.jaas.config.KeystoreManager"/>
+
+    <bean id="connectorFactory" class="org.apache.karaf.management.ConnectorServerFactory" init-method="init"
+          destroy-method="destroy">
+        <property name="server" ref="mbeanServer"/>
+        <property name="serviceUrl" value="${serviceUrl}"/>
+        <property name="daemon" value="${daemon}"/>
+        <property name="threaded" value="${threaded}"/>
+        <property name="objectName" value="${objectName}"/>
+        <property name="environment">
+            <map>
+                <entry key="jmx.remote.authenticator" value-ref="jaasAuthenticator"/>
+            </map>
+        </property>
+        <property name="keyStoreAvailabilityTimeout" value="${keyStoreAvailabilityTimeout}"/>
+        <property name="authenticatorType" value="${authenticatorType}"/>
+        <property name="secured" value="${secured}"/>
+        <property name="algorithm" value="${secureAlgorithm}"/>
+        <property name="secureProtocol" value="${secureProtocol}"/>
+        <property name="keyStore" value="${keyStore}"/>
+        <property name="keyAlias" value="${keyAlias}"/>
+        <property name="trustStore" value="${trustStore}"/>
+        <property name="keystoreManager" ref="keystoreManager"/>
+    </bean>
+
+    <!-- JAAS authenticator -->
+    <bean id="jaasAuthenticator" class="org.apache.karaf.management.JaasAuthenticator">
+        <property name="realm" value="${jmxRealm}"/>
+        <property name="role" value="${jmxRole}"/>
+    </bean>
+
+</blueprint>
+
diff --git a/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..44745cb
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle starts JMX required resources such as MBean server and RMI registry.
+
+    It allows end users to manage Karaf using any JMX client such as JConsole.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mManagement\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.properties
new file mode 100644
index 0000000..4a8b312
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.properties
@@ -0,0 +1,70 @@
+#
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+#
+
+#
+# This file contains localization strings for configuration labels and
+# descriptions as used in the metatype.xml descriptor
+
+management.name = Apache Karaf JMX Management
+management.description = Configuration of Apache Karaf JMX Management
+
+rmiRegistryPort.name = RMI Registry Port
+rmiRegistryPort.description = port of the registry for the exported RMI service
+
+rmiServerPort.name = RMI Server Port
+rmiServerPort.description = port of the server for the exported RMI objects
+
+jmxRealm.name = Realm
+jmxRealm.description = name of the JAAS realm used for authentication
+
+serviceUrl.name = Service Url
+serviceUrl.description = the service URL for the JMXConnectorServer
+
+daemon.name = Daemon
+daemon.description = whether any threads started for the JMXConnectorServer should be started as daemon threads
+
+threaded.name = Threaded
+threaded.description = whether the JMXConnectorServer should be started in a separate thread
+
+objectName.name = ObjectName
+objectName.description = the ObjectName used to register the JMXConnectorServer
+
+secured.name = Secured
+secured.description = whether to start MBean server with SSL
+
+keyStoreAvailabilityTimeout.name = KeyStore Availability Timeout
+keyStoreAvailabilityTimeout.description = Number of milliseconds waiting for keystore to be loaded.
+
+secureAlgorithm.name = Secure Algorithm
+secureAlgorithm.description = Algorithm to use
+
+secureProtocol.name = Secure Protocol
+secureProtocol.description = Protocol to use
+
+keyStore.name = Keystore Name
+keyStore.description = Keystore name from keystore manager
+
+keyAlias.name = Key Alias
+keyAlias.description = Key alias to be used with secured connector
+
+trustStore.name = Truststore Name
+trustStore.description = Truststore name from keystore manager
+
+authenticatorType.name = Authenticator Type
+authenticatorType.description = Authenticator to use. Available values are "none", "password", and "certificate".
diff --git a/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.xml
new file mode 100644
index 0000000..b522eb2
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.xml
@@ -0,0 +1,45 @@
+<?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.
+
+-->
+<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0" localization="OSGI-INF/metatype/metatype">
+    <OCD id="org.apache.karaf.management" name="%management.name" description="%management.description">
+        <AD id="rmiRegistryPort" type="Integer" default="1099" name="%rmiRegistryPort.name"
+            description="%rmiRegistryPort.description"/>
+        <AD id="rmiServerPort" type="Integer" default="44444" name="%rmiServerPort.name"
+            description="%rmiServerPort.description"/>
+        <AD id="jmxRealm" type="String" default="karaf" name="%jmxRealm.name"
+            description="%jmxRealm.description"/>
+        <AD id="serviceUrl" type="String" default="service:jmx:rmi://localhost:44444/jndi/rmi://localhost:1099/jmxrmi" name="%serviceUrl.name"
+            description="%serviceUrl.description"/>
+        <AD id="daemon" type="Boolean" default="true" name="%daemon.name" description="%daemon.description"/>
+        <AD id="threaded" type="Boolean" default="true" name="%threaded.name" description="%threaded.description"/>
+        <AD id="objectName" type="String" default="connector:name=rmi" name="%objectName.name" description="%objectName.description"/>
+        <AD id="secured" type="Boolean" default="false" name="%secured.name" description="%secured.description"/>
+        <AD id="keyStoreAvailabilityTimeout" type="Boolean" default="false" name="%keyStoreAvailabilityTimeout.name" description="%keyStoreAvailabilityTimeout.description"/>
+        <AD id="secureAlgorithm" type="String" default="default" name="%secureAlgorithm.name" description="%secureAlgorithm.description"/>
+        <AD id="secureProtocol" type="String" default="TLS" name="%secureProtocol.name" description="%secureProtocol.description"/>
+        <AD id="keyStore" type="String" default="karaf.ks" name="%keyStore.name" description="%keyStore.description"/>
+        <AD id="keyAlias" type="String" default="karaf" name="%keyAlias.name" description="%keyAlias.description"/>
+        <AD id="trustStore" type="String" default="karaf.ts" name="%trustStore.name" description="%trustStore.description"/>
+        <AD id="authenticatorType" type="String" default="password" name="%authenticatorType.name" description="%authenticatorType.description"/>
+    </OCD>
+    <Designate pid="org.apache.karaf.management">
+        <Object ocdref="org.apache.karaf.management"/>
+    </Designate>
+</metatype:MetaData>
diff --git a/karaf-2.2.x/management/server/src/test/configs/factories/management.properties b/karaf-2.2.x/management/server/src/test/configs/factories/management.properties
new file mode 100644
index 0000000..0357bf2
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/test/configs/factories/management.properties
@@ -0,0 +1,26 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+service.pid=org.apache.karaf.management.JmxConnectorServiceFactory
+instances=1
+keys=objectName,serviceUrl,threaded,daemon,
+objectName.1=connector:name=rmi
+serviceUrl.1=service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
+threaded.1=true
+daemon.1=true
diff --git a/karaf-2.2.x/management/server/src/test/configs/services/org.ops4j.pax.logging.properties b/karaf-2.2.x/management/server/src/test/configs/services/org.ops4j.pax.logging.properties
new file mode 100644
index 0000000..d1f34a6
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/test/configs/services/org.ops4j.pax.logging.properties
@@ -0,0 +1,34 @@
+# 
+# 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.
+#
+#
+log4j.rootLogger=DEBUG, out
+
+log4j.logger.org.springframework=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.FileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+log4j.appender.out.file=target/shell.log
+log4j.appender.out.append=true
diff --git a/karaf-2.2.x/management/server/src/test/java/org/apache/karaf/management/MBeanRegistererTest.java b/karaf-2.2.x/management/server/src/test/java/org/apache/karaf/management/MBeanRegistererTest.java
new file mode 100644
index 0000000..e02f127
--- /dev/null
+++ b/karaf-2.2.x/management/server/src/test/java/org/apache/karaf/management/MBeanRegistererTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.karaf.management;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+import static org.easymock.classextension.EasyMock.*;
+import org.easymock.classextension.IMocksControl;
+
+import junit.framework.TestCase;
+
+public class MBeanRegistererTest extends TestCase {
+    public void testRegistration() throws Exception {
+        IMocksControl control = createNiceControl();
+        MBeanServer mbeanServer = control.createMock(MBeanServer.class);
+        String rawName = "org.apache.karaf:type=admin,name=${karaf.name}";
+        AdminServiceMBean mbean = control.createMock(AdminServiceMBean.class);
+        ObjectName name = new ObjectName("org.apache.karaf:type=admin,name=foobar");
+        expect(mbeanServer.registerMBean(isA(AdminServiceMBean.class), eq(name))).andReturn(null);
+        mbeanServer.unregisterMBean(eq(name));
+        expectLastCall();
+        control.replay();
+
+        String old = System.getProperty("karaf.name");
+        System.setProperty("karaf.name", "foobar");
+        MBeanRegistrer registerer = new MBeanRegistrer();
+        Map<Object, String> mbeans = new HashMap<Object, String>();
+        mbeans.put(mbean, rawName);
+        registerer.setMbeans(mbeans);
+        registerer.registerMBeanServer(mbeanServer);
+        registerer.unregisterMBeanServer(mbeanServer);
+
+        restoreProperties(old);
+        control.verify();
+    }
+
+    private void restoreProperties(String old) {
+        if (old != null) {
+           System.setProperty("karaf.name", old);
+        } else { 
+           System.getProperties().remove("karaf.name");
+        }
+    }
+
+	public static interface AdminServiceMBean {
+	    int createInstance(String name) throws Exception;
+	}
+}
diff --git a/karaf-2.2.x/manual/pom.xml b/karaf-2.2.x/manual/pom.xml
new file mode 100644
index 0000000..a85507c
--- /dev/null
+++ b/karaf-2.2.x/manual/pom.xml
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>manual</artifactId>
+    <name>Apache Karaf :: Manual</name>
+    <packaging>war</packaging>
+
+    <properties>
+        <manual.dir>${project.build.directory}/manual</manual.dir>
+        <manual>${manual.dir}/manual-${project.version}</manual>
+        <netbeans.hint.deploy.server>Tomcat60</netbeans.hint.deploy.server>
+        <jetty-port>8080</jetty-port>
+        <jetty-war-dir>${project.build.directory}/webapp/</jetty-war-dir>
+        <scalate.version>1.4.0</scalate.version>
+        <wikitext.version>1.3</wikitext.version>
+        <scalate.editor>${env.SCALATE_EDITOR}</scalate.editor>
+        <scalate.mode>production</scalate.mode>
+        <scalate.workdir>${project.build.directory}/scalateWorkDir</scalate.workdir>
+        <karaf.version>${project.version}</karaf.version>
+        <maven.wagon.version>1.0-beta-6</maven.wagon.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>fusesource</id>
+            <name>Fusesource Maven Repository</name>
+            <url>http://repo.fusesource.com/nexus/content/repositories/snapshots/</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <pluginRepositories>
+        <pluginRepository>
+            <id>fusesource</id>
+            <name>Fusesource Maven Repository</name>
+            <url>http://repo.fusesource.com/nexus/content/repositories/snapshots/</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.fusesource.scalate</groupId>
+            <artifactId>scalate-wikitext</artifactId>
+            <version>${scalate.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>0.9.24</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-library</artifactId>
+            <version>2.8.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.scala-lang</groupId>
+            <artifactId>scala-compiler</artifactId>
+            <version>2.8.1</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>filter</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/webapp</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/webapp</directory>
+                                    <filtering>true</filtering>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-source</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>${project.build.directory}/webapp</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>cmdhelp-maven-plugin</artifactId>
+                <version>${project.version}</version>
+                <executions>
+                    <execution>
+                        <id>generate-commands</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>cmdhelp</goal>
+                        </goals>
+                        <configuration>
+                            <format>conf</format>
+                            <targetFolder>${project.build.directory}/webapp/commands/</targetFolder>
+                            <classLoader>plugin</classLoader>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <!-- Commands for help generation -->
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.commands</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.config</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.console</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.dev</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.log</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.obr</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.osgi</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.packages</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.ssh</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.web</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.shell</groupId>
+                        <artifactId>org.apache.karaf.shell.wrapper</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.admin</groupId>
+                        <artifactId>org.apache.karaf.admin.command</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.diagnostic</groupId>
+                        <artifactId>org.apache.karaf.diagnostic.command</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.features</groupId>
+                        <artifactId>org.apache.karaf.features.command</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.apache.karaf.jaas</groupId>
+                        <artifactId>org.apache.karaf.jaas.command</artifactId>
+                        <version>${project.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <groupId>org.fusesource.scalate</groupId>
+                <artifactId>maven-scalate-plugin</artifactId>
+                <version>${scalate.version}</version>
+                <executions>
+                    <execution>
+                        <id>generate-htmls</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>sitegen-no-fork</goal>
+                        </goals>
+                        <configuration>
+                            <warSourceDirectory>${project.build.directory}/webapp</warSourceDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+                <configuration>
+                    <remoteServerId>people.apache.org</remoteServerId>
+                    <remoteServerUrl>scp://people.apache.org/www/karaf.apache.org/manual/${karaf.version}</remoteServerUrl>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.wagon</groupId>
+                        <artifactId>wagon-ssh</artifactId>
+                        <version>${maven.wagon.version}</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.fusesource.wikitext</groupId>
+                        <artifactId>confluence-core</artifactId>
+                        <version>${wikitext.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>create-manual</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                        <configuration>
+                            <tasks>
+                                <mkdir dir="${manual.dir}" />
+                                <move file="${project.build.directory}/sitegen/manual.html" tofile="${manual}.html" />
+                                <echo message="Generating PDF using Prince XML (http://www.princexml.com/)" />
+                                <exec executable="prince">
+                                    <arg value="${manual}.html" />
+                                    <arg value="${manual}.pdf" />
+                                    <arg value="--log" />
+                                    <arg value="${project.build.directory}/prince.log" />
+                                </exec>
+                                <attachartifact file="${manual}.html" type="html" />
+                                <attachartifact file="${manual}.pdf" type="pdf" />
+                            </tasks>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <webResources>
+                        <resource>
+                            <directory>${project.build.directory}/webapp/</directory>
+                        </resource>
+                    </webResources>
+                    <archive>
+                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+                    </archive>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.mortbay.jetty</groupId>
+                <artifactId>jetty-maven-plugin</artifactId>
+                <version>7.1.5.v20100705</version>
+                <configuration>
+                    <!-- When editing the conf files, you can comment this line to run
+                        mvn jetty:run
+                       to have a live web site
+                    -->
+                    <webAppSourceDirectory>${jetty-war-dir}</webAppSourceDirectory>
+
+                    <systemProperties>
+                        <systemProperty>
+                            <name>scalate.editor</name>
+                            <value>${scalate.editor}</value>
+                        </systemProperty>
+                        <systemProperty>
+                            <name>scalate.workdir</name>
+                            <value>${scalate.workdir}</value>
+                        </systemProperty>
+                        <systemProperty>
+                            <name>scalate.mode</name>
+                            <value>${scalate.mode}</value>
+                        </systemProperty>
+                    </systemProperties>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>bundle-manifest</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>manifest</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <supportedProjectTypes>
+                        <supportedProjectType>jar</supportedProjectType>
+                        <supportedProjectType>bundle</supportedProjectType>
+                        <supportedProjectType>war</supportedProjectType>
+                    </supportedProjectTypes>
+                    <instructions>
+                        <Import-Package>
+                            javax.servlet,
+                            javax.servlet.http,
+                            org.osgi.framework,
+                            org.osgi.service.packageadmin,
+                            javax.swing.tree,
+                            org.apache.commons.logging;provider=paxlogging;resolution:=optional,
+                            org.apache.log4j;provider=paxlogging;resolution:=optional,
+                            org.slf4j;provider=paxlogging;resolution:=optional;version="[1.5,2)",
+                            *
+                        </Import-Package>
+                        <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
+                        <Embed-Directory>WEB-INF/lib</Embed-Directory>
+                        <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
+                        <Embed-Transitive>true</Embed-Transitive>
+                        <Webapp-Context>/karaf-doc</Webapp-Context>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.fusesource.scalate</groupId>
+                <artifactId>maven-scalate-plugin</artifactId>
+                <version>${scalate.version}</version>
+            </plugin>
+        </plugins>
+    </reporting>
+
+    <profiles>
+        <profile>
+            <id>live</id>
+            <properties>
+                <jetty-war-dir>${basedir}/src/main/webapp/</jetty-war-dir>
+                <scalate.mode>development</scalate.mode>
+            </properties>
+        </profile>
+    </profiles>
+
+</project>
+
diff --git a/karaf-2.2.x/manual/src/fallback/manual.html b/karaf-2.2.x/manual/src/fallback/manual.html
new file mode 100644
index 0000000..4aa3dbd
--- /dev/null
+++ b/karaf-2.2.x/manual/src/fallback/manual.html
@@ -0,0 +1,20 @@
+<!--
+
+    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.
+-->
+<div class="wiki-content">
+    Unable to generate manual.
+</div>
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/fallback/manual.pdf b/karaf-2.2.x/manual/src/fallback/manual.pdf
new file mode 100644
index 0000000..72f3d80
--- /dev/null
+++ b/karaf-2.2.x/manual/src/fallback/manual.pdf
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/.livereload b/karaf-2.2.x/manual/src/main/webapp/.livereload
new file mode 100644
index 0000000..b185045
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/.livereload
@@ -0,0 +1,19 @@
+# Lines starting with pound sign (#) are ignored.
+
+# additional extensions to monitor
+#config.exts << 'haml'
+
+# exclude files with NAMES matching this mask
+#config.exclusions << '~*'
+# exclude files with PATHS matching this mask (if the mask contains a slash)
+#config.exclusions << '/excluded_dir/*'
+# exclude files with PATHS matching this REGEXP
+#config.exclusions << /somedir.*(ab){2,4}.(css|js)$/
+
+# reload the whole page when .js changes
+#config.apply_js_live = false
+# reload the whole page when .css changes
+#config.apply_css_live = false
+
+# wait 100ms for more changes before reloading a page
+#config.grace_period = 0.1
diff --git a/karaf-2.2.x/manual/src/main/webapp/WEB-INF/scalate/layouts/default.scaml b/karaf-2.2.x/manual/src/main/webapp/WEB-INF/scalate/layouts/default.scaml
new file mode 100644
index 0000000..8b7b00b
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/WEB-INF/scalate/layouts/default.scaml
@@ -0,0 +1,116 @@
+-#
+-# Copyright (C) 2009-2010 the original author or authors.
+-# See the notice.md file distributed with this work for additional
+-# information regarding copyright ownership.
+-#
+-# 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.
+-#
+
+-@ var body: String
+-@ var title : String = "Apache Karaf ${project.version} Guide"
+- response.setContentType("text/html")
+
+-# Only include the console if it's available and the engine is in dev mode.
+- val include_console = engine.isDevelopmentMode && engine.resourceLoader.exists("/org/fusesource/scalate/console/console_head.scaml")
+
+!!! Basic
+%html(lang="en")
+  %head
+    %meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
+    %meta(name="description" content="description goes here")
+    %meta(name="keywords" content="keywords,goes,here")
+    %meta(name="author" content="The Apache Karaf Team")
+
+    - if (include_console)
+      = include("/org/fusesource/scalate/console/console_head.scaml")
+
+    %link(href={uri("/css/style.css")} rel="stylesheet" type="text/css")
+    %link(href={uri("/css/pygmentize.css")} rel="stylesheet" type="text/css")
+
+    - if (include_console)
+      %link(href={uri("/css/scalate/console.css")} rel="stylesheet" type="text/css")
+
+    %title
+      = title
+  
+  %body
+    %table{:width => "100%", :cellpadding => "0", :cellspacing => "0"}
+      %tr{:width => "100%"}
+        %td#cell-0-0{:colspan => "2"}
+          &nbsp;
+        %td#cell-0-1
+          &nbsp;
+        %td#cell-0-2{:colspan => "2"}
+          &nbsp;
+      %tr{:width => "100%"}
+        %td#cell-1-0
+          &nbsp;
+        %td#cell-1-1
+          &nbsp;
+        %td#cell-1-2
+          %div{:style => "padding: 5px;"}
+            #banner
+              = include("/_banner.ssp")
+            #top-menu
+              %table{:border => "0", :cellpadding => "1", :cellspacing => "0", :width => "100%"}
+                %tr
+                  %td
+                    %div{:align => "left"}
+                  %td
+                    %div{:align => "right"}
+                      = include("/_quicklinks.ssp")
+        %td#cell-1-3
+          &nbsp;
+        %td#cell-1-4
+          &nbsp;
+      %tr{:width => "100%"}
+        %td#cell-2-0{:colspan => "2"}
+          &nbsp;
+        %td#cell-2-1
+          %table
+            %tr{:height => "100%", :valign => "top"}
+              %td{:height => "100%"}
+                #wrapper-menu-page-right
+                  #wrapper-menu-page-top
+                    #wrapper-menu-page-bottom
+                      #menu-page
+                        = include("/_navigation.conf")
+              %td{:height =>"100%", :width => "100%"}
+                .wiki-content
+                  !~~ body
+        %td#cell-2-2{:colspan => "2"}
+          &nbsp;
+      %tr{:width => "100%"}
+        %td#cell-3-0
+          &nbsp;
+        %td#cell-3-1
+          &nbsp;
+        %td#cell-3-2
+          #footer
+            #site-footer
+              &copy; 2008-2011 The Apache Software Foundation
+              %br
+              Apache Karaf, Karaf, Apache, the Apache feather logo, and the Apache Karaf project logo are trademarks of The Apache Software Foundation.
+        %td#cell-3-3
+          &nbsp;
+        %td#cell-3-4
+          &nbsp;
+      %tr{:width => "100%"}
+        %td#cell-4-0{:colspan => "2"}
+          &nbsp;
+        %td#cell-4-1
+          &nbsp;
+        %td#cell-4-2{:colspan => "2"}
+          &nbsp;
+    - if (include_console)
+      = include("/org/fusesource/scalate/console/console.scaml")
diff --git a/karaf-2.2.x/manual/src/main/webapp/WEB-INF/scalate/layouts/print.ssp b/karaf-2.2.x/manual/src/main/webapp/WEB-INF/scalate/layouts/print.ssp
new file mode 100644
index 0000000..1a042ef
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/WEB-INF/scalate/layouts/print.ssp
@@ -0,0 +1,817 @@
+<%--
+Copyright (C) 2009-2010 the original author or authors.
+See the notice.md file distributed with this work for additional
+information regarding copyright ownership.
+
+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.
+--%>
+<%@ var body: String %>
+<%@ var title: String = "Apache Karaf ${karaf.version}" %>
+<% escapeMarkup = false %>
+<!DOCTYPE html>
+<html>
+<head>
+  <style type="text/css">
+/*
+
+Copyright (c) 2005 Hakon Wium Lie and Bert Bos
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+html {
+  margin: 0; padding: 0;
+  font: 10pt/1.26 "Gill Sans", sans-serif;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: "Gill Sans", sans-serif;
+  margin: 2em 0 0.5em 0;
+  page-break-after: avoid;
+}
+
+h1 {
+  font-size: 2.0em;
+  font-weight: 900;
+
+  margin: 0;
+  margin-left:-2cm;
+  margin-top:-1cm;
+  margin-bottom:1.5cm;
+  top: 0cm;
+  left: 0cm;
+  padding: 2cm;
+  padding-top: 0cm;
+  padding-bottom: 1cm;
+  background: #888;
+  border-bottom-right-radius: 2cm;
+  page-break-before: always;
+  page-break-inside: avoid;
+}
+
+@media screen, handheld {
+h1 {
+  margin-top:1cm;
+  background-image: url("chapter-rounded-bottom.png");
+  background-repeat: no-repeat;
+  background-position: bottom right;
+}
+div.page-reset > h1 {
+  margin-top:0cm;
+}
+}
+
+
+h2 {
+  font-size: 1.2em;
+  text-transform: uppercase;
+  font-weight: bold;
+}
+
+h3 {
+  font-size: 1em;
+  font-weight: bold;
+}
+
+q::before {
+  content: "\201C";
+}
+
+q::after {
+  content: "\201D";
+}
+
+p { margin: 0 }
+p + p { text-indent: 1.3em ; margin-top: 0.2em; }
+p.sidenote + p, p.caption, p.art { text-indent: 0 }
+
+p.author {
+  margin-top: 2em;
+  text-indent: 0;
+  text-align: right;
+}
+
+a { text-decoration: none; color: black }
+
+/* cross-references */
+
+a.pageref::after { content: " on page " target-counter(attr(href), page); }
+a.chapref::before { content: " Chapter " target-counter(attr(href), chapter) ", "; }
+a.figref { content: " Figure " target-counter(attr(href), figure); }
+a.tableref { content: " Table " target-counter(attr(href), figure); }
+a.listingref { content: " Listing " target-counter(attr(href), listing); }
+
+/* sidenotes */
+
+.sidenote {
+  float: left;
+  clear: left;
+  margin: 0 0 1em -41%;
+  width: 37%;
+  font-size: 0.9em;
+  font-style: normal;
+  text-indent: 0;
+  text-align: right;
+  page-break-inside: avoid;
+}
+
+/* sidebars */
+
+div.sidebar {
+  float: top-next;
+  margin: 1.2em 0 1.2em 0;
+  border: thin solid;
+  background: #CCC;
+  padding: 0.5em 1em;
+  page-break-inside: avoid;
+  column-count: 2;
+  column-gap: 1.5em;
+}
+
+div.sidebar h2 {
+  margin-top: 0;
+}
+
+/* frontpage */
+
+.title p{
+	font-size:22pt;
+  	font-family: "Gill Sans", sans-serif;
+  	text-align: center;
+}
+
+.copyright-section {
+	text-align: center;
+	font-size: 9pt;
+	page-break-after: always;
+	margin-top: 50pt;
+	margin-bottom: 20pt;
+}
+
+.toc-title {
+	font-size:18pt;
+  	font-family: "Gill Sans", sans-serif;
+  	text-align: left;
+  	margin-left:20pt;
+  	margin-bottom: 40pt;
+
+}
+
+/* figures, tables, and listings */
+
+div.confluenceTableSmall th.confluenceTh {
+  font-size: 11px;
+}
+
+div.confluenceTableSmall td.confluenceTd {
+  font-size: 7px;
+}
+
+div.figure {
+  margin: 1em 0;
+  counter-increment: figure;
+}
+
+div.figure .caption, div.table .caption {
+  font-size: 0.9em;
+  font-style: italic;
+}
+
+div.figure .caption::before {
+  content: "Figure " counter(figure) ". ";
+  font-weight: bold;
+  font-style: normal;
+}
+
+div.table .caption::before {
+  content: "Table " counter(table) ". ";
+  font-weight: bold;
+  font-style: normal;
+}
+
+div.table {
+  margin: 1em 0;
+  counter-increment: table;
+}
+
+div.table th {
+  text-align: left;
+}
+
+table th, table td {
+  text-align: left;
+  padding-right: 1em;
+  page-break-inside: avoid;
+}
+
+table th {
+  border-top: thin solid;
+  border-bottom: thin solid;
+  padding-top: 0.2em;
+  padding-bottom: 0.2em;
+}
+table td {
+  border-top: none;
+  border-bottom: thin dotted;
+  padding-top: 0.2em;
+  padding-bottom: 0.2em;
+}
+
+div.Scrollbar {
+	display: none;
+}
+
+
+/* Weird div.codeHeader a b::before would be a better selection
+   but prince does not properly match it.. Firefox does. */
+div.codeHeader::before {
+  content: "Listing " counter(listing) ". ";
+  font-weight: bold;
+  font-style: normal;
+}
+div.codeHeader a b {
+  font-style: italic;
+  font-weight: normal;
+}
+div.codeHeader {
+  font-size: 0.9em;
+  counter-increment: listing;
+}
+div.code {
+	border: 1px dashed #c0c0c0;
+    font-size: 12px;
+	font-family: Courier;
+    margin: 5px;
+	line-height: 13px;
+	padding: 3px;
+	background-color: #f8f8f8;
+
+}
+
+
+@page {
+  margin: 2cm;
+  size: 7in 9.25in;
+
+  @footnotes {
+    border-top: thin solid black;
+    padding-top: 0.3em;
+    margin-top: 0.6em;
+  }
+}
+
+
+/* define default page and names pages: cover, blank, frontmatter */
+div.page-reset {
+    counter-reset: page 1;
+}
+
+@page :left {
+  @top-left-corner {
+    font-weight: 900; font: 9pt "Gill Sans", serif;
+    content: counter(page);
+    text-align: left;
+    margin-left: 1cm;
+    visibility: hidden;
+  }
+  @top-left {
+    font-weight: 900;
+    font: 9pt "Gill Sans", serif; white-space: pre; text-transform: uppercase; letter-spacing: 0.1em;
+    content: string(header, first);
+    visibility: hidden;
+  }
+  @bottom-left-corner {
+    font-weight: 900; font: 9pt "Gill Sans", serif;
+    content: counter(page);
+    text-align: left;
+    margin-left: 1cm;
+  }
+  @bottom-left {
+    font-weight: 900;
+    font: 9pt "Gill Sans", serif; white-space: pre; text-transform: uppercase; letter-spacing: 0.1em;
+    content: string(header, first);
+  }
+}
+
+@page :right {
+  @top-right-corner {
+    font-weight: 900; font: 9pt "Gill Sans", serif;
+    content: counter(page);
+    text-align: left;
+    margin-left: 1cm;
+    visibility: hidden;
+  }
+  @top-right {
+    font-weight: 900;
+    font: 9pt "Gill Sans", serif; white-space: pre; text-transform: uppercase; letter-spacing: 0.1em;
+    content: string(header, first)
+    visibility: hidden;
+  }
+  @bottom-right-corner {
+    font-weight: 900; font: 9pt "Gill Sans", serif;
+    content: counter(page);
+    text-align: right;
+    margin-right: 1cm;
+  }
+  @bottom-right {
+    font-weight: 900; font: 9pt "Gill Sans", serif;
+    white-space: pre; text-transform: uppercase; letter-spacing: 0.1em;
+    content: string(header, first)
+  }
+}
+
+/*
+  In theory we should be able to use the :first selector so taht
+  we can put the page numbering on the bottom of the first page of the chapter
+  but have the rest of the pages number at the top.  But this does not seem
+  to work.  See http://www.princexml.com/doc/6.0/page-selectors/
+
+  So for now just always number at the bottom :(
+*/
+/*
+div.chapter { page: bottom-number; }
+@page bottom-number :first {
+  @top-left {
+    visibility: hidden;
+  }
+  @bottom-left {
+    visibility: visible;
+  }
+  @top-right {
+    visibility: hidden;
+  }
+  @bottom-right {
+    visibility: visible;
+  }
+}
+*/
+
+@page cover { margin: 0; }
+
+@page frontmatter :left {
+  @bottom-left-corner {
+    content: counter(page, lower-roman);
+  }
+  @bottom-left-corner {
+    content: counter(page, lower-roman);
+  }
+}
+
+@page frontmatter :right {
+  @bottom-right-corner {
+    content: counter(page, lower-roman);
+  }
+  @bottom-right-corner {
+    content: counter(page, lower-roman);
+  }
+}
+
+@page blank :left {
+  @top-left { visibility: hidden; }
+  @bottom-left { visibility: hidden; }
+  @top-left-corner { visibility: hidden; }
+  @bottom-left-corner { visibility: hidden; }
+}
+
+@page blank :right {
+  @top-right { visibility: hidden; }
+  @bottom-right { visibility: hidden; }
+  @top-right-corner { visibility: hidden; }
+  @bottom-right-corner { visibility: hidden; }
+}
+
+/* footnotes */
+.footnote {
+  display: none;                   /* default rule */
+
+  display: prince-footnote;        /* prince-specific rules */
+  position: footnote;
+  footnote-style-position: inside;
+
+  counter-increment: footnote;
+  margin-left: 1.4em;
+  font-size: 90%;
+  line-height: 1.4;
+}
+
+.footnote::footnote-call {
+  vertical-align: super;
+  font-size: 80%;
+}
+
+.footnote::footnote-marker {
+  vertical-align: super;
+  color: green;
+  padding-right: 0.4em;
+}
+
+/* Confluence contents to hide */
+#labels-section {
+	display: none;
+}
+#comments-section {
+	display: none;
+}
+#footer {
+	display: none;
+}
+.hidden {
+	display: none;
+}
+
+/*
+   A book consists of different types of sections. We propose to use
+   DIV elements with these class names:
+
+    frontcover
+    halftitlepage: contains the title of the book
+    titlepage: contains the title of the book, name of author(s) and publisher
+    imprint: left page with copyright, publisher, library printing information
+    dedication: right page with short dedication
+    foreword: written by someone other than the author(s)
+    toc: table of contents
+    preface: preface, including acknowledgements
+    chapter: each chapter is given its own DIV element
+    references: contains list of references
+    appendix: each appendix is given its own
+    bibliography
+    glossary
+    index
+    colophon: describes how the book was produced
+    backcover
+
+   A book will use several of the types listed above, but few books
+   will use all of them.
+*/
+
+/* which section uses which named page */
+
+div.halftitlepage, div.titlepage, div.imprint, div.dedication { page: blank }
+div.foreword, div.toc, div.preface { page: frontmatter }
+
+
+/* page breaks */
+div.frontcover, div.halftitlepage, div.titlepage { page-break-before: right }
+div.imprint { page-break-before: always; }
+div.chapter { page-break-before: always; }
+div.dedication, div.foreword, div.toc, div.preface, div.reference,
+div.appendix, div.bibliography, div.glossary, div.index, div.colophon {
+  page-break-before: always
+}
+div.backcover { page-break-before: left }
+
+/* titlepage, halftitlepage */
+
+div.titlepage h1, div.halftitlepage h1 { margin-bottom: 2em; }
+div.titlepage h2, div.halftitlepage h2 { font-size: 1.2em; margin-bottom: 3em; }
+div.titlepage h3, div.halftitlepage h3 { font-size: 1em; margin-bottom: 3em; }
+div.titlepage p, div.halftitlepage p {
+  font-size: 1.4em;
+  font-weight: bold;
+  margin: 0; padding: 0;
+}
+
+
+/* TOC */
+
+ul.toc, ul.toc ul {
+  list-style-type: none;
+  margin: 0; padding: 0;
+  margin-left: 3cm;
+}
+ul.toc ul {
+  margin-left: 1em;
+  font-weight: normal;
+}
+ul.toc > li {
+  font-weight: bold;
+  margin-bottom: 0.5em;
+}
+ul.toc a::after {
+  content: leader('.') target-counter(attr(href), page);
+  font-style: normal;
+}
+ul.toc > li.frontmatter a::after {
+  content: leader('.') target-counter(attr(href), page, lower-roman);
+  font-style: normal;
+}
+ul.toc > li.endmatter a::after {
+  content: leader('.') target-counter(attr(href), page);
+  font-style: normal;
+}
+ul.toc > li.chapter::before {
+  content: "Chapter " counter(toc-chapter, decimal);
+  display: block;
+  margin: 1em 0 0.1em -2.5cm;
+  font-weight: normal;
+  counter-increment: toc-chapter;
+  page-break-after: avoid;
+}
+
+/* chapter numbers */
+
+div.chapter { counter-increment: chapter; }
+div.chapter h1::before {
+  text-transform: uppercase;
+  letter-spacing: 0.15em;
+  content: "Chapter  " counter(chapter) " \A\B0 \B0 \B0 \B0\A";
+  white-space: pre;
+  font-size: 50%;
+}
+
+div.frontcover h1::before, div.titlepage h1::before, div.halftitlepage h1::before {
+  content: normal; /* that is, none */
+}
+
+h1 { string-set: header content();}
+div.chapter h1 { string-set: header "Chapter " counter(chapter) " - " content(); }
+
+/* index */
+
+ul.index {
+  list-style-type: none;
+  margin: 0; padding: 0;
+  column-count: 2;
+  column-gap: 1em;
+}
+
+ul.index a::after { content: ", " target-counter(attr(href), page); }
+
+
+span.element, span.attribute {
+  text-transform: uppercase;
+  font-weight: bold;
+  font-size: 80%;
+}
+span.property { font-weight: bold }
+code, span.css, span.value, span.declaration {
+  font: 90% "Lucida Console", "Lucida Sans Typewriter", monospace;
+}
+
+
+@media screen, handheld {
+  html {font: 14px "Gill Sans", sans-serif; }
+  h1 { margin-bottom: 0.5em }
+  div.frontcover, div.halftitlepage, div.titlepage, div.imprint,
+  div.dedication, div.foreword, div.toc, div.index { display: none }
+  body {
+      margin: 0cm;
+      margin-left: 2cm;
+      margin-right: 2cm;
+  }
+}
+
+/*
+ * Enhancements to the take advantage of some of the style markup that
+ * Confluence generates
+ */
+a sup img { visibility: hidden; position: absolute;}
+
+img {
+  prince-image-resolution:150dpi;
+}
+
+table {
+  font: "Lucida Console", "Lucida Sans Typewriter", monospace;
+}
+
+table td {
+  font-size: 10pt;
+}
+
+pre {
+   white-space: pre-wrap;
+}
+
+.codeContent {
+  font-size: 80%;
+}
+.code {
+}
+.code-keyword {
+  color: #000091;
+  background-color: inherit;
+}
+
+.code-object {
+  color: #910091;
+  background-color: inherit;
+}
+
+.code-quote {
+  color: #009100;
+  background-color: inherit;
+}
+
+.code-comment {
+  color: #808080;
+  background-color: inherit;
+}
+
+
+.code-xml .code-keyword {
+  color: inherit;
+  font-weight: bold;
+}
+
+.code-tag {
+  color: #000091;
+  background-color: inherit;
+}
+
+.noteMacro { border-color: #F0C000; background-color: #FFFFCE;}
+.warningMacro { border-color: #CC0000; background-color: #FFCCCC }
+.infoMacro { border-color: #3c78b5; background-color: #D8E4F1; }
+.tipMacro { border-color: #090; background-color: #dfd;}
+.noteMacro, .warningMacro, .infoMacro, .tipMacro, .informationMacroPadding {
+  border: thin solid;
+  float: top-next;
+  margin: 1em 0 1.2em 0;
+  padding: 0.5em;
+  column-count: 2;
+  column-gap: 1.5em;
+  width: 100%;
+}
+table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
+    border: none;
+}
+table.infoMacro p, table.warningMacro p, table.tipMacro p, table.noteMacro p, table.sectionMacro p {
+    font-size:x-small;
+    margin-top: 1em;
+}
+  </style>
+  <style type="text/css">
+.syntax .hll { background-color: #ffffcc }
+.syntax  { background: #f0f0f0; }
+.syntax .c { color: #60a0b0; font-style: italic } /* Comment */
+.syntax .err { border: 1px solid #FF0000 } /* Error */
+.syntax .k { color: #007020; font-weight: bold } /* Keyword */
+.syntax .o { color: #666666 } /* Operator */
+.syntax .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
+.syntax .cp { color: #007020 } /* Comment.Preproc */
+.syntax .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
+.syntax .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
+.syntax .gd { color: #A00000 } /* Generic.Deleted */
+.syntax .ge { font-style: italic } /* Generic.Emph */
+.syntax .gr { color: #FF0000 } /* Generic.Error */
+.syntax .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.syntax .gi { color: #00A000 } /* Generic.Inserted */
+.syntax .go { color: #808080 } /* Generic.Output */
+.syntax .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.syntax .gs { font-weight: bold } /* Generic.Strong */
+.syntax .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.syntax .gt { color: #0040D0 } /* Generic.Traceback */
+.syntax .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.syntax .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.syntax .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.syntax .kp { color: #007020 } /* Keyword.Pseudo */
+.syntax .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.syntax .kt { color: #902000 } /* Keyword.Type */
+.syntax .m { color: #40a070 } /* Literal.Number */
+.syntax .s { color: #4070a0 } /* Literal.String */
+.syntax .na { color: #4070a0 } /* Name.Attribute */
+.syntax .nb { color: #007020 } /* Name.Builtin */
+.syntax .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.syntax .no { color: #60add5 } /* Name.Constant */
+.syntax .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.syntax .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.syntax .ne { color: #007020 } /* Name.Exception */
+.syntax .nf { color: #06287e } /* Name.Function */
+.syntax .nl { color: #002070; font-weight: bold } /* Name.Label */
+.syntax .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.syntax .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.syntax .nv { color: #bb60d5 } /* Name.Variable */
+.syntax .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.syntax .w { color: #bbbbbb } /* Text.Whitespace */
+.syntax .mf { color: #40a070 } /* Literal.Number.Float */
+.syntax .mh { color: #40a070 } /* Literal.Number.Hex */
+.syntax .mi { color: #40a070 } /* Literal.Number.Integer */
+.syntax .mo { color: #40a070 } /* Literal.Number.Oct */
+.syntax .sb { color: #4070a0 } /* Literal.String.Backtick */
+.syntax .sc { color: #4070a0 } /* Literal.String.Char */
+.syntax .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.syntax .s2 { color: #4070a0 } /* Literal.String.Double */
+.syntax .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.syntax .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.syntax .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.syntax .sx { color: #c65d09 } /* Literal.String.Other */
+.syntax .sr { color: #235388 } /* Literal.String.Regex */
+.syntax .s1 { color: #4070a0 } /* Literal.String.Single */
+.syntax .ss { color: #517918 } /* Literal.String.Symbol */
+.syntax .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.syntax .vc { color: #bb60d5 } /* Name.Variable.Class */
+.syntax .vg { color: #bb60d5 } /* Name.Variable.Global */
+.syntax .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.syntax .il { color: #40a070 } /* Literal.Number.Integer.Long */
+
+
+/* don't highlight errors */
+.syntax .err {
+  border: none;
+}
+
+.syntax {
+  font-size: .9em;
+  font-family:Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
+  background-color: #F8F8FF;
+
+  overflow:auto;
+  -moz-background-clip:border;
+  -moz-background-inline-policy:continuous;
+  -moz-background-origin:padding;
+  margin: 1em 0 1em 0;
+  border:1px solid #DDDDDD;
+
+  border-top-left-radius: 8px; -webkit-border-top-left-radius: 8px; -moz-border-radius-topleft: 8px;
+  border-top-right-radius: 8px; -webkit-border-top-right-radius: 8px; -moz-border-radius-topright: 8px;
+  border-style: solid;  border-width: 1px; border-color: #dedede !important;
+  padding: 1em;
+}
+.syntax .linenodiv  {
+  background-color:#ECECEC;
+  border-right:1px solid #DDDDDD;
+  color:#AAAAAA;
+  padding: .5em;
+  text-align:right;
+}
+.syntax .highlight  {
+}
+.syntax pre {
+  margin:0;
+}
+
+pre.syntax {
+  padding: .5em;
+  background-color: #F8F8FF; overflow:auto;
+}
+
+.syntax code {
+  font-family:Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
+  font-size: 10pt;
+}
+
+div.compare { width: 700px; }
+div.compare div.compare-left { float:left; width:340px; padding:5px; margin-top: 15px; }
+div.compare div.compare-right { float:right; width:340px; padding:5px; margin-top: 15px; }
+div.compare div h3 {
+  margin-left: 15px;
+  padding: 5px 15px;
+  display: inline;
+  font-size: .8em;
+  color: #666;
+
+  border-top: 1px solid #ccc; -moz-border-top-colors: #ccc white white #e5e5e5;
+  border-left: 1px solid #ccc; -moz-border-left-colors: #ccc white white #e5e5e5;
+  border-right: 1px solid #ccc;-moz-border-right-colors: #ccc white white #e5e5e5;
+  border-top-left-radius: 8px; -webkit-border-top-left-radius: 8px;  -moz-border-radius-topleft: 8px;
+  border-top-right-radius: 8px; -webkit-border-top-right-radius: 8px; -moz-border-radius-topright: 8px;
+}
+div.compare div div {
+  margin: 5px 0px 0px 0px;
+}
+.clear {
+  clear:both;
+}
+.wide div.compare div.compare-left { float:none; width:700px; }
+.wide div.compare div.compare-right { float:none; width:700px; }
+
+  </style>
+
+  <title>${title}</title>
+</head>
+<body>
+  <div id="titlepage">
+    <div id="title">Apache Karaf</div>
+    <div id="subtitle">Version ${karaf.version}</div>
+  </div>
+  <div id="main">
+    <%= body %>
+  </div>
+</body>
+</html>
diff --git a/karaf-2.2.x/manual/src/main/webapp/WEB-INF/web.xml b/karaf-2.2.x/manual/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..d461465
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (C) 2009-2010 the original author or authors.
+    See the notice.md file distributed with this work for additional
+    information regarding copyright ownership.
+
+    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.
+
+-->
+
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+	version="2.5">
+
+  <display-name>Apache Karaf Documentation</display-name>
+
+  <description>
+    Apache Karaf Documentation
+  </description>
+
+  <filter>
+    <filter-name>TemplateEngineFilter</filter-name>
+    <filter-class>org.fusesource.scalate.servlet.TemplateEngineFilter</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>TemplateEngineFilter</filter-name>
+    <url-pattern>/*</url-pattern>
+  </filter-mapping>
+
+  <welcome-file-list>
+    <welcome-file>index.conf</welcome-file>
+  </welcome-file-list>
+
+  <error-page>
+    <error-code>500</error-code>
+    <location>/WEB-INF/scalate/errors/500.scaml</location>
+  </error-page>
+</web-app>
diff --git a/karaf-2.2.x/manual/src/main/webapp/_banner.ssp b/karaf-2.2.x/manual/src/main/webapp/_banner.ssp
new file mode 100644
index 0000000..1f9c27d
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/_banner.ssp
@@ -0,0 +1,14 @@
+      <table border="0" cellpadding="0" cellspacing="0" width="100%">
+        <tr>
+          <td align="left" class="topbardiv" nowrap="">
+<a href="http://karaf.apache.org/" title="A server side OSGi distribution">
+            <img border="0" src="${uri("/images/karaf-logo.png")}" width="400px"></img>
+</a>
+          </td>
+          <td align="right" nowrap="">
+<a href="http://www.apache.org/" title="The Apache Sofware Foundation">
+            <img border="0" src="${uri("/images/asf-logo.png")}">
+</a>
+          </td>
+        </tr>
+      </table>
diff --git a/karaf-2.2.x/manual/src/main/webapp/_navigation.conf b/karaf-2.2.x/manual/src/main/webapp/_navigation.conf
new file mode 100644
index 0000000..d880835
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/_navigation.conf
@@ -0,0 +1,43 @@
+h3. [Home|/index]
+
+- [Overview]
+- [Quick Start]
+
+h3. [Users Guide|/users-guide/index]
+
+- [Installing Karaf|/users-guide/installation]
+- [Directory Structure|/users-guide/directory-structure]
+- [Starting and stopping Karaf|/users-guide/start-stop]
+- [OS integration|/users-guide/wrapper]
+- [Using the console|/users-guide/using-console]
+- [Colorized console|/users-guide/colorized-console]
+- [Remote console|/users-guide/remote-console]
+- [Web console|/users-guide/web-console]
+- [Child instances|/users-guide/child-instances]
+- [Security|/users-guide/security]
+- [Failover Deployments|/users-guide/failover]
+- [Logging system|/users-guide/logging-system]
+- [Deployer|/users-guide/deployer]
+- [Provisioning|/users-guide/provisioning]
+- [KAR archive|/users-guide/kar]
+- [Configuration|/users-guide/configuration]
+- [HTTP service|/users-guide/http]
+- [Web applications|/users-guide/web-applications]
+- [JRE tuning|/users-guide/jre-tuning]
+- [JMX for administration and monitoring|jmx]
+
+h3. [Developers Guide|/developers-guide/index]
+
+- [Maven Archetypes|/developers-guide/archetypes]
+- [Branding the Console|/developers-guide/branding-console]
+- [Extending the Console|/developers-guide/extending-console]
+- [Custom Distribution|/developers-guide/custom-distribution]
+- [Security Framework|/developers-guide/security-framework]
+- [Using the features-maven-plugin|/developers-guide/features-maven-plugin]
+- [Troubleshooting, Debugging and Profiling|/developers-guide/debugging]
+- [Programmatically connect to the console|/developers-guide/connect-console]
+- [Writing integration tests|/developers-guide/writing-tests]
+- [Creating bundles|/developers-guide/creating-bundles]
+- [Shell syntax|/developers-guide/shell-syntax]
+
+h3. [Commands|/commands/commands]
diff --git a/karaf-2.2.x/manual/src/main/webapp/_quicklinks.ssp b/karaf-2.2.x/manual/src/main/webapp/_quicklinks.ssp
new file mode 100644
index 0000000..1594d7e
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/_quicklinks.ssp
@@ -0,0 +1,8 @@
+<p>
+<a href="${uri("/index.html")}" title="Home">Home</a>
+&#124;
+<a href="${uri("/users-guide/index.html")}" title="Users Guide">Users Guide</a>
+&#124;
+<a href="${uri("/developers-guide/index.html")}" title="Developers Guide">Developers Guide</a>
+</p>
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/css/pygmentize.css b/karaf-2.2.x/manual/src/main/webapp/css/pygmentize.css
new file mode 100644
index 0000000..80efdcd
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/css/pygmentize.css
@@ -0,0 +1,134 @@
+.syntax .hll { background-color: #ffffcc }
+.syntax  { background: #f0f0f0; }
+.syntax .c { color: #60a0b0; font-style: italic } /* Comment */
+.syntax .err { border: 1px solid #FF0000 } /* Error */
+.syntax .k { color: #007020; font-weight: bold } /* Keyword */
+.syntax .o { color: #666666 } /* Operator */
+.syntax .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
+.syntax .cp { color: #007020 } /* Comment.Preproc */
+.syntax .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
+.syntax .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
+.syntax .gd { color: #A00000 } /* Generic.Deleted */
+.syntax .ge { font-style: italic } /* Generic.Emph */
+.syntax .gr { color: #FF0000 } /* Generic.Error */
+.syntax .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.syntax .gi { color: #00A000 } /* Generic.Inserted */
+.syntax .go { color: #808080 } /* Generic.Output */
+.syntax .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.syntax .gs { font-weight: bold } /* Generic.Strong */
+.syntax .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.syntax .gt { color: #0040D0 } /* Generic.Traceback */
+.syntax .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.syntax .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.syntax .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.syntax .kp { color: #007020 } /* Keyword.Pseudo */
+.syntax .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.syntax .kt { color: #902000 } /* Keyword.Type */
+.syntax .m { color: #40a070 } /* Literal.Number */
+.syntax .s { color: #4070a0 } /* Literal.String */
+.syntax .na { color: #4070a0 } /* Name.Attribute */
+.syntax .nb { color: #007020 } /* Name.Builtin */
+.syntax .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.syntax .no { color: #60add5 } /* Name.Constant */
+.syntax .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.syntax .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.syntax .ne { color: #007020 } /* Name.Exception */
+.syntax .nf { color: #06287e } /* Name.Function */
+.syntax .nl { color: #002070; font-weight: bold } /* Name.Label */
+.syntax .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.syntax .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.syntax .nv { color: #bb60d5 } /* Name.Variable */
+.syntax .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.syntax .w { color: #bbbbbb } /* Text.Whitespace */
+.syntax .mf { color: #40a070 } /* Literal.Number.Float */
+.syntax .mh { color: #40a070 } /* Literal.Number.Hex */
+.syntax .mi { color: #40a070 } /* Literal.Number.Integer */
+.syntax .mo { color: #40a070 } /* Literal.Number.Oct */
+.syntax .sb { color: #4070a0 } /* Literal.String.Backtick */
+.syntax .sc { color: #4070a0 } /* Literal.String.Char */
+.syntax .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.syntax .s2 { color: #4070a0 } /* Literal.String.Double */
+.syntax .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.syntax .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.syntax .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.syntax .sx { color: #c65d09 } /* Literal.String.Other */
+.syntax .sr { color: #235388 } /* Literal.String.Regex */
+.syntax .s1 { color: #4070a0 } /* Literal.String.Single */
+.syntax .ss { color: #517918 } /* Literal.String.Symbol */
+.syntax .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.syntax .vc { color: #bb60d5 } /* Name.Variable.Class */
+.syntax .vg { color: #bb60d5 } /* Name.Variable.Global */
+.syntax .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.syntax .il { color: #40a070 } /* Literal.Number.Integer.Long */
+
+
+/* don't highlight errors */
+.syntax .err {
+  border: none;
+}
+
+.syntax {
+  font-size: .9em;
+  font-family:Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
+  background-color: #F8F8FF; 
+  
+  overflow:auto;
+  -moz-background-clip:border;
+  -moz-background-inline-policy:continuous;
+  -moz-background-origin:padding;
+  margin: 1em 0 1em 0;
+  border:1px solid #DDDDDD;
+  
+  border-top-left-radius: 8px; -webkit-border-top-left-radius: 8px; -moz-border-radius-topleft: 8px;  
+  border-top-right-radius: 8px; -webkit-border-top-right-radius: 8px; -moz-border-radius-topright: 8px;
+  border-style: solid;  border-width: 1px; border-color: #dedede !important; 
+  padding: 1em;
+}
+.syntax .linenodiv  {
+  background-color:#ECECEC;
+  border-right:1px solid #DDDDDD;
+  color:#AAAAAA;
+  padding: .5em;
+  text-align:right;
+}
+.syntax .highlight  {
+}
+.syntax pre {
+  margin:0;
+}
+
+pre.syntax {
+  padding: .5em;
+  background-color: #F8F8FF; overflow:auto;
+}
+
+.syntax code {
+  font-family:Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
+  font-size: 10pt;
+}
+
+div.compare { width: 700px; }
+div.compare div.compare-left { float:left; width:340px; padding:5px; margin-top: 15px; }
+div.compare div.compare-right { float:right; width:340px; padding:5px; margin-top: 15px; }
+div.compare div h3 {
+  margin-left: 15px;
+  padding: 5px 15px;
+  display: inline;
+  font-size: .8em;
+  color: #666;
+
+  border-top: 1px solid #ccc; -moz-border-top-colors: #ccc white white #e5e5e5;
+  border-left: 1px solid #ccc; -moz-border-left-colors: #ccc white white #e5e5e5;
+  border-right: 1px solid #ccc;-moz-border-right-colors: #ccc white white #e5e5e5;
+  border-top-left-radius: 8px; -webkit-border-top-left-radius: 8px;  -moz-border-radius-topleft: 8px;
+  border-top-right-radius: 8px; -webkit-border-top-right-radius: 8px; -moz-border-radius-topright: 8px; 
+}
+div.compare div div {
+  margin: 5px 0px 0px 0px;
+}
+.clear {
+  clear:both;
+}
+.wide div.compare div.compare-left { float:none; width:700px; }
+.wide div.compare div.compare-right { float:none; width:700px; }
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/css/scalate/console.css b/karaf-2.2.x/manual/src/main/webapp/css/scalate/console.css
new file mode 100644
index 0000000..4b2dfe7
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/css/scalate/console.css
@@ -0,0 +1,71 @@
+/**
+ * Copyright (C) 2009-2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * 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.
+ */
+
+#scalate-console {
+  position:fixed;
+  top:40px;
+  right:10px;
+  background: #FDFCAD;
+  padding:10px;
+  border: 1px solid #BDBD81;
+  font-family:Arial,Verdana,Helvetica,sans-serif;
+  font-size: 80%;
+  max-width: 400px;
+}
+
+#scalate-console .archetypes ul, #scalate-console .templates ul, #scalate-console .resources ul, #scalate-console .layouts ul   {
+  padding-left:20px;
+  overflow: auto;
+}
+
+#scalate-console .toggle {
+  text-align: right;
+}
+
+#scalate-console .toggle img {
+  vertical-align: middle;
+}
+
+#scalate-console div.attributes {
+  margin: 10px;
+  overflow: auto;
+  background: white;
+}
+
+#scalate-console div.attributes table th {
+  text-align: left;
+  color: #993333;
+}
+#scalate-console div.attributes table td {
+  padding:2px;
+  border-top: 1px solid #BDBD81;
+}
+
+#scalate-console div.body {
+  margin: 10px;
+  overflow: auto;
+  max-height: 300px;
+  background: white;
+}
+
+#scalate-console div.systemProperties {
+  margin: 10px;
+  overflow: auto;
+  max-height: 300px;
+  background: white;
+}
diff --git a/karaf-2.2.x/manual/src/main/webapp/css/style.css b/karaf-2.2.x/manual/src/main/webapp/css/style.css
new file mode 100644
index 0000000..496901e
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/css/style.css
@@ -0,0 +1,1588 @@
+/**
+ * Copyright (C) 2009-2010 the original author or authors.
+ * See the notice.md file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * 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.
+ */
+body {
+  margin: 0;
+  padding: 0;
+}
+
+#cell-0-0 { background: white url( '../images/bg02-white-left-nogr.png' ) repeat-y right top; }
+#cell-0-1 { height: 1em; width: 85%; }
+#cell-0-2 { background: transparent url( '../images/bg02-white-right-nogr.png' ) repeat-y left top; }
+#cell-1-0 { background: transparent url( '../images/bg.png' ) repeat-x top; }
+#cell-1-1 { background: transparent url( '../images/bg02-blue-left.png' ) no-repeat right top; width:13px; }
+#cell-1-2 { background: transparent url( '../images/bg.png' ) repeat-x top; width:85%; }
+#banner { height: 80px; }
+#cell-1-3 { background: transparent url( '../images/bg02-blue-right.png' ) no-repeat left top; width:13px; }
+#cell-1-4 { background: transparent url( '../images/bg.png' ) repeat-x top; }
+#cell-2-0 { background: white url( '../images/bg02-white-left-nogr.png' ) repeat-y right top; }
+#cell-2-1 { height: 1em; width: 85%; }
+#cell-2-2 { background: white url( '../images/bg02-white-right-nogr.png' ) repeat-y left top; }
+#cell-3-0 { background: transparent url( '../images/bg.png' ) repeat-x top; }
+#cell-3-1 { background: transparent url( '../images/bg02-blue-left.png' ) no-repeat right top; width:13px; }
+#cell-3-2 { background: transparent url( '../images/bg.png' ) repeat-x top; width:85%; }
+#cell-3-3 { background: transparent url( '../images/bg02-blue-right.png' ) no-repeat left top; width:13px; }
+#cell-3-4 { background: transparent url( '../images/bg.png' ) repeat-x top; }
+#cell-4-0 { background: white url( '../images/bg02-white-left-nogr.png' ) repeat-y right top; }
+#cell-4-1 { height: 1em; width: 85%; }
+#cell-4-2 { background: transparent url( '../images/bg02-white-right-nogr.png' ) repeat-y left top; }
+
+#banner {
+  margin: 0px 20px;
+  padding: 0px 50px 0px 50px;
+  font-size: 200%;
+  text-align: center;
+  background: transparent;
+}
+#top-menu {
+  margin: 0px 25px;
+  padding: 2px;
+  line-height: 100%;
+  font-family: Verdana, arial, sans-serif;
+  font-weight: bold;
+  font-size: 11px;
+  color: white;
+  line-height: 13px;
+  overflow: none;
+}
+#top-menu a:link, #top-menu a:visited {
+  color: #ffffff;
+  text-decoration: none;
+}
+#top-menu a:active, #top-menu a:hover {
+  color: #5b8fbe;
+  text-decoration: underline;
+}
+#top-menu sup img {
+  height: 0px;
+  width: 0px;
+}
+
+#footer {
+  padding: 0px 50px 0px 50px;
+  min-height: 0em;
+  text-align: center;
+  color: white;
+  font-size: 65%;
+  font-family: Verdana, arial, sans-serif;
+}
+#site-footer {
+  margin: 5px;
+}
+#footer a:link, #footer a:visited {
+  color: white;
+  text-decoration: none;
+}
+#footer a:hover {
+  color: white;
+  text-decoration: underline;
+}
+
+#wrapper-menu-page-right {
+  background: transparent url( '../images/left-box-right.png' ) repeat-y right;
+}
+
+#wrapper-menu-page-bottom {
+  background: transparent url( '../images/left-box-bottom.png' ) no-repeat right bottom;
+}
+
+#wrapper-menu-page-top {
+  background: transparent url( '../images/left-box-top.png' ) no-repeat right top;
+}
+
+#menu-page {
+  width: 200px;
+  color: #5b8fbe;
+  font-family: Verdana, arial, sans-serif;
+  font-weight: bold;
+  margin: 0px;
+  padding: 17px 11px 17px 0px;
+  text-align: left;
+  margin-left: 0px;
+  line-height: 1em;
+}
+
+#menu-page ul {
+  margin: 0;
+  padding: 0;
+  padding-left: 35px;
+  font-size: 75%;
+}
+
+#menu-page h3 {
+  font-size: 75%;
+  text-transform: uppercase;
+  margin: 1em 0 0.3em 0;
+  color: #5b8fbe;
+  font-weight: normal;
+  letter-spacing: 0.15em;
+  background: url('../images/big-bullet.png') no-repeat 0pt;
+  background-position:left center;
+  margin-left:15px;
+  padding-left: 20px;
+  font-family: Verdana, arial, sans-serif;
+  font-weight: bold;
+}
+
+#menu-page a:link, #menu-page a:visited {
+  color: black;
+}
+
+#menu-page a:hover {
+  color: #5b8fbe;
+}
+
+#content {
+  padding: 20px 0px 0px 0px;
+  display: block;
+  text-align: left;
+  height: 100%;
+  width: 100%;
+  color: black;
+}
+
+h2 {
+  font-size: 110%;
+}
+
+h3 {
+  font-size: 100%;
+}
+
+a:link, a:visited {
+  color: #5b8fbe;
+  text-decoration: none;
+}
+
+a:hover {
+  color: #666;
+  text-decoration: none;
+}
+
+
+table.align {
+  padding: 0px;
+  border: none;
+}
+
+td.align {
+  padding: 0px;
+  border: none;
+}
+
+/*********************************************************************
+ CSS Elements that are part of the confluence rendered xhtml
+ *********************************************************************/
+.wiki-content {
+	font-family: Verdana, arial, sans-serif;
+	font-size: 11px;
+	line-height: 16px;
+	color: #000000;
+	font-weight: normal;
+	padding-top: 10px;
+	padding-bottom: 10px;
+}
+
+/*
+** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
+** use an id=PageContent or class=wiki-content, so we must
+** set the body style to that used for PageContent, and p to that used for wiki-content.
+*/
+
+.monospaceInput {
+    font:12px monospace
+}
+
+.wiki-content p, .commentblock p {
+    margin: 16px 0px 16px 0px;
+    padding: 0px;
+}
+
+.wiki-content-preview {
+    padding: 5px;
+    border-left: 1px solid #3c78b5;
+    border-right: 1px solid #3c78b5;
+}
+
+ul, ol {
+    margin-top: 2px;
+    margin-bottom: 2px;
+    padding-top: 0px;
+    padding-bottom: 0px;
+}
+
+pre {
+    padding: 0px;
+    margin-top: 5px;
+    margin-left: 15px;
+    margin-bottom: 5px;
+    margin-right: 5px;
+    text-align: left;
+}
+
+.helpheading {
+    font-weight: bold;
+    background-color: #D0D9BD;
+        border-bottom: 1px solid #3c78b5;
+        padding: 4px 4px 4px 4px;
+        margin: 0px;
+        margin-top: 10px;
+}
+.helpcontent {
+        padding: 4px 4px 20px 4px;
+    background-color: #f5f7f1;
+}
+
+.code {
+ 	border: 1px dashed #3c78b5;
+    font-size: 11px;
+	font-family: Courier;
+    margin: 10px;
+	line-height: 13px;
+}
+
+.focusedComment {
+    background: #ffffce;
+}
+
+.commentBox, .focusedComment {
+    padding: 10px;
+    margin: 5px 0 5px 0;
+    border: 1px #bbb solid;
+}
+
+.codeHeader {
+    background-color: #f0f0f0;
+ 	border-bottom: 1px dashed #3c78b5;
+    padding: 3px;
+	text-align: center;
+}
+
+.codeContent {
+    text-align: left;
+    background-color: #f0f0f0;
+    padding: 3px;
+}
+
+.preformatted {
+ 	border: 1px dashed #3c78b5;
+    font-size: 11px;
+	font-family: Courier;
+    margin: 10px;
+	line-height: 13px;
+}
+
+.preformattedHeader {
+    background-color: #f0f0f0;
+ 	border-bottom: 1px dashed #3c78b5;
+    padding: 3px;
+	text-align: center;
+}
+
+.preformattedContent {
+    background-color: #f0f0f0;
+    padding: 3px;
+}
+
+.panel {
+ 	border: 1px dashed #3c78b5;
+    margin: 10px;
+    margin-top: 0px;
+}
+
+.panelHeader {
+    background-color: #f0f0f0;
+ 	border-bottom: 1px dashed #3c78b5;
+    padding: 3px;
+	text-align: center;
+}
+
+.panelContent {
+    background-color: #f0f0f0;
+    padding: 5px;
+}
+
+.anonymousAlert {
+    background-color: #f0f0f0;
+ 	border: 1px dashed red;
+    font-size: 11px;
+    padding: 10px 5px 10px 5px;
+    margin: 4px;
+	line-height: 13px;
+}
+
+.lockAlert {
+    background-color: #f0f0f0;
+    width: 50%;
+ 	border: 1px dashed red;
+    font-size: 11px;
+    padding: 10px 5px 10px 5px;
+    margin: 4px;
+	line-height: 13px;
+}
+
+
+.code-keyword {
+  color: #000091;
+  background-color: inherit;
+}
+
+.code-object {
+  color: #910091;
+  background-color: inherit;
+}
+
+.code-quote {
+  color: #009100;
+  background-color: inherit;
+}
+
+.code-comment {
+  color: #808080;
+  background-color: inherit;
+}
+
+
+.code-xml .code-keyword {
+  color: inherit;
+  font-weight: bold;
+}
+
+.code-tag {
+  color: #000091;
+  background-color: inherit;
+}
+
+.breadcrumbs {
+    background-color: #f0f0f0;
+ 	border-color: #3c78b5;
+	border-width: 1px 0px 1px 0px;
+	border-style: solid;
+    font-size: 11px;
+    padding: 3px 0px 3px 0px;
+}
+
+.navmenu {
+    border: 1px solid #ccc;
+}
+
+.menuheading {
+    font-weight: bold;
+    background-color: #f0f0f0;
+ 	border-bottom: 1px solid #3c78b5;
+	padding: 4px 4px 2px 4px;
+}
+
+.menuitems {
+	padding: 4px 4px 20px 4px;
+}
+
+.rightpanel {
+    border-left: 1px solid #ccc;
+    border-bottom: 1px solid #ccc;
+}
+
+#helpheading {
+    text-align: left;
+    font-weight: bold;
+    background-color: #D0D9BD;
+ 	border-bottom: 1px solid #3c78b5;
+	padding: 4px 4px 4px 4px;
+	margin: 0px;
+}
+#helpcontent {
+	padding: 4px 4px 4px 4px;
+    background-color: #f5f7f1;
+}
+.helptab-unselected {
+    font-weight: bold;
+	padding: 5px;
+    background-color: #f5f7f1;
+}
+.helptab-selected {
+    font-weight: bold;
+    background-color: #D0D9BD;
+	padding: 5px;
+}
+.helptabs {
+    margin: 0px;
+    background-color: #f5f7f1;
+	padding: 5px;
+}
+.infopanel-heading {
+    font-weight: bold;
+	padding: 4px 0px 2px 0px;
+}
+
+.pagebody {
+}
+
+.pageheader {
+	padding: 5px 5px 5px 0px;
+ 	border-bottom: 1px solid #3c78b5;
+}
+
+.steptitle {
+	font-size: 18px;
+	font-weight: bold;
+	font-family: Arial, sans-serif;
+	color: #003366;
+	margin-bottom: 7px;
+}
+
+.substeptitle {
+    font-size: 12px;
+    font-weight: bold;
+    font-family: Arial, sans-serif;
+    color: #003366;
+    margin: 2px 4px 4px 4px;
+    padding: 2px 4px 1px 4px;
+}
+
+.stepdesc {
+    font-family: Verdana, arial, sans-serif;
+	font-size: 11px;
+	line-height: 16px;
+	font-weight: normal;
+    color: #666666;
+    margin-top: 7px;
+    margin-bottom: 7px;
+}
+
+.steplabel {
+    font-weight: bold;
+    margin-right: 4px;
+    color: black;
+    float: left;
+    width: 15%;
+    text-align: right;
+}
+
+.stepfield {
+    background: #f0f0f0;
+    padding: 5px;
+}
+
+.submitButtons{
+    margin-top:5px;
+    text-align:right;
+}
+
+.formtitle {
+	font-size: 12px;
+	font-weight: bold;
+	font-family: Arial, sans-serif;
+	color: #003366;
+}
+
+.sectionbottom {
+    border-bottom: 1px solid #3c78b5;
+}
+
+.topRow {
+    border-top: 2px solid #3c78b5;
+}
+
+.tabletitle {
+	font-size: 14px;
+	font-weight: bold;
+	font-family: Arial, sans-serif;
+    padding: 3px 0px 2px 0px;
+    margin: 8px 4px 2px 0px;
+	color: #003366;
+	border-bottom: 2px solid #3c78b5;
+}
+.pagesubheading {
+    color: #666666;
+    font-size: 10px;
+    padding: 0px 0px 5px 0px;
+}
+
+HR {
+	color: 3c78b5;
+	height: 1;
+}
+
+A:link, A:visited, A:active, A:hover {
+  color: #5b8fbe;
+}
+
+A:hover {
+  text-decoration: underline;
+}
+
+h1 A:link, h1 A:visited, h1 A:active {
+	text-decoration: none;
+}
+
+h1 A:hover {
+    border-bottom: 1px dotted #003366;
+}
+
+.wiki-content > :first-child, .commentblock > :first-child {
+    margin-top: 3px;
+}
+
+.logocell {
+    padding: 10px;
+}
+
+input {
+	font-family: verdana, geneva, arial, sans-serif;
+	font-size: 11px;
+	color: #000000;
+}
+
+textarea, textarea.editor {
+	font-family: verdana, geneva, arial, sans-serif;
+	font-size: 11px;
+	color: #333333;
+}
+
+/* use logoSpaceLink instead.
+.spacenametitle {
+	font: 21px/31px Impact, Arial, Helvetica;
+    font-weight: 100;
+    color: #999999;
+	margin: 0px;
+}
+.spacenametitle img {
+  margin: 0 0 -4px 0;
+}
+.spacenametitle a {
+    text-decoration: none;
+    color: #999999;
+}
+.spacenametitle a:visited {
+    text-decoration: none;
+    color: #999999;
+}*/
+
+.spacenametitle-printable {
+	font: 20px/25px Impact, Arial, Helvetica;
+    font-weight: 100;
+    color: #999999;
+	margin: 0px;
+}
+.spacenametitle-printable a {
+    text-decoration: none;
+    color: #999999;
+}
+.spacenametitle-printable a:visited {
+    text-decoration: none;
+    color: #999999;
+}
+
+.blogDate {
+	font-weight: bold;
+	text-decoration: none;
+	color: black;
+}
+
+.blogSurtitle {
+    background: #f0f0f0;
+ 	border: 1px solid #ddd;
+	padding: 3px;
+	margin: 1px 1px 10px 1px;
+}
+
+.blogHeading {
+    font-size: 20px;
+    line-height: normal;
+    font-weight: bold;
+    padding: 0px;
+    margin: 0px;
+}
+
+.blogHeading a {
+   text-decoration: none;
+   color: black;
+}
+
+.endsection {
+	align: right;
+	color: #666666;
+	margin-top: 10px;
+}
+.endsectionleftnav {
+	align: right;
+	color: #666666;
+	margin-top: 10px;
+}
+
+h1 {
+	font-size: 24px;
+	line-height: normal;
+	font-weight: bold;
+	background-color: #f0f0f0;
+	color: #003366;
+ 	border-bottom: 1px solid #3c78b5;
+	padding: 2px;
+	margin: 36px 0px 4px 0px;
+}
+
+h2 {
+	font-size: 18px;
+	line-height: normal;
+	font-weight: bold;
+	background-color: #f0f0f0;
+ 	border-bottom: 1px solid #3c78b5;
+	padding: 2px;
+	margin: 27px 0px 4px 0px;
+}
+
+h3 {
+	font-size: 14px;
+	line-height: normal;
+	font-weight: bold;
+	background-color: #f0f0f0;
+	padding: 2px;
+	margin: 21px 0px 4px 0px;
+}
+
+h4 {
+	font-size: 12px;
+	line-height: normal;
+	font-weight: bold;
+	background-color: #f0f0f0;
+	padding: 2px;
+	margin: 18px 0px 4px 0px;
+}
+
+h4.search {
+	font-size: 12px;
+	line-height: normal;
+	font-weight: normal;
+	background-color: #f0f0f0;
+	padding: 4px;
+	margin: 18px 0px 4px 0px;
+}
+
+h5 {
+	font-size: 10px;
+	line-height: normal;
+	font-weight: bold;
+	background-color: #f0f0f0;
+	padding: 2px;
+	margin: 14px 0px 4px 0px;
+}
+
+h6 {
+	font-size: 8px;
+	line-height: normal;
+	font-weight: bold;
+	background-color: #f0f0f0;
+	padding: 2px;
+	margin: 14px 0px 4px 0px;
+}
+
+.smallfont {
+    font-size: 10px;
+}
+.descfont {
+    font-size: 10px;
+    color: #666666;
+}
+.smallerfont {
+    font-size: 9px;
+}
+.smalltext {
+    color: #666666;
+    font-size: 10px;
+}
+.smalltext a {
+    color: #666666;
+}
+.smalltext-blue {
+    color: #3c78b5;
+    font-size: 10px;
+}
+.surtitle {
+    margin-left: 1px;
+    margin-bottom: 5px;
+    font-size: 14px;
+    color: #666666;
+}
+
+/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
+.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
+.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
+.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
+.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
+.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
+.navItem a { color: #ffffff; text-decoration: none; }
+.navItem a:hover { color: #ffffff; text-decoration: none; }
+.navItem a:visited { color: #ffffff; text-decoration: none; }
+
+div.padded { padding: 4px; }
+div.thickPadded { padding: 10px; }
+h3.macrolibrariestitle {
+    margin: 0px 0px 0px 0px;
+}
+
+div.centered { text-align: center; margin: 10px; }
+div.centered table {margin: 0px auto; text-align: left; }
+
+.tableview table {
+    margin: 0;
+}
+
+.tableview th {
+    text-align: left;
+    color: #003366;
+    font-size: 12px;
+    padding: 5px 0px 0px 5px;
+    border-bottom: 2px solid #3c78b5;
+}
+.tableview td {
+    text-align: left;
+    border-color: #ccc;
+    border-width: 0px 0px 1px 0px;
+    border-style: solid;
+    margin: 0;
+    padding: 4px 10px 4px 5px;
+}
+
+.grid {
+    margin: 2px 0px 5px 0px;
+    border-collapse: collapse;
+}
+.grid th  {
+    border: 1px solid #ccc;
+    padding: 2px 4px 2px 4px;
+    background: #f0f0f0;
+    text-align: center;
+}
+.grid td  {
+    border: 1px solid #ccc;
+    padding: 3px 4px 3px 4px;
+}
+.gridHover {
+	background-color: #f9f9f9;
+}
+
+td.infocell {
+    background-color: #f0f0f0;
+}
+.label {
+	font-weight: bold;
+	color: #003366;
+}
+.error {
+	background-color: #fcc;
+}
+
+.errorBox {
+	background-color: #fcc;
+    border: 1px solid #c00;
+    padding: 5px;
+    margin: 5px;
+}
+
+.errorMessage {
+	color: #c00;
+}
+
+.success {
+	background-color: #dfd;
+}
+
+.successBox {
+	background-color: #dfd;
+    border: 1px solid #090;
+    padding: 5px;
+    margin-top:5px;
+    margin-bottom:5px;
+}
+
+blockquote {
+	padding-left: 10px;
+	padding-right: 10px;
+	margin-left: 5px;
+	margin-right: 0px;
+	border-left: 1px solid #3c78b5;
+}
+
+table.confluenceTable
+{
+    margin: 5px;
+    border-collapse: collapse;
+}
+
+/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
+table.confluenceTable td.confluenceTd
+{
+    border-width: 1px;
+    border-style: solid;
+    border-color: #ccc;
+    padding: 3px 4px 3px 4px;
+}
+
+/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
+table.confluenceTable th.confluenceTh
+{
+    border-width: 1px;
+    border-style: solid;
+    border-color: #ccc;
+    padding: 3px 4px 3px 4px;
+    background-color: #f0f0f0;
+    text-align: center;
+}
+
+td.confluenceTd
+{
+    border-width: 1px;
+    border-style: solid;
+    border-color: #ccc;
+    padding: 3px 4px 3px 4px;
+}
+
+th.confluenceTh
+{
+    border-width: 1px;
+    border-style: solid;
+    border-color: #ccc;
+    padding: 3px 4px 3px 4px;
+    background-color: #f0f0f0;
+    text-align: center;
+}
+
+DIV.small {
+	font-size: 9px;
+}
+
+H1.pagename {
+	margin-top: 0px;
+}
+
+IMG.inline  {}
+
+.loginform {
+    margin: 5px;
+    border: 1px solid #ccc;
+}
+
+/* The text how the "This is a preview" comment should be shown. */
+.previewnote { text-align: center;
+                font-size: 11px;
+                    color: red; }
+
+/* How the preview content should be shown */
+.previewcontent { background: #E0E0E0; }
+
+/* How the system messages should be shown (DisplayMessage.jsp) */
+.messagecontent { background: #E0E0E0; }
+
+/* How the "This page has been modified..." -comment should be shown. */
+.conflictnote { }
+
+.createlink {
+    color: maroon;
+}
+a.createlink {
+    color: maroon;
+}
+.templateparameter {
+    font-size: 9px;
+    color: darkblue;
+}
+
+.diffadded {
+    background: #ddffdd;
+    padding: 1px 1px 1px 4px;
+	border-left: 4px solid darkgreen;
+}
+.diffdeleted {
+    color: #999;
+    background: #ffdddd;
+    padding: 1px 1px 1px 4px;
+	border-left: 4px solid darkred;
+}
+.diffnochange {
+    padding: 1px 1px 1px 4px;
+	border-left: 4px solid lightgrey;
+}
+.differror {
+    background: brown;
+}
+.diff {
+    font-family: lucida console, courier new, fixed-width;
+	font-size: 12px;
+	line-height: 14px;
+}
+.diffaddedchars {
+    background-color:#99ff99;
+    font-weight:bolder;
+}
+.diffremovedchars {
+    background-color:#ff9999;
+    text-decoration: line-through;
+    font-weight:bolder;
+}
+
+.greybackground {
+    background: #f0f0f0
+}
+
+.greybox {
+ 	border: 1px solid #ddd;
+	padding: 3px;
+	margin: 1px 1px 10px 1px;
+}
+
+.borderedGreyBox {
+    border: 1px solid #cccccc;
+    background-color: #f0f0f0;
+    padding: 10px;
+}
+
+.greyboxfilled {
+ 	border: 1px solid #ddd;
+	padding: 5px;
+	margin: 10px 1px 10px 1px;
+	background: #f0f0f0;
+}
+
+.navBackgroundBox {
+    padding: 5px 5px 5px 5px;
+    font-size: 22px;
+	font-weight: bold;
+	font-family: Arial, sans-serif;
+	color: white;
+    background: #3c78b5;
+    text-decoration: none;
+}
+
+.previewBoxTop {
+	background-color: #f0f0f0;
+    border-width: 1px 1px 0px 1px;
+    border-style: solid;
+    border-color: #3c78b5;
+    padding: 5px;
+    margin: 5px 0px 0px 0px;
+    text-align: center;
+}
+.previewContent {
+    background-color: #fff;
+ 	border-color: #3c78b5;
+	border-width: 0px 1px 0px 1px;
+	border-style: solid;
+	padding: 10px;
+	margin: 0px;
+}
+.previewBoxBottom {
+	background-color: #f0f0f0;
+    border-width: 0px 1px 1px 1px;
+    border-style: solid;
+    border-color: #3c78b5;
+    padding: 5px;
+    margin: 0px 0px 5px 0px;
+    text-align: center;
+}
+
+.functionbox {
+    background-color: #f0f0f0;
+ 	border: 1px solid #3c78b5;
+	padding: 3px;
+	margin: 1px 1px 10px 1px;
+}
+
+.functionbox-greyborder {
+    background-color: #f0f0f0;
+ 	border: 1px solid #ddd;
+	padding: 3px;
+	margin: 1px 1px 10px 1px;
+}
+
+.search-highlight {
+    background-color: #ffffcc;
+}
+
+/* normal (white) background */
+.rowNormal {
+    background-color: #ffffff;
+ }
+
+/* alternate (pale yellow) background */
+.rowAlternate {
+    background-color: #f7f7f7;
+}
+
+/* used in the list attachments table */
+.rowAlternateNoBottomColor {
+    background-color: #f7f7f7;
+}
+
+.rowAlternateNoBottomNoColor {
+}
+
+.rowAlternateNoBottomColor td {
+    border-bottom: 0px;
+}
+
+.rowAlternateNoBottomNoColor td {
+    border-bottom: 0px;
+}
+
+/* row highlight (grey) background */
+.rowHighlight {
+    background-color: #f0f0f0;
+
+}
+
+TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
+TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
+TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
+
+TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
+TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }
+
+.toolbar  {
+    margin: 0px;
+    border-collapse: collapse;
+}
+
+.toolbar td  {
+    border: 1px solid #ccc;
+    padding: 2px 2px 2px 2px;
+    color: #ccc;
+}
+
+td.noformatting {
+    border-width: 0px;
+    border-style: none;
+    text-align: center;
+	padding: 0px;
+}
+
+.commentblock {
+    margin: 12px 0 12px 0;
+}
+
+/*
+ * Divs displaying the license information, if necessary.
+ */
+.license-eval, .license-none, .license-nonprofit {
+    border-top: 1px solid #bbbbbb;
+    text-align: center;
+    font-size: 10px;
+    font-family: Verdana, Arial, Helvetica, sans-serif;
+}
+
+.license-eval, .license-none {
+    background-color: #ffcccc;
+}
+
+.license-eval b, .license-none b {
+    color: #990000
+}
+
+.license-nonprofit {
+    background-color: #ffffff;
+}
+
+/*
+ * The shadow at the bottom of the page between the main content and the
+ * "powered by" section.
+ */
+.bottomshadow {
+    height: 12px;
+    background-image: url("$req.contextPath/images/border/border_bottom.gif");
+    background-repeat: repeat-x;
+}
+
+/*
+ * Styling of the operations box
+ */
+.navmenu .operations li, .navmenu .operations ul {
+    list-style: none;
+    margin-left: 0;
+    padding-left: 0;
+}
+
+.navmenu .operations ul {
+    margin-bottom: 9px;
+}
+
+.navmenu .label {
+    font-weight: inherit;
+}
+
+/*
+ * Styling of ops as a toolbar
+ */
+.toolbar div {
+    display: none;
+}
+
+.toolbar .label {
+    display: none;
+}
+
+.toolbar .operations {
+    display: block;
+}
+
+.toolbar .operations ul {
+    display: inline;
+    list-style: none;
+    margin-left: 10px;
+    padding-left: 0;
+}
+
+.toolbar .operations li {
+    list-style: none;
+    display: inline;
+}
+
+/* list page navigational tabs */
+#foldertab {
+padding: 3px 0px 3px 8px;
+margin-left: 0;
+border-bottom: 1px solid #3c78b5;
+font: bold 11px Verdana, sans-serif;
+}
+
+#foldertab li {
+list-style: none;
+margin: 0;
+display: inline;
+}
+
+#foldertab li a {
+padding: 3px 0.5em;
+margin-left: 3px;
+border: 1px solid #3c78b5;
+border-bottom: none;
+background: #3c78b5;
+text-decoration: none;
+}
+
+#foldertab li a:link { color: #ffffff; }
+#foldertab li a:visited { color: #ffffff; }
+
+#foldertab li a:hover {
+color: #ffffff;
+background: #003366;
+border-color: #003366;
+}
+
+#foldertab li a.current {
+background: white;
+border-bottom: 1px solid white;
+color: black;
+}
+
+#foldertab li a.current:link { color: black; }
+#foldertab li a.current:visited { color: black; }
+#foldertab li a.current:hover {
+background: white;
+border-bottom: 1px solid white;
+color: black;
+}
+
+/* alphabet list */
+ul#squaretab {
+margin-left: 0;
+padding-left: 0;
+white-space: nowrap;
+font: bold 8px Verdana, sans-serif;
+}
+
+#squaretab li {
+display: inline;
+list-style-type: none;
+}
+
+#squaretab a {
+padding: 2px 6px;
+border: 1px solid #3c78b5;
+}
+
+#squaretab a:link, #squaretab a:visited {
+color: #fff;
+background-color: #3c78b5;
+text-decoration: none;
+}
+
+#squaretab a:hover {
+color: #ffffff;
+background-color: #003366;
+border-color: #003366;
+text-decoration: none;
+}
+
+#squaretab li a#current {
+background: white;
+color: black;
+}
+
+.blogcalendar * {
+    font-family:verdana, arial, sans-serif;
+    font-size:x-small;
+    font-weight:normal;
+    line-height:140%;
+    padding:2px;
+}
+
+
+table.blogcalendar {
+    border: 1px solid #3c78b5;
+}
+
+.blogcalendar th.calendarhead, a.calendarhead {
+    font-size:x-small;
+    font-weight:bold;
+    padding:2px;
+    text-transform:uppercase;
+    background-color: #3c78b5;
+    color: #ffffff;
+    letter-spacing: .3em;
+    text-transform: uppercase;
+}
+
+.calendarhead:visited {color: white;}
+.calendarhead:active {color: white;}
+.calendarhead:hover {color: white;}
+
+.blogcalendar th {
+    font-size:x-small;
+    font-weight:bold;
+    padding:2px;
+    background-color:#f0f0f0;
+}
+
+.blogcalendar td {
+    font-size:x-small;
+    font-weight:normal;
+}
+
+.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
+.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
+.searchItem { padding: 1px 4px 1px 4px; }
+.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }
+
+/* permissions page styles */
+.permissionHeading {
+    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
+}
+.permissionTab {
+    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
+}
+.permissionSuperTab {
+    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
+}
+.permissionCell {
+    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
+}
+
+/* warning panel */
+.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
+/* alert panel */
+.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
+
+/* side menu highlighting (e.g. space content screen) */
+.optionPadded { padding: 2px; }
+.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
+.optionSelected a { font-weight: bold; text-decoration: none; color: black; }
+
+/* information macros */
+.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
+.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
+.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
+.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
+.informationMacroPadding { padding: 5px 0 0 5px; }
+
+table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
+    border: none;
+}
+
+table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}
+
+/* styles for links in the top bar */
+.topBarDiv a:link {color: #ffffff;}
+.topBarDiv a:visited {color: #ffffff;}
+.topBarDiv a:active {color: #ffffff;}
+.topBarDiv a:hover {color: #ffffff;}
+.topBarDiv {color: #ffffff;}
+
+.topBar {
+    background-color: #003366;
+}
+
+
+/* styles for extended operations */
+.greyLinks a:link {color: #666666; text-decoration:underline;}
+.greyLinks a:visited {color: #666666; text-decoration:underline;}
+.greyLinks a:active {color: #666666; text-decoration:underline;}
+.greyLinks a:hover {color: #666666; text-decoration:underline;}
+.greyLinks {color: #666666; display:block; padding: 10px}
+
+.logoSpaceLink {color: #999999; text-decoration: none}
+.logoSpaceLink a:link {color: #999999; text-decoration: none}
+.logoSpaceLink a:visited {color: #999999; text-decoration: none}
+.logoSpaceLink a:active {color: #999999; text-decoration: none}
+.logoSpaceLink a:hover {color: #003366; text-decoration: none}
+
+/* basic panel (basicpanel.vmd) style */
+.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
+.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
+.basicPanelBody {padding: 5px; margin: 0px}
+
+.separatorLinks a:link {color: white}
+.separatorLinks a:visited {color: white}
+.separatorLinks a:active {color: white}
+
+.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}
+
+div.headerField {
+    float: left;
+    width: auto;
+    height: 100%;
+}
+
+.headerFloat {
+    margin-left: auto;
+    width: 50%;
+}
+
+.headerFloatLeft {
+    float: left;
+    margin-right: 20px;
+    margin-bottom: 10px;
+}
+
+#headerRow {
+    padding: 10px;
+}
+
+div.license-personal {
+   background-color: #003366;
+   color: #ffffff;
+}
+
+div.license-personal a {
+   color: #ffffff;
+}
+
+.greyFormBox {
+    border: 1px solid #cccccc;
+    padding: 5px;
+}
+
+/* IE automatically adds a margin before and after form tags. Use this style to remove that */
+.marginlessForm {
+    margin: 0px;
+}
+
+.openPageHighlight {
+    background-color: #ffffcc;
+    padding: 2px;
+    border: 1px solid #ddd;
+}
+
+.editPageInsertLinks, .editPageInsertLinks a
+{
+    color: #666666;
+    font-weight: bold;
+    font-size: 10px;
+}
+
+/* Style for label heatmap. */
+.top10 a {
+    font-weight: bold;
+    font-size: 2em;
+    color: #003366;
+}
+.top25 a {
+    font-weight: bold;
+    font-size: 1.6em;
+    color: #003366;
+}
+.top50 a {
+    font-size: 1.4em;
+    color: #003366;
+}
+.top100 a {
+    font-size: 1.2em;
+    color: #003366;
+}
+
+.heatmap {
+    list-style:none;
+    width: 95%;
+    margin: 0px auto;
+}
+
+.heatmap a {
+    text-decoration:none;
+}
+
+.heatmap a:hover {
+    text-decoration:underline;
+}
+
+.heatmap li {
+    display: inline;
+}
+
+.minitab {
+padding: 3px 0px 3px 8px;
+margin-left: 0;
+margin-top: 1px;
+margin-bottom: 0px;
+border-bottom: 1px solid #3c78b5;
+font: bold 9px Verdana, sans-serif;
+text-decoration: none;
+float:none;
+}
+.selectedminitab {
+padding: 3px 0.5em;
+margin-left: 3px;
+margin-top: 1px;
+border: 1px solid #3c78b5;
+background: white;
+border-bottom: 1px solid white;
+color: #000000;
+text-decoration: none;
+}
+.unselectedminitab {
+padding: 3px 0.5em;
+margin-left: 3px;
+margin-top: 1px;
+border: 1px solid #3c78b5;
+border-bottom: none;
+background: #3c78b5;
+color: #ffffff;
+text-decoration: none;
+}
+
+a.unselectedminitab:hover {
+color: #ffffff;
+background: #003366;
+border-color: #003366;
+}
+
+a.unselectedminitab:link { color: white; }
+a.unselectedminitab:visited { color: white; }
+
+a.selectedminitab:link { color: black; }
+a.selectedminitab:visited { color: black; }
+
+.linkerror { background-color: #fcc;}
+
+a.labelOperationLink:link {text-decoration: underline}
+a.labelOperationLink:active {text-decoration: underline}
+a.labelOperationLink:visited {text-decoration: underline}
+a.labelOperationLink:hover {text-decoration: underline}
+
+a.newLabel:link {background-color: #ddffdd}
+a.newLabel:active {background-color: #ddffdd}
+a.newLabel:visited {background-color: #ddffdd}
+a.newLabel:hover {background-color: #ddffdd}
+
+ul.square {list-style-type: square}
+
+.inline-control-link {
+    background: #ffc;
+    font-size: 9px;
+    color: #666;
+    padding: 2px;
+    text-transform: uppercase;
+    text-decoration: none;
+}
+
+
+.inline-control-link a:link {text-decoration: none}
+.inline-control-link a:active {text-decoration: none}
+.inline-control-link a:visited {text-decoration: none}
+.inline-control-link a:hover {text-decoration: none}
+
+.inline-control-link {
+    background: #ffc;
+    font-size: 9px;
+    color: #666;
+    padding: 2px;
+    text-transform: uppercase;
+    text-decoration: none;
+    cursor: pointer;
+}
+
+div.auto_complete {
+    width: 350px;
+    background: #fff;
+}
+div.auto_complete ul {
+    border: 1px solid #888;
+    margin: 0;
+    padding: 0;
+    width: 100%;
+    list-style-type: none;
+}
+div.auto_complete ul li {
+    margin: 0;
+    padding: 3px;
+}
+div.auto_complete ul li.selected {
+    background-color: #ffb;
+}
+div.auto_complete ul strong.highlight {
+    color: #800;
+    margin: 0;
+    padding: 0;
+}
+
+/******* Edit Page Styles *******/
+.toogleFormDiv{
+    border:1px solid #A7A6AA;
+    background-color:white;
+    padding:5px;
+    margin-top: 5px;
+}
+
+.toogleInfoDiv{
+    border:1px solid #A7A6AA;
+    background-color:white;
+    display:none;
+    padding:5px;
+    margin-top: 10px;
+}
+
+.inputSection{
+    margin-bottom:20px;
+}
+
+#editBox{
+   border:1px solid lightgray;
+   background-color:#F0F0F0;
+}
+
+/******* Left Navigation Theme Styles ********/
+.leftnav li a {
+    text-decoration:none;
+    color:white;
+    margin:0px;
+    display:block;
+    padding:2px;
+    padding-left:5px;
+    background-color: #3c78b5;
+    border-top:1px solid #3c78b5;
+}
+
+.leftnav li a:active {color:white;}
+.leftnav li a:visited {color:white;}
+.leftnav li a:hover {background-color: #003366; color:white;}
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/archetypes.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/archetypes.conf
new file mode 100644
index 0000000..24291c5
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/archetypes.conf
@@ -0,0 +1,361 @@
+
+
+
+h1. Archetypes
+
+Karaf provides archetypes to easily create commands, manage [features or repository and create a kar archive.
+This section describes each of them and explain How to use it.
+
+h2. Create a command (karaf-command-archetype)
+
+This archetype creates a Maven skeleton project that you will use to develop new Karaf commands.
+
+h3. Command line
+
+Using the command line, we can create our project:
+{code}
+mvn archetype:generate \
+  -DarchetypeGroupId=org.apache.karaf.archetypes \
+  -DartifactId=karaf-command-archetype \
+  -DarchetypeVersion=${project.version} \
+  -DgroupId=com.mycompany \
+  -DartifactId=com.mycompany.command \
+  -Dversion=1.0-SNAPSHOT \
+  -Dpackage=com.mycompany.package
+{code}
+
+h3. Additional parameters
+
+During the maven creation process, additional questions will be asked on the console :
+
+** Define value for property 'command':
+   The name of the command (list, add-item, ...)
+** Define value for property 'description':
+   Provide a description of the command that you want to create. This description will be displayed in the Karaf console when
+   the parameter --help is used
+** Define value for property 'scope':
+   This value represents the family name to which the command belongs (features, osgi, admin, jaas, ...)
+
+h3. Result of Maven command execution
+
+{code}
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building Maven Stub Project (No POM) 1
+[INFO] ------------------------------------------------------------------------
+[INFO]
+[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
+[INFO]
+[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
+[INFO]
+[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
+[INFO] Generating project in Interactive mode
+[INFO] Archetype repository missing. Using the one from [org.apache.karaf.archetypes:karaf-command-archetype:${project.version}] found in catalog local
+[INFO] Using property: groupId = com.mycompany
+[INFO] Using property: artifactId = com.mycompany.command
+[INFO] Using property: version = 1.0-SNAPSHOT
+[INFO] Using property: package = com.mycompany.package
+Define value for property 'command': : list
+Define value for property 'description': : List sample command
+Define value for property 'scope': : my
+Confirm properties configuration:
+groupId: com.mycompany
+artifactId: com.mycompany.command
+version: 1.0-SNAPSHOT
+package: com.mycompany.package
+command: list
+description: List sample command
+scope: my
+ Y: :
+[INFO] ----------------------------------------------------------------------------
+[INFO] Using following parameters for creating project from Archetype: karaf-command-archetype:${project.version}
+[INFO] ----------------------------------------------------------------------------
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.command
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: packageInPathFormat, Value: com/mycompany/package
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: scope, Value: my
+[INFO] Parameter: description, Value: List sample command
+[INFO] Parameter: command, Value: list
+[INFO] Parameter: artifactId, Value: com.mycompany.command
+[WARNING] Don't override file /home/jbonofre/workspace/karaf/test/com.mycompany.command/pom.xml
+[INFO] project created from Archetype in dir: /home/jbonofre/workspace/karaf/test/com.mycompany.command
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 27.204s
+[INFO] Finished at: Mon Dec 19 09:38:49 CET 2011
+[INFO] Final Memory: 7M/111M
+[INFO] ------------------------------------------------------------------------
+{code}
+
+Next, you can import your project in Eclipse/IntelliJ and developp the karaf command.
+
+h2. Create an OSGi bundle (karaf-bundle-archetype)
+
+This archetype creates a Maven skeleton to create an OSGi bundle, including a bundle Activator (a special callback class for bundle start/stop).
+
+h3. Command line
+
+Using the command line, we can create our project:
+{code}
+mvn archetype:generate \
+    -DarchetypeGroupId=org.apache.karaf.archetypes \
+    -DarchetypeArtifactId=karaf-bundle-archetype \
+    -DarchetypeVersion=${project.version} \
+    -DgroupId=com.mycompany \
+    -DartifactId=com.mycompany.bundle \
+    -Dversion=1.0-SNAPSHOT \
+    -Dpackage=com.mycompany.package
+{code}
+
+h3. Result of Maven command execution
+
+{code}
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building Maven Stub Project (No POM) 1
+[INFO] ------------------------------------------------------------------------
+[INFO]
+[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
+[INFO]
+[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
+[INFO]
+[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
+[INFO] Generating project in Interactive mode
+[INFO] Archetype repository missing. Using the one from [org.apache.karaf.archetypes:karaf-bundle-archetype:3.0.0-SNAPSHOT] found in catalog local
+[INFO] Using property: groupId = com.mycompany
+[INFO] Using property: artifactId = com.mycompany.bundle
+[INFO] Using property: version = 1.0-SNAPSHOT
+[INFO] Using property: package = com.mycompany.package
+Confirm properties configuration:
+groupId: com.mycompany
+artifactId: com.mycompany.bundle
+version: 1.0-SNAPSHOT
+package: com.mycompany.package
+ Y: :
+[INFO] ----------------------------------------------------------------------------
+[INFO] Using following parameters for creating project from Archetype: karaf-bundle-archetype:3.0.0-SNAPSHOT
+[INFO] ----------------------------------------------------------------------------
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.bundle
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: packageInPathFormat, Value: com/mycompany/package
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.bundle
+[INFO] project created from Archetype in dir: /home/jbonofre/workspace/karaf/test/com.mycompany.bundle
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 7.895s
+[INFO] Finished at: Mon Dec 19 11:41:44 CET 2011
+[INFO] Final Memory: 8M/111M
+[INFO] ------------------------------------------------------------------------
+{code}
+
+h2. Create an OSGi blueprint bundle (karaf-blueprint-archetype)
+
+This archetype creates a Maven skeleton project to create an OSGi blueprint bundle, including a sample bean exposed as an OSGi service in the blueprint XML descriptor.
+
+h3. Command line
+
+Using the command line, we can create our project:
+{code}
+mvn archetype:generate \
+    -DarchetypeGroupId=org.apache.karaf.archetypes \
+    -DarchetypeArtifactId=karaf-blueprint-archetype \
+    -DarchetypeVersion=${project.version} \
+    -DgroupId=com.mycompany \
+    -DartifactId=com.mycompany.blueprint \
+    -Dversion=1.0-SNAPSHOT \
+    -Dpackage=com.mycompany.blueprint
+{code}
+
+h3. Result of Maven command execution
+
+{code}
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building Maven Stub Project (No POM) 1
+[INFO] ------------------------------------------------------------------------
+[INFO]
+[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
+[INFO]
+[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
+[INFO]
+[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
+[INFO] Generating project in Interactive mode
+[INFO] Archetype repository missing. Using the one from [org.apache.karaf.archetypes:karaf-blueprint-archetype:3.0.0-SNAPSHOT] found in catalog local
+[INFO] Using property: groupId = com.mycompany
+[INFO] Using property: artifactId = com.mycompany.blueprint
+[INFO] Using property: version = 1.0-SNAPSHOT
+[INFO] Using property: package = com.mycompany.package
+Confirm properties configuration:
+groupId: com.mycompany
+artifactId: com.mycompany.blueprint
+version: 1.0-SNAPSHOT
+package: com.mycompany.package
+ Y: :
+[INFO] ----------------------------------------------------------------------------
+[INFO] Using following parameters for creating project from Archetype: karaf-blueprint-archetype:3.0.0-SNAPSHOT
+[INFO] ----------------------------------------------------------------------------
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.blueprint
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: packageInPathFormat, Value: com/mycompany/package
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.blueprint
+[INFO] project created from Archetype in dir: /home/jbonofre/workspace/karaf/test/com.mycompany.blueprint
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 1:06:36.741s
+[INFO] Finished at: Mon Dec 19 13:04:43 CET 2011
+[INFO] Final Memory: 7M/111M
+[INFO] ------------------------------------------------------------------------
+{code}
+
+h2. Create a features XML (karaf-feature-archetype)
+
+This archetype creates a Maven skeleton project which create a features XML file, using the dependencies that you define in the POM.
+
+h3. Command line
+
+Using the command line, we can create our project:
+{code}
+mvn archetype:generate \
+    -DarchetypeGroupId=org.apache.karaf.archetypes \
+    -DarchetypeArtifactId=karaf-feature-archetype \
+    -DarchetypeVersion=${project.version} \
+    -DgroupId=my.company \
+    -DartifactId=my.company.feature \
+    -Dversion=1.0-SNAPSHOT \
+    -Dpackage=my.company.package
+{code}
+
+h3. Result of maven command execution
+
+{code}
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building Maven Stub Project (No POM) 1
+[INFO] ------------------------------------------------------------------------
+[INFO]
+[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
+[INFO]
+[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
+[INFO]
+[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
+[INFO] Generating project in Interactive mode
+[INFO] Archetype repository missing. Using the one from [org.apache.karaf.archetypes:karaf-feature-archetype:3.0.0-SNAPSHOT] found in catalog local
+[INFO] Using property: groupId = com.mycompany
+[INFO] Using property: artifactId = com.mycompany.feature
+[INFO] Using property: version = 1.0-SNAPSHOT
+[INFO] Using property: package = com.mycompany.package
+Confirm properties configuration:
+groupId: com.mycompany
+artifactId: com.mycompany.feature
+version: 1.0-SNAPSHOT
+package: com.mycompany.package
+ Y: :
+[INFO] ----------------------------------------------------------------------------
+[INFO] Using following parameters for creating project from Archetype: karaf-feature-archetype:3.0.0-SNAPSHOT
+[INFO] ----------------------------------------------------------------------------
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.feature
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: packageInPathFormat, Value: com/mycompany/package
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.feature
+[INFO] project created from Archetype in dir: /home/jbonofre/workspace/karaf/test/com.mycompany.feature
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 7.262s
+[INFO] Finished at: Mon Dec 19 13:20:00 CET 2011
+[INFO] Final Memory: 7M/111M
+[INFO] ------------------------------------------------------------------------
+{code}
+
+h2. Create a KAR file (karaf-kar-archetype)
+
+This archetype creates a Maven skeleton project including a features XML sample, used to generate a KAR file.
+
+h3. Command line
+
+Using the command line, we can create our project:
+{code}
+mvn archetype:generate \
+    -DarchetypeGroupId=org.apache.karaf.archetypes \
+    -DarchetypeArtifactId=karaf-kar-archetype \
+    -DarchetypeVersion=${project.version} \
+    -DgroupId=com.mycompany \
+    -DartifactId=com.mycompany.kar \
+    -Dversion=1.0-SNAPSHOT \
+    -Dpackage=com.mycompany.package
+{code}
+
+h3. Result of maven command execution
+
+{code}
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building Maven Stub Project (No POM) 1
+[INFO] ------------------------------------------------------------------------
+[INFO]
+[INFO] >>> maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom >>>
+[INFO]
+[INFO] <<< maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom <<<
+[INFO]
+[INFO] --- maven-archetype-plugin:2.1:generate (default-cli) @ standalone-pom ---
+[INFO] Generating project in Interactive mode
+[INFO] Archetype repository missing. Using the one from [org.apache.karaf.archetypes:karaf-kar-archetype:3.0.0-SNAPSHOT] found in catalog local
+[INFO] Using property: groupId = com.mycompany
+[INFO] Using property: artifactId = com.mycompany.kar
+[INFO] Using property: version = 1.0-SNAPSHOT
+[INFO] Using property: package = com.mycompany.package
+Confirm properties configuration:
+groupId: com.mycompany
+artifactId: com.mycompany.kar
+version: 1.0-SNAPSHOT
+package: com.mycompany.package
+ Y: :
+[INFO] ----------------------------------------------------------------------------
+[INFO] Using following parameters for creating project from Archetype: karaf-kar-archetype:3.0.0-SNAPSHOT
+[INFO] ----------------------------------------------------------------------------
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.kar
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: packageInPathFormat, Value: com/mycompany/package
+[INFO] Parameter: package, Value: com.mycompany.package
+[INFO] Parameter: version, Value: 1.0-SNAPSHOT
+[INFO] Parameter: groupId, Value: com.mycompany
+[INFO] Parameter: artifactId, Value: com.mycompany.kar
+[INFO] project created from Archetype in dir: /home/jbonofre/workspace/karaf/test/com.mycompany.kar
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 7.465s
+[INFO] Finished at: Mon Dec 19 13:30:15 CET 2011
+[INFO] Final Memory: 8M/157M
+[INFO] ------------------------------------------------------------------------
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/branding-console.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/branding-console.conf
new file mode 100644
index 0000000..22dfe00
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/branding-console.conf
@@ -0,0 +1,114 @@
+
+
+h1. Branding the Console
+
+This chapter will show you how to customize the user interface of the Karaf console, making  
+changes such as a new welcome message and console prompt.  This is what we refer to as "branding" Karaf.
+
+h2. Create your branding bundle
+
+At startup, Karaf is looking for a bundle which exports the {{org.apache.karaf.branding}} package containing a {{branding.properties}}
+file.
+
+So you need to create a very simple bundle containing just a {{org/apache/karaf/branding/branding.properties}} file.
+
+The Maven POM of your branding bundle should look like this:
+
+{code:lang=xml}
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>your.group.id</groupId>
+    <artifactId>your.branding.artifact.id</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>Your Branding Bundle Name</name>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.2</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</bundle-SymbolicName>
+                        <Import-Package>*</Import-Package>
+                        <Private-Package>!*</Private-Package>
+                        <Export-Package>
+                            org.apache.karaf.branding
+                        </Export-Package>
+                        <Spring-Context>*;public-context:=false</Spring-Context>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
+{code}
+
+Now, add a {{src/main/resources/org/apache/karaf/branding/branding.properties}} similar to:
+
+{{code}}
+welcome = \
+\u001B[36m        __ __                  ____      \u001B[0m\r\n\
+\u001B[36m       / //_/____ __________ _/ __/      \u001B[0m\r\n\
+\u001B[36m      / ,<  / __ `/ ___/ __ `/ /_        \u001B[0m\r\n\
+\u001B[36m     / /| |/ /_/ / /  / /_/ / __/        \u001B[0m\r\n\
+\u001B[36m    /_/ |_|\\__,_/_/   \\__,_/_/         \u001B[0m\r\n\
+\r\n\
+\u001B[1m  Apache Karaf\u001B[0m (${project.version})\r\n\
+\r\n\
+Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\r\n\
+   and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\
+Hit '\u001B[1m<ctrl-d>\u001B[0m' or '\u001B[1mosgi:shutdown\u001B[0m' to shutdown Karaf.\r\n
+
+prompt = \u001B[1m${USER}@${APPLICATION}\u001B[0m>
+{{code}}
+
+As you can see, the {{branding.properties}} contains two properties:
+* welcome is the welcome message displayed when you start Karaf.
+* prompt is the string used to display the console prompt. This string supports variables:
+** ${USER}} defines the user name of the prompt. Caveat -- the user name is presently static and hardcoded to "karaf",
+however you can override here with your own static user name.
+** ${{APPLICATION}} defines the Karaf instance name.
+
+As you can see, both strings support ASCII escaped format. For instance \u001B[1m switches the foreground to bold and \u001B[0m
+switches it back to normal.
+
+Some examples of customized prompts:
+
+{code}
+# Define a user with fancy colors
+prompt = \u001B[36mmy-karaf-user\u001B[0m\u001B[1m@\u001B[0m\u001B[34m${APPLICATION}\u001B[0m>
+{code}
+
+{code}
+# Static sober prompt
+prompt = my-user@my-karaf>
+{code}
+
+h2. Configuring Karaf to use the branding bundle
+
+In order for Karaf to pick up the branding jar please edit the 
+$KARAF_HOME/etc/custom.properties file to include the following: 
+
+  org.osgi.framework.system.packages.extra = \ 
+    org.apache.karaf.branding;
+
+
+h2. Installing the branding bundle
+
+Build your branding bundle:
+
+{code}
+mvn install
+{code}
+
+and simply drop the generated jar file into the Karaf lib directory.
+
+Start Karaf and you will see your branded Karaf console.
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/connect-console.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/connect-console.conf
new file mode 100644
index 0000000..0253960
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/connect-console.conf
@@ -0,0 +1,53 @@
+
+
+h1. Programmatically connect to the console
+
+A connection to the Karaf console can also be done programmatically.
+The following code is a simplified version of the code from the client library.
+
+{pygmentize:java}
+import org.apache.sshd.ClientChannel;
+import org.apache.sshd.ClientSession;
+import org.apache.sshd.SshClient;
+import org.apache.sshd.client.future.ConnectFuture;
+
+public class Main {
+
+    public static void main(String[] args) throws Exception {
+        String host = "localhost";
+        int port = 8101;
+        String user = "karaf";
+        String password = "karaf";
+
+        SshClient client = null;
+        try {
+            client = SshClient.setUpDefaultClient();
+            client.start();
+            ConnectFuture future = client.connect(host, port);
+            future.await();
+            ClientSession session = future.getSession();
+            session.authPassword(user, password);
+            ClientChannel channel = session.createChannel("shell");
+            channel.setIn(System.in);
+            channel.setOut(System.out);
+            channel.setErr(System.err);
+            channel.open();
+            channel.waitFor(ClientChannel.CLOSED, 0);
+        } catch (Throwable t) {
+            t.printStackTrace();
+            System.exit(1);
+        } finally {
+            try {
+                client.stop();
+            } catch (Throwable t) { }
+        }
+        System.exit(0);
+    }
+
+}
+{pygmentize}
+
+You can find a more complete example at the [following location|http://svn.apache.org/repos/asf/karaf/trunk/client/src/main/java/org/apache/karaf/client/Main.java].
+
+
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/creating-bundles.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/creating-bundles.conf
new file mode 100644
index 0000000..c886c48
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/creating-bundles.conf
@@ -0,0 +1,179 @@
+h1. Add extended information to bundles
+
+Karaf supports a OSGI-INF/bundle.info file in a bundle.
+
+This file is extended description of the bundle. It supports ASCII character declarations (for adding color, formatting, etc).
+
+For instance, you can define a bundle like this (using Apache Felix maven-bundle-plugin):
+
+{code:lang=xml}
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>my.groupId</groupId>
+    <artifactId>my.bundle</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>My Bundle</name>
+    <description>My bundle short description</description>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.2.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        ...
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
+{code}
+
+And simply add a src/main/resources/OSGI-INF/bundle.info file containing, for instance:
+
+{code}
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.description}
+
+\u001B[1mDESCRIPTION\u001B[0m
+    Long description of your bundle, including usage, etc.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mhttp://yourside\u001B[0m
+    \u001B[36mhttp://yourside/docs\u001B[0m
+
+{code}
+
+You can display this extended information using:
+
+{code}
+root@karaf> osgi:info
+{code}
+
+h1. Creating bundles for third party dependencies
+
+Karaf supports the wrap: protocol execution.
+
+It allows for directly deploying third party dependencies, like Apache Commons Lang:
+
+{code}
+root@karaf> osgi:install wrap:mvn:commons-lang/commons-lang/2.4
+{code}
+
+You can specify OSGi statements in the wrap URL:
+
+{code}
+root@karaf> osgi:install wrap:mvn:commons-lang/commons-lang/2.4,Bundle-SymbolicName=commons-lang&Bundle-Version=2.4
+{code}
+
+You can also create a wrap bundle for a third party dependency.
+This bundle is simply a Maven POM that shades an existing jar and package into a jar bundle.
+
+For instance, to create an OSGi bundle that wraps Apache Commons Lang, you can simply define the following Maven POM:
+
+{code:lang=xml}
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>osgi.commons-lang</groupId>
+    <artifactId>osgi.commons-lang</artifactId>
+    <version>2.4</version>
+    <packaging>bundle</packaging>
+    <name>commons-lang OSGi Bundle</name>
+    <description>This OSGi bundle simply wraps commons-lang-2.4.jar artifact.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.4</version>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+
+        <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-shade-plugin</artifactId>
+            <version>1.1</version>
+            <executions>
+                <execution>
+                    <phase>package</phase>
+                    <goals>
+                        <goal>shade</goal>
+                    </goals>
+                    <configuration>
+                        <artifactSet>
+                            <includes>
+                                <include>commons-lang:commons-lang</include>
+                            </includes>
+                        </artifactSet>
+                        <filters>
+                            <filter>
+                                <artifact>commons-lang:commons-lang</artifact>
+                                <excludes>
+                                    <exclude>**</exclude>
+                                </excludes>
+                            </filter>
+                        </filters>
+                        <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+                        <createDependencyReducedPom>true</createDependencyReducedPom>
+                    </configuration>
+                </execution>
+            </executions>
+        </plugin>
+        <plugin>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>maven-bundle-plugin</artifactId>
+            <version>2.1.0</version>
+            <extensions>true</extensions>
+            <configuration>
+                <instructions>
+                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                    <Export-Package>*</Export-Package>
+                    <Import-Package></Import-Package>
+                    <_versionpolicy>[$(version;==;$(@)),$(version;+;$(@)))</_versionpolicy>
+                    <_removeheaders>Ignore-Package,Include-Resource,Private-Package,Embed-Dependency</_removeheaders>
+                </instructions>
+                <unpackBundle>true</unpackBundle>
+            </configuration>
+        </plugin>
+    </build>
+
+</project>
+{code}
+
+You have now a OSGi bundle for commons-lang that you can deploy directly:
+
+{code}
+root@karaf> osgi:install -s mvn:osgi.commons-lang/osgi.commons-lang/2.4
+{code}
+
+Some more information is available at [http://gnodet.blogspot.com/2008/09/id-like-to-talk-bit-about-third-party.html], [http://blog.springsource.com/2008/02/18/creating-osgi-bundles/] and [http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html].
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/custom-distribution.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/custom-distribution.conf
new file mode 100644
index 0000000..557c47e
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/custom-distribution.conf
@@ -0,0 +1,412 @@
+
+
+h1. Custom distributions
+
+As Karaf is an OSGi container, it's heavily used as an application and middleware kernel.
+
+You may wish to construct your own Karaf distribution preconfigured to your requirements.
+This custom distribution could contain:
+- branding to change the Karaf console look-and-feel
+- configuration files (in the etc folder) altered to your requirements
+- pre-packaged artifacts in the deploy folder
+- a pre-populated system repository (containing your own bundle and features descriptor)
+- renamed or specific scripts in the bin folder
+- system documentation files
+
+h2. Maven assembly
+
+Basically a Karaf custom distribution involves:
+1. Uncompressing a standard Karaf distribution in a given directory.
+2. Populating the system repo with your features.
+3. Populating the lib directory with your branding or other system bundle jar files.
+4. Overriding the configuration files in the etc folder.
+
+These tasks could be performed using scripting, or more easily and portable, using Apache Maven and a set of Maven plugins.
+
+For instance, the Maven POM could look like:
+
+{code}
+<?xml version="1.0" encoding="UTF-8"?>
+<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <groupId>my.company</groupId>
+  <artifactId>mycustom-karaf</artifactId>
+  <version>1.0</version>
+  <packaging>pom</packaging>
+  <name>My Unix Custom Karaf Distribution</name>
+
+  <properties>
+    <karaf.version>2.2.2</karaf.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.karaf</groupId>
+      <artifactId>apache-karaf</artifactId>
+      <version>${karaf.version}</version>
+      <type>tar.gz</type>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.karaf</groupId>
+      <artifactId>apache-karaf</artifactId>
+      <version>${karaf.version}</version>
+      <type>xml</type>
+      <classifier>features</classifier>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>${project.basedir}/src/main/filtered-resources</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>**/*</include>
+        </includes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>filter</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>resources</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>features-maven-plugin</artifactId>
+        <version>${karaf.version}</version>
+        <executions>
+          <execution>
+           <id>add-features-to-repo</id>
+           <phase>generate-resources</phase>
+           <goals>
+             <goal>add-features-to-repo</goal>
+           </goals>
+           <configuration>
+              <descriptors>
+                <descriptor>mvn:org.apache.karaf/apache-karaf/${karaf.version}/xml/features</descriptor>
+                <descriptor>file:${project.basedir}/target/classes/my-features.xml</descriptor>
+              </descriptors>
+              <features>
+                <feature>my-feature</feature>
+              </features>
+           </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+               <!-- Define here the artifacts which should be considered in the assembly -->
+               <!-- For instance, the branding jar -->
+               <artifactItems>
+                 <artifactItem>
+                    <groupId>my.groupId</groupId>
+                    <artifactId>my.branding.id</artifactId>
+                    <version>1.0</version>
+                    <outputDirectory>target/dependencies</outputDirectory>
+                    <destFileName>mybranding.jar</destFileName>
+                 </artifactItem>
+               </artifactItems>
+            </configuration>
+          </execution>
+          <execution>
+            <!-- Uncompress the standard Karaf distribution -->
+            <id>unpack</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>unpack</goal>
+            </goals>
+            <configuration>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>org.apache.karaf</groupId>
+                  <artifactId>apache-karaf</artifactId>
+                  <type>tar.gz</type>
+                  <outputDirectory>target/dependencies</outputDirectory>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>bin</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>src/main/descriptors/bin.xml</descriptor>
+              </descriptors>
+              <appendAssemblyId>false</appendAssemblyId>
+              <tarLongFileMode>gnu</tarLongFileMode>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
+{code}
+
+The Maven POM will download the Karaf standard distribution and prepare resources to be processed by the Maven assembly plugin.
+
+Your Maven project structure should look like:
+
+* pom.xml: the previous POM file
+* src/main/descriptors/bin.xml: the assembly maven plugin descriptor (see below)
+* src/main/filtered-resources: contains all resource files that have Maven property values to be filtered/replaced. Typically, this will include features descriptor and configuration files.
+* src/main/distribution: contains all raw files which will be copied as-is into your custom distribution.
+
+For instance, {{src/main/filtered-resources}} could contain:
+* {{my-features.xml}} where maven properties will be replaced
+* {{etc/org.apache.karaf.features.cfg}} file containing your my-features descriptor:
+{code}
+#
+# Comma separated list of features repositories to register by default
+#
+featuresRepositories=mvn:org.apache.karaf/apache-karaf/${karaf.version}/xml/features,mvn:my.groupId/my-features/${project.version}/xml/features
+
+#
+# Comma separated list of features to install at startup
+#
+featuresBoot=config,ssh,management,my-feature
+{code}
+
+The {{src/main/distribution}} contains all your custom Karaf configuration files and scripts, as, for examples:
+
+* etc/org.ops4j.pax.logging.cfg
+{code}
+# Root logger
+log4j.rootLogger=INFO, out, osgi:VmLogAppender
+log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
+
+# CONSOLE appender not used by default
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32C %4L | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+
+# File appender
+log4j.appender.out=org.apache.log4j.RollingFileAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32C %4L | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
+log4j.appender.out.file=${karaf.home}/log/my-customer-distribution.log
+log4j.appender.out.append=true
+log4j.appender.out.maxFileSize=1MB
+log4j.appender.out.maxBackupIndex=10
+
+# Sift appender
+log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
+log4j.appender.sift.key=bundle.name
+log4j.appender.sift.default=my-custom
+log4j.appender.sift.appender=org.apache.log4j.FileAppender
+log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
+log4j.appender.sift.appender.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
+log4j.appender.sift.appender.append=true
+{code}
+* etc/system.properties
+{code}
+#
+# The properties defined in this file will be made available through system
+# properties at the very beginning of the FAS boot process.
+#
+
+# Log level when the pax-logging service is not available
+# This level will only be used while the pax-logging service bundle
+# is not fully available.
+# To change log levels, please refer to the org.ops4j.pax.logging.cfg file
+# instead.
+org.ops4j.pax.logging.DefaultServiceLog.level=ERROR
+
+#
+# Name of this custom instance.
+#
+karaf.name=my-custom
+
+#
+# Default repository where bundles will be loaded from before using
+# other maven repositories. For the full Maven configuration, see the
+# org.ops4j.pax.url.mvn.cfg file.
+#
+karaf.default.repository=system
+
+#
+# Location of a shell script that will be run when starting a shell
+# session. This script can be used to create aliases and define
+# additional commands.
+#
+karaf.shell.init.script=${karaf.home}/etc/shell.init.script
+
+#
+# Set this empty property to avoid errors when validating xml documents.
+#
+xml.catalog.files=
+
+#
+# Suppress the bell in the console when hitting backspace to many times
+# for example
+#
+jline.nobell=true
+
+#
+# Default port for the OSGi HTTP Service
+#
+org.osgi.service.http.port=8181
+
+#
+# Allow usage of ${custom.home} as an alias for ${karaf.home}
+#
+custom.home=${karaf.home}
+{code}
+* etc/users.properties
+{code}
+admin=admin,admin
+{code}
+* You can add a {{etc/custom.properties}}, it's a placeholder for any override you may need. For instance:
+{code}
+karaf.systemBundlesStartLevel=50
+obr.repository.url=http://svn.apache.org/repos/asf/servicemix/smx4/obr-repo/repository.xml
+org.osgi.framework.system.packages.extra = \
+  org.apache.karaf.branding; \
+  com.sun.org.apache.xalan.internal.xsltc.trax; \
+  com.sun.org.apache.xerces.internal.dom; \
+  com.sun.org.apache.xerces.internal.jaxp; \
+  com.sun.org.apache.xerces.internal.xni; \
+  com.sun.jndi.ldap
+{code}
+
+Now, we can "assemble" our custom distribution using the Maven assembly plugin. The Maven assembly plugin uses an assembly descriptor, configured in POM above to be {{src/main/descriptors/bin.xml}}:
+
+{code}
+<assembly>
+
+    <id>bin</id>
+
+    <formats>
+        <format>tar.gz</format>
+    </formats>
+
+    <fileSets>
+
+        <!-- Expanded Karaf Standard Distribution -->
+        <fileSet>
+            <directory>target/dependencies/apache-karaf-${karaf.version}</directory>
+            <outputDirectory>/</outputDirectory>
+            <excludes>
+                <exclude>**/demos/**</exclude>
+                <exclude>bin/**</exclude>
+                <exclude>etc/system.properties</exclude>
+                <exclude>etc/users.properties</exclude>
+                <exclude>etc/org.apache.karaf.features.cfg</exclude>
+                <exclude>etc/org.ops4j.pax.logging.cfg</exclude>
+                <exclude>LICENSE</exclude>
+                <exclude>NOTICE</exclude>
+                <exclude>README</exclude>
+                <exclude>RELEASE-NOTES</exclude>
+                <exclude>karaf-manual*.html</exclude>
+                <exclude>karaf-manual*.pdf</exclude>
+            </excludes>
+        </fileSet>
+
+        <!-- Copy over bin/* separately to get the correct file mode -->
+        <fileSet>
+            <directory>target/dependencies/apache-karaf-${karaf.version}</directory>
+            <outputDirectory>/</outputDirectory>
+            <includes>
+                <include>bin/admin</include>
+                <include>bin/karaf</include>
+                <include>bin/start</include>
+                <include>bin/stop</include>
+            </includes>
+            <fileMode>0755</fileMode>
+        </fileSet>
+
+        <!-- Copy over jar files -->
+        <fileSet>
+            <directory>target/dependencies</directory>
+            <includes>
+                <include>my-custom.jar</include>
+            </includes>
+            <outputDirectory>/lib/</outputDirectory>
+        </fileSet>
+
+        <fileSet>
+            <directory>src/main/distribution</directory>
+            <outputDirectory>/</outputDirectory>
+            <fileMode>0644</fileMode>
+        </fileSet>
+        <fileSet>
+            <directory>target/classes/etc</directory>
+            <outputDirectory>/etc/</outputDirectory>
+            <lineEnding>unix</lineEnding>
+            <fileMode>0644</fileMode>
+        </fileSet>
+
+        <fileSet>
+            <directory>target/features-repo</directory>
+            <outputDirectory>/system</outputDirectory>
+        </fileSet>
+
+    </fileSets>
+
+    <files>
+        <file>
+            <source>${basedir}/target/dependencies/apache-karaf-${karaf.version}/bin/karaf</source>
+            <outputDirectory>/bin/</outputDirectory>
+            <destName>my-custom</destName>
+            <fileMode>0755</fileMode>
+            <lineEnding>unix</lineEnding>
+        </file>
+        <file>
+            <source>${basedir}/target/classes/features.xml</source>
+            <outputDirectory>/system/my.groupid/my-features/${project.version}</outputDirectory>
+            <destName>my-features-${project.version}-features.xml</destName>
+            <fileMode>0644</fileMode>
+            <lineEnding>unix</lineEnding>
+        </file>
+    </files>
+
+</assembly>
+{code}
+
+To build your custom Karaf distribution, just run:
+
+{code}
+mvn install
+{code}
+
+You will find your Karaf custom distribution tar.gz in the target directory.
+
+h2. Roadmap
+
+A distribution goal is in preparation in the next Karaf
+
+h2. Custom distribution examples
+
+* [Apache ServiceMix 4|http://svn.apache.org/repos/asf/servicemix/smx4/features/trunk/assembly/]
+* [Apache ServiceMix NMR|http://svn.apache.org/repos/asf/servicemix/smx4/nmr/trunk/assembly/]
+* [BuildProcess BuildEraser|http://buildprocess.svn.sourceforge.net/viewvc/buildprocess/builderaser/trunk/assembly/]
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/debugging.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/debugging.conf
new file mode 100644
index 0000000..5d45753
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/debugging.conf
@@ -0,0 +1,139 @@
+
+
+h1. Troubleshooting, Debugging, Profiling, and Monitoring
+
+h2. Troubleshooting
+
+h3. Logging
+
+Logging is easy to control through the console, with commands grouped under _log_ shell. To learn about the available logging commands type:
+
+{code}
+karaf@root> log<tab>
+
+log:display              log:display-exception    log:get                  log:set
+karaf@root>
+{code}
+
+Typical usage is:
+ 
+ # Use {{log:set}} to dynamically change the global log level
+ # Execute the problematic operation
+ # Use {{log:display}} (or {{log:display-exception}} to display the log 
+
+ 
+
+h3. Worst Case Scenario
+
+If you end up with a Karaf in a really bad state (i.e. you can not boot it anymore) or you just want to revert to a clean state quickly, you can safely remove the {{data}} directory in the installation directory.  This folder contains transient data and will be recreated if removed when you relaunch Karaf.
+You may also want to remove the files in the {{deploy}} folder to avoid them being automatically installed when Karaf is started the first time.
+
+h2. Debugging
+
+Usually, the easiest way to debug Karaf or any application deployed onto it is to use remote debugging.
+Remote debugging can be easily activated by using the {{debug}} parameter on the command line.
+
+{noformat}
+> bin/karaf debug
+{noformat
+or on Windows
+{noformat}
+> bin\karaf.bat debug
+{noformat
+
+Another option is to set the {{KARAF_DEBUG}} environment variable to {{TRUE}}.
+
+This can be done using the following command on Unix systems:
+{noformat}
+export KARAF_DEBUG=true
+{noformat}
+
+On Windows, use the following command
+{noformat}
+set KARAF_DEBUG=true
+{noformat}
+
+Then, you can launch Karaf using the usual way:
+{noformat}
+bin/karaf
+{noformat}
+or
+{noformat}
+bin\karaf.bat
+{noformat}
+
+Last, inside your IDE, connect to the remote application (the default port to connect to is 5005).
+
+This option works fine when it is needed to debug a project deployed top of Apache Karaf. Nevertheless, you will be blocked 
+if you would like to debug the server Karaf. In this case, you can change the following parameter suspend=y in the 
+karaf.bat script file. That will cause the JVM to pause just before running main() until you attach a debugger then it 
+will resume the execution.  This way you can set your breakpoints anywhere in the code and you should be able to hit them
+no matter how early in the startup they are.  
+
+{code}
+export DEFAULT_JAVA_DEBUG_OPTS='-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005'
+{code}
+and on Windows,
+{code}
+set DEFAULT_JAVA_DEBUG_OPTS='-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005'
+{code}
+
+h2. Profiling
+
+h3. YourKit
+
+You need a few steps to be able to profile Karaf using YourKit.
+The first one is to edit the {{etc/config.properties}} configuration file and add the following property:
+{noformat}
+org.osgi.framework.bootdelegation=com.yourkit.*
+{noformat}
+
+Then, set the {{JAVA_OPTS}} environment variable:
+{noformat}
+export JAVA_OPTS='-Xmx512M -agentlib:yjpagent'
+{noformat}
+
+or, on Windows
+
+{noformat}
+set JAVA_OPTS='-Xmx512M -agentlib:yjpagent'
+{noformat}
+
+Run Karaf from the console, and you should now be able to connect using YourKit standalone or from your favorite IDE.
+
+h2. Monitoring
+
+Karaf uses JMX for monitoring and management of all Karaf components.
+
+The JMX connection could be:
+* local using the process id
+
+!/images/jconsole_connect.jpg|border=1!
+
+* remote using the {{rmiRegistryPort}} property defined in {{etc/org.apache.karaf.management.cfg}} file.
+
+Using JMX, you can have a clean overview of the running Karaf instance:
+
+* A overview with graphics displaying the load in terms of thread, heap/GC, etc:
+
+!/images/jconsole_overview.jpg|border=1!
+
+* A thread overview:
+
+!/images/jconsole_threads.jpg|border=1!
+
+* A memory heap consumption, including "Perform GC" button:
+
+!/images/jconsole_memory.jpg|border=1!
+
+* A complete JVM summary, with all number of threads, etc:
+
+!/images/jconsole_summary.jpg|border=1!
+
+You can manage Karaf features like you are in the shell. For example, you have access to the Admin service MBean, allowing you to create, rename, destroy, change SSH port, etc. Karaf instances:
+
+!/images/jconsole_admin.jpg|border=1!
+
+You can also manage Karaf features MBean to list, install, and uninstall Karaf features:
+
+!/images/jconsole_features.jpg|border=1!
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/developer-commands.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/developer-commands.conf
new file mode 100644
index 0000000..f10230a
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/developer-commands.conf
@@ -0,0 +1,152 @@
+
+
+h1. Developer commands
+
+Karaf provides a set of commands specific for developer use.
+
+They allow for getting detailed detailed information about the Karaf instance and the applications running in them.
+
+h2. Diagnostic dump command
+
+Karaf provides a {{dev:create-dump}} command which creates a dump files containing diagnostic information. The dumps can be
+packaged in a zip archive (default) or directly into a given directory.
+
+{code}
+karaf@root> dev:create-dump
+Diagnostic dump created.
+{code}
+
+The previous command generates a zip archive in the KARAF_HOME (by default the name is the generation timestamp).
+
+The following dumps are available in the zip archive:
+* {{features.txt}} provides an overview of the features. It means:
+** the repository list
+** the feature list including bundles URL
+* {{bundles.txt}} provides an overview of the installed bundles, with the ID and the state of each bundle.
+* {{threads.txt}} provides a complete threads dump. It describe all threads running in Karaf and their current state (blocked,
+waiting, etc) with the associated class hierarchy.
+
+These dumps are very helpful when you would like to take a snapshot of a current Karaf running instance.
+
+h2. Dynamic import
+
+The {{dev:dynamic-import}} command allows you to enable or disable the dynamic import of a given bundle:
+
+{code}
+karaf@root> dev:dynamic-import 41
+Enabling dynamic imports on bundle org.apache.karaf.shell.config [41]
+{code}
+
+h2. OSGi framework
+
+The {{dev:framework}} command shows you the current OSGi framework in use, and enables debugging of the underlying OSGi framework.
+
+{code}
+karaf@root> dev:framework
+Current OSGi framework is Felix
+karaf@root> dev:framework -debug
+Enabling debug for OSGi framework (Felix)
+- set felix.log.level=4 in etc/config.properties
+
+Restart Karaf now to enable Felix debug logging
+karaf@root> dev:framework -nodebug
+Disabling debug for OSGi framework (Felix)
+- removed felix.log.level from etc/config.properties
+
+Restart Karaf now to disable Felix debug logging
+{code}
+
+h2. Print stack trace
+
+The {{dev:print-stack-traces}} command prints the full stack trace in the console when the execution of a command
+throws an exception.
+
+You can enable or disable this behavior by passing true (to enable) or false (to disable) on the command on the fly:
+
+{code}
+karaf@root> dev:print-stack-traces
+karaf@root> osgi:start
+Error executing command osgi:start: argument ids is required
+org.apache.felix.gogo.commands.CommandException: Argument ids is required
+        at org.apache.felix.gogo.commands.basic.DefaultActionPreparator.prepare(DefaultActionPreparator.java:284)
+        at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:34)
+        at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
+        at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:474)
+        at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:400)
+        at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
+        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
+        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
+        at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:79)
+        at org.apache.karaf.shell.console.jline.Console.run(Console.java:180)
+        at java.lang.Thread.run(Thread.java:619)
+karaf@root> dev:print-stack-traces false
+karaf@root> osgi:start
+Error executing command osgi:start: argument ids is required
+{code}
+
+h2. Karaf restart
+
+The {{dev:restart}} command allows you to restart the running Karaf instance:
+
+{code}
+karaf@root> dev:restart
+karaf@root>
+        __ __                  ____
+       / //_/____ __________ _/ __/
+      / ,<  / __ `/ ___/ __ `/ /_
+     / /| |/ /_/ / /  / /_/ / __/
+    /_/ |_|\__,_/_/   \__,_/_/
+
+  Apache Karaf (2.1.99-SNAPSHOT)
+
+Hit '<tab>' for a list of available commands
+and '[cmd] --help' for help on a specific command.
+Hit '<ctrl-d>' or 'osgi:shutdown' to shutdown Karaf.
+
+karaf@root>
+{code}
+
+h2. Bundle tree
+
+The {{dev:show-tree}} command shows the bundle dependency tree based on the wiring information of a given single bundle ID.
+
+{code}
+karaf@root> dev:show-tree 40
+Bundle org.apache.karaf.diagnostic.command [40] is currently ACTIVE
+
+org.apache.karaf.diagnostic.command [40]
++- org.apache.aries.blueprint [10]
+|  +- org.apache.aries.util [8]
+|  +- org.apache.felix.configadmin [5]
+|  +- org.apache.aries.proxy [7]
+|  |  +- org.apache.aries.util [8]
+|  |  +- org.apache.servicemix.bundles.asm [9]
+|  |  +- org.ops4j.pax.logging.pax-logging-api [3]
+|  +- org.ops4j.pax.logging.pax-logging-api [3]
++- org.apache.karaf.shell.console [22]
+|  +- org.apache.aries.blueprint [10]
+|  +- org.ops4j.pax.logging.pax-logging-api [3]
+|  +- org.apache.karaf.jaas.modules [13]
+|     +- org.apache.aries.blueprint [10]
+|     +- org.apache.felix.configadmin [5]
+|     +- org.apache.karaf.jaas.config [29]
+|     |  +- org.apache.aries.blueprint [10]
+|     |  +- org.ops4j.pax.logging.pax-logging-api [3]
+|     +- org.ops4j.pax.logging.pax-logging-api [3]
++- org.apache.karaf.diagnostic.core [23]
+{code}
+
+h2. Watching and updating bundle
+
+The {{dev:watch}} watches and updates bundles. It's especially helpful in development mode.
+
+It allows you to configure a set of URLs that will be monitored. All bundles whose location matches the given URL will be
+automatically updated. This avoids needing to manually update the bundles or even copy the bundles to the system folder.
+
+Note that only Maven based URLs and Maven SNAPSHOTs will actually be updated automatically, so if you do:
+
+{code}
+karaf@root> dev:watch *
+{code}
+
+it will actually monitor all bundles that have a location matching mvn:* that have '-SNAPSHOT' in their URL.
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/extending-console.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/extending-console.conf
new file mode 100644
index 0000000..4e6cddc
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/extending-console.conf
@@ -0,0 +1,306 @@
+
+
+h1. Extending the console
+
+This chapter will guide you through the steps needed to extend the console and create a new shell.  
+We will leverage Maven, Blueprint and OSGi, so you will need some knowledge of those products.
+
+You may also find some information about the console at [http://felix.apache.org/site/rfc-147-overview.html].
+
+h2. Create the project using maven
+
+We first need to create a project using Maven.  Let's leverage Maven archetypes for that.
+
+h3. Command line
+
+Using the command line, we can create our project:
+{code}
+mvn archetype:create \
+  -DarchetypeArtifactId=maven-archetype-quickstart \
+  -DgroupId=org.apache.karaf.shell.samples \
+  -DartifactId=shell-sample-commands \
+  -Dversion=1.0-SNAPSHOT
+{code}
+
+This generate the main {{pom.xml}} and some additional packages.
+
+h3. Interactive shell
+
+You can also use the interactive mode for creating the skeleton project:
+{code}
+mvn archetype:generate
+{code}
+Use the following values when prompted:
+{code}
+Choose a number:  (1/2/3/4/5/6/7/.../32/33/34/35/36) 15: : 15
+Define value for groupId: : org.apache.karaf.shell.samples
+Define value for artifactId: : shell-sample-commands
+Define value for version:  1.0-SNAPSHOT: : 
+Define value for package: : org.apache.karaf.shell.samples
+{code}
+
+h3. Manual creation
+
+Alternatively, you can simply create the directory {{shell-sample-commands}} and create the {{pom.xml}} file inside it:
+
+{pygmentize:xml}
+<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>
+
+  <groupId>org.apache.karaf.shell.samples</groupId>
+  <artifactId>shell-sample-commands<artifactId>
+  <packaging>bundle</packaging>
+  <version>1.0-SNAPSHOT</version>
+  <name>shell-sample-commmands</name>
+
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.karaf.shell</groupId>
+      <artifactId>org.apache.karaf.shell.console</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>${felix.plugin.version}</version>
+        <configuration>
+          <instructions>
+            <Import-Package>
+              org.apache.felix.service.command,
+              org.apache.felix.gogo.commands,
+              org.apache.karaf.shell.console,
+              *
+            </Import-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
+{pygmentize}
+
+h2. Configuring for Java 5
+
+We are using annotations to define commands, so we need to ensure Maven will actually use JDK 1.5 to compile the jar.
+Just add the following snippet after the {{dependencies}} section.
+
+{pygmentize:xml}
+<build>
+  <plugins>
+    <plugin>
+      <groupId>org.apache.maven.plugins</groupId>
+      <artifactId>maven-compiler-plugin</artifactId>
+      <configuration>
+        <target>1.5</target>
+        <source>1.5</source>
+      </configuration>
+    </plugin>
+  </plugins>
+</build>
+{pygmentize}
+
+h2. Loading the project in your IDE
+
+We can use Maven to generate the needed files for your IDE:
+
+Inside the project, run the following command
+{code}
+mvn eclipse:eclipse
+{code}
+or
+{code}
+mvn idea:idea
+{code}
+
+The project files for your IDE should now be created.  Just open the IDE and load the project.
+
+h2. Creating a basic command class
+
+We can now create the command class {{HelloShellCommand.java}}
+
+{pygmentize:java}
+package org.apache.karaf.shell.samples;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+@Command(scope = "test", name = "hello", description="Says hello")
+public class HelloShellCommand extends OsgiCommandSupport {
+
+    @Override
+    protected Object doExecute() throws Exception {
+        System.out.println("Executing Hello command");
+        return null;
+    }
+}
+{pygmentize}
+
+h2. Creating the associated blueprint configuration files
+
+The blueprint configuration file will be used to create the command and register it in the OSGi registry, which is the way to make the command available to Karaf console.  This blueprint file must be located in the {{OSGI-INF/blueprint/}} directory inside the bundle.
+
+If you don't have the {{src/main/resources}} directory yet, create it.
+
+{code}
+mkdir src/main/resources
+{code}
+
+Then, re-generate the IDE project files and reload it so that this folder is now recognized as a source folder.
+
+Inside this directory, create the {{OSGI-INF/blueprint/}} directory and put the following file inside (the name of this file has no impact at all):
+
+{pygmentize:xml}
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="test/hello">
+            <action class="org.apache.karaf.shell.samples.HelloShellCommand"/>
+        </command>
+    </command-bundle>
+
+</blueprint>
+{pygmentize}
+
+h2. Compiling the jar
+
+Let's try to build the jar.  Remove the test classes and sample classes if you used the artifact, then from the command line, run:
+
+{code}
+mvn install
+{code}
+
+The end of the maven output should look like:
+{code}
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESSFUL
+[INFO] ------------------------------------------------------------------------
+{code}
+
+h2. Test in Karaf
+
+Launch a Karaf instance and run the following command to install the newly created bundle:
+{code}
+karaf@root> osgi:install -s mvn:org.apache.karaf.shell.samples/shell-sample-commands/1.0-SNAPSHOT
+{code}
+
+Let's try running the command:
+
+{code}
+karaf@root> test:hello
+Executing Hello command
+{code}
+
+h1. Command completer
+
+A completer allows you to automatically complete a command argument using <tab>. A completer is simply a bean which is injected to a command.
+
+Of course to be able to complete it, the command should require an argument.
+
+h2. Command argument
+
+We add an argument to the HelloCommand:
+
+{code}
+package org.apache.karaf.shell.samples;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+@Command(scope = "test", name = "hello", description="Says hello")
+public class HelloShellCommand extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "arg", description = "The command argument", required = false, multiValued = false)
+    String arg = null;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        System.out.println("Executing Hello command");
+        return null;
+    }
+}
+{code}
+
+The Blueprint configuration file is the same as previously.
+
+h2. Completer bean
+
+A completer is a bean which implements the Completer interface:
+
+{code}
+package org.apache.karaf.shell.samples;
+
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.console.Completer;
+
+/**
+ * <p>
+ * A very simple completer.
+ * </p>
+ */
+public class SimpleCompleter implements Completer {
+
+ /**
+  * @param buffer the beginning string typed by the user
+  * @param cursor the position of the cursor
+  * @param candidates the list of completions proposed to the user
+  */
+ public int complete(String buffer, int cursor, List candidates) {
+    StringsCompleter delegate = new StringsCompleter();
+    delegate.getStrings().add("one");
+    delegate.getStrings().add("two");
+    delegate.getStrings().add("three");
+    return delegate.complete(buffer, cursor, candidates);
+ }
+
+}
+{code}
+
+h2. Blueprint configuration file
+
+Using Blueprint, you can "inject" the completer linked to your command. The same completer could be used for several commands and a command can have several completers:
+
+{code:lang=xml}
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="test/hello">
+            <action class="org.apache.karaf.shell.samples.HelloShellCommand"/>
+            <completers>
+                <ref component-id="simpleCompleter"/>
+                <null/>
+            </completers>
+        </command>
+    </command-bundle>
+
+    <bean id="simpleCompleter" class="org.apache.karaf.shell.samples.SimpleCompleter"/>
+
+</blueprint>
+{code}
+
+h2. Test in Karaf
+
+Launch a Karaf instance and run the following command to install the newly created bundle:
+{code}
+karaf@root> osgi:install -s mvn:org.apache.karaf.shell.samples/shell-sample-commands/1.0-SNAPSHOT
+{code}
+
+Let's try running the command:
+
+{code}
+karaf@root> test:hello <tab>
+ one    two    three
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-add.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-add.conf
new file mode 100644
index 0000000..60291d4
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-add.conf
@@ -0,0 +1,50 @@
+h2. Goal {{features:add-features-to-repo}}
+
+The {{features:add-features-to-repo}} goal adds all the required bundles for a given set of features into directory.  You can use this goal to create a {{/system}} directory for building your own Karaf-based distribution.
+
+By default, the Karaf core features descriptors (standard and enterprise) are automatically included in the descriptors set.
+
+h3. Example
+The example below copies the bundles for the {{spring}} and {{war}} features defined in the Karaf features XML descriptor into the {{target/features-repo}} directory.
+{pygmentize:xml}
+<project>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>features-maven-plugin</artifactId>
+        <version>${project.version}</version>
+
+        <executions>
+          <execution>
+            <id>add-features-to-repo</id>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>add-features-to-repo</goal>
+            </goals>
+            <configuration>
+              <descriptors>
+                <descriptor>mvn:my.groupid/my.artifactid/1.0.0/xml/features</descriptor>
+              </descriptors>
+              <features>
+                <feature>spring</feature>
+                <feature>war</feature>
+                <feature>my</feature>
+                <feature>other/1.0-SNAPSHOT</feature>
+              </features>
+              <repository>target/features-repo</repository>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>  
+</project>
+{pygmentize}
+
+h3. Parameters
+|| Name || Type || Description ||
+| {{descriptors}} | {{String[]}} | List of features XML descriptors where the features are defined \\ NB: Karaf core features descriptors (standard and enterprise) are automatically added in this list |
+| {{features}} | {{String[]}} | List of features that bundles should be copied to the repository directory. A feature could be just a feature name or a name/version. If it's just a name, the features-maven-plugin will take the first feature with the given name, whatever the version is. |
+| {{repository}} | {{File}} | The directory where the bundles will be copied by the plugin goal |
+| {{karafVersion}} | {{String}} | Target Karaf version to use to resolve the Karaf core features descriptors (standard and enterprise) |
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-create-kar.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-create-kar.conf
new file mode 100644
index 0000000..24d6e3e
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-create-kar.conf
@@ -0,0 +1,39 @@
+h2. Goal {{features:create-kar}}
+
+The {{features:create-kar}} goal creates a kar file from a given features XML.
+A kar file is a zip archive shipping all bundles and configuration files containing in features of a features XML, and the features XML itself.
+You can deploy a kar file just by copying it in the deploy folder, all resources will be loaded from the kar file.
+
+h3. Example
+The example below generates a kar file from a given features XML. The generated kar will be in the target folder with the ${artifactId}-${version}.kar name.
+{pygmentize:xml}
+<project>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>features-maven-plugin</artifactId>
+        <version>${project.version}</version>
+          <executions>
+            <execution>
+              <id>create-kar</id>
+              <goals>
+                <goal>create-kar</goal>
+              </goals>
+              <configuration>
+                <featuresFile>${project.basedir}/src/main/resources/features.xml</featuresFile>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+    </plugins>
+  </build>
+</project>
+{pygmentize}
+
+h3. Parameters
+|| Name || Type || Description ||
+| {{featuresFile}} | {{File}} | The features XML used to generate the KAR file \\ Default value: {{${project.build.directory}/feature/feature.xml}} |
+| {{resourcesDir} | {{File}} | Location of resources directory for additional content to include in the KAR. Note that it includes everything under classes so as to include maven-remote-resources \\ Default value: ${project.build.directory}/classes}} |
+| {{finalName}} | {{String}} | Name of the generated kar \\ Default value: {{${project.build.finalName}}} |
+| {{outputDirectory}} | {{File}} | Directory containing the generated archive \\ Default value: {{${project.build.directory}}} |
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-generate.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-generate.conf
new file mode 100644
index 0000000..8a02035
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-generate.conf
@@ -0,0 +1,53 @@
+h2. Goal {{features:generate}}
+
+The {{features:generate}} goal generates a features XML file for every bundle listed in the project's dependencies.  In order to satisfy the required imports in these bundles, the plugin will add bundles:
+- bundles provided by Apache Karaf
+- a explicit list of bundles
+- bundles discovered in the POM's transitive dependencies
+
+Afterwards, the generated file will be attached to the build as an additional build artifact (by default as {{group:artifact:version:xml:features}}).
+
+h3. Example
+The example below generates one feature that installs bundle {{mvn:org.apache:bundle1:1.0}} in a features XML file called {{target/features.xml}}.  It will find bundle in Apache Karaf ${project.version}, the transitive dependencies for this POM and the bundles listed in {{src/main/resources/bundles.properties}}. 
+{pygmentize:xml}
+<project>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache</groupId>
+      <artifactId>bundle1</artifactId>
+      <version>1.0</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>features-maven-plugin</artifactId>
+        <version>${project.version}</version>
+          <executions>
+            <execution>
+              <id>generate</id>
+              <phase>generate-resources</phase>
+              <goals>
+                <goal>generate</goal>
+              </goals>
+              <configuration>
+                <bundles>src/main/resources/bundles.properties</bundles>
+                <kernelVersion>${project.version}</kernelVersion>
+                <outputFile>target/features.xml</outputFile>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+    </plugins>
+  </build>  
+</project>
+{pygmentize}
+
+h3. Parameters
+|| Name || Type || Description ||
+| {{outputFile}} | {{File}} | Name of the features XML file that is being generated \\ Default value: {{${project.build.directory}/classes/feature.xml}} |
+| {{attachmentArtifactType}} | {{String}} | The artifact type for attaching the generated file to the project \\ Default value: {{xml}) |
+| {{attachmentArtifactClassifier}} | {{String}} | The artifact classifier for attaching the generated file to the project \\ Default value: {{features}} |
+| {{kernelVersion}} | {{String}} | The version of Karaf that is used to determine system bundles and default provided features |
+| {{bundles}} | {{File}} | A properties file that contains a list of bundles that will be used to generate the features.xml file |
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-validate.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-validate.conf
new file mode 100644
index 0000000..2c74edb
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin-validate.conf
@@ -0,0 +1,50 @@
+h2. Goal {{features:validate}}
+
+The {{features:validate}} goal validates a features XML descriptor by checking if all the required imports for the bundles defined in the features can be matched to a provided export.
+
+By default, the plugin tries to add the Karaf standard features (standard and enterprise) in the repositories set.
+It means that it's not necessary to explicitly define the Karaf features descriptor in the repository section of your features descriptor.
+
+h3. Example
+The example below validates the features defined in the {{target/features.xml}} by checking all the imports and exports.  It reads the definition for the packages that are exported by the system bundle from the {{src/main/resources/config.properties}} file.
+{pygmentize:xml}
+<project>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>features-maven-plugin</artifactId>
+        <version>${project.version}</version>
+          <executions>
+            <execution>
+              <id>validate</id>
+              <phase>process-resources</phase>
+              <goals>
+                <goal>validate</goal>
+              </goals>
+              <configuration>
+                <file>target/features.xml</file>
+                <karafConfig>src/main/resources/config.properties</karafConfig>
+              </configuration>
+            </execution>
+          </executions>
+          <dependencies>
+            <dependency>
+              <groupId>org.slf4j</groupId>
+              <artifactId>slf4j-simple</artifactId>
+              <version>1.4.3</version>
+	        </dependency>
+          </dependencies>
+        </plugin>
+    </plugins>
+  </build>  
+</project>
+{pygmentize}
+
+h3. Parameters
+|| Name || Type || Description ||
+| {{file}} | {{File}} | The features XML descriptor file to validate. \\ Default value: {{${project.build.directory}/classes/features.xml}} |
+| {{karafConfig}} | {{String}} | The Karaf {{config.properties}} file to use during the validation process \\ Default value: {{config.properties}} |
+| {{jreVersion}} | {{String}} | The JRE version that is used during the validation process \\ Default value: {{jre-1.5}) |
+| {{karafVersion}} | {{String}} | The target Karaf version used to get the Karaf core features (standard and enterprise) \\ Default value is the version of the plugin |
+| {{repositories}} | {{String[]}} | Additional features XML descriptors that will be used during the validation process |
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin.conf
new file mode 100644
index 0000000..14d2f11
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/features-maven-plugin.conf
@@ -0,0 +1,30 @@
+h1. Using the features-maven-plugin
+
+The {{features-maven-plugin}} provides several goals to help you create and validate features XML descriptors as well as leverage your features to create a custom Karaf distribution.
+
+|| Goal || Description ||
+| {{[features:add-features-to-repo|features-maven-plugin-add]}} | Copies all the bundles required for a given set of features into a directory \\ (e.g. for creating your own Karaf-based distribution) |
+| {{features:generate-features-file}} | Deprecated - use {{[features:generate-features-xml|features-maven-plugin-generate]}} instead |
+| {{[features:generate-features-xml|features-maven-plugin-generate]}} | Generates a features XML descriptor for a set of bundles |
+| {{[features:validate|features-maven-plugin-validate]}} | Validate a features XML descriptor by checking if all the required imports can be matched to exports |
+| {{|features:create-kar|features-maven-plugin-create-kar]}} | Create a KAR file from a features XML |
+
+h2. Configure the features-maven-plugin
+In order to use the {{features-maven-plugin}}, you have to define the plugin in your project's {{pom.xml}} file:
+{pygmentize:xml}
+<project>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>features-maven-plugin</artifactId>
+        <version>${project.version}</version>
+
+        <executions>
+          <!-- add execution definitions here -->
+        </executions>
+      </plugin>
+    </plugins>
+  </build>  
+</project>
+{pygmentize}
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/index.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/index.conf
new file mode 100644
index 0000000..81e8964
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/index.conf
@@ -0,0 +1,14 @@
+h1. Developers Guide
+
+* [Maven Archetypes|archetypes]
+* [Branding the Console|branding-console]
+* [Extending the Console|extending-console]
+* [Custom Distribution|custom-distribution]
+* [Security Framework|security-framework]
+* [Using the features-maven-plugin|features-maven-plugin]
+* [Troubleshooting, Debugging, Profiling, and Monitoring|debugging]
+* [Developer Commands|developer-commands]
+* [Programmatically connect to the console|connect-console]
+* [Writing integration tests|writing-tests]
+* [Creating bundles|creating-bundles]
+* [Shell syntax|shell-syntax]
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/security-framework.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/security-framework.conf
new file mode 100644
index 0000000..179699f
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/security-framework.conf
@@ -0,0 +1,399 @@
+h1. Security framework
+
+Karaf supports [JAAS|http://download.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html] with some enhancements to allow JAAS to work nicely in an OSGi environment.  This framework also features an OSGi keystore manager with the ability to deploy new keystores or truststores at runtime.  
+
+h2. Overview
+
+This feature allows runtime deployment of JAAS based configuration for use in various parts of the application. This includes the remote console login, which uses the {{karaf}} realm, but which is configured with a dummy login module by default.  These realms can also be used by the NMR, JBI components or the JMX server to authenticate users logging in or sending messages into the bus.
+
+In addition to JAAS realms, you can also deploy keystores and truststores to secure the remote shell console, setting up HTTPS connectors or using certificates for WS-Security.
+
+A very simple XML schema for spring has been defined, allowing the deployment of a new realm or a new keystore very easily.
+
+h2. Schema
+
+To override or deploy a new realm, you can use the following XSD which is supported by a Spring namespace handler and can thus be defined in a Spring xml configuration file.
+
+Following is the XML Schema to use when defining Karaf realms:
+{snippet:url=../jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd|lang=xml|pygmentize=true}
+{snippet}
+
+You can find the schema at the following [location|http://karaf.apache.org/xmlns/jaas/v1.1.0].
+
+Here are two examples using this schema:
+{pygmentize:xml}
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <!-- Bean to allow the $[karaf.base] property to be correctly resolved -->
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/>
+
+    <jaas:config name="myrealm">
+        <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" 
+                     flags="required">
+            users = $[karaf.base]/etc/users.properties
+        </jaas:module>
+    </jaas:config>
+
+</blueprint>
+{pygmentize}
+{pygmentize:xml}
+<jaas:keystore xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.1.0"
+               name="ks"
+               rank="1"
+               path="classpath:privatestore.jks"
+               keystorePassword="keyStorePassword"
+               keyPasswords="myalias=myAliasPassword">
+</jaas:keystore>
+{pygmentize}
+
+The {{id}} attribute is the blueprint id of the bean, but it will be used by default as the name of the realm if no {{name}} attribute is specified.   Additional attributes on the {{config}} elements are a {{rank}}, which is an integer.  When the LoginContext looks for a realm for authenticating a given user, the realms registered in the OSGi registry are matched against the required name.  If more than one realm is found, the one with the highest rank will be used, thus allowing the override of some realms with new values.  The last attribute is {{publish}} which can be set to false to not publish the realm in the OSGi registry, thereby disabling the use of this realm.
+
+Each realm can contain one or more module definitions.  Each module identifies a LoginModule and the {{className}} attribute must be set to the class name of the login module to use.   Note that this login module must be available from the bundle classloader, so either it has to be defined in the bundle itself, or the needed package needs to be correctly imported. The {{flags}} attribute can take one of four values that are explained on the [JAAS documentation|http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java].
+The content of the {{module}} element is parsed as a properties file and will be used to further configure the login module.
+
+Deploying such a code will lead to a [JaasRealm|http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java] object in the OSGi registry, which will then be used when using the JAAS login module.
+
+h3. Configuration override and use of the {{rank}} attribute
+
+The {{rank}} attribute on the {{config}} element is tied to the ranking of the underlying OSGi service.  When the JAAS framework performs an authentication, it will use the realm name to find a matching JAAS configuration.  If multiple configurations are used, the one with the highest {{rank}} attribute will be used.
+So if you want to override the default security configuration in Karaf (which is used by the ssh shell, web console and JMX layer), you need to deploy a JAAS configuration with the name {{name="karaf"}} and {{rank="1"}}.
+
+{pygmentize:xml}
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.1.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <!-- Bean to allow the $[karaf.base] property to be correctly resolved -->
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]"/>
+
+    <jaas:config name="karaf" rank="1">
+        <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule"
+                     flags="required">
+            users = $[karaf.base]/etc/users.properties
+            ...
+        </jaas:module>
+    </jaas:config>
+
+</blueprint>
+{pygmentize}
+
+
+h2. Architecture
+
+Due to constraints in the JAAS specification, one class has to be available for all bundles.  This class is called [ProxyLoginModule|http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java] and is a LoginModule that acts as a proxy for an OSGi defines LoginModule.  If you plan to integrate this feature into another OSGi runtime, this class must be made available from the system classloader and the related package be part of the boot delegation classpath (or be deployed as a fragment attached to the system bundle).
+
+The xml schema defined above allows the use of a simple xml (leveraging spring xml extensibility) to configure and register a JAAS configuration for a given realm.  This configuration will be made available into the OSGi registry as a [JaasRealm|http://svn.apache.org/repos/asf/karaf/tags/karaf-2.0.0/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java] and the OSGi specific Configuration will look for such services.  Then the proxy login module will be able to use the information provided by the realm to actually load the class from the bundle containing the real login module.
+
+h2. Available realms
+
+Karaf comes with several login modules to handle authentication needs for your environment.
+
+h3. PropertiesLoginModule
+
+This login module is the one configured by default.  It uses a properties text file to load the users, passwords and roles.  
+
+|| Name             || Description |
+| {{users}}          | location of the properties file |
+
+This file uses the [properties file format|http://download.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader)].
+The format of the properties is as follows, with each line defining a user, its password and associated roles:
+{code}
+user=password[,role][,role]...
+{code}
+
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" 
+                 flags="required">
+        users = $[karaf.base]/etc/users.properties
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
+h3. OsgiConfigLoginModule
+
+The OsgiConfigLoginModule uses the OSGi ConfigurationAdmin service to provide the users, passwords and roles.
+
+|| Name           || Description |
+| {{pid}}          | the PID of the configuration containing user definitions |
+
+The format of the configuration is the same than for the {{PropertiesLoginModule}}.
+
+h3. JDBCLoginModule
+
+The JDBCLoginModule uses a database to load the users, passwords and roles from a provided data source _(normal or XA)_. The data source and the queries for password and role retrieval are configurable using the following parameters.
+
+|| Name                   || Description ||
+| {{datasource}}           | The datasource as on OSGi ldap filter or as JDNI name|
+| {{query.password}}       | The SQL query that retries the password of the user |
+| {{query.role}}           | The SQL query that retries the roles of the user |
+
+
++Passing a data source as an OSGi ldap filter+
+
+To use an OSGi ldap filter, the prefix osgi: needs to be provided, as shown below:
+
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule" 
+                 flags="required">
+        datasource = osgi:javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)
+        query.password = SELECT PASSWORD FROM USERS WHERE USERNAME=?
+        query.role = SELECT ROLE FROM ROLES WHERE USERNAME=?
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
++Passing a data source as a JNDI name+
+
+To use an JNDI name, the prefix jndi: needs to be provided. The example below assumes the use of Aries JNDI to expose services via JNDI.
+
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule" 
+                 flags="required">
+        datasource = jndi:aries:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)
+        query.password = SELECT PASSWORD FROM USERS WHERE USERNAME=?
+        query.role = SELECT ROLE FROM ROLES WHERE USERNAME=?
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
+h3. LDAPLoginModule
+
+The LDAPLoginModule uses LDAP to load the users and roles and bind the users on the LDAP to check passwords.
+
+The LDAPLoginModule supports the following parameters:
+
+|| Name                      || Description ||
+| {{connection.url}}          | The LDAP connection URL, e.g. ldap://hostname |
+| {{connection.username}}     | Admin username to connect to the LDAP. This parameter is optional, if it's not provided, the LDAP connection will be anonymous. |
+| {{connection.password}}     | Admin password to connect to the LDAP. Only used if the {{connection.username}} is specified. |
+| {{user.base.dn}}            | The LDAP base DN used to looking for user, e.g. ou=user,dc=apache,dc=org |
+| {{user.filter}}             | The LDAP filter used to looking for user, e.g. (uid=%u) where %u will be replaced by the username. |
+| {{user.search.subtree}}     | If "true", the user lookup will be recursive (SUBTREE). If "false", the user lookup will be performed only at the first level (ONELEVEL). |
+| {{role.base.dn}}            | The LDAP base DN used to looking for roles, e.g. ou=role,dc=apache,dc=org |
+| {{role.filter}}             | The LDAP filter used to looking for user's role, e.g. (member:=uid=%u) |
+| {{role.name.attribute}}     | The LDAP role attribute containing the role string used by Karaf, e.g. cn |
+| {{role.search.subtree}}     | If "true", the role lookup will be recursive (SUBTREE). If "false", the role lookup will be performed only at the first level (ONELEVEL). |
+| {{authentication}}          | Define the authentication backend used on the LDAP server. The default is simple. |
+| {{initial.context.factory}} | Define the initial context factory used to connect to the LDAP server. The default is com.sun.jndi.ldap.LdapCtxFactory |
+| {{ssl}}                     | If "true" or if the protocol on the {{connection.url}} is {{ldaps}}, an SSL connection will be used |
+| {{ssl.provider}}            | The provider name to use for SSL |
+| {{ssl.protocol}}            | The protocol name to use for SSL (SSL for example)|
+| {{ssl.algorithm}}           | The algorithm to use for the KeyManagerFactory and TrustManagerFactory  (PKIX for example) |
+| {{ssl.keystore}}            | The key store name to use for SSL.  The key store must be deployed using a {{jaas:keystore}} configuration.  |
+| {{ssl.keyalias}}            | The key alias to use for SSL |
+| {{ssl.truststore}}          | The trust store name to use for SSL.  The trust store must be deployed using a {{jaas:keystore}} configuration.  |
+
+A example of LDAPLoginModule usage follows:
+
+{pygmentize:xml}
+<jaas:config name="karaf">
+  <jaas:module className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule" flags="required">
+        connection.url = ldap://localhost:389
+        user.base.dn = ou=user,dc=apache,dc=org
+        user.filter = (cn=%u)
+        user.search.subtree = true
+        role.base.dn = ou=group,dc=apache,dc=org
+        role.filter = (member:=uid=%u)
+        role.name.attribute = cn
+        role.search.subtree = true
+        authentication = simple
+  </jaas:module>
+</jaas:config>
+{pygmentize}
+
+If you wish to use an SSL connection, the following configuration can be used as an example:
+{pygmentize:xml}
+<ext:property-placeholder />
+
+<jaas:config name="karaf" rank="1">
+    <jaas:module className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule" flags="required">
+        connection.url = ldaps://localhost:10636
+        user.base.dn = ou=users,ou=system
+        user.filter = (uid=%u)
+        user.search.subtree = true
+        role.base.dn = ou=groups,ou=system
+        role.filter = (uniqueMember=uid=%u)
+        role.name.attribute = cn
+        role.search.subtree = true
+        authentication = simple
+        ssl.protocol=SSL
+        ssl.truststore=ks
+        ssl.algorithm=PKIX
+    </jaas:module>
+</jaas:config>
+
+<jaas:keystore name="ks"
+               path="file:///${karaf.home}/etc/trusted.ks"
+               keystorePassword="secret" />
+{pygmentize}
+
+
+h2. Encryption service
+
+The [EncryptionService|http://svn.apache.org/repos/asf/karaf/trunk/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java] is a service registered in the OSGi registry providing means to encrypt and check encrypted passwords.  This service acts as a factory for [Encryption|http://svn.apache.org/repos/asf/karaf/trunk/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java] objects actually performing the encryption.
+
+This service is used in all Karaf login modules to support encrypted passwords.
+
+h3. Configuring properties
+
+Each login module supports the following additional set of properties:
+|| Name                   || Description ||
+| {{encryption.name}}      | Name of the encryption service registered in OSGi (cf. paragraph [below|#Jasypt]) |
+| {{encryption.enabled}}   | Boolean used to turn on encryption |
+| {{encryption.prefix}}    | Prefix for encrypted passwords |
+| {{encryption.suffix}}    | Suffix for encrypted passwords |
+| {{encryption.algorithm}} | Name of an algorithm to be used for hashing, like "MD5" or "SHA-1" |
+| {{encryption.encoding}}  | Encrypted passwords encoding (can be {{hexadecimal}} or {{base64}}) |
+| {{role.policy}}          | A policy for identifying roles (can be {{prefix}} or {{group}}) [below|#Role discovery policies]) |
+| {{role.discriminator}}   | A discriminator value to be used by the role policy |
+
+A simple example follows:
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" 
+                 flags="required">
+        users = $[karaf.base]/etc/users.properties
+        encryption.enabled = true
+        encryption.algorithm = MD5
+        encryption.encoding = hexadecimal
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
+h3. Prefix and suffix
+
+The login modules have the ability to support both encrypted and plain passwords at the same time.  In some cases, some login modules may be able to encrypt the passwords on the fly and save them back in an encrypted form.
+
+To 
+
+h3. Jasypt
+
+Karaf default installation comes with a simple encryption service which usually fulfills simple needs.  However, in some cases, you may need to install the [Jasypt|http://www.jasypt.org/] library which provides stronger encryption algorithms and more control over them.
+
+To install the Jasypt library, the easiest way is to install the available feature:
+{code}
+karaf@root> features:install jasypt-encryption
+{code}
+
+It will download and install the required bundles and also register an {{EncryptionService}} for Jasypt in the OSGi registry.
+
+When configuring a login module to use Jasypt, you need to specify the {{encryption.name}} property and set it to a value of {{jasypt}} to make sure the Jasypt encryption service will be used. 
+
+In addition to the standard properties above, the Jasypt service provides the following parameters:
+
+|| Name                     || Description ||
+| {{providerName}}           | Name of the {{java.security.Provider}} name to use for obtaining the digest algorithm |
+| {{providerClassName}}      | Class name for the security provider to be used for obtaining the digest algorithm |
+| {{iterations}}             | Number of times the hash function will be applied recursively |
+| {{saltSizeBytes}}          | Size of the salt to be used to compute the digest |
+| {{saltGeneratorClassName}} | Class name of the salt generator |
+
+A typical realm definition using Jasypt encryption service would look like:
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" 
+                 flags="required">
+        users = $[karaf.base]/etc/users.properties
+        encryption.enabled = true
+        encryption.name = jasypt
+        encryption.algorithm = SHA-256
+        encryption.encoding = base64
+        encryption.iterations = 100000
+        encryption.saltSizeBytes = 16
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
+
+h2. Role discovery policies
+
+The JAAS specification does not provide means to distinguish between User and Role Principals without referring to the specification classes. In order to provide means to the application developer to decouple the application from Karaf JAAS implementation role policies have been created.
+
+A role policy is a convention that can be adopted by the application in order to identify Roles, without depending from the implementation. Each role policy can be cofigured by setting a "role.policy" and "role.discriminator" property to the login module configuration. Currently, Karaf provides two policies that can be applied to all Karaf Login Modules.
+
+# Prefixed Roles
+# Grouped Roles
+
++Prefixed Roles+
+When the prefixed role policy is used the login module applies a configurable prefix _(property role.discriminator)_ to the role, so that the application can identify the role's principals by its prefix. Example:
+
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" 
+                 flags="required">
+        users = $[karaf.base]/etc/users.properties
+        role.policy = prefix
+        role.discriminator = ROLE_
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
+The application can identify the role principals using a snippet like this:
+
+{pygmentize:java}
+LoginContext ctx = new LoginContext("karaf", handler);
+ctx.login();
+authenticated = true;
+subject = ctx.getSubject();
+for (Principal p : subject.getPrincipals()) {
+   	if (p.getName().startsWith("ROLE_")) {
+   	   	roles.add((p.getName().substring("ROLE_".length())));
+   	}
+}
+{pygmentize}
+
++Grouped Roles+
+When the group role policy is used the login module provides all roles as members of a group with a configurable name _(property role.discriminator)_. Example:
+
+{pygmentize:xml}
+<jaas:config name="karaf">
+    <jaas:module className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule" 
+                 flags="required">
+        users = $[karaf.base]/etc/users.properties
+        role.policy = group
+        role.discriminator = ROLES
+    </jaas:module>
+</jaas:config>
+{pygmentize}
+
+{pygmentize:java}
+LoginContext ctx = new LoginContext("karaf", handler);
+ctx.login();
+authenticated = true;
+subject = ctx.getSubject();
+for (Principal p : subject.getPrincipals()) {
+    if ((p instanceof Group) && ("ROLES".equalsIgnoreCase(p.getName()))) {
+        Group g = (Group) p;
+        Enumeration<? extends Principal> members = g.members();
+        while (members.hasMoreElements()) {
+            Principal member = members.nextElement();
+            roles.add(member.getName());
+        }
+    }
+}
+{pygmentize}
+
+h2. Default role policies
+
+The previous section describes how to leverage role policies. However, Karaf provides a default role policy, based on the following class names:
+
+* org.apache.karaf.jaas.modules.UserPrincipal
+* org.apache.karaf.jaas.modules.RolePrincipal
+* org.apache.karaf.jaas.modules.GroupPrincipal
+
+It allows you to directly handling the role class:
+
+{pygmentize:java}
+String rolePrincipalClass = "org.apache.karaf.jaas.modules.RolePrincipal";
+
+for (Principal p : subject.getPrincipals()) {
+	if (p.getClass().getName().equals(rolePrincipalClass)) {
+		roles.add(p.getName());
+	}
+}
+{pygmentize}
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/shell-syntax.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/shell-syntax.conf
new file mode 100644
index 0000000..3b74180
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/shell-syntax.conf
@@ -0,0 +1,92 @@
+h1. Shell syntax
+
+h2. Easy to use interactively - no unnecessary syntax
+
+{code}
+// simple command
+karaf@root> echo hello world
+hello world
+
+// session variables
+karaf@root> msg = "hello world"
+hello world
+karaf@root> echo $msg
+hello world
+
+// execution quotes () - similar to bash backquotes
+karaf@root> (bundle 1) location
+mvn:org.ops4j.pax.url/pax-url-mvn/1.1.3
+{code}
+
+h2. List, maps, pipes and closures
+
+{code}
+// lists - []
+karaf@root> list = [1 2 a b]
+1
+2
+a
+b
+
+karaf@root> map = [Jan=1 Feb=2 Mar=3]
+Jan                 1
+Feb                 2
+Mar                 3
+
+// pipes
+karaf@root> bundles | grep felix
+000000 ACT org.apache.felix.framework-3.0.2
+000005 ACT org.apache.felix.configadmin-1.2.4
+000006 ACT org.apache.felix.fileinstall-3.0.2
+
+// closures - {}
+karaf@root> echo2 = { echo xxx $args yyy }
+org.apache.felix.gogo.runtime.shell.Closure@2ffb36c2
+karaf@root> echo2 hello world
+xxx hello world yyy
+{code}
+
+h2. Leverages existing Java capabilities, via reflection
+
+{code}
+// exception handling - console shows summary, but full context available
+karaf@root> start xxx
+Error executing command osgi:start: unable to convert argument ids with value '[xxx]' to type java.util.List<java.lang.Long>
+karaf@root> $karaf.lastException printStackTrace
+org.apache.felix.gogo.commands.CommandException: Unable to convert argument ids with value '[xxx]' to type java.util.List<java.lang.Long>
+	at org.apache.felix.gogo.commands.basic.DefaultActionPreparator.prepare(DefaultActionPreparator.java:347)
+	at org.apache.felix.gogo.commands.basic.AbstractCommand.execute(AbstractCommand.java:34)
+	at org.apache.felix.gogo.runtime.shell.CommandProxy.execute(CommandProxy.java:50)
+	at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:229)
+	at org.apache.felix.gogo.runtime.shell.Closure.executeStatement(Closure.java:162)
+	at org.apache.felix.gogo.runtime.shell.Pipe.run(Pipe.java:101)
+	at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:79)
+	at org.apache.felix.gogo.runtime.shell.CommandSessionImpl.execute(CommandSessionImpl.java:71)
+	at org.apache.karaf.shell.console.jline.Console.run(Console.java:169)
+	at java.lang.Thread.run(Thread.java:637)
+Caused by: java.lang.Exception: Unable to convert from [xxx] to java.util.List<java.lang.Long>(error converting collection entry)
+	at org.apache.aries.blueprint.container.AggregateConverter.convertToCollection(AggregateConverter.java:318)
+	at org.apache.aries.blueprint.container.AggregateConverter.convert(AggregateConverter.java:159)
+	at org.apache.karaf.shell.console.commands.BlueprintCommand$BlueprintActionPreparator.convert(BlueprintCommand.java:73)
+	at org.apache.felix.gogo.commands.basic.DefaultActionPreparator.prepare(DefaultActionPreparator.java:344)
+	... 9 more
+Caused by: java.lang.NumberFormatException: For input string: "xxx"
+	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
+	at java.lang.Long.parseLong(Long.java:410)
+	at java.lang.Long.valueOf(Long.java:525)
+	at org.apache.aries.blueprint.container.AggregateConverter.convertFromString(AggregateConverter.java:261)
+	at org.apache.aries.blueprint.container.AggregateConverter.convert(AggregateConverter.java:151)
+	at org.apache.aries.blueprint.container.AggregateConverter.convertToCollection(AggregateConverter.java:316)
+	... 12 more
+
+// add all public methods on java.lang.System as commands:
+karaf@root> addcommand system (loadClass java.lang.System)
+karaf@root> system:getproperty karaf.name
+root
+
+// create new objects
+karaf@root> map = (new java.util.HashMap)
+karaf@root> $map put 0 0
+karaf@root> $map
+0                   0
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/developers-guide/writing-tests.conf b/karaf-2.2.x/manual/src/main/webapp/developers-guide/writing-tests.conf
new file mode 100644
index 0000000..ac02583
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/developers-guide/writing-tests.conf
@@ -0,0 +1,34 @@
+
+
+h1. Writing integration tests
+
+We recommend using [PAX Exam|http://team.ops4j.org/wiki/display/paxexam/Pax+Exam] to write integration tests when developing
+applications using Karaf.
+
+Karaf provides an helper library to help writing such integration tests.
+{pygmentize:java}
+   @Configuration
+   public static Option[] configuration() throws Exception{
+       return combine(
+           // Default karaf environment
+           Helper.getDefaultOptions(),
+           // Test on both equinox and felix
+           equinox(), felix()
+       );
+   }
+{pygmentize}
+
+If you need to provision a few features in addition to the default Karaf environment, you can do so by adding the following code:
+
+{pygmentize:java}
+           scanFeatures(
+                  maven().groupId("org.apache.felix.karaf")
+                         .artifactId("apache-felix-karaf")
+                         .type("xml").classifier("features")
+                         .versionAsInProject(),
+                  "obr", "wrapper"
+           ),
+{pygmentize}
+
+
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/asf-logo.png b/karaf-2.2.x/manual/src/main/webapp/images/asf-logo.png
new file mode 100644
index 0000000..d824fab
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/asf-logo.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/bg.png b/karaf-2.2.x/manual/src/main/webapp/images/bg.png
new file mode 100644
index 0000000..878a84f
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/bg.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/bg02-blue-left.png b/karaf-2.2.x/manual/src/main/webapp/images/bg02-blue-left.png
new file mode 100644
index 0000000..057efdf
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/bg02-blue-left.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/bg02-blue-right.png b/karaf-2.2.x/manual/src/main/webapp/images/bg02-blue-right.png
new file mode 100644
index 0000000..edf9a9d
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/bg02-blue-right.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/bg02-white-left-nogr.png b/karaf-2.2.x/manual/src/main/webapp/images/bg02-white-left-nogr.png
new file mode 100644
index 0000000..1c5186c
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/bg02-white-left-nogr.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/bg02-white-right-nogr.png b/karaf-2.2.x/manual/src/main/webapp/images/bg02-white-right-nogr.png
new file mode 100644
index 0000000..9734def
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/bg02-white-right-nogr.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/big-bullet.png b/karaf-2.2.x/manual/src/main/webapp/images/big-bullet.png
new file mode 100644
index 0000000..f036db5
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/big-bullet.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/deployer.png b/karaf-2.2.x/manual/src/main/webapp/images/deployer.png
new file mode 100644
index 0000000..505eb3c
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/deployer.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_admin.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_admin.jpg
new file mode 100644
index 0000000..93e8d0e
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_admin.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_connect.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_connect.jpg
new file mode 100644
index 0000000..6041ee1
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_connect.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_features.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_features.jpg
new file mode 100644
index 0000000..233e5fa
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_features.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_memory.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_memory.jpg
new file mode 100644
index 0000000..c9fbb29
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_memory.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_overview.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_overview.jpg
new file mode 100644
index 0000000..b41a72b
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_overview.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_summary.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_summary.jpg
new file mode 100644
index 0000000..7245d12
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_summary.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/jconsole_threads.jpg b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_threads.jpg
new file mode 100644
index 0000000..b4c0cb2
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/jconsole_threads.jpg
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/karaf-logo.png b/karaf-2.2.x/manual/src/main/webapp/images/karaf-logo.png
new file mode 100644
index 0000000..066ab86
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/karaf-logo.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/karaf.png b/karaf-2.2.x/manual/src/main/webapp/images/karaf.png
new file mode 100644
index 0000000..f9fb4a4
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/karaf.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/karaf2.png b/karaf-2.2.x/manual/src/main/webapp/images/karaf2.png
new file mode 100644
index 0000000..f9fb4a4
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/karaf2.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/left-box-bottom.png b/karaf-2.2.x/manual/src/main/webapp/images/left-box-bottom.png
new file mode 100644
index 0000000..0495248
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/left-box-bottom.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/left-box-right.png b/karaf-2.2.x/manual/src/main/webapp/images/left-box-right.png
new file mode 100644
index 0000000..2698074
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/left-box-right.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/images/left-box-top.png b/karaf-2.2.x/manual/src/main/webapp/images/left-box-top.png
new file mode 100644
index 0000000..e1fc26e
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/images/left-box-top.png
Binary files differ
diff --git a/karaf-2.2.x/manual/src/main/webapp/index.conf b/karaf-2.2.x/manual/src/main/webapp/index.conf
new file mode 100644
index 0000000..1575417
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/index.conf
@@ -0,0 +1,10 @@
+h1. Apache Karaf
+
+This project contains documentation about Apache Karaf.
+
+* [Karaf Overview|overview]
+* [Quick Start|quick-start]
+* [Users Guide|users-guide/index]
+* [Developers Guide|developers-guide/index]
+* [Commands Reference|commands/commands]
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/manual.conf b/karaf-2.2.x/manual/src/main/webapp/manual.conf
new file mode 100644
index 0000000..3c8ec9d
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/manual.conf
@@ -0,0 +1,74 @@
+{attributes:layout=/WEB-INF/scalate/layouts/print.ssp}
+
+{div:class=title}
+!/images/karaf-logos.png!
+\\
+\\
+\\
+\\
+Apache Karaf
+Users' Guide
+\\
+\\
+\\
+\\
+{div}
+
+{div:class=copyright-section}
+Copyright 2011 The Apache Software Foundation
+
+The PDF format of the Karaf Manual has been generated by Prince XML (http://www.princexml.com).
+{div}
+
+
+{div:class=toc-title}
+Table of contents
+{div}
+
+{toc:maxLevel=2}
+
+h1. Overview
+{include:overview.conf}
+
+h1. Quick Start
+{include:quick-start.conf}
+
+h1. Users Guide
+{include:users-guide/installation.conf}
+{include:users-guide/directory-structure.conf}
+{include:users-guide/start-stop.conf}
+{include:users-guide/wrapper.conf}
+{include:users-guide/using-console.conf}
+{include:users-guide/colorized-console.conf}
+{include:users-guide/remote-console.conf}
+{include:users-guide/web-console.conf}
+{include:users-guide/child-instances.conf}
+{include:users-guide/security.conf}
+{include:users-guide/failover.conf}
+{include:users-guide/logging-system.conf}
+{include:users-guide/deployer.conf}
+{include:users-guide/provisioning.conf}
+{include:users-guide/provisioning-schema.conf}
+{include:users-guide/kar.conf}
+{include:users-guide/configuration.conf}
+{include:users-guide/http.conf}
+{include:users-guide/web-applications.conf}
+{include:users-guide/jre-tuning.conf}
+{include:users-guide/jmx.conf}
+
+h1. Developers Guide
+{include:developers-guide/archetypes.conf}
+{include:developers-guide/branding-console.conf}
+{include:developers-guide/extending-console.conf}
+{include:developers-guide/custom-distribution.conf}
+{include:developers-guide/security-framework.conf}
+{include:developers-guide/features-maven-plugin.conf}
+{include:developers-guide/features-maven-plugin-add.conf}
+{include:developers-guide/features-maven-plugin-generate.conf}
+{include:developers-guide/features-maven-plugin-validate.conf}
+{include:developers-guide/debugging.conf}
+{include:developers-guide/connect-console.conf}
+{include:developers-guide/writing-tests.conf}
+{include:developers-guide/creating-bundles.conf}
+{include:developers-guide/shell-syntax.conf}
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/overview.conf b/karaf-2.2.x/manual/src/main/webapp/overview.conf
new file mode 100644
index 0000000..efbed92
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/overview.conf
@@ -0,0 +1,18 @@
+h1. Karaf Overview
+
+Apache Karaf is a small OSGi based runtime which provides a lightweight container onto which various components and applications can be deployed.
+
+Here is a short list of features supported by the Karaf:
+
+* *Hot deployment*: Karaf supports hot deployment of OSGi bundles by monitoring jar files inside the {{\[home\]/deploy}} directory.  Each time a jar is copied in this folder, it will be installed inside the runtime.  You can then update or delete it and changes will be handled automatically.  In addition, Karaf also supports exploded bundles and custom deployers (Blueprint and Spring ones are included by default).
+* *Dynamic configuration*: Services are usually configured through the ConfigurationAdmin OSGi service.  Such configuration can be defined in Karaf using property files inside the {{\[home\]/etc}} directory.  These configurations are monitored and changes on the properties files will be propagated to the services.
+* *Logging System*: using a centralized logging back end supported by Log4J, Karaf supports a number of different APIs (JDK 1.4, JCL, SLF4J, Avalon, Tomcat, OSGi)
+* *Provisioning*: Provisioning of libraries or applications can be done through a number of different ways, by which they will be downloaded locally, installed and started.
+* *Native OS integration*: Karaf can be integrated into your own Operating System as a service so that the lifecycle will be bound to your Operating System.
+* *Extensible Shell console*: Karaf features a nice text console where you can manage the services, install new applications or libraries and manage their state.  This shell is easily extensible by deploying new commands dynamically along with new features or applications.
+* *Remote access*: use any SSH client to connect to Karaf and issue commands in the console
+* *Security framework* based on JAAS
+* *Managing instances*: Karaf provides simple commands for managing multiple instances. You can easily create, delete, start and stop instances of Karaf through the console.
+* Supports the latest OSGi 4.2 containers: Apache Felix Framework 3.0 and Eclipse Equinox 3.6
+
+!/images/karaf.png!
diff --git a/karaf-2.2.x/manual/src/main/webapp/quick-start.conf b/karaf-2.2.x/manual/src/main/webapp/quick-start.conf
new file mode 100644
index 0000000..331a608
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/quick-start.conf
@@ -0,0 +1,169 @@
+
+
+h1. 1. Quick Start
+
+If you are in a hurry to have Apache Karaf up and running right away, this section will provide you with some basic steps for downloading, building (when needed) and running the server in no time. This is clearly not a complete guide so you may want to check other sections of this guide for further information.
+
+All you need is 5 to 10 minutes and to follow these basic steps.
+* [#Background]
+* [#Getting the software]
+* [#Start the server]
+* [#Deploy a sample application]
+
+h2. Background
+
+Apache Karaf is a small and lightweight OSGi based runtime.  This provides a small lightweight container onto which various bundles can be deployed.
+
+Apache Karaf started life as the [Apache ServiceMix|http://servicemix.apache.org] kernel and then moved as a [Apache Felix|http://felix.apache.org] subproject before becoming a top level project.
+
+h2. Getting the software
+
+At this time you have one option to get the software. The fastest and easiest way is to get the binary directly from the Apache site. Since this article is intended to help you to have Apache Karaf up and running in the fastest way only the binary download will be covered at this time.
+
+h3. Prerequisites
+
+Although this installation path is the fastest one, you will still need to install some software before installing Karaf.
+
+Karaf requires a Java SE 5 environment to run. Refer to [http://www.oracle.com/technetwork/java/javase/] for details on how to download and install Java SE 1.5 or greater.
+
+h3. Download binaries
+
+You will need to select the appropriate installation image for the platform you're using to run Karaf. Open a Web browser and access the following URL, there you will find the available packages for download (binaries and source code).
+
+[http://karaf.apache.org/index/community/download.html]
+
+Select the file compression format compatible with your system (zip for windows, tar.gz for unixes) by clicking directly on the link, download it and expand the binary to your hard drive in a new directory; for example in z:\karaf - from now on this directory will be referenced as <KARAF_HOME>. Please remember the restrictions concerning illegal characters in Java paths, e.g. \!, % etc.
+
+The installation of Karaf is as simple as uncompressing the .zip or .tar.gz files. The next step is to start the server.
+
+
+h2. Start the server
+
+With Karaf already installed, open a command line console and change directory to <KARAF_HOME>. To start the server, run the following command in Windows:
+{code}
+bin\karaf.bat
+{code}
+respectively on Unix:
+{code}
+bin/karaf
+{code}
+You should see the following information on the command line console:
+{include:Karaf welcome screen}
+You can now run your first command.  Simply type the {{<tab>}} key in the console.
+{code:borderStyle=solid}
+karaf@root> 
+
+admin:change-port         admin:connect             admin:create              admin:destroy
+admin:list                admin:start               admin:stop                config:cancel
+config:edit               config:list               config:propappend         config:propdel
+config:proplist           config:propset            config:update             dev:dynamic-import
+dev:framework             dev:print-stack-traces    dev:show-tree             features:addUrl
+features:info             features:install          features:list             features:listUrl
+features:refreshUrl       features:removeUrl        features:uninstall        log:display
+log:display-exception     log:get                   log:set                   osgi:bundle-level
+osgi:headers              osgi:install              osgi:list                 osgi:ls
+osgi:refresh              osgi:resolve              osgi:restart              osgi:shutdown
+osgi:start                osgi:start-level          osgi:stop                 osgi:uninstall
+osgi:update               packages:exports          packages:imports          shell:cat
+shell:clear               shell:each                shell:echo                shell:exec
+shell:grep                shell:history             shell:if                  shell:info
+shell:java                shell:logout              shell:new                 shell:printf
+shell:sleep               shell:sort                shell:tac                 ssh:ssh
+ssh:sshd                  cat                       clear                     each
+echo                      exec                      grep                      history
+if                        info                      java                      logout
+new                       printf                    sleep                     sort
+tac                       bundle-level              headers                   install
+list                      ls                        refresh                   resolve
+restart                   shutdown                  start                     start-level
+stop                      uninstall                 update
+karaf@root> 
+{code}
+
+You can then grab more specific help for a given command using the {{--help}} option for this command:
+
+{code:borderStyle=solid}
+karaf@root> admin:create --help
+DESCRIPTION
+	admin:create
+
+	Create a new instance.
+
+SYNTAX
+	admin:create [options] name
+
+ARGUMENTS
+        name
+                The name of the new container instance
+
+OPTIONS
+        --help
+                Display this help message
+        -f, --feature
+                Initial features. This option can be specified multiple times to enable multiple initial 
+                features
+        -p, --port
+                Port number for remote shell connection
+        -l, --location
+                Location of the new container instance in the file system
+        -furl, --featureURL
+                Additional feature descriptor URLs. This option can be specified multiple times to add 
+                multiple URLs
+
+karaf@root> 
+{code}
+
+Note that the console supports tab completion, so you just need to enter {{ad <tab> cr <tab>}} instead of {{admin:create}}.
+
+h2. Deploy a sample application
+
+While you will learn in the Karaf user's guide how to fully use and leverage Apache Karaf, let's install a sample [Apache Camel|http://camel.apache.org] application for now:
+
+In the console, run the following commands:
+{code}
+features:addurl mvn:org.apache.camel/camel-example-osgi/2.7.0/xml/features
+features:install camel-example-osgi
+{code}
+
+The example installed is using Camel to start a timer every 2 seconds and output a message on the console.
+The previous commands download the Camel features descriptor and install the example feature.
+{code}
+>>>> SpringDSL set body:  Fri Jan 07 11:59:51 CET 2011
+>>>> SpringDSL set body:  Fri Jan 07 11:59:53 CET 2011
+>>>> SpringDSL set body:  Fri Jan 07 11:59:55 CET 2011
+
+{code}
+
+h3. Stopping and uninstalling the sample application
+
+To stop this demo, run the following command:
+{code}
+features:uninstall camel-example-osgi
+{code}
+
+h3. Common Problems
+
+# Launching Karaf can result in a deadlock in Felix during module dependency resolution.
+This is often a result of sending a SIGINT (control-C) to the process when it will not cleanly exit.
+This can corrupt the caches and cause startup problems in the very next launch. It is fixed by emptying the component cache:
+{code}
+rm -rf data/cache/*
+{code}
+
+h2. Stopping Karaf
+
+To stop Karaf from the console, enter {{^D}} in the console:
+{code}
+^D
+{code}
+Alternatively, you can also run the following command:
+{code}
+osgi:shutdown
+{code}
+
+h2. Summary
+
+This document showed how simple it is to have Apache Karaf up and running. The overall time for getting the server running should be less than five
+minutes if you have the prerequisite (Java 1.5) already installed. Additionally, this article also showed you how to deploy and test a simple
+Apache Camel application.
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/child-instances.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/child-instances.conf
new file mode 100644
index 0000000..7116f08
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/child-instances.conf
@@ -0,0 +1,126 @@
+h1. Managing child instances
+
+A child instance of Karaf is a copy that you can launch separately and deploy applications into.  An instance does not contain the full copy of Karaf, but only a copy of the configuration files and data folder which contains all the runtime information, logs and temporary files.
+
+h2. Using the admin console commands
+
+The *admin* console commands allow you to create and manage instances of Karaf on the same machine.  Each new runtime is a child instance of the runtime that created it.  You can easily manage the children using names instead of network addresses.   For details on the *admin* commands, see the [{{admin}} commands|/commands/admin].
+ 
+h2. Creating child instances
+
+You create a new runtime instance by typing [{{admin:create}}|/commands/admin-create] in the Karaf console.
+
+As shown in the following example, {{admin:create}} causes the runtime to create a new runtime installation in the active runtime's {{instances/[name]} directory.  The new instance is a new Karaf instance and is assigned an SSH port number based on an incremental count starting at 8101 and a RMI registry port number based on an incremental count starting at 1099/44444.
+
+{code}
+karaf@root> admin:create alpha 
+Creating new instance on SSH port 8102 and RMI ports 1100/44445 at: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha
+Creating dir:  /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/bin
+Creating dir:  /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc
+Creating dir:  /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/system
+Creating dir:  /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/deploy
+Creating dir:  /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/data
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/config.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/jre.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/custom.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/java.util.logging.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.apache.felix.fileinstall-deploy.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.apache.karaf.log.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.apache.karaf.features.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.ops4j.pax.logging.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.ops4j.pax.url.mvn.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/startup.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/users.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/system.properties
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.apache.karaf.shell.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/etc/org.apache.karaf.management.cfg
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/bin/karaf
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/bin/start
+Creating file: /x3/karaf/test/apache-karaf-2.2.4/instances/alpha/bin/stop
+karaf@root>
+{code}
+
+h2. Changing a child's ports
+
+You can change the SSH port number assigned to a child instance using the [{{admin:change-ssh-port}}|/commands/admin-change-port] command.  The syntax for the command is:
+{code}
+admin:change-ssh-port instance port
+{code}
+Note that the child instance has to be stopped in order to run this command.
+
+In the same way, you can change the RMI registry port number assigned to a child instance using the [{{admin:change-rmi-registry-port}}|/commands/admin-change-rmi-registry-port] command. The syntax for the command is:
+{code}
+admin:change-rmi-registry-port instance port
+{code}
+Note that the child instance has to be stopped in order to run this command.
+
+h2. Starting child instances
+
+New instances are created in a stopped state.  To start a child instance and make it ready to host applications, use the [{{admin:start}}|/commands/admin-start] command.  This command takes a single argument {{[instance-name]}} that identifies the child you want started.
+
+h2. Listing all container instances
+
+To see a list of all Karaf instances running under a particular installation, use the [{{admin:list}}|/commands/admin-list] command.
+
+{code}
+karaf@root>admin:list
+  SSH Port   RMI Port   State       Pid  Name
+[    8107] [      1106] [Started ] [10628] harry
+[    8101] [      1099] [Started ] [20076] root
+[    8106] [      1105] [Stopped ] [15924] dick
+[    8105] [      1104] [Started ] [18224] tom
+karaf@root>
+{code}
+
+h2. Connecting to a child instance
+
+You can connect to a started child instance's remote console using the [{{admin:connect}}|/commands/admin-connect] command which takes three arguments:
+
+{code}
+admin:connect [-u username] [-p password] instance 
+{code}
+
+Once you are connected to the child instance, the Karaf prompt changes to display the name of the current instance, as shown:
+
+{code}
+karaf@harry>
+{code}
+
+h2. Stopping a child instance
+
+To stop a child instance from within the instance itself, type {{osgi:shutdown}} or simply {{shutdown}}.
+
+To stop a child instance remotely, in other words, from a parent or sibling instance, use the [{{admin:stop}}|/commands/admin-stop]:
+{code}
+admin:stop instance
+{code}
+
+h2. Destroying a child instance
+
+You can permanently delete a stopped child instance using the [{{admin:destroy}}|/commands/admin-destroy] command:
+{code}
+admin:destroy instance
+{code}
+Note that only stopped instances can be destroyed.
+
+h2. Using the admin script
+
+You can also manage the local instances of Karaf.  The {{admin}} script in the {{[karaf-install-dir]/bin}} directory provides the same commands as the {{admin}} console commands, apart from [{{admin:connect}}|/commands/admin-connect].
+ 
+{code}
+> bin/admin
+Available commands:
+  change-ssh-port - Changes the secure shell port of an existing container instance.
+  change-rmi-registry-port - Changes the RMI registry port (used by management layer) of an existing container instance.
+  create - Creates a new container instance.
+  destroy - Destroys an existing container instance.
+  list - List all existing container instances.
+  start - Starts an existing container instance.
+  stop - Stops an existing container instance.
+Type 'command --help' for more help on the specified command.
+{code}
+
+For example, to list all the instances of Karaf on the local machine, type:
+{code}
+bin/admin list
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/colorized-console.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/colorized-console.conf
new file mode 100644
index 0000000..599593c
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/colorized-console.conf
@@ -0,0 +1,25 @@
+h1. Enabling Colorized Console on Windows
+
+
+The default Karaf installation does not produce colorized console output on Windows like it does on Unix based systems.  To enable it, you must install LGPL licensed library [JNA|https://jna.dev.java.net/].  This can be done using a few simple commands in the Karaf console:
+
+You first need to install the JNA library:
+{code}
+karaf@root> osgi:install wrap:mvn:http://download.java.net/maven/2!net.java.dev.jna/jna/3.1.0
+{code}
+
+Next you need either restart karaf or you run the following Karaf commands to refresh the Karaf Console:
+
+{code}
+karaf@root> osgi:list | grep "Apache Karaf :: Shell Console"
+{code}
+
+Take note of the ID of the bundle, in my case it was 14 and then run:
+
+{code}
+osgi:refresh 14
+{code}
+
+{warning}
+TODO: refactor that using a nicer script to find the correct bundle
+{warning}
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/configuration.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/configuration.conf
new file mode 100644
index 0000000..38ddf8c
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/configuration.conf
@@ -0,0 +1,46 @@
+
+
+h1. Configuration
+
+The files in the {{etc}} directory are used to set the startup configuration.  
+
+For dynamic configuration, Karaf provides a suite of command to administer the configuration service grouped under {{config}}. To learn about all currently supported configuration commands type:
+
+|| Command                                || Description   ||
+| [{{cancel}}|/commands/config-cancel]     | Change the changes to the configuration being edited. |
+| [{{edit}}|/commands/config-edit]         | Create or edit a configuration. |
+| [{{list}}|/commands/config-list]         | List existing configurations. |
+| [{{propdel}}|/commands/config-propdel]   | Delete a property from the edited configuration. |
+| [{{proplist}}|/commands/config-proplist] | List properties from the edited configuration. |
+| [{{propset}}|/commands/config-propset]   | Set a property on the edited configuration. |
+| [{{update}}|/commands/config-update]     | Save and propagate changes from the configuration being edited. |
+
+
+h2. Editing
+
+h3. Select Configuration To Edit
+
+For example to edit configuration {{foo.bar}}:
+
+{code}
+karaf@root> config:edit foo.bar
+{code}
+
+h3. Modify Properties
+
+Use:
+ 
+ * [{{config:proplist}}|/commands/config-proplist] to list existing properties
+ * [{{config:propdel}}|/commands/config-propdel] to delete existing properties
+ * [{{config:propset}}|/commands/config-propset] to set a new value for a property
+
+Any number of properties can be modified within a single editing session. 
+
+h3. Commit Or Rollback Changes
+
+Use
+
+ * [{{config:update}}|/commands/config-update] to commit all changes made in the current session
+ * [{{config:cancel}}|/commands/config-cancel] to roll back any changes made in the current session
+
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/deployer.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/deployer.conf
new file mode 100644
index 0000000..ca2593a
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/deployer.conf
@@ -0,0 +1,209 @@
+
+
+h1. Deployer
+
+The following picture describes the architecture of the deployer.
+
+!/images/deployer.png!
+
+h2. Blueprint deployer
+
+Karaf includes a deployer that is able to deploy plain blueprint configuration files.
+The deployer will transform on the fly any spring configuration file dropped into the {{deploy}} folder into a valid OSGi bundle.
+
+The generated OSGi manifest will contain the following headers:
+
+{code}
+Manifest-Version: 2
+Bundle-SymbolicName: [name of the file]
+Bundle-Version: [version of the file]
+Import-Package: [required packages]
+DynamicImport-Package: *
+{code}
+
+The {{name}} and {{version}} of the file are extracted using a heuristic that will match common patterns.  For example {{my-config-1.0.1.xml}} will lead to {{name = my-config}} and {{version = 1.0.1}}.
+The default imported packages are extracted from the spring file definition and includes all classes referenced directly.
+
+If you need to customize the generated manifest, you can do so by including an xml element in your blueprint configuration:
+
+{code:lang=xml}
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+  <manifest xmlns="http://karaf.apache.org/xmlns/deployer/blueprint/v1.0.0">
+    Require-Bundle= my-bundle
+  </manifest>
+{code}
+
+h2. Spring deployer
+
+Similar to the blueprint deployer, you can deploy spring-dm configuration files.
+
+The generated OSGi manifest will contain the following headers:
+
+{code}
+Manifest-Version: 2
+Bundle-SymbolicName: [name of the file]
+Bundle-Version: [version of the file]
+Spring-Context: *;publish-context:=false;create-asynchronously:=true
+Import-Package: [required packages]
+DynamicImport-Package: *
+{code}
+
+If you need to customize the generated manifest, you can do so by including an xml element in your spring configuration:
+
+{code:lang=xml}
+<spring:beans ...>
+  <manifest xmlns="http://karaf.apache.org/xmlns/deployer/spring/v1.0.0">
+    Require-Bundle= my-bundle
+  </manifest>
+{code}
+
+h2. Features deployer
+
+To be able to hot deploy features from the deploy folder, you can just drop a feature descriptor on that folder.  A bundle will be created and its installation (automatic) will trigger the installation of all features contained in the descriptor.  Removing the file from the deploy folder will uninstall the features.
+If you want to install a single feature, you can do so by writing a feature descriptor like the following:
+
+{code:lang=xml}
+<features>
+  <repository>mvn:org.apache.servicemix.nmr/apache-servicemix-nmr/1.0.0/xml/features</repository>
+  <feature name="nmr-only">
+    <feature>nmr</feature>
+  </feature>
+</features>
+{code}
+
+For more informations about features, see the [provisioning section|provisioning].
+
+h2. War deployer
+
+To be able to hot deploy web application (war) from the deploy folder, you have to install the war feature:
+
+{code}
+karaf@root> features:install war
+{code}
+
+NB: you can use the -v or --verbose option to see exactly what is performed by the feature deployer.
+
+{code}
+karaf@root> features:install -v war
+Installing feature war 2.1.99-SNAPSHOT
+Installing feature http 2.1.99-SNAPSHOT
+Installing feature jetty 7.2.2.v20101205
+Installing bundle mvn:org.apache.geronimo.specs/geronimo-servlet_2.5_spec/1.1.2
+Found installed bundle: org.apache.servicemix.bundles.asm [9]
+Installing bundle mvn:org.eclipse.jetty/jetty-util/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-io/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-http/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-continuation/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-server/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-security/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-servlet/7.2.2.v20101205
+Installing bundle mvn:org.eclipse.jetty/jetty-xml/7.2.2.v20101205
+Checking configuration file mvn:org.apache.karaf/apache-karaf/2.1.99-SNAPSHOT/xml/jettyconfig
+Installing bundle mvn:org.ops4j.pax.web/pax-web-api/1.0.0
+Installing bundle mvn:org.ops4j.pax.web/pax-web-spi/1.0.0
+Installing bundle mvn:org.ops4j.pax.web/pax-web-runtime/1.0.0
+Installing bundle mvn:org.ops4j.pax.web/pax-web-jetty/1.0.0
+Installing bundle mvn:org.apache.karaf.shell/org.apache.karaf.shell.web/2.1.99-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-jsp/1.0.0
+Installing bundle mvn:org.ops4j.pax.web/pax-web-extender-war/1.0.0
+Installing bundle mvn:org.ops4j.pax.web/pax-web-extender-whiteboard/1.0.0
+Installing bundle mvn:org.ops4j.pax.web/pax-web-deployer/1.0.0
+Installing bundle mvn:org.ops4j.pax.url/pax-url-war/1.2.5
+{code}
+
+As you can see, the war feature uses PAX Web as war deployer.
+
+You should now be able to see the PAX Web war deployer:
+
+{code}
+karaf@root> osgi:list |grep -i war
+[  57] [Active     ] [            ] [   60] OPS4J Pax Web - Extender - WAR (1.0.0)
+[  60] [Active     ] [            ] [   60] OPS4J Pax Url - war:, war-i: (1.2.5)
+{code}
+
+You can deploy a web application packaged in war or exploded in a directory.
+
+Your web application should at least contain a WEB-INF/web.xml file.
+
+h2. Wrap deployer
+
+The wrap deployer allows you to hot deploy non-OSGi jar files ("classical" jar files) from the deploy folder.
+
+It's a standard deployer (you don't need to install additional Karaf features):
+
+{code}
+karaf@root> la|grep -i wrap
+[   1] [Active     ] [            ] [    5] OPS4J Pax Url - wrap: (1.2.5)
+[  32] [Active     ] [Created     ] [   30] Apache Karaf :: Deployer :: Wrap Non OSGi Jar (2.1.99.SNAPSHOT)
+{code}
+
+Karaf wrap deployer looks for jar files in the deploy folder. The jar files is considered as non-OSGi if the MANIFEST
+doesn't contain the Bundle-SymbolicName and Bundle-Version attributes, or if there is no MANIFEST at all.
+
+The non-OSGi jar file is transformed into an OSGi bundle.
+
+The deployer tries to populate the Bundle-SymbolicName and Bundle-Version extracted from the jar file path.
+
+For example, if you simply copy commons-lang-2.3.jar (which is not an OSGi bundle) into the deploy folder, you
+will see:
+
+{code}
+karaf@root> la|grep -i commons-lang
+[  41] [Active     ] [            ] [   60] commons-lang (2.3)
+{code}
+
+If you take a look on the commons-lang headers, you can see that the bundle exports all packages with optional resolution
+and that Bundle-SymbolicName and Bundle-Version have been populated:
+
+{code}
+karaf@root> osgi:headers 41
+
+commons-lang (41)
+-----------------
+Specification-Title = Commons Lang
+Tool = Bnd-0.0.357
+Specification-Version = 2.3
+Specification-Vendor = Apache Software Foundation
+Implementation-Version = 2.3
+Generated-By-Ops4j-Pax-From = wrap:file:/home/onofreje/workspace/karaf/assembly/target/apache-karaf-2.99.99-SNAPSHOT/deploy/commons-lang-2.3.jar$Bundle-SymbolicName=commons-lang&Bundle-Version=2.3
+Implementation-Vendor-Id = org.apache
+Created-By = 1.6.0_21 (Sun Microsystems Inc.)
+Implementation-Title = Commons Lang
+Manifest-Version = 1.0
+Bnd-LastModified = 1297248243231
+X-Compile-Target-JDK = 1.1
+Originally-Created-By = 1.3.1_09-85 ("Apple Computer, Inc.")
+Ant-Version = Apache Ant 1.6.5
+Package = org.apache.commons.lang
+X-Compile-Source-JDK = 1.3
+Extension-Name = commons-lang
+Implementation-Vendor = Apache Software Foundation
+
+Bundle-Name = commons-lang
+Bundle-SymbolicName = commons-lang
+Bundle-Version = 2.3
+Bundle-ManifestVersion = 2
+
+Import-Package =
+        org.apache.commons.lang;resolution:=optional,
+        org.apache.commons.lang.builder;resolution:=optional,
+        org.apache.commons.lang.enum;resolution:=optional,
+        org.apache.commons.lang.enums;resolution:=optional,
+        org.apache.commons.lang.exception;resolution:=optional,
+        org.apache.commons.lang.math;resolution:=optional,
+        org.apache.commons.lang.mutable;resolution:=optional,
+        org.apache.commons.lang.text;resolution:=optional,
+        org.apache.commons.lang.time;resolution:=optional
+Export-Package =
+        org.apache.commons.lang;uses:="org.apache.commons.lang.builder,org.apache.commons.lang.math,org.apache.commons.lang.exception",
+        org.apache.commons.lang.builder;uses:="org.apache.commons.lang.math,org.apache.commons.lang",
+        org.apache.commons.lang.enum;uses:=org.apache.commons.lang,
+        org.apache.commons.lang.enums;uses:=org.apache.commons.lang,
+        org.apache.commons.lang.exception;uses:=org.apache.commons.lang,
+        org.apache.commons.lang.math;uses:=org.apache.commons.lang,
+        org.apache.commons.lang.mutable;uses:="org.apache.commons.lang,org.apache.commons.lang.math",
+        org.apache.commons.lang.text;uses:=org.apache.commons.lang,
+        org.apache.commons.lang.time;uses:=org.apache.commons.lang
+
+
+{code}
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/directory-structure.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/directory-structure.conf
new file mode 100644
index 0000000..3848832
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/directory-structure.conf
@@ -0,0 +1,21 @@
+h1. Directory structure
+
+The directory layout of a Karaf installation is as follows:
+* {{/bin}}: startup scripts
+* {{/etc}}: configuration files
+* {{/data}}: working directory 
+** {{/cache}}: OSGi framework bundle cache
+** {{/generated-bundles}}: temporary folder used by the deployer
+** {{/log}}: log files
+* {{/deploy}}: hot deploy directory
+* {{/instances}}: directory containing [child instances|child-instances]
+* {{/lib}}: contains the bootstrap libraries
+** {{/lib/ext}}: directory for JRE extensions
+** {{/lib/endorsed}}: directory for endorsed libraries
+* {{/system}}: OSGi bundles repository, laid out as a Maven 2 repository
+
+{tip}
+The {{data}} folder contains all the working and temporary files for Karaf.  If you want to restart from a clean state, you can wipe out this directory, which has the same effect as [using the clean option|start-stop#Starting Karaf from clean].
+{tip}
+
+	
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/failover.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/failover.conf
new file mode 100644
index 0000000..54d58be
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/failover.conf
@@ -0,0 +1,115 @@
+h1. Failover Deployments
+
+Karaf provides failover capability using either a simple lock file system or a JDBC locking mechanism. In both cases, a container-level lock system allows bundles to be preloaded into the slave Karaf instance in order to provide faster failover performance.
+
+h2. Simple lock file
+
+The simple lock file mechanism is intended for failover configurations where instances reside on the same host machine.
+
+To use this feature, edit the {{$KARAF_HOME/etc/system.properties}} file as follows on each system in the master/slave setup:
+
+{noformat}
+karaf.lock=true
+karaf.lock.class=org.apache.karaf.main.SimpleFileLock
+karaf.lock.dir=<PathToLockFileDirectory>
+karaf.lock.delay=10
+{noformat}
+
+*Note*: Ensure that the {{karaf.lock.dir}} property points to the same directory for both the master and slave instance, so that the slave can acquire the lock only when the master releases it.
+
+
+h2. JDBC locking
+
+The JDBC locking mechanism is intended for failover configurations where instances exist on separate machines. In this deployment, the master instance holds a lock on a Karaf locking table hosted on a database. If the master loses the lock, a waiting slave process gains access to the locking table and fully starts its container. 
+
+To use this feature, do the following on each system in the master/slave setup:
+
+* Update the classpath to include the JDBC driver
+* Update the {{$KARAF_HOME/bin/karaf}} script to have a unique JMX remote port set if instances reside on the same host
+* Update the {{$KARAF_HOME/etc/system.properties}} file as follows:
+
+{noformat}
+karaf.lock=true
+karaf.lock.class=org.apache.karaf.main.DefaultJDBCLock
+karaf.lock.level=50
+karaf.lock.delay=10
+karaf.lock.jdbc.url=jdbc:derby://dbserver:1527/sample
+karaf.lock.jdbc.driver=org.apache.derby.jdbc.ClientDriver
+karaf.lock.jdbc.user=user
+karaf.lock.jdbc.password=password
+karaf.lock.jdbc.table=KARAF_LOCK
+karaf.lock.jdbc.clustername=karaf
+karaf.lock.jdbc.timeout=30
+{noformat}
+
+*Note*:
+
+* This process will fail if a JDBC driver is not on the classpath.
+* The "sample" database referred to above will be created if it does not exist.
+* The first Karaf instance to acquire the locking table is the master instance.
+* If the connection to the database is lost, the master instance tries to gracefully shutdown, allowing a slave instance to become master when the database service is restored. The former master will require a manual restart.
+
+h3. JDBC locking on Oracle
+
+If you are using Oracle as your database for JDBC locking, the {{karaf.lock.class}} property in the {{$KARAF_HOME/etc/system.properties}} file must point to {{org.apache.karaf.main.OracleJDBCLock}}.
+
+Otherwise, configure the system.properties file as normal for your setup, for example:
+
+{noformat}
+karaf.lock=true
+karaf.lock.class=org.apache.karaf.main.OracleJDBCLock
+karaf.lock.jdbc.url=jdbc:oracle:thin:@hostname:1521:XE
+karaf.lock.jdbc.driver=oracle.jdbc.OracleDriver
+karaf.lock.jdbc.user=user
+karaf.lock.jdbc.password=password
+karaf.lock.jdbc.table=KARAF_LOCK
+karaf.lock.jdbc.clustername=karaf
+karaf.lock.jdbc.timeout=30
+{noformat}
+
+As with the default JDBC locking setup, the Oracle JDBC driver JAR file must be in your classpath. You can ensure this by copying the {{ojdbc14.jar}} into Karaf's {{lib}} folder before starting Karaf.
+
+*Note*: The {{karaf.lock.jdbc.url}} requires an active SID, which means you must manually create a database instance before using this particular lock.
+
+h3. Derby
+
+{warning}
+TODO
+{warning}
+
+h3. MySQL
+
+{warning}
+TODO
+{warning}
+
+
+{anchor:locklevel}
+
+h2. Container-level locking
+
+Container-level locking allows bundles to be preloaded into the slave kernel instance in order to provide faster failover performance. Container-level locking is supported in both the simple file and JDBC locking mechanisms.
+
+To implement container-level locking, add the following to the {{$KARAF_HOME/etc/system.properties}} file on each system in the master/slave setup:
+
+{noformat}
+karaf.lock=true
+karaf.lock.level=50
+karaf.lock.delay=10
+{noformat}
+
+The {{karaf.lock.level}} property tells the Karaf instance how far into the boot process to bring the OSGi container. All bundles with an ID equal or lower to this start level will be started in that Karaf instance.
+
+Bundle start levels are specified in {{$KARAF_HOME/etc/startup.properties}}, in the format {{jar.name=level}}. The core system bundles have levels below 50, where user bundles have levels greater than 50.
+
+|| Level || Behavior ||
+| 1 | A 'cold' standby instance. Core bundles are not loaded into container. Slaves will wait until lock acquired to start server. |
+| <50 | A 'hot' standby instance. Core bundles are loaded into the container. Slaves will wait until lock acquired to start user level bundles. The console will be accessible for each slave instance at this level. |
+| >50 | This setting is not recommended as user bundles will end up being started. |
+
+*Note*: When using a 'hot' spare on the same host you need to set the JMX remote port to a unique value to avoid bind conflicts. You can edit the Karaf start script to include the following:
+
+{noformat}
+DEFAULT_JAVA_OPTS="-server $DEFAULT_JAVA_OPTS -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.authenticate=false"
+{noformat}
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/http.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/http.conf
new file mode 100644
index 0000000..750de9c
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/http.conf
@@ -0,0 +1,55 @@
+h1. Pax Web (OSGi HttpService)
+
+The Karaf http feature enables the Pax Web implementation of the OSGi HTTP service.
+
+h2. Installing the HTTP feature
+
+{code}
+root@karaf> features:install http
+{code}
+
+Create a file {{etc/org.ops4j.pax.web.cfg}} with the following content:
+
+{code}
+org.osgi.service.http.port=8080
+{code}
+
+This tells Pax Web to listen to the port 8080. As soon as the http feature is installed and the config
+file is present, the following URL will be reachable:
+
+{code}
+http://localhost:8080/
+{code}
+
+h2. Registering a servlet with the HttpService manually
+
+See [Apache Felix HTTP Service|http://felix.apache.org/site/apache-felix-http-service.html].
+
+h2. Using the Pax Web whiteboard extender
+
+The Pax Web whiteboard extender is part of the war feature. So use the following command to install:
+
+{code}
+root@karaf> features:install war
+{code}
+
+The [Pax Web whiteboard|http://wiki.ops4j.org/display/ops4j/Pax+Web+Extender+-+Whiteboard] extender listens to services
+of interface type HttpServlet and Filter.
+It will register each of these interfaces with the HttpService and remove them as soon as the service goes down.
+So it is much more convenient than registering with the HttpService directly.
+
+{code}
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+    <service interface="javax.servlet.http.HttpServlet">
+        <service-properties>
+            <entry key="alias" value="/myservlet"/>
+        </service-properties>
+        <bean id="myServlet" class="com.example.MyServlet"/>
+    </service>
+</blueprint>
+{code}
+
+The above snippet publishes the Servlet MyServlet on http://localhost:8080/myServlet.
+
+Please keep in mind that the Whiteboard pattern for Servlets is not standardized and only works with Pax Web.
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/index.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/index.conf
new file mode 100644
index 0000000..7af76ab
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/index.conf
@@ -0,0 +1,24 @@
+h1. Karaf Users Guide
+
+* [Installing Karaf|/users-guide/installation]
+* [Directory Structure|/users-guide/directory-structure]
+* [Starting and stopping Karaf|/users-guide/start-stop]
+* [Using the console|/users-guide/using-console]
+* [Colorized Console|/users-guide/colorized-console]
+* [Service Wrapper|/users-guide/wrapper]
+* [Web console|/users-guide/web-console]
+* [Remote console|/users-guide/remote-console]
+* [Child instances|/users-guide/child-instances]
+* [Security|/users-guide/security]
+* [Failover Deployments|/users-guide/failover]
+* [Logging system|/users-guide/logging-system]
+* [Deployer|/users-guide/deployer]
+* [Provisioning|/users-guide/provisioning]
+* [Provisioning Schema|/users-guide/provisioning-schema]
+* [Karaf Archive|/users-guide/kar]
+* [Configuration|/users-guide/configuration]
+* [Pax Web (OSGi HttpService)|/users-guide/http]
+* [Web applications|/users-guide/web-applications]
+* [OS integration|/users-guide/wrapper]
+* [JRE packages tuning|/users-guide/jre-tuning]
+* [Monitoring and Administration using JMX|/users-guide/jmx]
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/installation.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/installation.conf
new file mode 100644
index 0000000..8ef50f0
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/installation.conf
@@ -0,0 +1,118 @@
+h1. Installation
+
+This chapter describes how to install Apache Karaf for both Unix and Windows platforms, including
+prerequisite software and necessary download links.
+
+h2. Pre-Installation Requirements
+
+*Hardware:*
+* 20 MB of free disk space for the Apache Karaf x.y binary distribution.
+
+*Operating Systems:*
+* Windows: Windows Vista, Windows XP SP2, Windows 2000.
+* Unix: Ubuntu Linux, Powerdog Linux, MacOS, AIX, HP-UX, Solaris, any Unix platform that supports Java.
+
+*Environment:*
+* Java SE Development Kit 1.5.x or greater ([http://www.oracle.com/technetwork/java/javase/]).
+* The JAVA_HOME environment variable must be set to the directory where the Java runtime is installed, e.g., {{c:\Program Files\jdk.1.5.0_06}}. To accomplish that, press Windows key and Break key together, switch to "Advanced" tab and click on "Environment Variables". Here, check for the variable and, if necessary, add it.
+
+h2. Building from Sources
+
+If you intend to build Karaf from the sources, the requirements are a bit different:
+
+*Hardware:*
+* 200 MB of free disk space for the Apache Karaf x.y source distributions or SVN checkout, the Maven build and the dependencies Maven downloads.
+
+*Environment:*
+* Java SE Developement Kit 1.5.x or greater ([http://www.oracle.com/technetwork/java/javase/]).
+* Apache Maven 2.2.1 ([http://maven.apache.org/download.html]).
+
+h3. Building on Windows
+
+This procedure explains how to download and install the source distribution on a Windows system. *NOTE:* Karaf requires Java 5 is compile, build and run.
+# From a browser, navigate to [http://karaf.apache.org/index/community/download.html].
+# Scroll down to the "Apache Karaf" section and select the desired distribution.
+For a source distribution, the filename will be similar to: {{apache-karaf-x.y-src.zip}}.
+# Extract Karaf from the ZIP file into a directory of your choice. Please remember the restrictions concerning illegal characters in Java paths, e.g. \!, % etc.
+# {anchor:Windows Source Installation} Build Karaf using Maven 2.2.1 or greater and Java 5.
+The recommended method of building Karaf is the following:
+{code}
+cd [karaf_install_dir]\src
+{code}
+ where {{\[karaf_install_dir\]}} is the directory in which Karaf was installed.
+{code}
+mvn
+{code}
+Both steps take around 10 to 15 minutes.
+# Unzip the distribution using your favorite zip tool. The windows distribution is available at
+{code}
+[karaf_install_dir]\assembly\target\apache-karaf-x.y.zip
+{code}
+# Proceed to the [Starting Karaf|start-stop#Starting Karaf] chapter.
+
+h3. Building on Unix
+
+This procedure explains how to download and install the source distribution on a Unix system. This procedure assumes the Unix machine has a browser. Please see the previous [#Unix Binary Installation] section for ideas on how to install Karaf without a browser. *NOTE:* Karaf requires Java 5 to compile, build and run.
+# From a browser, navigate to [http://karaf.apache.org/download.html].
+# Scroll down to the "Apache Karaf" section and select the desired distribution.
+For a source distribution, the filename will be similar to: {{apache-karaf-x.y-src.tar.gz}}.
+# Extract the files from the ZIP file into a directory of your choice. For example:
+{code}
+gunzip apache-karaf-x.y-src.tar.gz
+tar xvf apache-karaf-x.y-src.tar
+{code}
+Please remember the restrictions concerning illegal characters in Java paths, e.g. \!, % etc.
+# Build Karaf using Maven:
+The preferred method of building Karaf is the following:
+{code}
+cd [karaf_install_dir]/src
+{code}
+ where \[karaf_install_dir\] is the directory in which Karaf was installed.
+{code}
+mvn
+{code}
+# Uncompress the distribution that has just been created
+{code}
+cd [karaf_install_dir]/assembly/target
+gunzip apache-karaf-x.y.tar.gz
+tar xvf apache-karaf-x.y.tar
+{code}
+# Proceed to the [Starting Karaf|start-stop#Starting Karaf] chapter.
+
+h2. Installation Procedure for Windows
+
+This procedure explains how to download and install the binary distribution on a Windows system.
+# From a browser, navigate to [http://karaf.apache.org/index/community/download.html].
+# Scroll down to the "Apache Karaf" section and select the desired distribution.
+For a binary distribution, the filename will be similar to: {{apache-karaf-x.y.zip}}.
+# Extract the files from the ZIP file into a directory of your choice. Please remember the restrictions concerning illegal characters in Java paths, e.g. \!, % etc.
+# Proceed to the [Starting Karaf|start-stop#Starting Karaf] chapter.
+# Optional: see [enabling Colorized Console Output On Windows|colorized-console]
+
+{tip:title=Handy Hint}
+In case you have to install Karaf into a very deep path or a path containing illegal characters for Java paths, e.g. \!, % etc., you may add a bat file to _start \-> startup_ that executes
+{noformat}
+subst S: "C:\your very % problematic path!\KARAF"
+{noformat}
+so your Karaf root directory is S: --- which works for sure and is short to type.
+{tip}
+
+h2. Installation Procedure For Unix
+
+This procedure explains how to download and install the binary distribution on a Unix system.
+# From a browser, navigate to [http://karaf.apache.org/download.html].
+# Scroll down to the "Apache Karaf" section and select the desired distribution.
+For a binary Unix distribution, the filename will be similar to: apache-karaf-x.y.tar.gz.
+# Extract the files from the gzip file into a directory of your choice. For example:
+{code}
+gunzip apache-karaf-x.y.tar.gz
+tar xvf apache-karaf-x.y.tar
+{code}
+Please remember the restrictions concerning illegal characters in Java paths, e.g. \!, % etc.
+# Proceed to the [Starting Karaf|start-stop#Starting Karaf] chapter.
+
+h2. Post-Installation steps
+
+Thought it is not always required, it is strongly advised to set up the {{JAVA_HOME}} environment property to point to the JDK you want Karaf to use before starting it.
+This property is used to locate the {{java}} executable and should be configured to point to the home directory of the Java SE 5 or 6 installation.
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/jmx.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/jmx.conf
new file mode 100644
index 0000000..0a0932a
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/jmx.conf
@@ -0,0 +1,23 @@
+
+
+h1. Monitoring and Administration using JMX
+
+Apache Karaf provides a large set of MBeans that allow you to fully monitore and administrate Karaf using any JMX client
+(like jconsole for instance).
+
+You can find more or less the same actions that you can do using the shell commands on the JMX layer.
+
+Apache Karaf provides the following MBeans:
+
+* org.apache.karaf:type=admin to administrate the child instances
+* org.apache.karaf:type=bundles to manipulate the OSGi bundles
+* org.apache.karaf:type=config to manipulate the Karaf configuration files (in the etc folder) and the ConfigAdmin layer
+* org.apache.karaf:type=dev to get information and manipulate the OSGi framework
+* org.apache.karaf:type=diagnostic to create information file (dump) about Karaf activity
+* org.apache.karaf:type=features to manipulate the Karaf features
+* org.apache.karaf:type=log to manipulate to logging layer
+* org.apache.karaf:type=packages to manipulate to PackageAdmin layer and get information about exported and imported packages
+* org.apache.karaf:type=services to get information about the OSGi services
+* org.apache.karaf:type=system to shutdown the Karaf container itself
+* org.apache.karaf:type=web to get information about the Web bundles (installed with the war feature)
+* org.apache.karaf:type=obr to manipulate the OBR layer (installed with the obr feature)
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/jre-tuning.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/jre-tuning.conf
new file mode 100644
index 0000000..f6a592d
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/jre-tuning.conf
@@ -0,0 +1,333 @@
+
+
+h1. JRE and system packages tuning
+
+Some packages are part of the JRE, but could be provided by tier libraries.
+
+Some examples of package in this case are:
+* {{javax.xml.stream}} package is provided by the JRE, but also by Apache Geronimo Spec bundles (and the implementation of provided by Woodstox).
+* {{com.sun.org.apache.xerces.internal.dom}} package is provided by the JRE, but also by Apache Xerces.
+* {{javax.activation}} package is provided by the JRE, but also by Apache Geronimo Spec bundles.
+* {{javax.annotation}} package is provided by the JRE, but also by Apache Geronimo Spec bundles.
+* etc ...
+
+We should define in the Karaf instance which packages should be provided by the JRE or by tier bundles.
+
+Moreover, we should manage the exported packages of JRE depending of the JRE version: the JRE 1.6 provides more packages
+than the 1.5 one.
+
+To customize this in Karaf, you can tune the {{etc/jre.properties}} file.
+
+In the {{etc/jre.properties}} file, you have two properties {{jre-1.5}} and {{jre-1.6}}.
+
+They allow you to define the packages exported by the JRE (in function of the runtime version).
+Each property provide the exhaustive list of packages provided by the JRE (and so part of the sytem packages).
+
+For instance, a "standard" Karaf distribution provides the following {{etc/jre.properties}}:
+
+{code}
+#
+# Java platform package export properties.
+#
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.5= \
+ javax.accessibility, \
+ javax.activity, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute
+jre-1.6= \
+ javax.accessibility, \
+ javax.activation, \
+ javax.activity, \
+ javax.annotation, \
+ javax.annotation.processing, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.jws, \
+ javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.bind, \
+ javax.xml.bind.annotation, \
+ javax.xml.bind.annotation.adapters, \
+ javax.xml.bind.attachment, \
+ javax.xml.bind.helpers, \
+ javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.soap, \
+ javax.xml.stream, \
+ javax.xml.stream.events, \
+ javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.ws, \
+ javax.xml.ws.handler, \
+ javax.xml.ws.handler.soap, \
+ javax.xml.ws.http, \
+ javax.xml.ws.soap, \
+ javax.xml.ws.spi, \
+ javax.xml.ws.wsaddressing, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+{code}
+
+For instance, if we deploy the Apache Geronimo Specs bundle providing the {{javax.xml.stream}} package, we have to comment
+the {{javax.xml.stream}} package in the the jre-1.6 definition. Indeed, jre-1.5 doesn't provide {{javax.xml.stream}}, it's
+new in the JRE 1.6:
+
+{code}
+jre-1.6= \
+[...]
+# javax.xml.stream, \
+# javax.xml.stream.events, \
+# javax.xml.stream.util, \
+[...]
+{code}
\ No newline at end of file
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/kar.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/kar.conf
new file mode 100644
index 0000000..38468c5
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/kar.conf
@@ -0,0 +1,112 @@
+
+
+h1. Karaf Archives (KAR)
+
+Karaf provides a specific archive format named the KAR (Karaf ARchive).
+
+Basically, the kar format is a jar (so a zip file) which contains a set of feature descriptor and bundle jar files.
+
+For instance, a kar looks like:
+* my-features-1.xml
+* bundle1.jar
+* bundle2.jar
+* bundle3.jar
+
+all packaged in zip format.
+
+h2. Create a kar archive
+
+You can create a kar file by hand, just by zip compressing a directory representing the kar content.
+
+You can also use the Karaf features maven plugin. The features maven plugin provides an create-kar goal.
+
+The kar-archive goal:
+1. Reads all features specified in the features descriptor.
+2. For each feature, it resolves the bundles defined in the feature.
+3. All bundles are packaged into the kar archive.
+
+For instance, you can use the following POM to create a kar:
+
+{code}
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+    <groupId>my.groupId</groupId>
+    <artifactId>my-kar</artifactId>
+    <version>1.0</version>
+    <packaging>pom</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>features-maven-plugin</artifactId>
+                <version>2.2.4</version>
+                <executions>
+                    <execution>
+                        <id>create-kar</id>
+                        <goals>
+                            <goal>create-kar</goal>
+                        </goals>
+                        <configuration>
+                            <featuresFile>src/main/resources/features.xml</featuresFile>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
+{code}
+
+For the example, the features descriptor is very simple:
+
+{code}
+<?xml version="1.0" encoding="UTF-8"?>
+<features>
+
+   <feature name="my" version="1.0">
+      <bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
+   </feature>
+
+</features>
+{code}
+
+To create the kar archive, simply type:
+
+{code}
+mvn install
+{code}
+
+and you will have your kar in the {{target}} directory.
+
+h2. Deploy a kar archive
+
+Karaf provides a KAR deployer:
+
+{code}
+karaf@root> la|grep -i archive
+[  12] [Active     ] [Created     ] [   30] Apache Karaf :: Deployer :: Karaf Archive (.kar) (2.2.4)
+{code}
+
+It's a core deployer (you don't need to install additional features).
+
+To deploy a kar, simply drop the kar into the deploy directory. The KAR Deployer will deploy all the kar content starting
+from the features descriptor.
+
+The KAR Deployer creates a repository dedicated to your kar (in the ${KARAF_HOME}/local-repo) and register the features
+descriptor. You can now see your feature available for installation:
+
+{code}
+karaf@root> features:list|grep -i my
+[uninstalled] [1.0             ] my                            repo-0
+{code}
+
+Now you can use any commands available on features:
+
+{code}
+karaf@root> features:install my
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/logging-system.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/logging-system.conf
new file mode 100644
index 0000000..df89931
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/logging-system.conf
@@ -0,0 +1,177 @@
+h1. Logging system
+
+Karaf provides a powerful logging system based on [OPS4j Pax Logging|http://team.ops4j.org/wiki/display/paxlogging/Pax+Logging]. 
+
+In addition to being a standard OSGi Log service, it supports the following APIs:
+* Apache Commons Logging
+* SLF4J
+* Apache Log4j
+* Java Util Logging
+
+Karaf also comes with a set of console commands that can be used to display, view and change the log levels.
+
+h2. Configuration
+
+h3. Configuration file
+
+The configuration of the logging system uses a [standard Log4j configuration file|http://logging.apache.org/log4j/1.2/manual.html] at the following location:
+{code}
+[karaf_install_dir]/etc/org.ops4j.pax.logging.cfg
+{code}
+You can edit this file at runtime and any change will be reloaded and be effective immediately.
+
+h3. Configuring the appenders
+
+The default logging configuration defines three appenders:
+* the {{stdout}} console appender is disabled by default.  If you plan to run Karaf in server mode only (i.e. with the locale console disabled), you can turn on this appender on by adding it to the list of configured appenders using the {{log4j.rootLogger}} property
+* the {{out}} appender is the one enabled by default. It logs events to a number of rotating log files of a fixed size.  You can easily change the parameters to control the number of files using {{maxBackupIndex}} and their size size {{maxFileSize}}
+* the {{sift}} appender can be used instead to provide a per-bundle log file.  The default configuration uses the bundle symbolic name as the file name to log to
+
+h3. Changing the log levels
+
+The default logging configuration sets the logging levels so that the log file will provide enough information to monitor the behavior of the runtime and provide clues about what caused a problem. However, the default configuration will not provide enough information to debug most problems.
+
+The most useful logger to change when trying to debug an issue with Karaf is the root logger. You will want to set its logging level to {{DEBUG}} in the {{org.ops4j.pax.logging.cfg}} file.
+{pygmentize:text}
+log4j.rootLogger=DEBUG, out, osgi:VmLogAppender
+...
+{pygmentize}
+
+When debugging a problem in Karaf you may want to change the level of logging information that is displayed on the console. The example below shows how to set the root logger to {{DEBUG}} but limiting the information displayed on the console to WARN.
+{pygmentize:text}
+log4j.rootLogger=DEBUG, out, stdout, osgi:VmLogAppender
+log4j.appender.stdout.threshold=WARN
+...
+{pygmentize}
+
+h2. Console Log Commands
+
+The log subshell comes with the following commands:
+* [{{log:clear}}|/commands/log-clear]: clear the log
+* [{{log:display}}|/commands/log-display]: display the last log entries
+* [{{log:display-exception}}|/commands/log-display-exception]: display the last exception from the log
+* [{{log:get}}|/commands/log-get]: show the log levels
+* [{{log:set}}|/commands/log-set]: set the log levels
+* [{{log:tail}}|/commands/log-tail]: continuous display of the log entries
+
+For example, if you want to debug something, you might want to run the following commands:
+{code}
+> log:set DEBUG
+... do something ...
+> log:display
+{code}
+
+Note that the log levels set using the {{log:set}} commands are not persistent and will be lost upon restart.
+To configure those in a persistent way, you should edit the configuration file mentioned above using the config commands or directly using a text editor of your choice.
+
+The log commands has a separate configure file:
+{code}
+[karaf_install_dir]/etc/org.apache.karaf.log.cfg
+{code}
+
+h2. Advanced configuration
+
+The logging backend uses Log4j, but offer a number of additional features.
+
+h3. Nested filters, appenders and error handlers
+
+h4. Filters
+
+Appender filters can be added using the following syntax:
+{pygmentize:text}
+log4j.appender.[appender-name].filter.[filter-name]=[filter-class]
+log4j.appender.[appender-name].filter.[filter-name].[option]=[value]
+{pygmentize}
+
+Below is a real example:
+{pygmentize:text}
+log4j.appender.out.filter.f1=org.apache.log4j.varia.LevelRangeFilter
+log4j.appender.out.filter.f1.LevelMax=FATAL
+log4j.appender.out.filter.f1.LevelMin=DEBUG
+{pygmentize}
+
+h4. Nested appenders
+
+Nested appenders can be added using the following syntax:
+{pygmentize:text}
+log4j.appender.[appender-name].appenders=[comma-separated-list-of-appender-names]
+{pygmentize}
+
+Below is a real example:
+{pygmentize:text}
+log4j.appender.async=org.apache.log4j.AsyncAppender
+log4j.appender.async.appenders=jms
+
+log4j.appender.jms=org.apache.log4j.net.JMSAppender
+...
+{pygmentize}
+
+h4. Error handlers
+
+Error handlers can be added using the following syntax:
+{pygmentize:text}
+log4j.appender.[appender-name].errorhandler=[error-handler-class]
+log4j.appender.[appender-name].errorhandler.root-ref=[true|false]
+log4j.appender.[appender-name].errorhandler.logger-ref=[logger-ref]
+log4j.appender.[appender-name].errorhandler.appender-ref=[appender-ref]
+{pygmentize}
+
+h3. OSGi specific MDC attributes
+
+Pax-Logging provides the following attributes by default:
+* {{bundle.id}}: the id of the bundle from which the class is loaded
+* {{bundle.name}}: the symbolic-name of the bundle
+* {{bundle.version}}: the version of the bundle
+
+An MDC sifting appender is available to split the log events based on MDC attributes.  Below is a configuration example for this appender:
+{pygmentize:text}
+log4j.appender.sift=org.apache.log4j.sift.MDCSiftingAppender
+log4j.appender.sift.key=bundle.name
+log4j.appender.sift.default=karaf
+log4j.appender.sift.appender=org.apache.log4j.FileAppender
+log4j.appender.sift.appender.layout=org.apache.log4j.PatternLayout
+log4j.appender.sift.appender.layout.ConversionPattern=%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n
+log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
+log4j.appender.sift.appender.append=true
+{pygmentize}
+
+h3. Enhanced OSGi stack trace renderer
+
+This renderer is configured by default in Karaf and will give additional informations when printing stack traces.
+For each line of the stack trace, it will display OSGi specific informations related to the class on that line: the bundle id, the bundle symbolic name and the bundle version.  This information can greatly help diagnosing problems in some cases.
+The information is appended at the end of each line in the following format {{[id:name:version]}} as shown below
+{pygmentize:text}
+java.lang.IllegalArgumentException: Command not found:  *:foo
+	at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:225)[21:org.apache.karaf.shell.console:2.1.0]
+	at org.apache.felix.gogo.runtime.shell.Closure.executeStatement(Closure.java:162)[21:org.apache.karaf.shell.console:2.1.0]
+	at org.apache.felix.gogo.runtime.shell.Pipe.run(Pipe.java:101)[21:org.apache.karaf.shell.console:2.1.0]
+	at org.apache.felix.gogo.runtime.shell.Closure.execute(Closure.java:79)[21:org.apache.karaf.shell.console:2.1.0]
+	at org.apache.felix.gogo.runtime.shell.CommandSessionImpl.execute(CommandSessionImpl.java:71)[21:org.apache.karaf.shell.console:2.1.0]
+	at org.apache.karaf.shell.console.jline.Console.run(Console.java:169)[21:org.apache.karaf.shell.console:2.1.0]
+	at java.lang.Thread.run(Thread.java:637)[:1.6.0_20]
+{pygmentize}
+
+h3. Using your own appenders
+
+If you plan to use your own appenders, you need to create an OSGi bundle and attach it as a fragment to the bundle with a symbolic name of 
+{{org.ops4j.pax.logging.pax-logging-service}}.  This way, the underlying logging system will be able to see and use your appenders.
+
+So for example you write a log4j appender:
+class MyAppender extends AppenderSkeleton {
+...
+}
+
+Then you need to package the appender in a jar with a Manifest like this:
+
+Manifest:
+Bundle-SymbolicName: org.mydomain.myappender       
+Fragment-Host: org.ops4j.pax.logging.pax-logging-service
+...
+
+Copy the new appender fragment into the ${karaf.home}/system directory. Karaf uses a virtual maven repository to access resources in the system
+directory, so the jar path should use the standard maven groupId/artifactId/version/ convention, where the groupId is a directory structure.
+
+Edit ${karaf.home}/etc/startup.properties and add the new fragment bundle to the list before the pax-logging-service bundle.
+
+Restart karaf with a clean run to reload the system bundles, and now you can use the appender in your log4j config file like shown in the config
+examples above.
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/provisioning-schema.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/provisioning-schema.conf
new file mode 100644
index 0000000..17610d7
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/provisioning-schema.conf
@@ -0,0 +1,9 @@
+
+
+h1. XML Schema for provisioning
+
+The following schema can be found in Karaf sources. It is also available publicly at url http://karaf.apache.org/xmlns/features/v1.0.0.
+
+{snippet:url=../features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd|lang=xml|pygmentize=true}
+{snippet}
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/provisioning.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/provisioning.conf
new file mode 100644
index 0000000..a08d249
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/provisioning.conf
@@ -0,0 +1,296 @@
+
+
+h1. Provisioning
+
+Karaf provides a simple, yet flexible, way to provision applications or "features".  Such a mechanism is mainly provided by a set of commands available in the {{features}} shell.  The provisioning system uses xml "repositories" that define a set of features.
+
+h2. Repositories
+
+The complete xml schema for feature descriptor are available on [Features XML Schema|provisioning-schema] page. We recommend using this XML schema. It will allow Karaf to validate your repository before parsing. You may also verify your descriptor before adding it to Karaf by simply validation, even from IDE level.
+
+
+Here is an example of such a repository:
+{code:lang=xml}
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
+    <feature name="spring" version="3.0.4.RELEASE">
+        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/1.0_1</bundle>
+        <bundle>mvn:org.springframework/spring-core/3.0.4.RELEASE</bundle>
+        <bundle>mvn:org.springframework/spring-beans/3.0.4.RELEASE</bundle>
+        <bundle>mvn:org.springframework/spring-aop/3.0.4.RELEASE</bundle>
+        <bundle>mvn:org.springframework/spring-context/3.0.4.RELEASE</bundle>
+        <bundle>mvn:org.springframework/spring-context-support/3.0.4.RELEASE</bundle>
+    </feature>
+</features>
+{code}
+
+A repository includes a list of {{feature}} elements, each one representing an application that can be installed.  The feature is identified by its {{name}} which must be unique amongst all the repositories used and consists of a set of bundles that need to be installed along with some optional dependencies on other features and some optional configurations for the Configuration Admin OSGi service.
+
+References to features define in other repositories are allow and can be achieved by adding a list of repository.
+
+{code:xml}
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
+  <repository>mvn:org.apache.servicemix.nmr/apache-servicemix-nmr/1.3.0/xml/features</repository>
+  <repository>mvn:org.apache.camel.karaf/apache-camel/2.5.0/xml/features</repository>
+  <repository>mvn:org.apache.karaf/apache-karaf/2.1.2/xml/features</repository>
+  ...
+{code}
+
+{warning}
+Be careful when you define them as there is a risk of 'cycling' dependencies.
+{warning}
+
+Remark: By default, all the features defined in a repository are not installed at the launch of Apache Karaf (see section hereafter 'h2. Service configuration' for more info).
+
+h3. Bundles
+
+The main information provided by a feature is the set of OSGi bundles that defines the application.  Such bundles are URLs pointing to the actual bundle jars.  For example, one would write the following definition:
+{code:lang=xml}
+<bundle>http://repo1.maven.org/maven2/org/apache/servicemix/nmr/org.apache.servicemix.nmr.api/1.0.0-m2/org.apache.servicemix.nmr.api-1.0.0-m2.jar</bundle>
+{code}
+Doing this will make sure the above bundle is installed while installing the feature.
+
+However, Karaf provides several URL handlers, in addition to the usual ones (file, http, etc...). One of these is the Maven URL handler, which allow reusing Maven repositories to point to the bundles.
+
+h4. Maven URL Handler
+
+The equivalent of the above bundle would be:
+{code}
+<bundle>mvn:org.apache.servicemix.nmr/org.apache.servicemix.nmr.api/1.0.0-m2</bundle>
+{code}
+In addition to being less verbose, the Maven url handlers can also resolve snapshots and can use a local copy of the jar if one is available in your Maven local repository.
+
+The {{org.ops4j.pax.url.mvn}} bundle resolves {{mvn}} URLs. This flexible tool can be configured through the configuration service. For example, to find the current repositories type:
+
+{code}
+karaf@root:/> config:list
+...
+----------------------------------------------------------------
+Pid:            org.ops4j.pax.url.mvn
+BundleLocation: mvn:org.ops4j.pax.url/pax-url-mvn/0.3.3
+Properties:
+   service.pid = org.ops4j.pax.url.mvn
+   org.ops4j.pax.url.mvn.defaultRepositories = file:/opt/development/karaf/assembly/target/apache-felix-karaf-1.2.0-SNAPSHOT/system@snapshots
+   org.ops4j.pax.url.mvn.repositories = http://repo1.maven.org/maven2, 
+                                         http://svn.apache.org/repos/asf/servicemix/m2-repo 
+   below = list of repositories and even before the local repository
+{code}
+
+The repositories checked are controlled by these configuration properties. 
+
+For example, {{org.ops4j.pax.url.mvn.repositories}} is a comma separate list of repository URLs specifying those remote repositories to be checked. So, to replace the defaults with a new repository at {{http://www.example.org/repo}} on the local machine:
+
+{code}
+karaf@root:/> config:edit org.ops4j.pax.url.mvn
+karaf@root:/> config:proplist                  
+   service.pid = org.ops4j.pax.url.mvn
+   org.ops4j.pax.url.mvn.defaultRepositories = file:/opt/development/karaf/assembly/target/apache-felix-karaf-1.2.0-SNAPSHOT/system@snapshots
+   org.ops4j.pax.url.mvn.repositories = http://repo1.maven.org/maven2,
+                                        http://svn.apache.org/repos/asf/servicemix/m2-repo
+   below = list of repositories and even before the local repository
+karaf@root:/> config:propset org.ops4j.pax.url.mvn.repositories http://www.example.org/repo
+karaf@root:/> config:update
+{code}
+
+By default, snapshots are disabled. To enable an URL for snapshots append @snapshots. For example
+
+{code}
+http://www.example.org/repo@snapshots
+{code}
+
+Repositories on the local machine are supported through {{file:/}} URLs
+
+h4. Bundle start-level
+
+*Available since Karaf 2.0*
+
+By default, the bundles deployed through the feature mechanism will have a start-level equals to the value defined in the configuration file {{config.properties}}
+with the variable {{karaf.startlevel.bundle=80}}. This value can be changed using the xml attribute start-level. 
+
+{code:xml}
+  <feature name='my-project' version='1.0.0'>
+    <feature version='2.4.0'>camel-spring</feature>
+    <bundle start-level='80'>mvn:com.mycompany.myproject/myproject-dao</bundle>    
+    <bundle start-level='85'>mvn:com.mycompany.myproject/myproject-service</bundle>
+    <bundle start-level='85'>mvn:com.mycompany.myproject/myproject-camel-routing</bundle>
+  </feature> 
+{code}  
+
+The advantage in defining the bundle start-level is that you can deploy all your bundles including any required 'infrastructure' bundles (e.g Camel, ActiveMQ)
+at the same time and you will have the guarantee when using Spring Dynamic Modules or Blueprint that the Spring context will not be
+created without all the required services installed.
+
+h4. Bundle 'stop/start'
+
+The OSGI specification allows for installing a bundle without starting it. To use this functionality, simply add the following attribute in your <bundle> definition
+
+{code:xml}
+  <feature name='my-project' version='1.0.0'>
+    <feature version='2.4.0'>camel-spring</feature>
+    <bundle start-level='80' start='false'>mvn:com.mycompany.myproject/myproject-dao</bundle>    
+    <bundle start-level='85' start='false'>mvn:com.mycompany.myproject/myproject-service</bundle>
+    <bundle start-level='85' start='false'>mvn:com.mycompany.myproject/myproject-camel-routing</bundle>
+  </feature> 
+{code}
+
+h4. Bundle 'dependency'
+
+A bundle can be flagged as being a dependency.  Such information can be used by resolvers to compute the full list of bundles to be installed.
+
+h3. Dependent features
+
+Dependent features are useful when a given feature depends on another feature to be installed.  Such a dependency can be expressed easily in the feature definition:
+{code:lang=xml}
+<feature name="jbi">
+  <feature>nmr</feature>
+  ...
+</feature>
+{code}
+
+The effect of such a dependency is to automatically install the required {{nmr}} feature when the {{jbi}} feature is installed.
+
+A version range can be specified on the feature dependency:
+{code:lang=xml}
+<feature name="spring-dm">
+  <feature version="[2.5.6,4)">spring</feature>
+  ...
+</feature>
+{code}
+In such a case, if no matching feature is already installed, the feature with the highest version available in the range will be installed.  If a single version is specified, this version will be chosen.  If nothing is specified, the highest available will be installed.
+
+h3. Configurations
+
+The configuration section allows for declaring deployment configuration of the OSGi Configuration Admin service along a set of bundles.
+Here is an example of such a configuration:
+
+{code:lang=xml}
+<config name="com.foo.bar">
+  myProperty = myValue
+</config>
+{code}
+
+The {{name}} attribute of the {{configuration}} element will be used as the ManagedService PID for the configuration set in the Configuration Admin service.  When using a ManagedServiceFactory, the {{name}} attribute is _servicePid_-_aliasId_, where _servicePid_ is the PID of the ManagedServiceFactory and _aliasId_ is a label used to uniquely identify a particular service (an alias to the factory generated service PID).
+
+Deploying such a configuration has the same effect as dropping a file named {{com.foo.bar.cfg}} into the {{etc}} folder.
+
+The content of the {{configuration}} element is set of properties parsed using the [standard java property mechanism|http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html#load(java.io.InputStream)].
+
+Such configuration as usually used with Spring-DM or Blueprint support for the Configuration Admin service, as in the following example, but using plain OSGi APIs will of course work the same way:
+
+{code:lang=xml}
+<bean ...>
+    <property name="propertyName" value="${myProperty}" />
+</bean>
+
+<osgix:cm-properties id="cmProps" persistent-id="com.foo.bar">
+    <prop key="myProperty">myValue</prop>
+</osgix:cm-properties>
+<ctx:property-placeholder properties-ref="cmProps" />
+{code}
+
+There may also be cases where you want to make the properties from multiple configuration files available to your bundle context. This is something you may
+want to do if you have a multi-bundle application where there are application properties used by multiple bundles, and each bundle has its own specific
+properties. In that case, {{<ctx:property-placeholder>}} won't work as it was designed to make only one configuration file available to a bundle context.
+ To make more than one configuration file available to your bundle-context you would do something like this:
+
+{code:lang=xml}
+<beans:bean id="myBundleConfigurer"
+            class="org.springframework.beans.factory.config.PropertyPlaceholderConfig">
+    <beans:property name="ignoreUnresolvablePlaceholders" value="true"/>
+    <beans:property name="propertiesArray">
+        <osgix:cm-properties id="myAppProps" persistent-id="myApp.props"/>
+        <osgix:cm-properties id="myBundleProps" persistent-id="my.bundle.props"/>
+    </beans:property>
+</beans:bean>
+{code}
+
+In this example, we are using SpringDM with osgi as the primary namespace. Instead of using ctx:context-placeholder we are using the "PropertyPlaceholderConfig"
+class. Then we are passing in a beans array and inside of that array is where we set our osgix:cm-properties elements. This element "returns" a properties bean.
+
+For more information about using the Configuration Admin service in Spring-DM, see the [Spring-DM documentation|http://static.springframework.org/osgi/docs/1.2.0-m2/reference/html/compendium.html#compendium:cm:props].
+
+h3. Configuration files
+
+In certain cases it is needed not only to provide configurations for the configuration admin service but to add additional
+configuration files e.g. a configuration file for jetty (jetty.xml). It even might be helpful to deploy a configuration
+file instead of a configuration for the config admin service since. To achieve this the attribute {{finalname}} shows the
+final destination of the {{configfile}}, while the value references the Maven artifact to deploy.
+
+{code}
+<configfile finalname="/etc/jetty.xml">mvn:org.apache.karaf/apache-karaf/${project.version}/xml/jettyconfig</configfile>
+{code}
+
+
+h3. Feature resolver
+
+The resolver attribute on a feature can be set to force the use of a given resolver instead of the default resolution process.  A resolver will be use to obtain the list of bundles to actually install for a given feature.
+The default resolver will simply return the list of bundles provided in the feature description.
+The OBR resolver can be installed and used instead of the standard one.  In that case, the resolver will use the OBR service
+to determine the list of bundles to install (bundles flagged as dependency will only be used as possible candidates to solve
+various constraints).
+
+h2. Commands
+
+h3. Repository management
+
+The following commands can be used to manage the list of descriptors known by Karaf.  They use URLs pointing to features descriptors.  These URLs can use any protocol known to the Apache Karaf, the most common ones being http, file and mvn.
+
+{code}
+features:addUrl      Add a list of repository URLs to the features service
+features:removeUrl   Remove a list of repository URLs from the features service
+features:listUrl     Display the repository URLs currently associated with the features service.
+features:refreshUrl  Reload the repositories to obtain a fresh list of features
+{code}
+
+Karaf maintains a persistent list of these repositories so that if you add one URL and restart Karaf, the features will still be available.
+
+The {{refreshUrl}} command is mostly used when developing features descriptors: when changing the descriptor, it can be
+handy to reload it in the Kernel without having to restart it or to remove then add the URL again.
+
+h3. Features management
+
+{code}
+features:install
+features:uninstall
+features:list
+{code}
+
+h3. Examples
+
+1. Install features using mvn handler
+{code}
+features:addUrl mvn:org.apache.servicemix.nmr/apache-servicemix-nmr/1.0.0-m2/xml/features
+features:install nmr
+{code}
+
+2. Use file handler to deploy features file
+{code}
+features:addUrl file:base/features/features.xml
+{code}
+
+Note: The path is relative to the Apache Karaf installation directory
+
+3. Deploy bundles from file system without using Maven
+
+As we can use file:// as protocol handler to deploy bundles, you can use the following syntax to deploy bundles when they are 
+located in a directory which is not available using Maven
+
+{code:xml}
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
+   <feature name="spring-web" version="2.5.6.SEC01">
+      <bundle>file:base/bundles/spring-web-2.5.6.SEC01.jar</bundle>
+   </feature>
+</features>
+{code}
+
+Note: The path is relative to the Apache Karaf installation directory
+
+h2. Service configuration
+
+A simple configuration file located in {{\[FELIX:karaf\]/etc/org.apache.karaf.features.cfg}} can be modified to customize the behavior when starting the Kernel for the first time.
+This configuration file contains two properties:
+* {{featuresBoot}}: a comma separated list of features to install at startup
+* {{featuresRepositories}}: a comma separated list of feature repositories to load at startup
+
+This configuration file is of interest if you plan to distribute a customized Karaf distribution having pre-installed features.  Such a process is detailed in the [6.2. Building custom distributions] section.
+
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/remote-console.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/remote-console.conf
new file mode 100644
index 0000000..c4bc52f
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/remote-console.conf
@@ -0,0 +1,115 @@
+h1. Using remote instances
+
+h2. Configuring remote instances
+
+It does not always make sense to manage an instance of Karaf using its local console. You can manage Karaf remotely using a remote console.
+
+When you start Karaf, it enables a remote console that can be accessed over SSH from any other Karaf console or plain SSH client.  The remote console provides all the features of the local console and gives a remote user complete control over the container and services running inside of it.
+
+The SSH hostname and port number is configured in the {{\[karaf_install_dir\]/etc/org.apache.karaf.shell.cfg}} configuration file with the following default values:
+
+{code}
+sshPort=8101
+sshHost=0.0.0.0
+sshRealm=karaf
+hostKey=${karaf.base}/etc/host.key
+{code}
+
+You can change this configuration using the [config commands|configuration] or by editing the above file, but you'll need to restart the ssh console in order for it to use the new parameters.
+
+{code}
+# define helper functions
+bundle-by-sn = { bm = new java.util.HashMap ;  each (bundles) { $bm put ($it symbolicName) $it } ; $bm get $1 }
+bundle-id-by-sn = { b = (bundle-by-sn $1) ; if { $b } { $b bundleId } { -1 } }
+# edit config
+config:edit org.apache.karaf.shell
+config:propset sshPort 8102
+config:update 
+# force a restart
+osgi:restart --force (bundle-id-by-sn org.apache.karaf.shell.ssh)
+{code}
+
+h2. Connecting and disconnecting remotely
+
+h3. Using the {{ssh:ssh}} command
+
+You can connect to a remote Karaf's console using the [{{ssh:ssh}}|/commands/ssh-ssh] command.
+
+{code}
+karaf@root> ssh:ssh -l karaf -P karaf -p 8101 hostname
+{code}
+
+{warning}
+The default password is {{karaf}} but we recommend changing it. See the [security] section for more informations.
+{warning}
+
+To confirm that you have connected to the correct Karaf instance, type [{{shell:info}}|/commands/shell-info] at the {{karaf>}} prompt. Information about the currently connected instance is returned, as shown.
+
+{code}
+Karaf
+  Karaf home                  /local/apache-karaf-2.0.0
+  Karaf base                  /local/apache-karaf-2.0.0
+  OSGi Framework              org.eclipse.osgi - 3.5.1.R35x_v20090827
+JVM
+  Java Virtual Machine        Java HotSpot(TM) Server VM version 14.1-b02
+  ...
+{code}
+
+h3. Using the Karaf client
+
+The Karaf client allows you to securely connect to a remote Karaf instance without having to launch a Karaf instance locally.
+
+For example, to quickly connect to a Karaf instance running in server mode on the same machine, run the following command from the {{[karaf-install-dir]}} directory:
+{code}
+bin/client
+{code}
+
+More commonly, you would provide a hostname, port, username and password to connect to a remote instance.  And, if you were using the client within a larger script, you could append console commands as follows:
+{code}
+bin/client -a 8101 -h hostname -u karaf -p karaf features:install wrapper
+{code}
+
+To display the available options for the client, type:
+{code}
+> bin/client --help
+Apache Karaf client
+  -a [port]     specify the port to connect to
+  -h [host]     specify the host to connect to
+  -u [user]     specify the user name
+  -p [password] specify the password
+  --help        shows this help message
+  -v            raise verbosity
+  -r [attempts] retry connection establishment (up to attempts times)
+  -d [delay]    intra-retry delay (defaults to 2 seconds)
+  [commands]    commands to run
+If no commands are specified, the client will be put in an interactive mode
+{code}
+
+h3. Using a plain SSH client
+
+You can also connect using a plain SSH client from your *nix system or Windows SSH client like Putty.
+{code}
+~$ ssh -p 8101 karaf@localhost
+karaf@localhost's password: 
+{code}
+
+h3. Disconnecting from a remote console
+
+To disconnect from a remote console, press {{Ctrl+D}}, {{shell:logout}} or simply {{logout}} at the Karaf prompt.
+
+h2. Stopping a remote instance
+
+h3. Using the remote console 
+
+If you have connected to a remote console using the [{{ssh:ssh}}|/commands/ssh-ssh] command or the Karaf client, you can stop the remote instance using the [{{osgi:shutdown}}|/commands/osgi-shutdown] command.
+
+{info}
+Pressing {{Ctrl+D}} in a remote console simply closes the remote connection and returns you to the local shell.
+{info}
+
+h3. Using the Karaf client
+
+To stop a remote instance using the Karaf client, run the following from the {{[karaf-install-dir]/lib}} directory:
+{code}
+bin/client -u karaf -p karaf -a 8101 hostname osgi:shutdown
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/security.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/security.conf
new file mode 100644
index 0000000..1a53ed1
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/security.conf
@@ -0,0 +1,83 @@
+h1. Security
+
+h2. Managing users and passwords
+
+The default security configuration uses a property file located at {{[karaf-install-dir]/etc/users.properties}} to store authorized users and their passwords.
+
+The default user name is {{karaf}} and the associated password is {{karaf}} too.  We strongly encourage you to change the default password by editing the above file before moving Karaf into production.
+
+The users are currently used in three different places in Karaf:
+* access to the SSH console
+* access to the JMX management layer
+* access to the Web console
+Those three ways all delegate to the same JAAS based security authentication.
+
+The {{users.properties}} file contains one or more lines, each line defining a user, its password and the associated roles.
+
+{code}
+user=password[,role][,role]...
+{code}
+
+h2. Managing roles
+
+JAAS roles can be used by various components. The three management layers (SSH, JMX and WebConsole) all use a global role based authorization system. The default role name is configured in the {{etc/system.properties}} using the {{karaf.admin.role}} system property and the default value is {{admin}}. All users authenticating for the management layer must have this role defined.
+
+The syntax for this value is the following:
+{code}
+[classname:]principal
+{code}
+where classname is the class name of the principal object (defaults to org.apache.karaf.jaas.modules.RolePrincipal) and principal is the name of the principal of that class (defaults to admin).
+
+Note that roles can be changed for a given layer using ConfigAdmin in the following configurations:
+|| Layer || PID                        || Value  ||
+| SSH     | org.apache.karaf.shell      | sshRole |
+| JMX     | org.apache.karaf.management | jmxRole |
+| Web     | org.apache.karaf.webconsole | role    |
+
+h2. Enabling password encryption
+
+In order to not keep the passwords in plain text, the passwords can be stored encrypted in the configuration file.
+This can be easily enabled using the following commands:
+
+{code}
+# edit config
+config:edit org.apache.karaf.jaas
+config:propset encryption.enabled true
+config:update 
+# force a restart
+dev:restart
+{code}
+
+The passwords will be encrypted automatically in the {{etc/users.properties}} configuration file the first time the user logs in.
+Encrypted passwords are prepended with {{\{CRYPT\}}} so that are easy to recognize.
+
+h2. Managing realms
+
+More information about modifying the default realm or deploying new realms is provided in the [developers guide|/developers-guide/security-framework].
+
+h2. Deploying security providers
+
+Some applications require specific security providers to be available, such as [BouncyCastle|http://www.bouncycastle.org].  The JVM impose some restrictions about the use of such jars: they have to be signed and be available on the boot classpath.  One way to deploy those providers is to put them in the JRE folder at {{$JAVA_HOME/jre/lib/ext}} and modify the security policy configuration ({{$JAVA_HOME/jre/lib/security/java.security}}) in order to register such providers.
+
+While this approach works fine, it has a global effect and requires you to configure all your servers accordingly.
+
+Karaf offers a simple way to configure additional security providers:
+* put your provider jar in {{[karaf-install-dir]/lib/ext}}
+* modify the {{[karaf-install-dir]/etc/config.properties}} configuration file to add the following property
+
+{code}
+org.apache.karaf.security.providers = xxx,yyy
+{code}
+
+The value of this property is a comma separated list of the provider class names to register.
+For example:
+{code}
+org.apache.karaf.security.providers = org.bouncycastle.jce.provider.BouncyCastleProvider
+{code}
+
+In addition, you may want to provide access to the classes from those providers from the system bundle so that all bundles can access those.  It can be done by modifying the {{org.osgi.framework.bootdelegation}} property in the same configuration file:
+{code}
+org.osgi.framework.bootdelegation = ...,org.bouncycastle*
+{code}
+
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/start-stop.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/start-stop.conf
new file mode 100644
index 0000000..f62adfa
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/start-stop.conf
@@ -0,0 +1,107 @@
+h1. Starting and Stopping Karaf
+
+This chapter describes how to start and stop Apache Karaf and the various options that are available.
+
+h2. Starting Karaf
+
+h3. On Windows
+
+From a console window, change to the installation directory and run {{Karaf}}. For the binary distribution, go to
+{code}
+cd [karaf_install_dir]
+{code}
+where {{karaf_install_dir}} is the directory in which Karaf was installed, e.g., {{c:\Program Files\apache-karaf-x.y}}.
+
+Then type:
+{code}
+bin\karaf.bat
+{code}
+
+h3. On Unix
+
+From a command shell, change to the installation directory and run {{Karaf}}. For the binary distribution, go to
+{code}
+cd [karaf_install_dir]
+{code}
+where {{karaf_install_dir}} is the directory in which Karaf was installed, e.g., {{/usr/local/apache-karaf-x.y}}.
+
+Then type:
+{code}
+bin/karaf
+{code}
+
+{warning:title=Warning}
+Do NOT close the console or shell in which Karaf was started, as that will terminate Karaf (unless Karaf was started with nohup).
+{warning}
+
+h2. Starting Karaf without console
+
+Karaf can be started without the console if you don't intend to use it (one can always connect using the remote ssh access) using the following command:
+{code}
+bin\karaf.bat server
+{code}
+or, on Unix:
+{code}
+bin\karaf server
+{code}
+
+h2. Starting Karaf in the background
+
+Karaf can be easily started as a background process using the following command:
+{code}
+bin\start.bat
+{code}
+or, on Unix:
+{code}
+bin\start
+{code}
+
+h2. Starting Karaf from clean
+
+Karaf can be reset to a clean state by simply deleting the {{\[karaf_install_dir\]/data}} folder.
+For convenience, a parameter on the {{karaf}} and {{start}} scripts is available:
+{code}
+bin/start clean
+{code}
+
+h2. Stopping Karaf
+
+For both Windows and Unix installations, you can perform a clean shutdown of Karaf by using the following command when inside a Karaf console:
+{code}
+osgi:shutdown
+{code}
+or simply:
+{code}
+shutdown
+{code}
+
+The shutdown command asks you to confirm that you really want to shutdown. If you are sure about the shutdown and avoid the confirmation message, you can use the -f or --force option:
+
+{code}
+osgi:shutdown -f
+{code}
+
+It's also possible to delay the shutdown using the time argument. The time argument can have different formats. First, it can be an absolute time in the format hh:mm, in which hh is the hour (1 or 2 digits) and mm is the minute of the hour (in two digits). Second, it can be in the format +m, in which m is the number of minutes to wait. The work now is an alias for +0.
+
+The following command will shutdown Karaf at 10:35am:
+
+{code}
+osgi:shutdown 10:35
+{code}
+
+The following command will shutdown Karaf in 10 minutes:
+
+{code}
+osgi:shutdown +10
+{code}
+
+If you're running from the main console, exiting the shell using {{logout}} or {{Ctrl+D}} will also terminate the Karaf instance.
+
+From a command shell, you can run the following command:
+{code}
+bin\stop.bat
+{code}
+or, on Unix:
+{code}
+bin/stop
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/using-console.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/using-console.conf
new file mode 100644
index 0000000..09b4072
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/using-console.conf
@@ -0,0 +1,99 @@
+h1. Using the console
+
+h2. Viewing available commands
+
+To see a list of the available commands in the console press the {{<tab>}} key at the prompt.
+
+{code}
+root@root> Display all 182 possibilities? (y or n)
+*:help                           addurl                           admin:change-opts
+admin:change-rmi-registry-port   admin:change-ssh-port            admin:connect
+admin:create                     admin:destroy                    admin:list
+admin:rename                     admin:start                      admin:stop
+bundle-level                     cancel                           cat
+change-opts                      change-rmi-registry-port         change-ssh-port
+clear                            commandlist                      config:cancel
+config:edit                      config:list                      config:propappend
+config:propdel                   config:proplist                  config:propset
+config:update                    connect                          create
+create-dump                      destroy                          dev:create-dump
+dev:dynamic-import               dev:framework                    dev:print-stack-traces
+dev:restart                      dev:show-tree                    dev:watch
+display                          display-exception                dynamic-import
+each                             echo                             edit
+exec                             exports                          features:addurl
+features:info                    features:install                 features:list
+features:listrepositories        features:listurl                 features:listversions
+features:refreshurl              features:removerepository        features:removeurl
+features:uninstall               framework                        get
+grep                             head                             headers
+help                             history                          if
+imports                          info                             install
+jaas:cancel                      jaas:commandlist                 jaas:list
+jaas:manage                      jaas:roleadd                     jaas:roledel
+jaas:update                      jaas:useradd                     jaas:userdel
+jaas:userlist                    java                             list
+listrepositories                 listurl                          listversions
+log:clear                        log:display                      log:display-exception
+log:get                          log:set                          log:tail
+logout                           ls                               manage
+more                             new                              osgi:bundle-level
+osgi:headers                     osgi:info                        osgi:install
+osgi:list                        osgi:ls                          osgi:refresh
+osgi:resolve                     osgi:restart                     osgi:shutdown
+osgi:start                       osgi:start-level                 osgi:stop
+osgi:uninstall                   osgi:update                      packages:exports
+packages:imports                 print-stack-traces               printf
+propappend                       propdel                          proplist
+propset                          refresh                          refreshurl
+removerepository                 removeurl                        rename
+resolve                          restart                          roleadd
+roledel                          set                              shell:cat
+shell:clear                      shell:each                       shell:echo
+shell:exec                       shell:grep                       shell:head
+shell:history                    shell:if                         shell:info
+shell:java                       shell:logout                     shell:more
+shell:new                        shell:printf                     shell:sleep
+shell:sort                       shell:tac                        shell:tail
+show-tree                        shutdown                         sleep
+sort                             ssh                              ssh:ssh
+ssh:sshd                         sshd                             start
+start-level                      stop                             tac
+tail                             uninstall                        update
+useradd                          userdel                          userlist
+watch
+root@root>
+{code}
+
+The {{<tab>}} key toggles autocompletion anywhere on the line, so if you want to see the commands in the {{osgi}} group, type the first letters and hit {{<tab>}}.  Depending on the commands, autocompletion may be available for options and arguments too.
+
+h2. Getting help for a command
+
+To view help on a particular command, type the command followed by {{--help}} or use the {{help}} command followed by the name of the command:
+
+{code}
+karaf@root> features:list --help
+DESCRIPTION
+        features:list
+
+        Lists all existing features available from the defined repositories.
+
+SYNTAX
+        features:list [options]
+
+OPTIONS
+        --help
+                       Display this help message
+        -i, --installed
+                       Display a list of all installed features only
+{code}
+
+
+h2. More...
+
+The list of all available commands and their usage is also available in a [dedicated section|/commands/commands].
+
+You'll find a more in-depth guide to the shell syntax in the [developers guide|/developers-guide/shell-syntax].
+
+The console can also be easily extended by creating new commands as explained in the [developers guide|/developers-guide/extending-console].
+
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/web-applications.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/web-applications.conf
new file mode 100644
index 0000000..3f4fbb4
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/web-applications.conf
@@ -0,0 +1,99 @@
+
+h1. Web applications
+
+h2. Installing war support
+
+The following steps will install the "war" feature (support for deploying WAR files with Servlet and JSPs into a Jetty server) into your Karaf instance.
+# List the available features -
+{noformat}
+karaf@root> features:list 
+ State        Name
+. . .
+[uninstalled] [2.2.0] obr        karaf-2.2.0
+[uninstalled] [2.2.0] config     karaf-2.2.0
+[uninstalled] [2.2.0] http       karaf-2.2.0
+[uninstalled] [2.2.0] war        karaf-2.2.0
+[uninstalled] [2.2.0] webconsole karaf-2.2.0
+[installed  ] [2.2.0] ssh        karaf-2.2.0
+. . .
+{noformat}
+# Install the war feature (and the sub-features it requires) -
+{noformat}
+karaf@root> features:install war 
+{noformat}
+Note: you can use the -v or --verbose to see exactly what Karaf does
+{noformat}
+karaf@root> features:install -v war
+Installing feature war 2.1.99-SNAPSHOT
+Installing feature http 2.1.99-SNAPSHOT
+Installing feature jetty 7.1.6.v20100715
+Installing bundle mvn:org.apache.geronimo.specs/geronimo-servlet_2.5_spec/1.1.2
+Found installed bundle: org.apache.servicemix.bundles.asm [10]
+Installing bundle mvn:org.eclipse.jetty/jetty-util/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-io/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-http/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-continuation/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-server/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-security/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-servlet/7.1.6.v20100715
+Installing bundle mvn:org.eclipse.jetty/jetty-xml/7.1.6.v20100715
+Checking configuration file mvn:org.apache.karaf/apache-karaf/2.1.99-SNAPSHOT/xml/jettyconfig
+Installing bundle mvn:org.ops4j.pax.web/pax-web-api/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-spi/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-runtime/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-jetty/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-jsp/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-extender-war/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-extender-whiteboard/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.web/pax-web-deployer/0.8.2-SNAPSHOT
+Installing bundle mvn:org.ops4j.pax.url/pax-url-war/1.2.4
+{noformat}
+# Verify the features were installed
+{noformat}
+servicemix> features/list
+ State        Name
+. . .
+[installed ] [2.2.0] http karaf-2.2.0
+[installed ] [2.2.0] war  karaf-2.2.0
+. . .
+{noformat}
+# Verify the installed bundles were started
+{noformat}
+karaf@root> osgi:list 
+START LEVEL 100
+   ID   State         Level  Name
+. . .
+[ 32] [Active ] [ ] [ 60] geronimo-servlet_2.5_spec (1.1.2) 
+[ 33] [Active ] [ ] [ 60] Apache ServiceMix :: Bundles :: jetty (6.1.22.2) 
+[ 34] [Active ] [ ] [ 60] OPS4J Pax Web - API (1.0.0)
+[ 35] [Active ] [ ] [ 60] OPS4J Pax Web - Service SPI (1.0.0)
+[ 36] [Active ] [ ] [ 60] OPS4J Pax Web - Runtime (1.0.0)
+[ 37] [Active ] [ ] [ 60] OPS4J Pax Web - Jetty (1.0.0)
+[ 38] [Active ] [ ] [ 60] OPS4J Pax Web - Jsp Support (1.0.0)
+[ 39] [Active ] [ ] [ 60] OPS4J Pax Web - Extender - WAR (1.0.0)
+[ 40] [Active ] [ ] [ 60] OPS4J Pax Web - Extender - Whiteboard (1.0.0)
+[ 42] [Active ] [ ] [ 60] OPS4J Pax Web - FileInstall Deployer (1.0.0)
+[ 41] [Active ] [ ] [ 60] OPS4J Pax Url - war:, war-i: (1.2.4)
+. . .
+{noformat}
+# The Jetty server should now be listening on http://localhost:8181/, but with no published applications available.
+{noformat}
+HTTP ERROR: 404
+NOT_FOUND
+RequestURI=/
+Powered by jetty://
+{noformat}
+
+h2. Deploying a WAR to the installed web feature
+
+The following steps will describe how to install a simple WAR file (with JSPs or Servlets) to the just installed web feature.
+# To deploy a WAR (JSP or Servlet) to Jetty, update its MANIFEST.MF to include the required OSGi headers as described here - \\
+[http://team.ops4j.org/wiki/display/ops4j/Pax+Web+Extender+-+War+-+OSGi-fy]
+# Copy the updated WAR (archive or extracted files) to the _deploy_ directory.
+
+If you want to deploy a sample web application into Karaf, you could use the following command:
+{code}
+karaf@root> osgi:install -s webbundle:http://tomcat.apache.org/tomcat-5.5-doc/appdev/sample/sample.war?Bundle-SymbolicName=tomcat-sample&Webapp-Context=/sample
+{code}
+
+Then open your web browser and point to {{http://localhost:8181/sample/index.html}}.
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/web-console.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/web-console.conf
new file mode 100644
index 0000000..dce1abe
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/web-console.conf
@@ -0,0 +1,35 @@
+h1. Web console
+
+The Karaf web console provides a graphical overview of the runtime.
+You can use it to:
+* install and uninstall features
+* start, stop, install bundles
+* create child instances
+* configure Karaf
+* view logging informations
+
+h2. Installing the web console
+
+The web console is not installed by default.  To install it, run the following command from the Karaf prompt:
+
+{code}
+root@karaf> features:install webconsole
+{code}
+
+h2. Accessing the web console
+
+To access the console for an instance of Karaf running locally, enter the following address in your web browser:
+
+{code}
+http://localhost:8181/system/console
+{code}
+
+Log in with the username {{karaf}} and the password {{karaf}}.  If you have changed the default user or password, use the one you have configured.
+
+h2. Changing the web console port number
+
+By default, the console runs on port 8181. You can change the port number by creating the properties file, {{etc/org.ops4j.pax.web.cfg}}, and adding the following property setting (changing the port number to whatever value desired):
+
+{code}
+org.osgi.service.http.port=8181
+{code}
diff --git a/karaf-2.2.x/manual/src/main/webapp/users-guide/wrapper.conf b/karaf-2.2.x/manual/src/main/webapp/users-guide/wrapper.conf
new file mode 100644
index 0000000..d3d7381
--- /dev/null
+++ b/karaf-2.2.x/manual/src/main/webapp/users-guide/wrapper.conf
@@ -0,0 +1,122 @@
+h1. Service Wrapper
+
+h2. Introduction
+
+The Karaf Wrapper (for service wrapper) makes it possible to install Karaf as a Windows Service. Likewise, the scripts shipped with Karaf also make it very easy to install Karaf as a daemon process on Unix systems.
+
+The Wrapper correctly handles "user's log outs" under Windows, service dependencies, and the ability to run services which interact with the desktop.
+
+h2. Supported platforms
+
+The following platforms are supported by the Karaf Wrapper:
+* AIX
+* FreeBSD
+* HP-UX, 32-bit and 64-bit versions
+* SGI Irix
+* Linux kernels 2.2.x, 2.4.x, 2.6.x. Known to work with Debian, Ubuntu, and Red Hat, but should work with any distribution. Currently supported on both 32-bit and 64-bit x86, Itanium, and PPC systems.
+* Macintosh OS X
+* Sun OS, Solaris 9 and 10. Currently supported on both 32-bit and 64-bit sparc, and x86 systems.
+* Windows - Windows 2000, XP, 2003, Vista, 2008 and Windows 7. Currently supported on both 32-bit and 64-bit x86 and Itanium systems. Also known to run on Windows 98 and ME, however due the lack of support for services in the OS, the Wrapper can be run only in console mode.
+
+h2. Installation
+
+Karaf Wrapper is an optional feature. To install it, simply type:
+
+{code}
+karaf@root> features:install wrapper
+{code}
+
+Once installed, wrapper feature will provide {{wrapper:install}} new command in the Karaf shell:
+
+{code}
+karaf@root> wrapper:install --help
+DESCRIPTION
+        wrapper:install
+
+        Install the container as a system service in the OS.
+
+SYNTAX
+        wrapper:install [options]
+
+OPTIONS
+        -s, --start-type
+                Mode in which the service is installed. AUTO_START or DEMAND_START (Default: AUTO_START)
+                (defaults to AUTO_START)
+        --help
+                Display this help message
+        -n, --name
+                The service name that will be used when installing the service. (Default: karaf)
+                (defaults to karaf)
+        -d, --display
+                The display name of the service.
+        -D, --description
+                The description of the service.
+                (defaults to )
+{code}
+
+Using {{wrapper:install}}, you can install Karaf as a service.
+
+For instance, to register Karaf as a service (depending of the running OS), in automatic start mode, simply type:
+
+{code}
+karaf@root> wrapper:install -s AUTO_START -n KARAF -d Karaf -D "Karaf Service"
+{code}
+
+For instance, on Linux, {{wrapper:install}} command will do:
+
+{code}
+karaf@root> wrapper:install -s AUTO_START -n KARAF -d Karaf -D "Karaf Service"
+Creating file: /home/onofreje/apache-karaf-2.1.3/bin/KARAF-wrapper
+Creating file: /home/onofreje/apache-karaf-2.1.3/bin/KARAF-service
+Creating file: /home/onofreje/apache-karaf-2.1.3/etc/KARAF-wrapper.conf
+Creating file: /home/onofreje/apache-karaf-2.1.3/lib/libwrapper.so
+Creating file: /home/onofreje/apache-karaf-2.1.3/lib/karaf-wrapper.jar
+Creating file: /home/onofreje/apache-karaf-2.1.3/lib/karaf-wrapper-main.jar
+
+Setup complete.  You may wish to tweak the JVM properties in the wrapper configuration file:
+        /home/onofreje/apache-karaf-2.1.3/etc/KARAF-wrapper.conf
+before installing and starting the service.
+
+The way the service is installed depends upon your flavor of Linux.
+
+On Redhat/Fedora/CentOS Systems:
+  To install the service:
+    $ ln -s /home/onofreje/apache-karaf-2.1.3/bin/KARAF-service /etc/init.d/
+    $ chkconfig KARAF-service --add
+
+  To start the service when the machine is rebooted:
+    $ chkconfig KARAF-service on
+
+  To disable starting the service when the machine is rebooted:
+    $ chkconfig KARAF-service off
+
+  To start the service:
+    $ service KARAF-service start
+
+  To stop the service:
+    $ service KARAF-service stop
+
+  To uninstall the service :
+    $ chkconfig KARAF-service --del
+    $ rm /etc/init.d/KARAF-service
+
+On Ubuntu/Debian Systems:
+  To install the service:
+    $ ln -s /home/onofreje/apache-karaf-2.1.3/bin/KARAF-service /etc/init.d/
+
+  To start the service when the machine is rebooted:
+    $ update-rc.d KARAF-service defaults
+
+  To disable starting the service when the machine is rebooted:
+    $ update-rc.d -f KARAF-service remove
+
+  To start the service:
+    $ /etc/init.d/KARAF-service start
+
+  To stop the service:
+    $ /etc/init.d/KARAF-service stop
+
+  To uninstall the service :
+    $ rm /etc/init.d/KARAF-service
+
+{code}
\ No newline at end of file
diff --git a/karaf-2.2.x/pom.xml b/karaf-2.2.x/pom.xml
new file mode 100644
index 0000000..9d04e94
--- /dev/null
+++ b/karaf-2.2.x/pom.xml
@@ -0,0 +1,1473 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>10</version>
+    </parent>
+
+    <groupId>org.apache.karaf</groupId>
+    <artifactId>karaf</artifactId>
+    <packaging>pom</packaging>
+    <version>2.2.7</version>
+    <name>Apache Karaf</name>
+    <inceptionYear>2007</inceptionYear>
+
+    <modules>
+        <module>util</module>
+        <module>main</module>
+        <module>features</module>
+        <module>admin</module>
+        <module>deployer</module>
+        <module>shell</module>
+        <module>jaas</module>
+        <module>client</module>
+        <module>management</module>
+        <module>webconsole</module>
+        <module>exception</module>
+        <module>assemblies</module>
+        <module>demos</module>
+        <module>itests</module>
+        <module>tooling</module>
+        <module>archetypes</module>
+        <module>diagnostic</module>
+    </modules>
+
+    <scm>
+        <connection>scm:svn:http://svn.apache.org/repos/asf/karaf/tags/karaf-2.2.7</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/karaf/tags/karaf-2.2.7</developerConnection>
+        <url>http://svn.apache.org/viewvc/karaf/tags/karaf-2.2.7</url>
+    </scm>
+
+    <issueManagement>
+        <system>jira</system>
+        <url>https://issues.apache.org/jira/browse/KARAF</url>
+    </issueManagement>
+
+    <mailingLists>
+        <mailingList>
+            <name>Karaf Dev</name>
+            <subscribe>dev-subscribe@karaf.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@karaf.apache.org</unsubscribe>
+            <post>-</post>
+            <archive>http://www.mail-archive.com/dev%karaf.apache.org/</archive>
+        </mailingList>
+        <mailingList>
+            <name>Karaf User</name>
+            <subscribe>user-subscribe@karaf.apache.org</subscribe>
+            <unsubscribe>user-unsubscribe@karaf.apache.org</unsubscribe>
+            <post>-</post>
+            <archive>http://www.mail-archive.com/user%40karaf.apache.org/</archive>
+        </mailingList>
+        <mailingList>
+            <name>Karaf Commits</name>
+            <subscribe>commits-subscribe@karaf.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@karaf.apache.org</unsubscribe>
+            <post>-</post>
+            <archive>http://www.mail-archive.com/commits%40karaf.apache.org/</archive>
+        </mailingList>
+        <mailingList>
+            <name>Karaf Issues</name>
+            <subscribe>issues-subscribe@karaf.apache.org</subscribe>
+            <unsubscribe>issues-unsubscribe@karaf.apache.org</unsubscribe>
+            <post>-</post>
+            <archive>http://www.mail-archive.com/issues%40karaf.apache.org/</archive>
+        </mailingList>
+    </mailingLists>
+
+    <prerequisites>
+        <maven>2.2.1</maven>
+    </prerequisites>
+
+    <properties>
+        <aopalliance.bundle.version>1.0_5</aopalliance.bundle.version>
+        <asm.bundle.version>3.3.1_1</asm.bundle.version>
+        <cglib.bundle.version>2.1_3_7</cglib.bundle.version>
+        <commons-beanutils.version>1.8.3</commons-beanutils.version>
+        <commons-codec.version>1.6</commons-codec.version>
+        <commons-collections.version>3.2.1</commons-collections.version>
+        <commons-fileupload.version>1.1.1</commons-fileupload.version>
+        <commons-lang.version>2.6</commons-lang.version>
+        <icu4j.version>4.8.1.1</icu4j.version>
+        <jasypt.bundle.version>1.9.0_1</jasypt.bundle.version>
+        <jetty.version>7.5.4.v20111024</jetty.version>
+        <junit.bundle.version>4.10_1</junit.bundle.version>
+        <geronimo.jms-spec.version>1.1.1</geronimo.jms-spec.version>
+        <geronimo.jpa-spec.version>1.1</geronimo.jpa-spec.version>
+        <geronimo.jta-spec.version>1.1.1</geronimo.jta-spec.version>
+        <geronimo.servlet.version>1.1.2</geronimo.servlet.version>
+        <easymock.version>3.1</easymock.version>
+        <equinox.version>3.6.2.R36x_v20110210</equinox.version>
+        <felix.bundlerepository.version>1.6.4</felix.bundlerepository.version>
+        <felix.configadmin.version>1.2.8</felix.configadmin.version>
+        <felix.fileinstall.version>3.2.2</felix.fileinstall.version>
+        <felix.framework.version>3.0.9</felix.framework.version>
+        <felix.gogo.version>0.10.0</felix.gogo.version>
+        <felix.plugin.version>2.3.7</felix.plugin.version>
+        <felix.utils.version>1.1.0</felix.utils.version>
+        <felix.webconsole.version>3.1.8</felix.webconsole.version>
+        <felix.metatype.version>1.0.4</felix.metatype.version>
+        <felix.eventadmin.version>1.2.14</felix.eventadmin.version>
+        <felix.eventadmin-plugin.version>1.0.2</felix.eventadmin-plugin.version>
+        <felix.obr.version>1.0.2</felix.obr.version>
+        <aries.application.version>0.3</aries.application.version>
+        <aries.blueprint.version>0.3.1</aries.blueprint.version>
+        <aries.jmx.version>0.3</aries.jmx.version>
+        <aries.jpa.version>0.3</aries.jpa.version>
+        <aries.jndi.version>0.3</aries.jndi.version>
+        <aries.proxy.version>0.3</aries.proxy.version>
+        <aries.transaction.version>0.3</aries.transaction.version>
+        <aries.util.version>0.3</aries.util.version>
+        <jansi.version>1.8</jansi.version>
+        <jline.version>2.6</jline.version>
+        <jsw.version>3.2.3</jsw.version>
+        <log4j.version>1.2.16</log4j.version>
+        <maven.version>2.0.9</maven.version>
+        <mina.version>2.0.1</mina.version>
+        <osgi.version>4.2.0</osgi.version>
+        <pax.exam.version>1.2.4</pax.exam.version>
+        <pax.logging.version>1.6.5</pax.logging.version>
+        <pax.runner.version>1.6.2</pax.runner.version>
+        <pax.url.version>1.2.8</pax.url.version>
+        <pax.web.version>1.0.9</pax.web.version>
+        <pax.tinybundles.version>1.3.0</pax.tinybundles.version>
+        <plexus.utils.version>2.1</plexus.utils.version>
+        <servicemix.specs.version>1.9.0</servicemix.specs.version>
+        <servlet.api.version>2.5</servlet.api.version>
+        <slf4j.version>1.6.4</slf4j.version>
+        <spring.osgi.version>1.2.1</spring.osgi.version>
+        <spring2.version>2.5.6.SEC02</spring2.version>
+        <spring.version>3.0.7.RELEASE</spring.version>
+        <sshd.version>0.5.0</sshd.version>
+        <xbean.version>3.7</xbean.version>
+        <javax.mail.version>1.4.4</javax.mail.version>
+
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <appendedResourcesDirectory>${basedir}/etc/appended-resources</appendedResourcesDirectory>
+        <bnd.version.policy>[$(version;==;$(@)),$(version;+;$(@)))</bnd.version.policy>
+    </properties>
+
+    <repositories>
+        <!-- ServiceMix repo -->
+        <repository>
+            <id>servicemix</id>
+            <name>Apache ServiceMix Repository</name>
+            <url>http://svn.apache.org/repos/asf/servicemix/m2-repo</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+            </snapshots>
+        </repository>
+        <repository>
+            <id>fusesource.snapshots</id>
+            <name>FuseSource snapshot repository</name>
+            <url>http://repo.fusesource.com/nexus/content/repositories/snapshots</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+        <!-- OPS4J SNAPSHOT repository -->
+        <repository>
+            <id>ops4j.sonatype.snapshots.deploy</id>
+            <name>OPS4J snapshot repository</name>
+            <url>https://oss.sonatype.org/content/repositories/ops4j-snapshots/</url>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+        </repository>
+    </repositories>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.ibm.icu</groupId>
+                <artifactId>icu4j</artifactId>
+                <version>${icu4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>manual</artifactId>
+                <type>pdf</type>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>manual</artifactId>
+                <type>html</type>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>org.apache.karaf.main</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>org.apache.karaf.util</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>org.apache.karaf.exception</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>org.apache.karaf.client</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.deployer</groupId>
+                <artifactId>org.apache.karaf.deployer.spring</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.deployer</groupId>
+                <artifactId>org.apache.karaf.deployer.blueprint</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.deployer</groupId>
+                <artifactId>org.apache.karaf.deployer.features</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.deployer</groupId>
+                <artifactId>org.apache.karaf.deployer.kar</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.deployer</groupId>
+                <artifactId>org.apache.karaf.deployer.wrap</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.management</groupId>
+                <artifactId>org.apache.karaf.management.server</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.management.mbeans</groupId>
+                <artifactId>org.apache.karaf.management.mbeans.config</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.demos</groupId>
+                <artifactId>demos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.features</groupId>
+                <artifactId>org.apache.karaf.features.core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.features</groupId>
+                <artifactId>org.apache.karaf.features.command</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.features</groupId>
+                <artifactId>org.apache.karaf.features.management</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.features</groupId>
+                <artifactId>org.apache.karaf.features.obr</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.diagnostic</groupId>
+                <artifactId>org.apache.karaf.diagnostic.core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.diagnostic</groupId>
+                <artifactId>org.apache.karaf.diagnostic.common</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.diagnostic</groupId>
+                <artifactId>org.apache.karaf.diagnostic.command</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.diagnostic</groupId>
+                <artifactId>org.apache.karaf.diagnostic.management</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.admin</groupId>
+                <artifactId>org.apache.karaf.admin.core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.admin</groupId>
+                <artifactId>org.apache.karaf.admin.command</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.admin</groupId>
+                <artifactId>org.apache.karaf.admin.management</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.console</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.obr</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.osgi</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.log</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.config</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.packages</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.ssh</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.commands</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.dev</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.shell</groupId>
+                <artifactId>org.apache.karaf.shell.wrapper</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.jaas</groupId>
+                <artifactId>org.apache.karaf.jaas.boot</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.jaas</groupId>
+                <artifactId>org.apache.karaf.jaas.config</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.jaas</groupId>
+                <artifactId>org.apache.karaf.jaas.modules</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.jaas</groupId>
+                <artifactId>org.apache.karaf.jaas.command</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.webconsole</groupId>
+                <artifactId>org.apache.karaf.webconsole.admin</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.webconsole</groupId>
+                <artifactId>org.apache.karaf.webconsole.branding</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.webconsole</groupId>
+                <artifactId>org.apache.karaf.webconsole.console</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.webconsole</groupId>
+                <artifactId>org.apache.karaf.webconsole.features</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.webconsole</groupId>
+                <artifactId>org.apache.karaf.webconsole.gogo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.demos</groupId>
+                <artifactId>web</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>apache-karaf</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>apache-karaf</artifactId>
+                <type>tar.gz</type>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>apache-karaf</artifactId>
+                <type>zip</type>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.assemblies.features</groupId>
+                <artifactId>standard</artifactId>
+                <type>xml</type>
+                <classifier>features</classifier>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.assemblies.features</groupId>
+                <artifactId>enterprise</artifactId>
+                <type>xml</type>
+                <classifier>features</classifier>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>org.apache.karaf.tooling.testing</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.framework</artifactId>
+                <version>${felix.framework.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>org.osgi.compendium</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.core</artifactId>
+                <version>${osgi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.compendium</artifactId>
+                <version>${osgi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.configadmin</artifactId>
+                <version>${felix.configadmin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.bundlerepository</artifactId>
+                <version>${felix.bundlerepository.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>org.osgi.service.obr</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>org.apache.felix.shell</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>net.sf.kxml</groupId>
+                        <artifactId>kxml2</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.metatype</artifactId>
+                <version>${felix.metatype.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>org.osgi.core</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>org.osgi.compendium</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.utils</artifactId>
+                <version>${felix.utils.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.osgi</groupId>
+                        <artifactId>org.osgi.core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.webconsole</artifactId>
+                <version>${felix.webconsole.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.fileinstall</artifactId>
+                <version>${felix.fileinstall.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.osgi</groupId>
+                        <artifactId>org.osgi.core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.eventadmin</artifactId>
+                <version>${felix.eventadmin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>${felix.plugin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven</groupId>
+                <artifactId>maven-plugin-api</artifactId>
+                <version>${maven.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven</groupId>
+                <artifactId>maven-project</artifactId>
+                <version>${maven.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-aop</artifactId>
+                <version>${spring.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.aopalliance</groupId>
+                        <artifactId>com.springsource.org.aopalliance</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-beans</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-core</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-context</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework</groupId>
+                <artifactId>spring-test</artifactId>
+                <version>${spring.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.osgi</groupId>
+                <artifactId>spring-osgi-core</artifactId>
+                <version>${spring.osgi.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>org.springframework.aop</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>org.springframework.beans</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>org.springframework.context</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.springframework</groupId>
+                        <artifactId>org.springframework.core</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.osgi</groupId>
+                <artifactId>spring-osgi-io</artifactId>
+                <version>${spring.osgi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.osgi</groupId>
+                <artifactId>spring-osgi-extender</artifactId>
+                <version>${spring.osgi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.osgi</groupId>
+                <artifactId>spring-osgi-annotation</artifactId>
+                <version>${spring.osgi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.osgi</groupId>
+                <artifactId>spring-osgi-test</artifactId>
+                <version>${spring.osgi.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.springframework.osgi</groupId>
+                        <artifactId>asm.osgi</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.junit</groupId>
+                        <artifactId>com.springsource.junit</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.objectweb.asm</groupId>
+                        <artifactId>com.springsource.org.objectweb.asm</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.servicemix.bundles</groupId>
+                <artifactId>org.apache.servicemix.bundles.ant</artifactId>
+                <version>1.7.0_3</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>commons-logging</groupId>
+                        <artifactId>commons-logging-api</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.servicemix.bundles</groupId>
+                <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+                <version>${junit.bundle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-util</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-io</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-http</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-continuation</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-server</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-security</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-servlet</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.jetty</groupId>
+                <artifactId>jetty-xml</artifactId>
+                <version>${jetty.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.servicemix.bundles</groupId>
+                <artifactId>org.apache.servicemix.bundles.asm</artifactId>
+                <version>${asm.bundle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>log4j</groupId>
+                <artifactId>log4j</artifactId>
+                <version>${log4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>jline</groupId>
+                <artifactId>jline</artifactId>
+                <version>${jline.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.fusesource.jansi</groupId>
+                <artifactId>jansi</artifactId>
+                <version>${jansi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.maven.artifact</groupId>
+                <artifactId>maven-artifact</artifactId>
+                <version>3.0-alpha-1</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.mina</groupId>
+                <artifactId>mina-core</artifactId>
+                <version>${mina.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.easymock</groupId>
+                        <artifactId>easymock</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>org.easymock</groupId>
+                        <artifactId>easymockclassextension</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-jdk14</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-nop</artifactId>
+                <version>${slf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-simple</artifactId>
+                <version>${slf4j.version}</version>
+            </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>
+                <exclusions>
+                    <exclusion>
+                        <groupId>log4j</groupId>
+                        <artifactId>log4j</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.url</groupId>
+                <artifactId>pax-url-mvn</artifactId>
+                <version>${pax.url.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.url</groupId>
+                <artifactId>pax-url-wrap</artifactId>
+                <version>${pax.url.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.url</groupId>
+                <artifactId>pax-url-war</artifactId>
+                <version>${pax.url.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-servlet_2.5_spec</artifactId>
+                <version>${geronimo.servlet.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.easymock</groupId>
+                <artifactId>easymock</artifactId>
+                <version>${easymock.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.servicemix.specs</groupId>
+                <artifactId>org.apache.servicemix.specs.activation-api-1.1</artifactId>
+                <version>${servicemix.specs.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.sshd</groupId>
+                <artifactId>sshd-core</artifactId>
+                <version>${sshd.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.exam</groupId>
+                <artifactId>pax-exam</artifactId>
+                <version>${pax.exam.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.exam</groupId>
+                <artifactId>pax-exam-junit</artifactId>
+                <version>${pax.exam.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.exam</groupId>
+                <artifactId>pax-exam-container-default</artifactId>
+                <version>${pax.exam.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.exam</groupId>
+                <artifactId>pax-exam-junit-extender-impl</artifactId>
+                <version>${pax.exam.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.swissbox</groupId>
+                <artifactId>pax-swissbox-tinybundles</artifactId>
+                <version>${pax.tinybundles.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse</groupId>
+                <artifactId>osgi</artifactId>
+                <version>${equinox.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.servlet</groupId>
+                <artifactId>servlet-api</artifactId>
+                <version>${servlet.api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.blueprint</groupId>
+                <artifactId>org.apache.aries.blueprint</artifactId>
+                <version>${aries.blueprint.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>org.apache.felix</groupId>
+                        <artifactId>javax.servlet</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.proxy</groupId>
+                <artifactId>org.apache.aries.proxy</artifactId>
+                <version>${aries.proxy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries</groupId>
+                <artifactId>org.apache.aries.util</artifactId>
+                <version>${aries.util.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.jmx</groupId>
+                <artifactId>org.apache.aries.jmx.api</artifactId>
+                <version>${aries.jmx.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.jmx</groupId>
+                <artifactId>org.apache.aries.jmx.core</artifactId>
+                <version>${aries.jmx.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.jmx</groupId>
+                <artifactId>org.apache.aries.jmx.blueprint</artifactId>
+                <version>${aries.jmx.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.jndi</groupId>
+                <artifactId>org.apache.aries.jndi.api</artifactId>
+                <version>${aries.jndi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.jndi</groupId>
+                <artifactId>org.apache.aries.jndi.core</artifactId>
+                <version>${aries.jndi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.aries.jndi</groupId>
+                <artifactId>org.apache.aries.jndi.url</artifactId>
+                <version>${aries.jndi.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.gogo.runtime</artifactId>
+                <version>${felix.gogo.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>org.apache.felix.gogo.commands</artifactId>
+                <version>${felix.gogo.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.runner</groupId>
+                <artifactId>pax-runner-no-jcl</artifactId>
+                <version>${pax.runner.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-api</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-spi</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-runtime</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-jetty</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-jsp</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-deployer</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-extender-war</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.ops4j.pax.web</groupId>
+                <artifactId>pax-web-extender-whiteboard</artifactId>
+                <version>${pax.web.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.xbean</groupId>
+                <artifactId>xbean-finder-shaded</artifactId>
+                <version>${xbean.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>tanukisoft</groupId>
+                <artifactId>wrapper</artifactId>
+                <version>${jsw.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-codec</groupId>
+                <artifactId>commons-codec</artifactId>
+                <version>${commons-codec.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-collections</groupId>
+                <artifactId>commons-collections</artifactId>
+                <version>${commons-collections.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-lang</groupId>
+                <artifactId>commons-lang</artifactId>
+                <version>${commons-lang.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.servicemix.bundles</groupId>
+                <artifactId>org.apache.servicemix.bundles.jasypt</artifactId>
+                <version>${jasypt.bundle.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.10</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <version>2.3.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>2.7</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>2.8</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-jar-plugin</artifactId>
+                    <version>2.3.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-enforcer-plugin</artifactId>
+                    <version>1.0.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-gpg-plugin</artifactId>
+                    <version>1.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-eclipse-plugin</artifactId>
+                    <version>2.6</version>
+                    <configuration>
+                        <outputDirectory>${basedir}/eclipse-classes</outputDirectory>
+                        <downloadSources>true</downloadSources>
+                        <downloadJavadocs>true</downloadJavadocs>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.2.1</version>
+                    <configuration>
+                        <useReleaseProfile>false</useReleaseProfile>
+                        <preparationGoals>clean install</preparationGoals>
+                        <goals>deploy</goals>
+                        <arguments>-Prelease,deploy,manual</arguments>
+                        <autoVersionSubmodules>true</autoVersionSubmodules>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.felix</groupId>
+                    <artifactId>maven-bundle-plugin</artifactId>
+                    <version>${felix.plugin.version}</version>
+                    <extensions>true</extensions>
+                    <configuration>
+                        <instructions>
+                            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                            <Export-Package>${project.artifactId}*;version=${project.version};-split-package:=merge-first</Export-Package>
+                            <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                        </instructions>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-idea-plugin</artifactId>
+                    <version>2.2</version>
+                    <configuration>
+                        <downloadSources>true</downloadSources>
+                        <downloadJavadocs>true</downloadJavadocs>
+                    </configuration>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-surefire-plugin</artifactId>
+                    <version>2.9</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-shade-plugin</artifactId>
+                    <version>1.4</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-resources-plugin</artifactId>
+                    <version>2.5</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.servicemix.tooling</groupId>
+                    <artifactId>depends-maven-plugin</artifactId>
+                    <version>1.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>2.1.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-assembly-plugin</artifactId>
+                    <version>2.2.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-antrun-plugin</artifactId>
+                    <version>1.6</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>exec-maven-plugin</artifactId>
+                    <version>1.2</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>2.3</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>build-helper-maven-plugin</artifactId>
+                    <version>1.7</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-remote-resources-plugin</artifactId>
+                    <version>1.2.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-war-plugin</artifactId>
+                    <version>2.1.1</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.5</source>
+                    <target>1.5</target>
+                    <maxmem>256M</maxmem>
+                    <fork>${compiler.fork}</fork>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-remote-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>process</goal>
+                        </goals>
+                        <configuration>
+                            <appendedResourcesDirectory>${appendedResourcesDirectory}</appendedResourcesDirectory>
+                            <resourceBundles>
+                                <resourceBundle>org.apache:apache-jar-resource-bundle:1.4</resourceBundle>
+                            </resourceBundles>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-notice</id>
+                        <phase>generate-resources</phase>
+                        <configuration>
+                            <target>
+                                <copy file="NOTICE" todir="target/maven-shared-archive-resources/META-INF" failonerror="false" overwrite="true" />
+                            </target>
+                        </configuration>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <inherited>true</inherited>
+                <executions>
+                    <execution>
+                        <id>cleanVersions</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>cleanVersions</goal>
+                        </goals>
+                        <configuration>
+                            <versions>
+                                <karaf.osgi.version>${project.version}</karaf.osgi.version>
+                            </versions>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+                <version>2.8</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jxr-plugin</artifactId>
+                <version>2.3</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-site-plugin</artifactId>
+                <version>3.0</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-report-plugin</artifactId>
+                <version>2.9</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>2.4</version>
+            </plugin>
+        </plugins>
+    </reporting>
+
+    <profiles>
+        <profile>
+            <id>fastinstall</id>
+            <properties>
+                <maven.test.skip>true</maven.test.skip>
+            </properties>
+        </profile>
+        <profile>
+            <id>manual</id>
+            <modules>
+                <module>manual</module>
+            </modules>
+        </profile>
+        <profile>
+            <id>rat</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.rat</groupId>
+                        <artifactId>apache-rat-plugin</artifactId>
+                        <version>0.7</version>
+                        <executions>
+                            <execution>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>check</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <reportFile>${project.build.directory}/${project.build.finalName}.rat</reportFile>
+                            <excludeSubProjects>false</excludeSubProjects>
+                            <excludes>
+                                <exclude>**/target/**/*</exclude>
+                                <!-- IDEA files -->
+                                <exclude>**/*.iml</exclude>
+                                <exclude>**/*.ipr</exclude>
+                                <exclude>**/*.iws</exclude>
+                                <!-- Eclipse files -->
+                                <exclude>**/.*</exclude>
+                                <exclude>**/eclipse-classes/**/*</exclude>
+                                <exclude>**/dependency-reduced-pom.xml</exclude>
+                                <!--RAT doesn't seem to recognize MIT style licenses-->
+                                <exclude>manual/src/styles/print.css</exclude>
+                            </excludes>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>release</id>
+            <modules>
+                <module>manual</module>
+            </modules>
+            <build>
+                <plugins>
+                    <!-- We check the Maven and JDK during the release -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-enforcer-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>enforce-versions</id>
+                                <goals>
+                                    <goal>enforce</goal>
+                                </goals>
+                                <configuration>
+                                    <rules>
+                                        <requireMavenVersion>
+                                            <version>[2.2.1,3)</version>
+                                        </requireMavenVersion>
+                                        <requireJavaVersion>
+                                            <version>[1.5,1.7.1)</version>
+                                        </requireJavaVersion>
+                                    </rules>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <!-- We want to deploy the artifact to a staging location for perusal -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-deploy-plugin</artifactId>
+                        <inherited>true</inherited>
+                        <configuration>
+                            <altDeploymentRepository>${deploy.altRepository}</altDeploymentRepository>
+                            <updateReleaseInfo>true</updateReleaseInfo>
+                        </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>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>make-assembly</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>build-helper-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-assemblies</id>
+                                <phase>none</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>setup.eclipse</id>
+            <modules>
+                <module>assemblies</module>
+            </modules>
+            <properties>
+                <eclipse.workspace.dir>${basedir}/../workspace</eclipse.workspace.dir>
+            </properties>
+            <build>
+                <defaultGoal>eclipse:eclipse</defaultGoal>
+                <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>add-maven-repo</goal>
+                                </goals>
+                                <configuration>
+                                    <workspace>${eclipse.workspace.dir}</workspace>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>deploy</id>
+            <properties>
+                <createSourcesJar>true</createSourcesJar>
+            </properties>
+            <build>
+                <defaultGoal>deploy</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <version>2.0.4</version>
+                        <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>
+                        <version>2.4</version>
+                        <configuration>
+                            <source>1.5</source>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>attach-javadocs</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/karaf-2.2.x/shell/commands/NOTICE b/karaf-2.2.x/shell/commands/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/commands/pom.xml b/karaf-2.2.x/shell/commands/pom.xml
new file mode 100644
index 0000000..57ccd33
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/pom.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.commands</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: Various Commands</name>
+    <description>This bundles provides basic Karaf shell commands.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.gogo.runtime</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.util.process
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/CatAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/CatAction.java
new file mode 100644
index 0000000..cf116ea
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/CatAction.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.commands;
+
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.util.List;
+
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+
+/**
+ * Concatenate and print files and/or URLs.
+ *
+ * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
+ */
+@Command(scope = "shell", name = "cat", description = "Displays the content of a file or URL.")
+public class CatAction extends AbstractAction {
+
+    @Option(name = "-n", aliases = {}, description = "Number the output lines, starting at 1.", required = false, multiValued = false)
+    private boolean displayLineNumbers;
+
+    @Argument(index = 0, name = "paths or urls", description = "A list of file paths or urls to display separated by whitespace (use - for STDIN)", required = true, multiValued = true)
+    private List<String> paths;
+
+    protected Object doExecute() throws Exception {
+        //
+        // Support "-" if length is one, and read from io.in
+        // This will help test command pipelines.
+        //
+        if (paths.size() == 1 && "-".equals(paths.get(0))) {
+            log.info("Printing STDIN");
+            cat(new BufferedReader(new InputStreamReader(System.in)));
+        }
+        else {
+            for (String filename : paths) {
+                BufferedReader reader;
+
+                // First try a URL
+                try {
+                    URL url = new URL(filename);
+                    log.info("Printing URL: " + url);
+                    reader = new BufferedReader(new InputStreamReader(url.openStream()));
+                }
+                catch (MalformedURLException ignore) {
+                    // They try a file
+                    File file = new File(filename);
+                    log.info("Printing file: " + file);
+                    reader = new BufferedReader(new FileReader(file));
+                }
+
+                try {
+                    cat(reader);
+                }
+                finally {
+                    try {
+                        reader.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private void cat(final BufferedReader reader) throws IOException
+    {
+        String line;
+        int lineno = 1;
+
+        while ((line = reader.readLine()) != null) {
+            if (displayLineNumbers) {
+                System.out.print(String.format("%6d  ", lineno++));
+            }
+            System.out.println(line);
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ClearAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ClearAction.java
new file mode 100644
index 0000000..2cebeb7
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ClearAction.java
@@ -0,0 +1,36 @@
+/*
+ * 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.karaf.shell.commands;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * A command to clear the console buffer
+ */
+@Command(scope = "shell", name = "clear", description = "Clears the console buffer.")
+public class ClearAction extends AbstractAction {
+
+	protected Object doExecute() throws Exception {
+		System.out.print("\33[2J");
+		System.out.flush();
+		System.out.print("\33[1;1H");
+		System.out.flush();
+		return null;
+	}	
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EachAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EachAction.java
new file mode 100644
index 0000000..8fb9b18
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EachAction.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.service.command.Function;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * Execute a closure on a list of arguments.
+ */
+@Command(scope = "shell", name = "each", description = "Execute a closure on a list of arguments.")
+public class EachAction extends AbstractAction {
+
+    @Argument(name = "values", index = 0, multiValued = false, required = true, description = "The collection of arguments to iterate on")
+    Collection<Object> values;
+
+    @Argument(name = "function", index = 1, multiValued = false, required = true, description = "The function to execute")
+    Function function;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        for (Object v : values) {
+            function.execute(session, Collections.singletonList(v));
+        }
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EchoAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EchoAction.java
new file mode 100644
index 0000000..69fe0e7
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EchoAction.java
@@ -0,0 +1,54 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.karaf.shell.console.AbstractAction;
+
+@Command(scope = "shell", name = "echo", description="Echoes or prints arguments to STDOUT.")
+public class EchoAction extends AbstractAction
+{
+    @Option(name = "-n", aliases = {}, description = "Do not print the trailing newline character", required = false, multiValued = false)
+    private boolean noTrailingNewline = false;
+
+    @Argument(index = 0, name = "arguments", description="Arguments to display separated by whitespaces", required = false, multiValued = true)
+    private List<String> args;
+
+    protected Object doExecute() throws Exception {
+        if (args != null) {
+            boolean first = true;
+            for (String arg : args) {
+                if (first) {
+                    first = false;
+                } else {
+                    System.out.print(" ");
+                }
+                System.out.print(arg);
+            }
+        }
+
+        if (!noTrailingNewline) {
+            System.out.println();
+        }
+
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ExecuteAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ExecuteAction.java
new file mode 100644
index 0000000..0772c46
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ExecuteAction.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.karaf.shell.commands;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.util.process.PumpStreamHandler;
+
+/**
+ * Execute system processes.
+ *
+ * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
+ */
+@Command(scope = "shell", name = "exec", description = "Executes system processes.")
+public class ExecuteAction extends AbstractAction {
+
+    @Argument(index = 0, name = "command", description = "Execution command with arguments", required = true, multiValued = true)
+    private List<String> args;
+
+    protected Object doExecute() throws Exception {
+        ProcessBuilder builder = new ProcessBuilder(args);
+
+        PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err, "Command" + args.toString());
+
+        log.info("Executing: {}", builder.command());
+        Process p = builder.start();
+
+        handler.attach(p);
+        handler.start();
+
+        log.debug("Waiting for process to exit...");
+
+        int status = p.waitFor();
+
+
+        log.info("Process exited w/status: {}", status);
+
+        handler.stop();
+
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/GrepAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/GrepAction.java
new file mode 100644
index 0000000..9414149
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/GrepAction.java
@@ -0,0 +1,209 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.fusesource.jansi.Ansi;
+
+
+@Command(scope = "shell", name="grep", description="Prints lines matching the given pattern.", detailedDescription="classpath:grep.txt")
+public class GrepAction extends AbstractAction {
+
+    public static enum ColorOption {
+        never,
+        always,
+        auto
+    }
+
+    @Argument(index = 0, name = "pattern", description = "Regular expression", required = true, multiValued = false)
+    private String regex;
+
+    @Option(name = "-n", aliases = { "--line-number" }, description = "Prefixes each line of output with the line number within its input file.", required = false, multiValued = false)
+    private boolean lineNumber;
+
+    @Option(name = "-v", aliases = { "--invert-match" }, description = "Inverts the sense of matching, to select non-matching lines.", required = false, multiValued = false)
+    private boolean invertMatch;
+
+    @Option(name = "-w", aliases = { "--word-regexp" }, description = "Selects only those lines containing matches that form whole " +
+                                                                      "words.  The test is that the matching substring must either be " +
+                                                                      "at  the beginning of the line, or preceded by a non-word constituent " +
+                                                                      "character.  Similarly, it must be either at the end of " +
+                                                                      "the line or followed by a non-word constituent character.  " +
+                                                                      "Word-constituent characters are letters, digits, and the underscore.", required = false, multiValued = false)
+    private boolean wordRegexp;
+
+    @Option(name = "-x", aliases = { "--line-regexp" }, description = "Selects only those matches that exactly match the whole line.", required = false, multiValued = false)
+    private boolean lineRegexp;
+
+    @Option(name = "-i", aliases = { "--ignore-case" }, description = "Ignores case distinctions in both the PATTERN and the input files.", required = false, multiValued = false)
+    private boolean ignoreCase;
+
+    @Option(name = "-c", aliases = { "--count" }, description = "only print a count of matching lines per FILE", required = false, multiValued = false)
+    private boolean count;
+
+    @Option(name = "--color", aliases = { "--colour" }, description = "use markers to distinguish the matching string. WHEN may be `always', `never' or `auto'", required = false, multiValued = false)
+    private ColorOption color = ColorOption.auto;
+
+    @Option(name = "-B", aliases = { "--before-context" }, description = "Print NUM lines of leading context before matching lines.  Places a line containing -- between contiguous groups of matches.", required = false, multiValued = false)
+    private int before = -1;
+
+    @Option(name = "-A", aliases = { "--after-context" }, description = "Print NUM lines of trailing context after matching lines.  Places a line containing -- between contiguous groups of matches.", required = false, multiValued = false)
+    private int after = -1;
+
+    @Option(name = "-C", aliases = { "--context" }, description = "Print NUM lines of output context.  Places a line containing -- between contiguous groups of matches.", required = false, multiValued = false)
+    private int context = 0;
+
+
+    protected Object doExecute() throws Exception {
+        if (after < 0) {
+            after = context;
+        }
+        if (before < 0) {
+            before = context;
+        }
+        List<String> lines = new ArrayList<String>();
+
+        String regexp = regex;
+        if (wordRegexp) {
+            regexp = "\\b" + regexp + "\\b";
+        }
+        if (lineRegexp) {
+            regexp = "^" + regexp + "$";
+        } else {
+            regexp = ".*" + regexp + ".*";
+        }
+        Pattern p;
+        Pattern p2;
+        if (ignoreCase) {
+            p = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE);
+            p2 = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+        } else {
+            p = Pattern.compile(regexp);
+            p2 = Pattern.compile(regex);
+        }
+        try {
+            boolean firstPrint = true;
+            int nb = 0;
+            int lineno = 1;
+            String line;
+            int lineMatch = 0;
+            BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+            while ((line = r.readLine()) != null) {
+                if (line.length() == 1 && line.charAt(0) == '\n') {
+                    break;
+                }
+                if (p.matcher(line).matches() ^ invertMatch) {
+                    Matcher matcher2 = p2.matcher(line);
+                    StringBuffer sb = new StringBuffer();
+                    while (matcher2.find()) {
+                        if (!invertMatch && color != ColorOption.never) {
+                            int index = matcher2.start(0);
+                            String prefix = line.substring(0,index);
+                            matcher2.appendReplacement(sb, Ansi.ansi()
+                                .bg(Ansi.Color.YELLOW)
+                                .fg(Ansi.Color.BLACK)
+                                .a(matcher2.group())
+                                 .reset()
+                                .a(lastEscapeSequence(prefix))
+                                .toString());
+                        } else {
+                            matcher2.appendReplacement(sb, matcher2.group());
+                        }
+                        nb++;
+                    }
+                    matcher2.appendTail(sb);
+                    sb.append(Ansi.ansi().reset().toString());
+                    if (!count && lineNumber) {
+                        lines.add(String.format("%6d  ", lineno) + sb.toString());
+                    } else {
+                        lines.add(sb.toString());
+                    }
+					lineMatch = lines.size();
+                } else {
+                    if (lineMatch != 0 & lineMatch + after + before <= lines.size()) {
+                        if (!count) {
+                            if (!firstPrint && before + after > 0) {
+                                System.out.println("--");
+                            } else {
+                                firstPrint = false;
+                            }
+                            for (int i = 0; i < lineMatch + after; i++) {
+                                System.out.println(lines.get(i));
+                            }
+                        }
+                        while (lines.size() > before) {
+                            lines.remove(0);
+                        }
+                        lineMatch = 0;
+                    }
+                    lines.add(line);
+                    while (lineMatch == 0 && lines.size() > before) {
+                        lines.remove(0);
+                    }
+                }
+                lineno++;
+            }
+            if (!count && lineMatch > 0) {
+                if (!firstPrint && before + after > 0) {
+                    System.out.println("--");
+                } else {
+                    firstPrint = false;
+                }
+                for (int i = 0; i < lineMatch + after && i < lines.size(); i++) {
+                    System.out.println(lines.get(i));
+                }
+            }
+            if (count) {
+                System.out.println(nb);
+            }
+        } catch (IOException e) {
+        }
+        return null;
+    }
+
+
+    /**
+     * Returns the last escape pattern found inside the String.
+     * This method is used to restore the formating after highliting the grep pattern.
+     * If no pattern is found just returns the reset String.
+     * @param str
+     * @return
+     */
+    private String lastEscapeSequence(String str) {
+        String escapeSequence=Ansi.ansi().reset().toString();
+        String escapePattern = "(\\\u001B\\[[0-9;]*[0-9]+m)+";
+        Pattern pattern =  Pattern.compile(escapePattern);
+        Matcher matcher = pattern.matcher(str);
+        while(matcher.find()) {
+            escapeSequence = matcher.group();
+        }
+        return escapeSequence;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java
new file mode 100644
index 0000000..19b598c
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.commands;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+
+@Command(scope = "shell", name = "head", description = "Displays the first lines of a file.")
+public class HeadAction extends AbstractAction {
+
+    private static final int DEFAULT_NUMBER_OF_LINES = 10;
+
+    @Option(name = "-n", aliases = {}, description = "The number of lines to display, starting at 1.", required = false, multiValued = false)
+    private int numberOfLines;
+
+    @Argument(index = 0, name = "paths or urls", description = "A list of file paths or urls to display separated by whitespaces.", required = false, multiValued = true)
+    private List<String> paths;
+
+    protected Object doExecute() throws Exception {
+        //If no paths provided assume standar input
+        if (paths == null || paths.size() == 0) {
+            if (log.isDebugEnabled()) {
+                log.debug("Heading STDIN");
+            }
+
+            head(new BufferedReader(new InputStreamReader(System.in)));
+        } else {
+            for (String filename : paths) {
+                BufferedReader reader;
+
+                // First try a URL
+                try {
+                    URL url = new URL(filename);
+                    if (log.isDebugEnabled()) {
+                        log.debug("Heading URL: " + url);
+                    }
+                    reader = new BufferedReader(new InputStreamReader(url.openStream()));
+                }
+                catch (MalformedURLException ignore) {
+                    // They try a file
+                    File file = new File(filename);
+                    if (log.isDebugEnabled()) {
+                        log.debug("Heading file: " + file);
+                    }
+                    reader = new BufferedReader(new FileReader(file));
+                }
+
+                try {
+                    head(reader);
+                }
+                finally {
+                    try {
+                        reader.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    private void head(final BufferedReader reader) throws IOException {
+        String line;
+        int lineno = 1;
+
+        if (numberOfLines < 1) {
+            numberOfLines = DEFAULT_NUMBER_OF_LINES;
+        }
+
+        while ((line = reader.readLine()) != null && lineno <= numberOfLines) {
+            System.out.println(line);
+            lineno++;
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HistoryAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HistoryAction.java
new file mode 100644
index 0000000..a3aeb3c
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HistoryAction.java
@@ -0,0 +1,45 @@
+/*
+ * 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.karaf.shell.commands;
+
+import jline.console.history.History;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.AbstractAction;
+import org.fusesource.jansi.Ansi;
+
+/**
+ * History command
+ */
+@Command(scope = "shell", name="history", description="Prints command history.")
+public class HistoryAction extends AbstractAction {
+
+    @Override
+    protected Object doExecute() throws Exception {
+        History history = (History) session.get(".jline.history");
+
+        for (History.Entry element : history) {
+            System.out.println(
+                    Ansi.ansi()
+                        .a("  ")
+                        .a(Ansi.Attribute.INTENSITY_BOLD).render("%3d", element.index()).a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                        .a("  ")
+                        .a(element.value())
+                        .toString());
+        }
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/IfAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/IfAction.java
new file mode 100644
index 0000000..3016294
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/IfAction.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.commands;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.service.command.Function;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * Execute a closure on a list of arguments.
+ */
+@Command(scope = "shell", name = "if", description = "If/Then/Else block.")
+public class IfAction extends AbstractAction {
+
+    @Argument(name = "condition", index = 0, multiValued = false, required = true, description = "The condition")
+    Function condition;
+
+    @Argument(name = "ifTrue", index = 1, multiValued = false, required = true, description = "The function to execute if the condition is true")
+    Function ifTrue;
+
+    @Argument(name = "ifFalse", index = 2, multiValued = false, required = false, description = "The function to execute if the condition is false")
+    Function ifFalse;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        Object result = condition.execute(session, null);
+        if (isTrue(result)) {
+            return ifTrue.execute(session, null);
+        } else {
+            if (ifFalse != null) {
+                return ifFalse.execute(session, null);
+            }
+        }
+        return null;
+    }
+
+    private boolean isTrue(Object result) {
+        if (result == null) {
+            return false;
+        }
+        if (result instanceof String && ((String) result).equals("")) {
+            return false;
+        }
+        if (result instanceof Boolean) {
+            return ((Boolean) result).booleanValue();
+        }
+        return true;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/InfoAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/InfoAction.java
new file mode 100644
index 0000000..691d526
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/InfoAction.java
@@ -0,0 +1,210 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.lang.management.ClassLoadingMXBean;
+import java.lang.management.GarbageCollectorMXBean;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MemoryMXBean;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+import java.lang.management.ThreadMXBean;
+import java.lang.reflect.Method;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.commands.info.InfoProvider;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.fusesource.jansi.Ansi;
+
+@Command(scope = "shell", name = "info", description = "Prints system information.")
+public class InfoAction extends OsgiCommandSupport {
+
+    private NumberFormat fmtI = new DecimalFormat("###,###", new DecimalFormatSymbols(Locale.ENGLISH));
+    private NumberFormat fmtD = new DecimalFormat("###,##0.000", new DecimalFormatSymbols(Locale.ENGLISH));
+
+    private List<InfoProvider> infoProviders = new LinkedList<InfoProvider>();
+
+    protected Object doExecute() throws Exception {
+        int maxNameLen;
+
+        RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
+        OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
+        ThreadMXBean threads = ManagementFactory.getThreadMXBean();
+        MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
+        ClassLoadingMXBean cl = ManagementFactory.getClassLoadingMXBean();
+
+        //
+        // print Karaf informations
+        //
+        maxNameLen = 25;
+        System.out.println("Karaf");
+        printValue("Karaf version", maxNameLen, System.getProperty("karaf.version"));
+        printValue("Karaf home", maxNameLen, System.getProperty("karaf.home"));
+        printValue("Karaf base", maxNameLen, System.getProperty("karaf.base"));
+        printValue("OSGi Framework", maxNameLen, bundleContext.getBundle(0).getSymbolicName() + " - " +
+                bundleContext.getBundle(0).getVersion());
+        System.out.println();
+
+        System.out.println("JVM");
+        printValue("Java Virtual Machine", maxNameLen, runtime.getVmName() + " version " + runtime.getVmVersion());
+        printValue("Version", maxNameLen, System.getProperty("java.version"));
+        printValue("Vendor", maxNameLen, runtime.getVmVendor());
+        printValue("Uptime", maxNameLen, printDuration(runtime.getUptime()));
+        try {
+            printValue("Process CPU time", maxNameLen, printDuration(getSunOsValueAsLong(os, "getProcessCpuTime") / 1000000));
+        } catch (Throwable t) {
+        }
+        printValue("Total compile time", maxNameLen, printDuration(ManagementFactory.getCompilationMXBean().getTotalCompilationTime()));
+
+        System.out.println("Threads");
+        printValue("Live threads", maxNameLen, Integer.toString(threads.getThreadCount()));
+        printValue("Daemon threads", maxNameLen, Integer.toString(threads.getDaemonThreadCount()));
+        printValue("Peak", maxNameLen, Integer.toString(threads.getPeakThreadCount()));
+        printValue("Total started", maxNameLen, Long.toString(threads.getTotalStartedThreadCount()));
+
+        System.out.println("Memory");
+        printValue("Current heap size", maxNameLen, printSizeInKb(mem.getHeapMemoryUsage().getUsed()));
+        printValue("Maximum heap size", maxNameLen, printSizeInKb(mem.getHeapMemoryUsage().getMax()));
+        printValue("Committed heap size", maxNameLen, printSizeInKb(mem.getHeapMemoryUsage().getCommitted()));
+        printValue("Pending objects", maxNameLen, Integer.toString(mem.getObjectPendingFinalizationCount()));
+        for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {
+            String val = "Name = '" + gc.getName() + "', Collections = " + gc.getCollectionCount() + ", Time = " + printDuration(gc.getCollectionTime());
+            printValue("Garbage collector", maxNameLen, val);
+        }
+
+        System.out.println("Classes");
+        printValue("Current classes loaded", maxNameLen, printLong(cl.getLoadedClassCount()));
+        printValue("Total classes loaded", maxNameLen, printLong(cl.getTotalLoadedClassCount()));
+        printValue("Total classes unloaded", maxNameLen, printLong(cl.getUnloadedClassCount()));
+
+        System.out.println("Operating system");
+        printValue("Name", maxNameLen, os.getName() + " version " + os.getVersion());
+        printValue("Architecture", maxNameLen, os.getArch());
+        printValue("Processors", maxNameLen, Integer.toString(os.getAvailableProcessors()));
+        try {
+            printValue("Total physical memory", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getTotalPhysicalMemorySize")));
+            printValue("Free physical memory", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getFreePhysicalMemorySize")));
+            printValue("Committed virtual memory", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getCommittedVirtualMemorySize")));
+            printValue("Total swap space", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getTotalSwapSpaceSize")));
+            printValue("Free swap space", maxNameLen, printSizeInKb(getSunOsValueAsLong(os, "getFreeSwapSpaceSize")));
+        } catch (Throwable t) {
+        }
+
+        //Display Information from external information providers.
+        Map<String, Map<Object, Object>> properties = new HashMap<String, Map<Object, Object>>();
+        if (infoProviders != null) {
+
+            // dump all properties to Map, KARAF-425
+            for (InfoProvider provider : infoProviders) {
+                if (!properties.containsKey(provider.getName())) {
+                    properties.put(provider.getName(), new Properties());
+                }
+                properties.get(provider.getName()).putAll(provider.getProperties());
+            }
+
+            for (String section : properties.keySet()) {
+                System.out.println(section);
+
+                for (Object key : properties.get(section).keySet()) {
+                    printValue(String.valueOf(key), maxNameLen, String.valueOf(properties.get(section).get(key)));
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private long getSunOsValueAsLong(OperatingSystemMXBean os, String name) throws Exception {
+        Method mth = os.getClass().getMethod(name);
+        return (Long) mth.invoke(os);
+    }
+
+    private String printLong(long i) {
+        return fmtI.format(i);
+    }
+
+    private String printSizeInKb(double size) {
+        return fmtI.format((long) (size / 1024)) + " kbytes";
+    }
+
+    private String printDuration(double uptime) {
+        uptime /= 1000;
+        if (uptime < 60) {
+            return fmtD.format(uptime) + " seconds";
+        }
+        uptime /= 60;
+        if (uptime < 60) {
+            long minutes = (long) uptime;
+            String s = fmtI.format(minutes) + (minutes > 1 ? " minutes" : " minute");
+            return s;
+        }
+        uptime /= 60;
+        if (uptime < 24) {
+            long hours = (long) uptime;
+            long minutes = (long) ((uptime - hours) * 60);
+            String s = fmtI.format(hours) + (hours > 1 ? " hours" : " hour");
+            if (minutes != 0) {
+                s += " " + fmtI.format(minutes) + (minutes > 1 ? " minutes" : "minute");
+            }
+            return s;
+        }
+        uptime /= 24;
+        long days = (long) uptime;
+        long hours = (long) ((uptime - days) * 24);
+        String s = fmtI.format(days) + (days > 1 ? " days" : " day");
+        if (hours != 0) {
+            s += " " + fmtI.format(hours) + (hours > 1 ? " hours" : "hour");
+        }
+        return s;
+    }
+
+    void printSysValue(String prop, int pad) {
+        printValue(prop, pad, System.getProperty(prop));
+    }
+
+    void printValue(String name, int pad, String value) {
+        System.out.println(Ansi.ansi().a("  ")
+                .a(Ansi.Attribute.INTENSITY_BOLD).a(name).a(spaces(pad - name.length())).a(Ansi.Attribute.RESET)
+                .a("   ").a(value).toString());
+    }
+
+    String spaces(int nb) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < nb; i++) {
+            sb.append(' ');
+        }
+        return sb.toString();
+    }
+
+    public List<InfoProvider> getInfoProviders() {
+        return infoProviders;
+    }
+
+    public void setInfoProviders(List<InfoProvider> infoProviders) {
+        this.infoProviders = infoProviders;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/JavaAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/JavaAction.java
new file mode 100644
index 0000000..80ffac6
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/JavaAction.java
@@ -0,0 +1,74 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * Execute a Java standard application.
+ *
+ * <p>By default looks for static main(String[]) to execute, but
+ * you can specify a different static method that takes a String[]
+ * to execute instead.
+ *
+ * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
+ */
+@Command(scope = "shell", name = "java", description = "Executes a Java standard application.")
+public class JavaAction extends AbstractAction {
+
+    @Option(name = "-m", aliases = {"--method"}, description = "Invoke a named method", required = false, multiValued = false)
+    private String methodName = "main";
+
+    @Argument(index = 0, name = "className", description="The name of the class to invoke", required = true, multiValued = false)
+    private String className;
+
+    @Argument(index = 1, name = "arguments", description="Arguments to pass to the method of the given class", required = false, multiValued = false)
+    private List<String> args;
+
+    protected Object doExecute() throws Exception {
+        boolean info = log.isInfoEnabled();
+
+        Class type = Thread.currentThread().getContextClassLoader().loadClass(className);
+        if (info) {
+            log.info("Using type: " + type);
+        }
+
+        Method method = type.getMethod(methodName, String[].class);
+        if (info) {
+            log.info("Using method: " + method);
+        }
+
+        if (info) {
+            log.info("Invoking w/arguments: {}", args);
+        }
+
+        Object result = method.invoke(null, args);
+
+        if (info) {
+            log.info("Result: " + result);
+        }
+
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/LogoutAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/LogoutAction.java
new file mode 100644
index 0000000..b3738fc
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/LogoutAction.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.shell.commands;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.shell.console.CloseShellException;
+
+@Command(scope = "shell", name = "logout", description = "Disconnects shell from current session.")
+public class LogoutAction extends AbstractAction {
+
+    protected Object doExecute() throws Exception {
+        log.info("Disconnecting from current session...");
+        throw new CloseShellException();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
new file mode 100644
index 0000000..192b0ff
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.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.karaf.shell.commands;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+
+@Command(scope = "shell", name = "more", description = "File pager.")
+public class MoreAction extends AbstractAction {
+
+    @Option(name = "--lines", description = "stop after N lines")
+    int lines;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        Terminal term = (Terminal) session.get(".jline.terminal");
+        if (term == null || !isTty(System.out)) {
+            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                System.out.println(line);
+            }
+            return null;
+        } else {
+            boolean echo = term.isEchoEnabled();
+            term.setEchoEnabled(false);
+            try {
+                if (lines == 0) {
+                    lines = term.getHeight();
+                }
+                LineSplitter reader = new LineSplitter(new BufferedReader(new InputStreamReader(System.in)), term.getWidth());
+                int count = 0;
+                int c;
+                do {
+                    do {
+                        String line;
+                        if ((line = reader.readLine()) == null) {
+                            return null;
+                        }
+                        System.out.println(line);
+                    } while (++count < lines - 2);
+                    c = -1;
+                    while (c == -1) {
+                        System.out.flush();
+                        System.out.print("--More--");
+                        System.out.flush();
+                        c = session.getKeyboard().read();
+                        switch (c) {
+                            case 'q':
+                            case -1:
+                                c = 'q';
+                                break;
+                            case '\r':
+                            case '\n':
+                            case 14: // Down arrow
+                                count--;
+                                System.out.print("\r          \r");
+                                break;
+                            case ' ':
+                                count = 0;
+                                System.out.print("\r          \r");
+                                break;
+                            case 16: // Up arrow
+                                // fall through
+                            default:
+                                c = -1;
+                                System.out.print("\r          \r");
+                                break;
+                        }
+                        if (c == 'q') {
+                            break;
+                        }
+                    }
+                } while (c != 'q');
+                return null;
+            } finally {
+                term.setEchoEnabled(echo);
+            }
+        }
+    }
+
+    public static class LineSplitter {
+
+        private final BufferedReader reader;
+        private final int width;
+        private final List<String> lines = new LinkedList<String>();
+
+        public LineSplitter(BufferedReader reader, int width) {
+            this.reader = reader;
+            this.width = width;
+        }
+
+        public String readLine() throws IOException {
+            if (lines.isEmpty()) {
+                String str = reader.readLine();
+                if (str == null) {
+                    return null;
+                }
+                while (str.length() > width) {
+                    lines.add(str.substring(0, width));
+                    str = str.substring(width);
+                }
+                lines.add(str);
+            }
+            return lines.remove(0);
+        }
+    }
+
+    protected boolean isTty(OutputStream out) {
+        try {
+            Method mth = out.getClass().getDeclaredMethod("getCurrent");
+            mth.setAccessible(true);
+            Object current = mth.invoke(out);
+            return current == session.getConsole();
+        } catch (Throwable t) {
+            return false;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/NewAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/NewAction.java
new file mode 100644
index 0000000..256a5cd
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/NewAction.java
@@ -0,0 +1,321 @@
+/*
+ * 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.karaf.shell.commands;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.converter.DefaultConverter;
+import org.apache.felix.gogo.commands.converter.ReifiedType;
+import org.apache.felix.gogo.commands.converter.GenericType;
+import org.apache.karaf.shell.console.AbstractAction;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Instanciate a new object
+ */
+@Command(scope = "shell", name = "new", description = "Creates a new java object.")
+public class NewAction extends AbstractAction {
+
+    @Argument(name = "class", index = 0, multiValued = false, required = true, description = "The object class")
+    Class clazz;
+
+    @Argument(name = "args", index = 1, multiValued = true, required = false, description = "Constructor arguments")
+    List<Object> args;
+
+    boolean reorderArguments;
+
+    protected DefaultConverter converter = new DefaultConverter(getClass().getClassLoader());
+
+    @Override
+    protected Object doExecute() throws Exception {
+        if (args == null) {
+            args = Collections.emptyList();
+        }
+        // Handle arrays
+        if (clazz.isArray()) {
+            Object obj = Array.newInstance(clazz.getComponentType(), args.size());
+            for (int i = 0; i < args.size(); i++) {
+                Array.set(obj, i, convert(args.get(i), clazz.getComponentType()));
+            }
+            return obj;
+        }
+        // Map of matching constructors
+        Map<Constructor, List<Object>> matches = findMatchingConstructors(clazz, args, Arrays.asList(new ReifiedType[args.size()]));
+        if (matches.size() == 1) {
+            try {
+                Map.Entry<Constructor, List<Object>> match = matches.entrySet().iterator().next();
+                return newInstance(match.getKey(), match.getValue().toArray());
+            } catch (Throwable e) {
+                throw new Exception("Error when instanciating object of class " + clazz.getName(), getRealCause(e));
+            }
+        } else if (matches.size() == 0) {
+            throw new Exception("Unable to find a matching constructor on class " + clazz.getName() + " for arguments " + args + " when instanciating object.");
+        } else {
+            throw new Exception("Multiple matching constructors found on class " + clazz.getName() + " for arguments " + args + " when instanciating object: " + matches.keySet());
+        }
+    }
+
+
+    //
+    // Code below comes from Aries blueprint implementation.  Given this code is not available
+    // from a public API it has been copied here.
+    //
+
+    private Object newInstance(Constructor constructor, Object... args) throws Exception {
+        return constructor.newInstance(args);
+    }
+
+    private Map<Constructor, List<Object>> findMatchingConstructors(Class type, List<Object> args, List<ReifiedType> types) {
+        Map<Constructor, List<Object>> matches = new HashMap<Constructor, List<Object>>();
+        // Get constructors
+        List<Constructor> constructors = new ArrayList<Constructor>(Arrays.asList(type.getConstructors()));
+        // Discard any signature with wrong cardinality
+        for (Iterator<Constructor> it = constructors.iterator(); it.hasNext();) {
+            if (it.next().getParameterTypes().length != args.size()) {
+                it.remove();
+            }
+        }
+        // Find a direct match with assignment
+        if (matches.size() != 1) {
+            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
+            for (Constructor cns : constructors) {
+                boolean found = true;
+                List<Object> match = new ArrayList<Object>();
+                for (int i = 0; i < args.size(); i++) {
+                    ReifiedType argType = new GenericType(cns.getGenericParameterTypes()[i]);
+                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
+                        found = false;
+                        break;
+                    }
+                    if (!isAssignable(args.get(i), argType)) {
+                        found = false;
+                        break;
+                    }
+                    try {
+                        match.add(convert(args.get(i), cns.getGenericParameterTypes()[i]));
+                    } catch (Throwable t) {
+                        found = false;
+                        break;
+                    }
+                }
+                if (found) {
+                    nmatches.put(cns, match);
+                }
+            }
+            if (nmatches.size() > 0) {
+                matches = nmatches;
+            }
+        }
+        // Find a direct match with conversion
+        if (matches.size() != 1) {
+            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
+            for (Constructor cns : constructors) {
+                boolean found = true;
+                List<Object> match = new ArrayList<Object>();
+                for (int i = 0; i < args.size(); i++) {
+                    ReifiedType argType = new GenericType(cns.getGenericParameterTypes()[i]);
+                    if (types.get(i) != null && !argType.getRawClass().equals(types.get(i).getRawClass())) {
+                        found = false;
+                        break;
+                    }
+                    try {
+                        Object val = convert(args.get(i), argType);
+                        match.add(val);
+                    } catch (Throwable t) {
+                        found = false;
+                        break;
+                    }
+                }
+                if (found) {
+                    nmatches.put(cns, match);
+                }
+            }
+            if (nmatches.size() > 0) {
+                matches = nmatches;
+            }
+        }
+        // Start reordering with assignment
+        if (matches.size() != 1 && reorderArguments && args.size() > 1) {
+            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
+            for (Constructor cns : constructors) {
+                ArgumentMatcher matcher = new ArgumentMatcher(cns.getGenericParameterTypes(), false);
+                List<Object> match = matcher.match(args, types);
+                if (match != null) {
+                    nmatches.put(cns, match);
+                }
+            }
+            if (nmatches.size() > 0) {
+                matches = nmatches;
+            }
+        }
+        // Start reordering with conversion
+        if (matches.size() != 1 && reorderArguments && args.size() > 1) {
+            Map<Constructor, List<Object>> nmatches = new HashMap<Constructor, List<Object>>();
+            for (Constructor cns : constructors) {
+                ArgumentMatcher matcher = new ArgumentMatcher(cns.getGenericParameterTypes(), true);
+                List<Object> match = matcher.match(args, types);
+                if (match != null) {
+                    nmatches.put(cns, match);
+                }
+            }
+            if (nmatches.size() > 0) {
+                matches = nmatches;
+            }
+        }
+        return matches;
+    }
+
+    protected Object convert(Object obj, Type type) throws Exception {
+        return converter.convert(obj, new GenericType(type));
+    }
+
+    protected Object convert(Object obj, ReifiedType type) throws Exception {
+        return converter.convert(obj, type);
+    }
+
+    public static boolean isAssignable(Object source, ReifiedType target) {
+        return source == null
+                || (target.size() == 0
+                    && unwrap(target.getRawClass()).isAssignableFrom(unwrap(source.getClass())));
+    }
+
+    private static Class unwrap(Class c) {
+        Class u = primitives.get(c);
+        return u != null ? u : c;
+    }
+
+    private static final Map<Class, Class> primitives;
+    static {
+        primitives = new HashMap<Class, Class>();
+        primitives.put(byte.class, Byte.class);
+        primitives.put(short.class, Short.class);
+        primitives.put(char.class, Character.class);
+        primitives.put(int.class, Integer.class);
+        primitives.put(long.class, Long.class);
+        primitives.put(float.class, Float.class);
+        primitives.put(double.class, Double.class);
+        primitives.put(boolean.class, Boolean.class);
+    }
+
+
+    private static Object UNMATCHED = new Object();
+
+    private class ArgumentMatcher {
+
+        private List<TypeEntry> entries;
+        private boolean convert;
+
+        public ArgumentMatcher(Type[] types, boolean convert) {
+            entries = new ArrayList<TypeEntry>();
+            for (Type type : types) {
+                entries.add(new TypeEntry(new GenericType(type)));
+            }
+            this.convert = convert;
+        }
+
+        public List<Object> match(List<Object> arguments, List<ReifiedType> forcedTypes) {
+            if (find(arguments, forcedTypes)) {
+                return getArguments();
+            }
+            return null;
+        }
+
+        private List<Object> getArguments() {
+            List<Object> list = new ArrayList<Object>();
+            for (TypeEntry entry : entries) {
+                if (entry.argument == UNMATCHED) {
+                    throw new RuntimeException("There are unmatched types");
+                } else {
+                    list.add(entry.argument);
+                }
+            }
+            return list;
+        }
+
+        private boolean find(List<Object> arguments, List<ReifiedType> forcedTypes) {
+            if (entries.size() == arguments.size()) {
+                boolean matched = true;
+                for (int i = 0; i < arguments.size() && matched; i++) {
+                    matched = find(arguments.get(i), forcedTypes.get(i));
+                }
+                return matched;
+            }
+            return false;
+        }
+
+        private boolean find(Object arg, ReifiedType forcedType) {
+            for (TypeEntry entry : entries) {
+                Object val = arg;
+                if (entry.argument != UNMATCHED) {
+                    continue;
+                }
+                if (forcedType != null) {
+                    if (!forcedType.equals(entry.type)) {
+                        continue;
+                    }
+                } else if (arg != null) {
+                    if (convert) {
+                        try {
+                            // TODO: call canConvert instead of convert()
+                            val = convert(arg, entry.type);
+                        } catch (Throwable t) {
+                            continue;
+                        }
+                    } else {
+                        if (!isAssignable(arg, entry.type)) {
+                            continue;
+                        }
+                    }
+                }
+                entry.argument = val;
+                return true;
+            }
+            return false;
+        }
+
+    }
+
+    private static class TypeEntry {
+
+        private final ReifiedType type;
+        private Object argument;
+
+        public TypeEntry(ReifiedType type) {
+            this.type = type;
+            this.argument = UNMATCHED;
+        }
+
+    }
+
+    public static Throwable getRealCause(Throwable t) {
+        if (t instanceof InvocationTargetException && t.getCause() != null) {
+            return t.getCause();
+        }
+        return t;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/PrintfAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/PrintfAction.java
new file mode 100644
index 0000000..3e95dc9
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/PrintfAction.java
@@ -0,0 +1,38 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.util.Collection;
+
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "shell", name = "printf", description = "Formats and prints arguments.")
+public class PrintfAction extends AbstractAction {
+
+    @Argument(index = 0, name = "format", description = "The format pattern to use", required = true, multiValued = false)
+    private String format;
+
+    @Argument(index = 1, name = "arguments", description = "The arguments for the given format pattern", required = true, multiValued = true)
+    private Collection<Object> arguments = null;
+
+    protected Object doExecute() throws Exception {
+        System.out.printf(format, arguments.toArray());
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SleepAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SleepAction.java
new file mode 100644
index 0000000..9b200c4
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SleepAction.java
@@ -0,0 +1,51 @@
+/*
+ * 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.karaf.shell.commands;
+
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "shell", name = "sleep", description = "Sleeps for a bit then wakes up.")
+public class SleepAction extends AbstractAction {
+
+    @Argument(index = 0, name = "duration", description = "The amount of time to sleep. The default time unit is millisecond, use -s option to use second instead.", required = true, multiValued = false)
+    private long time = -1;
+    
+    @Option(name = "-s", aliases = { "--second" }, description = "Use a duration time in seconds instead of milliseconds.", required = false, multiValued = false)
+    private boolean second = false;
+
+    protected Object doExecute() throws Exception {
+        if (second) {
+            log.info("Sleeping for {} second(s)", time);
+            time = time * 1000;
+        } else {
+            log.info("Sleeping for {} millisecond(s)", time);
+        }
+
+        try {
+            Thread.sleep(time);
+        }
+        catch (InterruptedException ignore) {
+            log.debug("Sleep was interrupted... :-(");
+        }
+
+        log.info("Awake now");
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SortAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SortAction.java
new file mode 100644
index 0000000..7abe5a2
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SortAction.java
@@ -0,0 +1,401 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * Sort lines of text
+ *
+ * @version $Rev: 722776 $ $Date: 2008-12-03 05:59:59 +0100 (Wed, 03 Dec 2008) $
+ */
+@Command(scope = "shell", name = "sort", description = "Writes sorted concatenation of all files to standard output.")
+public class SortAction extends AbstractAction {
+
+    @Option(name = "-f", aliases = { "-ignore-case" }, description = "fold lower case to upper case characters", required = false, multiValued = false)
+    private boolean caseInsensitive;
+
+    @Option(name = "-r", aliases = { "--reverse" }, description = "reverse the result of comparisons", required = false, multiValued = false)
+    private boolean reverse;
+
+    @Option(name = "-u", aliases = { "--unique" }, description = "output only the first of an equal run", required = false, multiValued = false)
+    private boolean unique;
+
+    @Option(name = "-t", aliases = { "--field-separator" }, description = "use SEP instead of non-blank to blank transition", required = false, multiValued = false)
+    private String separator;
+
+    @Option(name = "-b", aliases = { "--ignore-leading-blanks" }, description = "ignore leading blanks", required = false, multiValued = false)
+    private boolean ignoreBlanks;
+
+    @Option(name = "-k", aliases = { "--key" }, description = "Fields to use for sorting separated by whitespaces", required = false, multiValued = true)
+    private List<String> sortFields;
+
+    @Option(name = "-n", aliases = { "--numeric-sort" }, description = "compare according to string numerical value", required = false, multiValued = false)
+    private boolean numeric;
+
+    @Argument(index = 0, name = "files", description = "A list of files separated by whitespaces", required = false, multiValued = true)
+    private List<String> paths;
+
+
+    public Object doExecute() throws Exception {
+        if (paths != null && paths.size() > 0) {
+            List<String> lines = new ArrayList<String>();
+            for (String filename : paths) {
+                BufferedReader reader;
+
+                // First try a URL
+                try {
+                    URL url = new URL(filename);
+                    log.info("Printing URL: " + url);
+                    reader = new BufferedReader(new InputStreamReader(url.openStream()));
+                }
+                catch (MalformedURLException ignore) {
+                    // They try a file
+                    File file = new File(filename);
+                    log.info("Printing file: " + file);
+                    reader = new BufferedReader(new FileReader(file));
+                }
+
+                try {
+                    read(reader, lines);
+                }
+                finally {
+                    try {
+                        reader.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+                }
+            }
+            sort(lines, System.out);
+        }
+        else {
+            sort(System.in, System.out);
+        }
+        return null;
+    }
+
+    protected void read(BufferedReader r, List<String> lines) throws Exception {
+        for (String s = r.readLine(); s != null; s = r.readLine()) {
+            lines.add(s);
+        }
+    }
+
+    protected void sort(InputStream input, PrintStream out) throws Exception {
+        List<String> strings = new ArrayList<String>();
+        BufferedReader r = new BufferedReader(new InputStreamReader(input));
+        read(r, strings);
+        sort(strings, out);
+    }
+
+    protected void sort(List<String> strings, PrintStream out) throws Exception {
+        char sep = (separator == null || separator.length() == 0) ? '\0' : separator.charAt(0);
+        Collections.sort(strings, new SortComparator(caseInsensitive, reverse, ignoreBlanks, numeric, sep, sortFields));
+        String last = null;
+        for (String s : strings) {
+            if (last == null) {
+                last = s;
+            } else if (!unique || !s.equals(last)) {
+                out.println(s);
+            }
+        }
+    }
+
+    public static class SortComparator implements Comparator<String> {
+
+        private boolean caseInsensitive;
+        private boolean reverse;
+        private boolean ignoreBlanks;
+        private boolean numeric;
+        private char separator;
+        private List<Key> sortKeys;
+
+        private static Pattern fpPattern;
+        static {
+            final String Digits     = "(\\p{Digit}+)";
+            final String HexDigits  = "(\\p{XDigit}+)";
+            final String Exp        = "[eE][+-]?" + Digits;
+            final String fpRegex    = "([\\x00-\\x20]*[+-]?(NaN|Infinity|(((" + Digits + "(\\.)?(" + Digits + "?)(" + Exp + ")?)|(\\.(" + Digits + ")(" + Exp + ")?)|(((0[xX]" + HexDigits + "(\\.)?)|(0[xX]" + HexDigits + "?(\\.)" + HexDigits + "))[pP][+-]?" + Digits + "))" + "[fFdD]?))[\\x00-\\x20]*)(.*)";
+            fpPattern = Pattern.compile(fpRegex);
+        }
+
+        public SortComparator(boolean caseInsensitive,
+                              boolean reverse,
+                              boolean ignoreBlanks,
+                              boolean numeric,
+                              char separator,
+                              List<String> sortFields) {
+            this.caseInsensitive = caseInsensitive;
+            this.reverse = reverse;
+            this.separator = separator;
+            this.ignoreBlanks = ignoreBlanks;
+            this.numeric = numeric;
+            if (sortFields == null || sortFields.size() == 0) {
+                sortFields = new ArrayList<String>();
+                sortFields.add("1");
+            }
+            sortKeys = new ArrayList<Key>();
+            for (String f : sortFields) {
+                sortKeys.add(new Key(f));
+            }
+        }
+
+        public int compare(String o1, String o2) {
+            int res = 0;
+
+            List<Integer> fi1 = getFieldIndexes(o1);
+            List<Integer> fi2 = getFieldIndexes(o2);
+            for (Key key : sortKeys) {
+                int[] k1 = getSortKey(o1, fi1, key);
+                int[] k2 = getSortKey(o2, fi2, key);
+                if (key.numeric) {
+                    Double d1 = getDouble(o1, k1[0], k1[1]);
+                    Double d2 = getDouble(o2, k2[0], k2[1]);
+                    res = d1.compareTo(d2);
+                } else {
+                    res = compareRegion(o1, k1[0], k1[1], o2, k2[0], k2[1], key.caseInsensitive);
+                }
+                if (res != 0) {
+                    if (key.reverse) {
+                        res = - res;
+                    }
+                    break;
+                }
+            }
+            return res;
+        }
+
+        protected Double getDouble(String s, int start, int end) {
+            Matcher m = fpPattern.matcher(s.substring(start, end));
+            m.find();
+            return new Double(s.substring(0, m.end(1)));
+        }
+
+        protected int compareRegion(String s1, int start1, int end1, String s2, int start2, int end2, boolean caseInsensitive) {
+            int n1 = end1, n2 = end2;
+            for (int i1 = start1, i2 = start2; i1 < end1 && i2 < n2; i1++, i2++) {
+                char c1 = s1.charAt(i1);
+                char c2 = s2.charAt(i2);
+                if (c1 != c2) {
+                    if (caseInsensitive) {
+                        c1 = Character.toUpperCase(c1);
+                        c2 = Character.toUpperCase(c2);
+                        if (c1 != c2) {
+                            c1 = Character.toLowerCase(c1);
+                            c2 = Character.toLowerCase(c2);
+                            if (c1 != c2) {
+                                return c1 - c2;
+                            }
+                        }
+                    } else {
+                        return c1 - c2;
+                    }
+                }
+            }
+            return n1 - n2;
+        }
+
+        protected int[] getSortKey(String str, List<Integer> fields, Key key) {
+            int start;
+            int end;
+            if (key.startField * 2 <= fields.size()) {
+                start = fields.get((key.startField - 1) * 2);
+                if (key.ignoreBlanksStart) {
+                    while (start < fields.get((key.startField - 1) * 2 + 1) && Character.isWhitespace(str.charAt(start))) {
+                        start++;
+                    }
+                }
+                if (key.startChar > 0) {
+                    start = Math.min(start + key.startChar - 1, fields.get((key.startField - 1) * 2 + 1));
+                }
+            } else {
+                start = 0;
+            }
+            if (key.endField > 0 && key.endField * 2 <= fields.size()) {
+                end =  fields.get((key.endField - 1) * 2);
+                if (key.ignoreBlanksEnd) {
+                    while (end < fields.get((key.endField - 1) * 2 + 1) && Character.isWhitespace(str.charAt(end))) {
+                        end++;
+                    }
+                }
+                if (key.endChar > 0) {
+                    end = Math.min(end + key.endChar - 1, fields.get((key.endField - 1) * 2 + 1));
+                }
+            } else {
+                end = str.length();
+            }
+            return new int[] { start, end };
+        }
+
+        protected List<Integer> getFieldIndexes(String o) {
+            List<Integer> fields = new ArrayList<Integer>();
+            if (o.length() > 0) {
+                if (separator == '\0') {
+                    int i = 0;
+                    fields.add(0);
+                    for (int idx = 1; idx < o.length(); idx++) {
+                        if (Character.isWhitespace(o.charAt(idx)) && !Character.isWhitespace(o.charAt(idx - 1))) {
+                            fields.add(idx - 1);
+                            fields.add(idx);
+                        }
+                    }
+                    fields.add(o.length() - 1);
+                } else {
+                    int last = -1;
+                    for (int idx = o.indexOf(separator); idx >= 0; idx = o.indexOf(separator, idx + 1)) {
+                        if (last >= 0) {
+                            fields.add(last);
+                            fields.add(idx - 1);
+                        } else if (idx > 0) {
+                            fields.add(0);
+                            fields.add(idx - 1);
+                        }
+                        last = idx + 1;
+                    }
+                    if (last < o.length()) {
+                        fields.add(last < 0 ? 0 : last);
+                        fields.add(o.length() - 1);
+                    }
+                }
+            }
+            return fields;
+        }
+
+        public class Key {
+            int startField;
+            int startChar;
+            int endField;
+            int endChar;
+            boolean ignoreBlanksStart;
+            boolean ignoreBlanksEnd;
+            boolean caseInsensitive;
+            boolean reverse;
+            boolean numeric;
+
+            public Key(String str) {
+                boolean modifiers = false;
+                boolean startPart = true;
+                boolean inField = true;
+                boolean inChar = false;
+                for (char c : str.toCharArray()) {
+                    switch (c) {
+                        case '0':
+                        case '1':
+                        case '2':
+                        case '3':
+                        case '4':
+                        case '5':
+                        case '6':
+                        case '7':
+                        case '8':
+                        case '9':
+                            if (!inField && !inChar) {
+                                throw new IllegalArgumentException("Bad field syntax: " + str);
+                            }
+                            if (startPart) {
+                                if (inChar) {
+                                    startChar = startChar * 10 + (c - '0');
+                                } else {
+                                    startField = startField * 10 + (c - '0');
+                                }
+                            } else {
+                                if (inChar) {
+                                    endChar = endChar * 10 + (c - '0');
+                                } else {
+                                    endField = endField * 10 + (c - '0');
+                                }
+                            }
+                            break;
+                        case '.':
+                            if (!inField) {
+                                throw new IllegalArgumentException("Bad field syntax: " + str);
+                            }
+                            inField = false;
+                            inChar = true;
+                            break;
+                        case 'n':
+                            inField = false;
+                            inChar = false;
+                            modifiers = true;
+                            numeric = true;
+                            break;
+                        case 'f':
+                            inField = false;
+                            inChar = false;
+                            modifiers = true;
+                            caseInsensitive = true;
+                            break;
+                        case 'r':
+                            inField = false;
+                            inChar = false;
+                            modifiers = true;
+                            reverse = true;
+                            break;
+                        case 'b':
+                            inField = false;
+                            inChar = false;
+                            modifiers = true;
+                            if (startPart) {
+                                ignoreBlanksStart = true;
+                            } else {
+                                ignoreBlanksEnd = true;
+                            }
+                            break;
+                        case ',':
+                            inField = true;
+                            inChar = false;
+                            startPart = false;
+                            break;
+                        default:
+                            throw new IllegalArgumentException("Bad field syntax: " + str);
+                    }
+                }
+                if (!modifiers) {
+                    ignoreBlanksStart = ignoreBlanksEnd = SortComparator.this.ignoreBlanks;
+                    reverse = SortComparator.this.reverse;
+                    caseInsensitive = SortComparator.this.caseInsensitive;
+                    numeric = SortComparator.this.numeric;
+                }
+                if (startField < 1) {
+                    throw new IllegalArgumentException("Bad field syntax: " + str);
+                }
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SourceAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SourceAction.java
new file mode 100644
index 0000000..0c8eb6c
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SourceAction.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.karaf.shell.commands;
+
+import java.io.BufferedReader;
+import java.io.CharArrayWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.AbstractAction;
+
+/**
+ * TODO
+ */
+@Command(scope = "shell", name = "source", description = "Run a script")
+public class SourceAction extends AbstractAction {
+
+    @Argument(index = 0, name = "script", description = "A URI pointing to the script", required = true, multiValued = false)
+    private String script;
+
+    @Argument(index = 1, name = "args", description = "Arguments for the script", required = false, multiValued = true)
+    private List<Object> args;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        BufferedReader reader = null;
+        Object arg0 = session.get("0");
+        try {
+            // First try a URL
+            try {
+                URL url = new URL(script);
+                log.info("Printing URL: " + url);
+                reader = new BufferedReader(new InputStreamReader(url.openStream()));
+            }
+            catch (MalformedURLException ignore) {
+                // They try a file
+                File file = new File(script);
+                log.info("Printing file: " + file);
+                reader = new BufferedReader(new FileReader(file));
+            }
+
+            CharArrayWriter w = new CharArrayWriter();
+            int n;
+            char[] buf = new char[8192];
+            while ((n = reader.read(buf)) > 0) {
+                w.write(buf, 0, n);
+            }
+
+            for (int i = 0; args != null && i < args.size(); i++) {
+                session.put( Integer.toString(i+1), args.get(i) );
+            }
+
+            return session.execute(w.toString());
+        } finally {
+            for (int i = 0; args != null && i < args.size(); i++) {
+                session.put( Integer.toString(i+1), null );
+            }
+            session.put("0", arg0);
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TacAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TacAction.java
new file mode 100644
index 0000000..5996f2c
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TacAction.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.karaf.shell.commands;
+
+import java.io.StringWriter;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.File;
+import java.io.OutputStream;
+import java.io.BufferedWriter;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+
+/**
+ * Grab the text from the standard input and return it as a string.
+ * Also write this text to a file if specified
+ *
+ * @version $Rev: 593392 $ $Date: 2007-11-09 03:14:15 +0100 (Fri, 09 Nov 2007) $
+ */
+@Command(scope = "shell", name = "tac", description = "Captures the STDIN and returns it as a string. Optionally writes the content to a file.")
+public class TacAction extends AbstractAction {
+
+    @Option(name = "-f", aliases = {}, description = "Outputs the content to the given file", required = false, multiValued = false)
+    private File file;
+
+    protected Object doExecute() throws Exception {
+        StringWriter sw = new StringWriter();
+        Writer[] writers;
+        if (file != null) {
+            writers = new Writer[] { sw, new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))) };
+        } else {
+            writers = new Writer[] { sw };
+        }
+        BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
+        String s = rdr.readLine();
+        boolean first = true;
+        while (s != null)
+        {
+            for (Writer w : writers) {
+                if (!first) {
+                    w.write("\n");
+                }
+                w.write(s);
+            }
+            first = false;
+            s = rdr.readLine();
+        }
+        for (Writer w : writers) {
+            w.close();
+        }
+        return sw.toString();
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java
new file mode 100644
index 0000000..89b79b8
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.commands;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.LinkedList;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+
+@Command(scope = "shell", name = "tail", description = "Displays the last lines of a file.")
+public class TailAction extends AbstractAction {
+
+    private static final int DEFAULT_NUMBER_OF_LINES = 10;
+
+    private static final int DEFAULT_SLEEP_INTERVAL = 200;
+
+    @Option(name = "-n", aliases = {}, description = "The number of lines to display, starting at 1.", required = false, multiValued = false)
+    private int numberOfLines;
+
+    @Option(name = "-f", aliases = {}, description = "Follow file changes", required = false, multiValued = false)
+    private boolean continuous;
+
+    @Option(name = "-s", aliases = {}, description = "Sleep interval (used for follow)", required = false, multiValued = false)
+    private long sleepInterval;
+
+    @Argument(index = 0, name = "path or url", description = "A file path or url to display.", required = false, multiValued = false)
+    private String path;
+
+    protected Object doExecute() throws Exception {
+        //If no paths provided assume standar input
+        if (path == null || path.trim().length() == 0) {
+            if (log.isDebugEnabled()) {
+                log.debug("Tailing STDIN");
+            }
+            tail(new BufferedReader(new InputStreamReader(System.in)));
+        } else {
+            BufferedReader reader;
+
+            // First try a URL
+            try {
+                URL url = new URL(path);
+                if (log.isDebugEnabled()) {
+                    log.debug("Tailing URL: " + url);
+                }
+                reader = new BufferedReader(new InputStreamReader(url.openStream()));
+            }
+            catch (MalformedURLException ignore) {
+                // They try a file
+                File file = new File(path);
+                if (log.isDebugEnabled()) {
+                    log.debug("Tailing file: " + file);
+                }
+                reader = new BufferedReader(new FileReader(file));
+            }
+
+            try {
+                tail(reader);
+            }
+            finally {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * prints the tail of the file / url
+     * 
+     * @param reader
+     * @throws IOException
+     */
+    private void tail(final BufferedReader reader) throws InterruptedException, IOException {
+        
+        if (numberOfLines < 1) {
+            numberOfLines = DEFAULT_NUMBER_OF_LINES;
+        }
+        if (sleepInterval < 1) {
+            sleepInterval = DEFAULT_SLEEP_INTERVAL;
+        }
+        
+        LinkedList<String> lines = new LinkedList<String>();
+        String line;
+        while ((line = reader.readLine()) != null) {
+            lines.add(line);
+            if (lines.size() > numberOfLines) {
+                lines.removeFirst();
+            }
+        }
+
+        for (String l : lines) {
+            System.out.println(l);
+        }
+
+        //If command is running as continuous
+        while (continuous) {
+            Thread.sleep(sleepInterval);
+            while ((line = reader.readLine()) != null) {
+                System.out.println(line);
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/WatchAction.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/WatchAction.java
new file mode 100644
index 0000000..0af7a93
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/WatchAction.java
@@ -0,0 +1,121 @@
+/*
+ * 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.karaf.shell.commands;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.AbstractAction;
+
+@Command(scope = "shell", name = "command-watch", description = "Watches & refreshes the output of a command")
+public class WatchAction extends AbstractAction {
+
+    @Option(name = "-n", aliases = {"--interval"}, description = "The interval between executions of the command in seconds", required = false, multiValued = false)
+    private long interval = 1;
+
+    @Argument(index = 0, name = "command", description = "The command to watch / refresh", required = true, multiValued = true)
+    private String[] arguments;
+
+    CommandProcessor commandProcessor;
+    private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
+
+    @Override
+    protected Object doExecute() throws Exception {
+        if (arguments == null || arguments.length == 0) {
+            System.err.println("Argument expected");
+            return null;
+        } else {
+            StringBuilder command = new StringBuilder();
+            for (String arg:arguments) {
+                command.append(arg).append(" ");
+            }
+            WatchTask watchTask = new WatchTask(commandProcessor, command.toString().trim());
+            executorService.scheduleAtFixedRate(watchTask, 0, interval, TimeUnit.SECONDS);
+            try {
+                session.getKeyboard().read();
+            } finally {
+                executorService.shutdownNow();
+                watchTask.close();
+                return null;
+            }
+        }
+    }
+
+    public class WatchTask implements Runnable {
+
+        private final CommandProcessor processor;
+        private final String command;
+
+        CommandSession session;
+        ByteArrayOutputStream byteArrayOutputStream = null;
+        PrintStream printStream = null;
+
+        public WatchTask(CommandProcessor processor, String command) {
+            this.processor = processor;
+            this.command = command;
+        }
+
+        public void run() {
+            try {
+                 byteArrayOutputStream = new ByteArrayOutputStream();
+                printStream = new PrintStream(byteArrayOutputStream);
+                session = commandProcessor.createSession(null, printStream, printStream);
+                String output = "";
+                session.execute(command);
+                output = byteArrayOutputStream.toString();
+                System.out.print("\33[2J");
+                System.out.print("\33[1;1H");
+                System.out.print(output);
+                System.out.flush();
+                byteArrayOutputStream.close();
+                session.close();
+            } catch (Exception e) {
+                //Ingore
+            }
+        }
+
+        public void close() throws IOException {
+            if (this.session != null) {
+                this.session.close();
+            }
+            if (this.byteArrayOutputStream != null) {
+                this.byteArrayOutputStream.close();
+            }
+            if (this.printStream != null) {
+                printStream.close();
+            }
+        }
+    }
+
+    public CommandProcessor getCommandProcessor() {
+        return commandProcessor;
+    }
+
+    public void setCommandProcessor(CommandProcessor commandProcessor) {
+        this.commandProcessor = commandProcessor;
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoBundleTrackerCustomizer.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoBundleTrackerCustomizer.java
new file mode 100644
index 0000000..bca1be6
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoBundleTrackerCustomizer.java
@@ -0,0 +1,107 @@
+/*
+ * 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.karaf.shell.commands.info;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.BundleTrackerCustomizer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Dictionary;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+/**
+ *  Bundle tracker which check manifest headers for information.
+ */
+public class InfoBundleTrackerCustomizer implements BundleTrackerCustomizer {
+
+    /**
+     * Logger.
+     */
+    private Logger logger = LoggerFactory.getLogger(InfoBundleTrackerCustomizer.class);
+
+    /**
+     * Bundle context.
+     */
+    private final BundleContext context;
+
+    public InfoBundleTrackerCustomizer(BundleContext context) {
+        this.context = context;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("unchecked")
+    public Object addingBundle(Bundle bundle, BundleEvent event) {
+        Dictionary headers = bundle.getHeaders();
+        String headerEntry = (String) headers.get("Karaf-Info");
+
+        InfoProvider provider = createInfo(headerEntry);
+        if (provider == null) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Ignore incorrect info {} provided by bundle {}",
+                        headerEntry, bundle.getSymbolicName());
+            }
+            return null;
+        }
+        return bundle.getBundleContext().registerService(InfoProvider.class.getName(),
+                provider, null);
+    }
+
+    public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
+    }
+
+    public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
+        if (object instanceof ServiceRegistration) {
+            ServiceRegistration service = (ServiceRegistration) object;
+            service.unregister();
+        }
+    }
+
+    private InfoProvider createInfo(String entry) {
+        if (entry == null) {
+            return null;
+        }
+
+        StringTokenizer tokenizer = new StringTokenizer(entry, ";=");
+        if (tokenizer.countTokens() < 3) {
+            return null;
+        }
+
+        String name = tokenizer.nextToken();
+        Properties properties = new Properties();
+
+        do {
+            String property = tokenizer.nextToken();
+            if (tokenizer.hasMoreTokens()) {
+                properties.put(property, tokenizer.nextElement());
+            } else {
+                if (logger.isDebugEnabled()) {
+                    logger.debug("Ignore property {} without value", property);
+                }
+            }
+        } while (tokenizer.hasMoreTokens());
+
+        return new PojoInfoProvider(name, properties);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoProvider.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoProvider.java
new file mode 100644
index 0000000..0460f29
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoProvider.java
@@ -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.
+ */
+package org.apache.karaf.shell.commands.info;
+
+import java.util.Properties;
+
+public interface InfoProvider {
+
+	public String getName();
+
+	public Properties getProperties();
+
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/PojoInfoProvider.java b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/PojoInfoProvider.java
new file mode 100644
index 0000000..c4b66d3
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/PojoInfoProvider.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.commands.info;
+
+import java.util.Properties;
+
+public class PojoInfoProvider implements InfoProvider {
+
+	private String name;
+	private Properties properties;
+
+	public PojoInfoProvider() {
+	}
+
+	public PojoInfoProvider(String name, Properties properties) {
+		this.name = name;
+		this.properties = properties;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Properties getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Properties properties) {
+		this.properties = properties;
+	}
+}
diff --git a/karaf-2.2.x/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands b/karaf-2.2.x/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
new file mode 100644
index 0000000..84aef69
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
@@ -0,0 +1,34 @@
+##---------------------------------------------------------------------------
+##  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.
+##---------------------------------------------------------------------------
+org.apache.karaf.shell.commands.CatAction
+org.apache.karaf.shell.commands.ClearAction
+org.apache.karaf.shell.commands.EachAction
+org.apache.karaf.shell.commands.EchoAction
+org.apache.karaf.shell.commands.ExecuteAction
+org.apache.karaf.shell.commands.GrepAction
+org.apache.karaf.shell.commands.HistoryAction
+org.apache.karaf.shell.commands.HeadAction
+org.apache.karaf.shell.commands.IfAction
+org.apache.karaf.shell.commands.JavaAction
+org.apache.karaf.shell.commands.LogoutAction
+org.apache.karaf.shell.commands.MoreAction
+org.apache.karaf.shell.commands.NewAction
+org.apache.karaf.shell.commands.PrintfAction
+org.apache.karaf.shell.commands.SleepAction
+org.apache.karaf.shell.commands.SortAction
+org.apache.karaf.shell.commands.TacAction
+org.apache.karaf.shell.commands.TailAction
diff --git a/karaf-2.2.x/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml b/karaf-2.2.x/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
new file mode 100644
index 0000000..6ac53c4
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
@@ -0,0 +1,115 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="shell/cat">
+            <action class="org.apache.karaf.shell.commands.CatAction"/>
+        </command>
+        <command name="shell/clear">
+            <action class="org.apache.karaf.shell.commands.ClearAction"/>
+        </command>
+        <command name="shell/each">
+            <action class="org.apache.karaf.shell.commands.EachAction"/>
+        </command>
+        <command name="shell/echo">
+            <action class="org.apache.karaf.shell.commands.EchoAction"/>
+        </command>
+        <command name="shell/exec">
+            <action class="org.apache.karaf.shell.commands.ExecuteAction"/>
+        </command>
+        <command name="shell/grep">
+            <action class="org.apache.karaf.shell.commands.GrepAction"/>
+        </command>
+        <command name="shell/history">
+            <action class="org.apache.karaf.shell.commands.HistoryAction"/>
+        </command>
+        <command name="shell/head">
+            <action class="org.apache.karaf.shell.commands.HeadAction"/>
+        </command>
+        <command name="shell/if">
+            <action class="org.apache.karaf.shell.commands.IfAction"/>
+        </command>
+        <command name="shell/info">
+            <action class="org.apache.karaf.shell.commands.InfoAction">
+                <property name="infoProviders" ref="infoProviders"/>
+            </action>
+        </command>
+        <command name="shell/java">
+            <action class="org.apache.karaf.shell.commands.JavaAction"/>
+        </command>
+        <command name="shell/more">
+            <action class="org.apache.karaf.shell.commands.MoreAction"/>
+        </command>
+        <command name="shell/new">
+            <action class="org.apache.karaf.shell.commands.NewAction"/>
+        </command>
+        <command name="shell/logout">
+            <action class="org.apache.karaf.shell.commands.LogoutAction"/>
+        </command>
+        <command name="shell/printf">
+            <action class="org.apache.karaf.shell.commands.PrintfAction"/>
+        </command>
+        <command name="shell/sleep">
+            <action class="org.apache.karaf.shell.commands.SleepAction"/>
+        </command>
+        <command name="shell/sort">
+            <action class="org.apache.karaf.shell.commands.SortAction"/>
+        </command>
+        <command name="shell/source">
+            <action class="org.apache.karaf.shell.commands.SourceAction"/>
+        </command>
+        <command name="shell/tac">
+            <action class="org.apache.karaf.shell.commands.TacAction"/>
+        </command>
+        <command name="shell/tail">
+            <action class="org.apache.karaf.shell.commands.TailAction"/>
+        </command>
+        <command name="shell/command-watch">
+            <action class="org.apache.karaf.shell.commands.WatchAction">
+                <property name="commandProcessor" ref="commandProcessor"/>
+            </action>
+            <completers>
+                <ref component-id="commandCompleter" />
+                <null/>
+            </completers>
+        </command>
+    </command-bundle>
+
+   <bean id="commandCompleter" class="org.apache.karaf.shell.console.completer.CommandsCompleter"/>
+
+   <bean class="org.osgi.util.tracker.BundleTracker" init-method="open"
+        destroy-method="close">
+        <argument ref="blueprintBundleContext" />
+        <argument value="32" />
+        <argument>
+            <bean class="org.apache.karaf.shell.commands.info.InfoBundleTrackerCustomizer">
+                <argument ref="blueprintBundleContext" />
+            </bean>
+        </argument>
+    </bean>
+
+    <reference-list id="infoProviders" interface="org.apache.karaf.shell.commands.info.InfoProvider"
+        availability="optional">
+    </reference-list>
+
+    <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor"/>
+ 
+</blueprint>
diff --git a/karaf-2.2.x/shell/commands/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/commands/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..9278636
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,34 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides various shell commands.
+
+    The following commands are available:
+    \u001B[36mshell:cat\u001B[0m Displays the content of a file or url.
+    \u001B[36mshell:clear\u001B[0m Clears the console buffer.
+    \u001B[36mshell:each\u001B[0m Execute a closure on a list of arguments.
+    \u001B[36mshell:echo\u001B[0m Echoes or prints arguments to STDOUT.
+    \u001B[36mshell:exec\u001B[0m Executes system processes.
+    \u001B[36mshell:grep\u001B[0m Prints lines matching the given pattern.
+    \u001B[36mshell:head\u001B[0m Displays the first lines of a file.
+    \u001B[36mshell:history\u001B[0m Prints command history.
+    \u001B[36mshell:if\u001B[0m If/Then/Else block.
+    \u001B[36mshell:info\u001B[0m Prints system information.
+    \u001B[36mshell:java\u001B[0m Executes a Java standard application.
+    \u001B[36mshell:logout\u001B[0m Disconnects shell from current session.
+    \u001B[36mshell:more\u001B[0m File pager.
+    \u001B[36mshell:new\u001B[0m Creates a new java object.
+    \u001B[36mshell:printf\u001B[0m Formats and prints arguments.
+    \u001B[36mshell:sleep\u001B[0m Sleeps for a bit then wakes up.
+    \u001B[36mshell:sort\u001B[0m Writes sorted concatenation of all files to standard output.
+    \u001B[36mshell:tac\u001B[0m Captures the STDIN and returns it as a string. Optionally writes the content to a file.
+    \u001B[36mshell:tail\u001B[0m Displays the last lines of a file.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m and \u001B[36mUsing the console\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/commands/src/main/resources/org/apache/karaf/shell/commands/grep.txt b/karaf-2.2.x/shell/commands/src/main/resources/org/apache/karaf/shell/commands/grep.txt
new file mode 100644
index 0000000..1ada069
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/main/resources/org/apache/karaf/shell/commands/grep.txt
@@ -0,0 +1 @@
+Grep uses Java regular expressions for pattern matching.  For more informations, see http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html
diff --git a/karaf-2.2.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/GrepTest.java b/karaf-2.2.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/GrepTest.java
new file mode 100644
index 0000000..7b341bc
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/GrepTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.shell.commands;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+
+public class GrepTest extends TestCase {
+
+    public void testGrep() throws Exception {
+        InputStream input = System.in;
+        try {
+            ByteArrayInputStream bais = new ByteArrayInputStream("1\n2\n3\n4\n5\n6\n7\n8\n9\n".getBytes());
+            System.setIn(bais);
+
+            GrepAction grep = new GrepAction();
+            DefaultActionPreparator preparator = new DefaultActionPreparator();
+            preparator.prepare(grep, null, Arrays.<Object>asList("-C", "100", "2"));
+            grep.doExecute();
+        } finally {
+            System.setIn(input);
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/SortTest.java b/karaf-2.2.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/SortTest.java
new file mode 100644
index 0000000..11a1a61
--- /dev/null
+++ b/karaf-2.2.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/SortTest.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.karaf.shell.commands;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Collections;
+
+import junit.framework.TestCase;
+
+public class SortTest extends TestCase {
+
+    public void testFieldIndexesDefaultSep() {
+        SortAction.SortComparator comparator = new SortAction.SortComparator(false, false, false, false, '\0', null);
+        List<Integer> indexes = comparator.getFieldIndexes(" ad  re  t ");
+        assertTrue(Arrays.asList(0, 2, 3, 6, 7, 9, 10, 10).equals(indexes));
+    }
+
+    public void testFieldIndexesWithSep() {
+        SortAction.SortComparator comparator = new SortAction.SortComparator(false, false, false, false, '[', null);
+        List<Integer> indexes = comparator.getFieldIndexes("[  10] [Active     ] [       ] [    8] OPS4J Pax Logging - Service (1.3.0)");
+        assertTrue(Arrays.asList(1, 6, 8, 20, 22, 30, 32, 73 ).equals(indexes));
+
+        indexes = comparator.getFieldIndexes(" ad  re  t ");
+        assertTrue(Arrays.asList(0, 10).equals(indexes));
+    }
+
+    public void testSort() {
+        String s0 = "0321   abcd  ddcba   a";
+        String s1 = " 57t   bcad  ddacb   b";
+        String s2 = "  128  cab   ddbac   c";
+        List<String> strings = Arrays.asList(s0, s1, s2);
+
+        Collections.sort(strings, new SortAction.SortComparator(false, false, false, false, '\0', Arrays.asList("2")));
+        assertTrue(Arrays.asList(s0, s1, s2).equals(strings));
+
+        Collections.sort(strings, new SortAction.SortComparator(false, false, false, false, '\0', Arrays.asList("2.2b")));
+        assertTrue(Arrays.asList(s2, s0, s1).equals(strings));
+
+        Collections.sort(strings, new SortAction.SortComparator(false, false, false, true, '\0', null));
+        assertTrue(Arrays.asList(s1, s2, s0).equals(strings));
+
+        Collections.sort(strings, new SortAction.SortComparator(false, true, false, false, '\0', Arrays.asList("4")));
+        assertTrue(Arrays.asList(s2, s1, s0).equals(strings));
+    }
+
+}
diff --git a/karaf-2.2.x/shell/config/NOTICE b/karaf-2.2.x/shell/config/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/config/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/config/pom.xml b/karaf-2.2.x/shell/config/pom.xml
new file mode 100644
index 0000000..4e42d97
--- /dev/null
+++ b/karaf-2.2.x/shell/config/pom.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.config</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: ConfigAdmin Commands</name>
+    <description>This bundle provides Karaf shell commands to manipulate the ConfigAdmin service.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.fileinstall</artifactId>
+        </dependency>
+        
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.util;-split-package:=merge-first,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/CancelCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/CancelCommand.java
new file mode 100644
index 0000000..80c47cf
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/CancelCommand.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.config;
+
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "config", name = "cancel", description = "Cancels the changes to the configuration being edited.")
+public class CancelCommand extends ConfigCommandSupport {
+
+    protected void doExecute(ConfigurationAdmin admin) throws Exception {
+        session.put(PROPERTY_CONFIG_PID, null);
+        session.put(PROPERTY_CONFIG_PROPS, null);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigCommandSupport.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigCommandSupport.java
new file mode 100644
index 0000000..6bb4f55
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigCommandSupport.java
@@ -0,0 +1,265 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.apache.felix.fileinstall.ArtifactInstaller;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.util.Properties;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Abstract class from which all commands related to the ConfigurationAdmin
+ * service should derive.
+ * This command retrieves a reference to the ConfigurationAdmin service before
+ * calling another method to actually process the command.
+ */
+public abstract class ConfigCommandSupport extends OsgiCommandSupport {
+
+    public static final String PROPERTY_CONFIG_PID = "ConfigCommand.PID";
+    public static final String PROPERTY_CONFIG_PROPS = "ConfigCommand.Props";
+    private static final String PID_FILTER = "(service.pid=%s*)";
+    private static final String FILE_PREFIX = "file:";
+    private static final String CONFIG_SUFFIX = ".cfg";
+    private static final String FACTORY_SEPARATOR = "-";
+    private static final String FILEINSTALL_FILE_NAME = "felix.fileinstall.filename";
+
+    protected File storage;
+    private List<ArtifactInstaller> artifactInstallers;
+
+    protected Object doExecute() throws Exception {
+        // Get config admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("ConfigurationAdmin service is unavailable.");
+            return null;
+        }
+        ConfigurationAdmin admin = getConfigurationAdmin();
+        if (admin == null) {
+            System.out.println("ConfigAdmin service is unavailable.");
+            return null;
+        }
+
+        doExecute(admin);
+        return null;
+    }
+
+    protected Dictionary getEditedProps() throws Exception {
+        return (Dictionary) this.session.get(PROPERTY_CONFIG_PROPS);
+    }
+
+    protected ConfigurationAdmin getConfigurationAdmin() {
+        ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName());
+        if (ref == null) {
+            return null;
+        }
+        try {
+            ConfigurationAdmin admin = (ConfigurationAdmin) getBundleContext().getService(ref);
+            if (admin == null) {
+                return null;
+            } else {
+                return admin;
+            }
+        } finally {
+            getBundleContext().ungetService(ref);
+        }
+    }
+
+    protected abstract void doExecute(ConfigurationAdmin admin) throws Exception;
+
+    /**
+     * <p>
+     * Returns the Configuration object of the given (felix fileinstall) file name.
+     * </p>
+     *
+     * @param fileName
+     * @return
+     */
+    public Configuration findConfigurationByFileName(ConfigurationAdmin admin, String fileName) throws IOException, InvalidSyntaxException {
+        if (fileName != null && fileName.contains(FACTORY_SEPARATOR)) {
+            String factoryPid = fileName.substring(0, fileName.lastIndexOf(FACTORY_SEPARATOR));
+            String absoluteFileName = FILE_PREFIX + storage.getAbsolutePath() + File.separator + fileName + CONFIG_SUFFIX;
+            Configuration[] configurations = admin.listConfigurations(String.format(PID_FILTER, factoryPid));
+            if (configurations != null) {
+                for (Configuration configuration : configurations) {
+                    Dictionary dictionary = configuration.getProperties();
+                    if (dictionary != null) {
+                        String fileInstallFileName = (String) dictionary.get(FILEINSTALL_FILE_NAME);
+                        if (absoluteFileName.equals(fileInstallFileName)) {
+                            return configuration;
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Saves config to storage or ConfigurationAdmin.
+     *
+     * @param admin
+     * @param pid
+     * @param props
+     * @param bypassStorage
+     * @throws IOException
+     */
+    protected void update(ConfigurationAdmin admin, String pid, Dictionary props, boolean bypassStorage) throws IOException {
+        if (!bypassStorage && storage != null) {
+            persistConfiguration(admin, pid, props);
+        } else {
+            updateConfiguration(admin, pid, props);
+        }
+    }
+
+    /**
+     * Persists configuration to storage.
+     *
+     * @param admin
+     * @param pid
+     * @param props
+     * @throws IOException
+     */
+    protected void persistConfiguration(ConfigurationAdmin admin, String pid, Dictionary props) throws IOException {
+        File storageFile = new File(storage, pid + ".cfg");
+        Configuration cfg = admin.getConfiguration(pid, null);
+        if (cfg != null && cfg.getProperties() != null) {
+            Object val = cfg.getProperties().get(FILEINSTALL_FILE_NAME);
+            try {
+            if (val instanceof URL) {
+                storageFile = new File(((URL) val).toURI());
+            }
+            if (val instanceof URI) {
+                storageFile = new File((URI) val);
+            }
+            if (val instanceof String) {
+                storageFile = new File(new URL((String) val).toURI());
+            }
+            } catch (Exception e) {
+                throw (IOException) new IOException(e.getMessage()).initCause(e);
+            }
+        }
+        Properties p = new Properties(storageFile);
+        for (Enumeration keys = props.keys(); keys.hasMoreElements(); ) {
+            Object key = keys.nextElement();
+            if (!Constants.SERVICE_PID.equals(key)
+                    && !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
+                    && !FILEINSTALL_FILE_NAME.equals(key)) {
+                p.put((String) key, (String) props.get(key));
+            }
+        }
+        // remove "removed" properties from the file
+        ArrayList<String> propertiesToRemove = new ArrayList<String>();
+        for (Object key : p.keySet()) {
+            if (props.get(key) == null
+                    && !Constants.SERVICE_PID.equals(key)
+                    && !ConfigurationAdmin.SERVICE_FACTORYPID.equals(key)
+                    && !FILEINSTALL_FILE_NAME.equals(key)) {
+                propertiesToRemove.add(key.toString());
+            }
+        }
+        for (String key : propertiesToRemove) {
+            p.remove(key);
+        }
+        // save the cfg file
+        storage.mkdirs();
+        p.save();
+        updateFileInstall(storageFile);
+    }
+
+    /**
+     * Trigger felix fileinstall to update the config so there is no delay till it polls the file
+     * 
+     * @param storageFile
+     * @throws Exception
+     */
+    private void updateFileInstall(File storageFile) {
+        if (artifactInstallers != null) {
+            for (ArtifactInstaller installer : artifactInstallers) {
+                if (installer.canHandle(storageFile)) {
+                    try {
+                        installer.update(storageFile);
+                    } catch (Exception e) {
+                        log.warn("Error updating config " + storageFile + " in felix fileinstall" + e.getMessage(), e);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Updates the configuration to the {@link ConfigurationAdmin} service.
+     *
+     * @param admin
+     * @param pid
+     * @param props
+     * @throws IOException
+     */
+    public void updateConfiguration(ConfigurationAdmin admin, String pid, Dictionary props) throws IOException {
+        Configuration cfg = admin.getConfiguration(pid, null);
+        if (cfg.getProperties() == null) {
+            String[] pids = parsePid(pid);
+            if (pids[1] != null) {
+                cfg = admin.createFactoryConfiguration(pids[0], null);
+            }
+        }
+        if (cfg.getBundleLocation() != null) {
+            cfg.setBundleLocation(null);
+        }
+        cfg.update(props);
+    }
+
+    protected String[] parsePid(String pid) {
+        int n = pid.indexOf('-');
+        if (n > 0) {
+            String factoryPid = pid.substring(n + 1);
+            pid = pid.substring(0, n);
+            return new String[]{pid, factoryPid};
+        } else {
+            return new String[]{pid, null};
+        }
+    }
+
+    protected void deleteStorage(String pid) throws Exception {
+        File cfgFile = new File(storage, pid + ".cfg");
+        cfgFile.delete();
+    }
+
+    public File getStorage() {
+        return storage;
+    }
+
+    public void setStorage(File storage) {
+        this.storage = storage;
+    }
+    
+    public void setArtifactInstallers(List<ArtifactInstaller> artifactInstallers) {
+        this.artifactInstallers = artifactInstallers;
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigPropertyCommandSupport.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigPropertyCommandSupport.java
new file mode 100644
index 0000000..f866711
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigPropertyCommandSupport.java
@@ -0,0 +1,79 @@
+package org.apache.karaf.shell.config;
+
+import java.util.Dictionary;
+
+import org.apache.felix.gogo.commands.Option;
+import java.util.Properties;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Abstract class which commands that are related to property processing should extend.
+ */
+public abstract class ConfigPropertyCommandSupport extends ConfigCommandSupport {
+
+    @Option(name = "-p", aliases = "--pid", description = "The configuration pid", required = false, multiValued = false)
+    protected String pid;
+
+    @Option(name = "-b", aliases = { "--bypass-storage" }, multiValued = false, required = false, description = "Do not store the configuration in a properties file, but feed it directly to ConfigAdmin")
+    protected boolean bypassStorage;
+
+
+    protected void doExecute(ConfigurationAdmin admin) throws Exception {
+        Dictionary props = getEditedProps();
+        if (props == null && pid == null) {
+            System.err.println("No configuration is being edited--run the edit command first");
+        } else {
+            if (props == null) {
+                props = new Properties();
+            }
+            propertyAction(props);
+            if(requiresUpdate(pid)) {
+                update(admin, pid, props, bypassStorage);
+            }
+        }
+    }
+
+    /**
+     * Perform an action on the properties.
+     * @param props
+     */
+    protected abstract void propertyAction(Dictionary props);
+
+    /**
+     * Checks if the configuration requires to be updated.
+     * The default behavior is to update if a valid pid has been passed to the method.
+     * @param pid
+     * @return
+     */
+    protected boolean requiresUpdate(String pid) {
+        if (pid != null) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+
+    /**
+     * Retrieves confguration from the pid, if used or delegates to session from getting the configuration.
+     * @return
+     * @throws Exception
+     */
+    @Override
+    protected Dictionary getEditedProps() throws Exception {
+        if(pid != null) {
+            ConfigurationAdmin configurationAdmin = getConfigurationAdmin();
+            if (configurationAdmin != null) {
+                Configuration[] configs = configurationAdmin.listConfigurations("(service.pid=" + pid + ")");
+                if (configs != null && configs.length > 0) {
+                    Configuration configuration = configs[0];
+                    if (configuration != null) {
+                        return configuration.getProperties();
+                    }
+                }
+            }
+        }
+        return super.getEditedProps();
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/DeleteCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/DeleteCommand.java
new file mode 100644
index 0000000..5abe4f3
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/DeleteCommand.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.config;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+@Command(scope = "config", name = "delete", description = "Delete a configuration.")
+public class DeleteCommand extends ConfigCommandSupport {
+
+    @Argument(index = 0, name = "pid", description = "PID of the configuration", required = true, multiValued = false)
+    String pid;
+
+    @Option(name = "--force", aliases = {}, description = "Force the edition of this config, even if another one was under edition", required = false, multiValued = false)
+    boolean force;
+
+    @Option(name = "--no-delete-cfg-file", aliases = { }, description = "Do not delete the configuration file from the etc folder", required = false, multiValued = false)
+    boolean noDeleteCfgFile = false;
+
+    @Option(name = "-f", aliases = {"--use-file"}, description = "Configuration lookup using the filename instead of the pid", required = false, multiValued = false)
+    boolean useFile;
+
+    protected void doExecute(ConfigurationAdmin admin) throws Exception {
+        String oldPid = (String) this.session.get(PROPERTY_CONFIG_PID);
+        if (oldPid != null && oldPid.equals(pid) && !force) {
+            System.err.println("This config is being edited.  Cancel / update first, or use the --force option");
+            return;
+        }
+
+        // User selected to use file instead.
+        if (useFile) {
+            Configuration configuration = this.findConfigurationByFileName(admin, pid);
+            if(configuration == null) {
+                System.err.println("Could not find configuration with file install property set to: " + pid);
+                return;
+            }
+            configuration.delete();
+        } else {
+            Configuration configuration = admin.getConfiguration(pid);
+            configuration.delete();
+        }
+        if (!noDeleteCfgFile) {
+            deleteStorage(pid);
+        }
+        if (oldPid != null && oldPid.equals(pid) && !force) {
+            this.session.put(PROPERTY_CONFIG_PID, null);
+            this.session.put(PROPERTY_CONFIG_PROPS, null);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/EditCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/EditCommand.java
new file mode 100644
index 0000000..ae43af9
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/EditCommand.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.config;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+@Command(scope = "config", name = "edit", description = "Creates or edits a configuration.", detailedDescription="classpath:edit.txt")
+public class EditCommand extends ConfigCommandSupport {
+
+    @Argument(index = 0, name = "pid", description = "PID of the configuration", required = true, multiValued = false)
+    String pid;
+
+    @Option(name = "--force", aliases = {}, description = "Force the edition of this config, even if another one was under edition", required = false, multiValued = false)
+    boolean force;
+
+	@Option(name = "-f", aliases = {"--use-file"}, description = "Configuration lookup using the filename instead of the pid", required = false, multiValued = false)
+    boolean useFile;
+
+    protected void doExecute(ConfigurationAdmin admin) throws Exception {
+        String oldPid = (String) this.session.get(PROPERTY_CONFIG_PID);
+        if (oldPid != null && !oldPid.equals(pid) && !force) {
+            System.err.println("Another config is being edited.  Cancel / update first, or use the --force option");
+            return;
+        }
+	    Dictionary props;
+
+	    //User selected to use file instead.
+        if (useFile) {
+		    Configuration configuration = this.findConfigurationByFileName(admin, pid);
+		    if(configuration == null) {
+			    System.err.println("Could not find configuration with file install property set to: " + pid);
+			    return;
+		    }
+		    props = configuration.getProperties();
+		    pid = configuration.getPid();
+	    } else {
+            Configuration configuration = admin.getConfiguration(pid, null);
+            props = configuration.getProperties();
+            if (props == null) {
+                props = new Properties();
+            }
+        }
+        this.session.put(PROPERTY_CONFIG_PID, pid);
+        this.session.put(PROPERTY_CONFIG_PROPS, props);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ListCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ListCommand.java
new file mode 100644
index 0000000..b742cbc
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/ListCommand.java
@@ -0,0 +1,54 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "config", name = "list", description = "Lists existing configurations.")
+public class ListCommand extends ConfigCommandSupport {
+
+    @Argument(index = 0, name = "query", description = "Specify a LDAP query", required = false, multiValued = false)
+    String query;
+
+    protected void doExecute(ConfigurationAdmin admin) throws Exception {
+        Configuration[] configs = admin.listConfigurations(query);
+        if (configs != null) {
+            for (Configuration config : configs) {
+                System.out.println("----------------------------------------------------------------");
+                System.out.println("Pid:            " + config.getPid());
+                if (config.getFactoryPid() != null) {
+                    System.out.println("FactoryPid:     " + config.getFactoryPid());
+                }
+                System.out.println("BundleLocation: " + config.getBundleLocation());
+                if (config.getProperties() != null) {
+                    System.out.println("Properties:");
+                    Dictionary props = config.getProperties();
+                    for (Enumeration e = props.keys(); e.hasMoreElements();) {
+                        Object key = e.nextElement();
+                        System.out.println("   " + key + " = " + props.get(key));
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropAppendCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropAppendCommand.java
new file mode 100644
index 0000000..39272a7
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropAppendCommand.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.util.Dictionary;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+/**
+ * Appends a value to the current property value.
+ */
+@Command(scope = "config", name = "propappend", description = "Appends the given value to an existing property or creates the property with the specified name and value.")
+public class PropAppendCommand extends ConfigPropertyCommandSupport {
+
+    @Argument(index = 0, name = "name", description = "The name of the property", required = true, multiValued = false)
+    String prop;
+
+    @Argument(index = 1, name = "value", description = "The value to append to the property", required = true, multiValued = false)
+    String value;
+
+    @Override
+    public void propertyAction(Dictionary props) {
+        final Object currentValue = props.get(prop);
+        if (currentValue == null) {
+            props.put(prop, value);
+        } else if (currentValue instanceof String) {
+            props.put(prop, currentValue + value);
+        } else {
+            System.err.println("Append Failed: current value is not a String.");
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropDelCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropDelCommand.java
new file mode 100644
index 0000000..c8a5d11
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropDelCommand.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.karaf.shell.config;
+
+import java.util.Dictionary;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "config", name = "propdel", description = "Deletes a property from configuration being edited.")
+public class PropDelCommand extends ConfigPropertyCommandSupport {
+
+    @Argument(index = 0, name = "property", description = "The name of the property to delete", required = true, multiValued = false)
+    String prop;
+
+    @Override
+    public void propertyAction(Dictionary props) {
+        props.remove(prop);
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropListCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropListCommand.java
new file mode 100644
index 0000000..ed2f45b
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropListCommand.java
@@ -0,0 +1,43 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "config", name = "proplist", description = "Lists properties from the currently edited configuration.")
+public class PropListCommand extends ConfigPropertyCommandSupport {
+
+    @Override
+    public void propertyAction(Dictionary props) {
+        for (Enumeration e = props.keys(); e.hasMoreElements(); ) {
+            Object key = e.nextElement();
+            System.out.println("   " + key + " = " + props.get(key));
+        }
+    }
+
+    /**
+     * List commands never requires an update, so it always returns false.
+     * @param pid
+     * @return
+     */
+    @Override
+    protected boolean requiresUpdate(String pid) {
+        return false;
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropSetCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropSetCommand.java
new file mode 100644
index 0000000..245340a
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropSetCommand.java
@@ -0,0 +1,38 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.util.Dictionary;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+@Command(scope = "config", name = "propset", description = "Sets a property in the currently edited configuration.")
+public class PropSetCommand extends ConfigPropertyCommandSupport {
+
+    @Argument(index = 0, name = "property", description = "The name of the property to set", required = true, multiValued = false)
+    String prop;
+
+    @Argument(index = 1, name = "value", description = "The value of the property", required = true, multiValued = false)
+    String value;
+
+    @Override
+    public void propertyAction(Dictionary props) {
+        props.put(prop, value);
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/UpdateCommand.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/UpdateCommand.java
new file mode 100644
index 0000000..6c99e12
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/UpdateCommand.java
@@ -0,0 +1,45 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.fileinstall.ArtifactInstaller;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+@Command(scope = "config", name = "update", description = "Saves and propagates changes from the configuration being edited.")
+public class UpdateCommand extends ConfigCommandSupport {
+
+    @Option(name = "-b", aliases = {"--bypass-storage"}, multiValued = false, required = false, description = "Do not store the configuration in a properties file, but feed it directly to ConfigAdmin")
+    protected boolean bypassStorage;
+    
+    protected void doExecute(ConfigurationAdmin admin) throws Exception {
+        Dictionary props = getEditedProps();
+        if (props == null) {
+            System.err.println("No configuration is being edited--run the edit command first");
+            return;
+        }
+
+        String pid = (String) this.session.get(PROPERTY_CONFIG_PID);
+        update(admin, pid, props, bypassStorage);
+        this.session.put(PROPERTY_CONFIG_PID, null);
+        this.session.put(PROPERTY_CONFIG_PROPS, null);
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationCompleter.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationCompleter.java
new file mode 100644
index 0000000..0e93914
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationCompleter.java
@@ -0,0 +1,80 @@
+/*
+ * 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.karaf.shell.config.completers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.console.Completer;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
+
+/**
+ * {@link jline.Completor} for Configuration Admin configurations.
+ *
+ * Displays a list of existing config admin configurations for completion.
+ *
+ */
+public class ConfigurationCompleter implements Completer, ConfigurationListener {
+
+    private final StringsCompleter delegate = new StringsCompleter();
+
+    private ConfigurationAdmin admin;
+
+    public void setAdmin(ConfigurationAdmin admin) {
+        this.admin = admin;
+    }
+
+    public void init() {
+        Configuration[] configs;
+        try {
+            configs = admin.listConfigurations(null);
+            if (configs == null) {
+                return;
+            }
+        } catch (Exception e) {
+            return;
+        }
+
+        Collection<String> pids = new ArrayList<String>();
+        for (Configuration config : configs) {
+            pids.add(config.getPid());
+        }
+
+        delegate.getStrings().addAll(pids);
+    }
+
+    public int complete(final String buffer, final int cursor, final List candidates) {
+        return delegate.complete(buffer, cursor, candidates);
+    }
+
+    public void configurationEvent(ConfigurationEvent configurationEvent) {
+        String pid = configurationEvent.getPid();
+        if (configurationEvent.getType() == ConfigurationEvent.CM_DELETED) {
+            delegate.getStrings().remove(pid);
+        } else if (configurationEvent.getType() == ConfigurationEvent.CM_UPDATED) {
+            delegate.getStrings().add(pid);
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationPropertyCompleter.java b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationPropertyCompleter.java
new file mode 100644
index 0000000..363e182
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationPropertyCompleter.java
@@ -0,0 +1,134 @@
+/*
+ * 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.karaf.shell.config.completers;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.config.ConfigCommandSupport;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.console.jline.CommandSessionHolder;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * {@link jline.Completor} for Configuration Admin properties.
+ *
+ * Displays a list of existing properties based on the current configuration being edited.
+ *
+ */
+public class ConfigurationPropertyCompleter implements Completer {
+
+    private final StringsCompleter delegate = new StringsCompleter();
+
+    private static final String OPTION = "-p";
+    private static final String ALIAS = "--pid";
+
+    private ConfigurationAdmin configAdmin;
+
+    public int complete(final String buffer, final int cursor, final List candidates) {
+        CommandSession session = CommandSessionHolder.getSession();
+        if (session != null) {
+            String pid = getPid(session);
+            Set<String> propertyNames = getPropertyNames(pid);
+            delegate.getStrings().clear();
+            if (propertyNames != null && !propertyNames.isEmpty()) {
+                delegate.getStrings().addAll(propertyNames);
+            }
+        }
+        return delegate.complete(buffer,cursor,candidates);
+    }
+
+    /**
+     * Retrieves the pid stored in the {@link CommandSession} or passed as an argument.
+     * Argument takes precedence from pid stored in the {@link CommandSession}.
+     * @param commandSession
+     * @return
+     */
+    private String getPid(CommandSession commandSession) {
+        String pid = (String) commandSession.get(ConfigCommandSupport.PROPERTY_CONFIG_PID);
+        ArgumentCompleter.ArgumentList list = (ArgumentCompleter.ArgumentList) commandSession.get(ArgumentCompleter.ARGUMENTS_LIST);
+        if (list != null && list.getArguments() != null && list.getArguments().length > 0) {
+            List<String> arguments = Arrays.asList(list.getArguments());
+            if (arguments.contains(OPTION)) {
+                int index = arguments.indexOf(OPTION);
+                if (arguments.size() > index) {
+                    return arguments.get(index + 1);
+                }
+            }
+
+            if (arguments.contains(ALIAS)) {
+                int index = arguments.indexOf(ALIAS);
+                if (arguments.size() > index) {
+                    return arguments.get(index + 1);
+                }
+            }
+        }
+        return pid;
+    }
+
+    /**
+     * Returns the property names for the given pid.
+     * @param pid
+     * @return
+     */
+    private Set<String> getPropertyNames(String pid) {
+        Set<String> propertyNames = new HashSet<String>();
+        if (pid != null) {
+            Configuration configuration = null;
+            try {
+                Configuration[] configs = configAdmin.listConfigurations("(service.pid="+pid+")");
+                if (configs != null && configs.length > 0) {
+                    configuration = configs[0];
+                    if (configuration != null) {
+                        Dictionary properties = configuration.getProperties();
+                        if (properties != null) {
+                            Enumeration keys = properties.keys();
+                            while (keys.hasMoreElements()) {
+                                propertyNames.add(String.valueOf(keys.nextElement()));
+                            }
+                        }
+                    }
+                }
+            } catch (IOException e) {
+              //Ignore
+            } catch (InvalidSyntaxException e) {
+                //Ignore
+            }
+        }
+        return propertyNames;
+    }
+
+    public ConfigurationAdmin getConfigAdmin() {
+        return configAdmin;
+    }
+
+    public void setConfigAdmin(ConfigurationAdmin configAdmin) {
+        this.configAdmin = configAdmin;
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
new file mode 100644
index 0000000..41f5b3c
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -0,0 +1,121 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
+        <command name="config/cancel">
+            <action class="org.apache.karaf.shell.config.CancelCommand"/>
+        </command>
+        <command name="config/delete">
+            <action class="org.apache.karaf.shell.config.DeleteCommand">
+                <property name="storage" value="${storage}" />
+            </action>
+            <completers>
+                <ref component-id="configCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="config/edit">
+            <action class="org.apache.karaf.shell.config.EditCommand">
+                <property name="storage" value="${storage}" />
+            </action>
+            <completers>
+                <ref component-id="configCompleter" />
+                <null/>
+            </completers>
+        </command>
+        <command name="config/list">
+            <action class="org.apache.karaf.shell.config.ListCommand"/>
+        </command>
+        <command name="config/propdel">
+            <action class="org.apache.karaf.shell.config.PropDelCommand">
+                <property name="storage" value="${storage}" />
+            </action>
+            <completers>
+                <ref component-id="configPropertyCompleter" />
+                <null/>
+            </completers>
+            <optional-completers>
+                   <entry key="-p" value-ref="configCompleter"/>
+            </optional-completers>
+        </command>
+        <command name="config/proplist">
+            <action class="org.apache.karaf.shell.config.PropListCommand"/>
+                <optional-completers>
+                   <entry key="-p" value-ref="configCompleter"/>
+                </optional-completers>
+        </command>
+        <command name="config/propset">
+            <action class="org.apache.karaf.shell.config.PropSetCommand">
+                <property name="storage" value="${storage}" />
+            </action>
+            <completers>
+                <ref component-id="configPropertyCompleter" />
+                <null/>
+            </completers>
+            <optional-completers>
+                   <entry key="-p" value-ref="configCompleter"/>
+            </optional-completers>
+        </command>
+        <command name="config/propappend">
+            <action class="org.apache.karaf.shell.config.PropAppendCommand">
+                <property name="storage" value="${storage}" />
+            </action>
+            <completers>
+                <ref component-id="configPropertyCompleter" />
+                <null/>
+            </completers>
+            <optional-completers>
+                   <entry key="-p" value-ref="configCompleter"/>
+            </optional-completers>
+        </command>
+        <command name="config/update">
+            <action class="org.apache.karaf.shell.config.UpdateCommand">
+                <property name="storage" value="${storage}" />
+                <property name="artifactInstallers" ref="artifactInstallers"/>
+            </action>
+        </command>
+    </command-bundle>
+    
+    <reference-list id="artifactInstallers" interface="org.apache.felix.fileinstall.ArtifactInstaller" availability="optional" />
+
+    <bean id="configCompleter" class="org.apache.karaf.shell.config.completers.ConfigurationCompleter" init-method="init">
+        <property name="admin" ref="configAdmin"/>
+    </bean>
+    <service ref="configCompleter" interface="org.osgi.service.cm.ConfigurationListener" />
+
+    <bean id="configPropertyCompleter" class="org.apache.karaf.shell.config.completers.ConfigurationPropertyCompleter">
+        <property name="configAdmin" ref="configAdmin"/>
+    </bean>
+
+    <reference id="configAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"  />
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]" />
+
+    <cm:property-placeholder persistent-id="org.apache.karaf.shell.config">
+        <cm:default-properties>
+            <cm:property name="storage" value="$[karaf.base]/etc/"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..79f9b8c
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,24 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Karaf shell commands to manipulate the ConfigAdmin OSGi service.
+
+    The following commands are available:
+    \u001B[36mconfig:cancel\u001B[0m Cancels the changes to the configuration being edited.
+    \u001B[36mconfig:edit\u001B[0m Creates or edits a configuration.
+    \u001B[36mconfig:list\u001B[0m Lists existing configurations.
+    \u001B[36mconfig:propappend\u001B[0m Appends the given value to an existing property or creates
+     the property with the specified name and value.
+    \u001B[36mconfig:propdel\u001B[0m Deletes a property from the edited configuration.
+    \u001B[36mconfig:proplist\u001B[0m Lists properties from the currently edited configuration.
+    \u001B[36mconfig:propset\u001B[0m Sets a property in the currently edited configuration.
+    \u001B[36mconfig:update\u001B[0m Saves and propagates changes from the configuration being edited.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties
new file mode 100644
index 0000000..3bce187
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.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.
+#
+
+#
+# This file contains localization strings for configuration labels and
+# descriptions as used in the metatype.xml descriptor
+
+config.name = Apache Karaf Shell Config
+config.description = Configuration of Apache Karaf Shell Config
+
+storage.name = Storage directory
+storage.description = the directory used as a storage for configurations
diff --git a/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml
new file mode 100644
index 0000000..433d5e6
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml
@@ -0,0 +1,28 @@
+<?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.
+
+-->
+<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0" localization="OSGI-INF/metatype/metatype">
+    <OCD id="org.apache.karaf.shell.config" name="%config.name" description="%config.description">
+        <AD id="storage" type="String" default="${karaf.base}/etc/"
+            name="%storage.name" description="%storage.description"/>
+    </OCD>
+    <Designate pid="org.apache.karaf.shell.config">
+        <Object ocdref="org.apache.karaf.shell.config"/>
+    </Designate>
+</metatype:MetaData>
diff --git a/karaf-2.2.x/shell/config/src/main/resources/org/apache/karaf/shell/config/edit.txt b/karaf-2.2.x/shell/config/src/main/resources/org/apache/karaf/shell/config/edit.txt
new file mode 100644
index 0000000..aa68062
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/main/resources/org/apache/karaf/shell/config/edit.txt
@@ -0,0 +1,13 @@
+The edit command can be used to create or edit a configuration by passing its pid as argument.
+  > config:edit org.apache.karaf.sample.pid
+The command above will create a file etc/org.apache.karaf.sample.pid which corresponds to a configuration object with pid org.apache.karaf.sample.pid
+
+In case of Managed Service Factories the user can create or edit the configuration of a specific instance of a managed service.
+  > config:edit org.apache.karaf.sample.service.factory.pid-instanceid
+The command above will create a file etc/org.apache.karaf.sample.service.factory.pid-instanceid but in this case the pid is generated, according to the specification.
+
+This makes further editing to the configuration difficult because the generated pid is not known to the user. To make things simple config:edit provides a special flag -f or --use-file which allows editing a configuration using the filename instead of the pid.
+So the user can simply edit again the configuration by typing:
+  > config:edit org.apache.karaf.sample.service.factory.pid-instanceid.
+
+The --factory option can be used to create a new configuration for a given factory pid.  The parameter will be used as the factory pid and the configuration pid will be generated.  Note that this option
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/EditCommandTest.java b/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/EditCommandTest.java
new file mode 100644
index 0000000..97c4179
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/EditCommandTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.karaf.shell.config;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import org.apache.felix.service.command.CommandSession;
+import org.easymock.EasyMock;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+/**
+ * Test cases for {@link EditCommand}
+ */
+public class EditCommandTest extends TestCase {
+
+    private static final String PID = "my.test.persistent.id";
+
+    private EditCommand command;
+    private BundleContext context;
+    private ConfigurationAdmin admin;
+    private CommandSession session;
+    
+    @Override
+    protected void setUp() throws Exception {
+        command = new EditCommand();
+        
+        context = EasyMock.createMock(BundleContext.class);
+        command.setBundleContext(context);
+        
+        ServiceReference reference = createMock(ServiceReference.class);
+        expect(context.getServiceReference(ConfigurationAdmin.class.getName())).andReturn(reference).anyTimes();
+        
+        admin = createMock(ConfigurationAdmin.class);
+        expect(context.getService(reference)).andReturn(admin);
+        expect(context.ungetService(reference)).andReturn(Boolean.TRUE);
+        
+        replay(context);
+        
+        session = new MockCommandSession();
+    }
+    
+    public void testExecuteOnExistingPid() throws Exception {        
+        Configuration config = createMock(Configuration.class);
+        expect(admin.getConfiguration(PID, null)).andReturn(config);
+        replay(admin);
+        
+        // the ConfigAdmin service returns a Dictionary for an existing PID
+        Properties props = new Properties();
+        expect(config.getProperties()).andReturn(props);
+        replay(config);
+        
+        command.pid = PID; 
+        command.execute(session);
+        
+        // the PID and Dictionary should have been set on the session
+        assertEquals("The PID should be set on the session",
+                     PID, session.get(ConfigCommandSupport.PROPERTY_CONFIG_PID));
+        assertSame("The Dictionary returned by the ConfigAdmin service should be set on the session",
+                   props, session.get(ConfigCommandSupport.PROPERTY_CONFIG_PROPS));
+    }
+    
+    @SuppressWarnings("unchecked")
+    public void testExecuteOnNewPid() throws Exception {        
+        Configuration config = createMock(Configuration.class);
+        expect(admin.getConfiguration(PID, null)).andReturn(config);
+        replay(admin);
+        
+        // the ConfigAdmin service does not return a Dictionary for a new PID
+        expect(config.getProperties()).andReturn(null);
+        replay(config);
+        
+        command.pid = PID; 
+        command.execute(session);
+
+        // the PID and an empty Dictionary should have been set on the session        
+        assertEquals("The PID should be set on the session",
+                     PID, session.get(ConfigCommandSupport.PROPERTY_CONFIG_PID));
+        Dictionary props = (Dictionary) session.get(ConfigCommandSupport.PROPERTY_CONFIG_PROPS);
+        assertNotNull("Should have a Dictionary on the session", props);
+        assertTrue("Should have an empty Dictionary on the session", props.isEmpty());
+    }
+
+}
diff --git a/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/MockCommandSession.java b/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/MockCommandSession.java
new file mode 100644
index 0000000..8953373
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/MockCommandSession.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.karaf.shell.config;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.felix.service.command.CommandSession;
+
+/*
+ * A mock CommandSession implementation that only cares about the properties set on the session
+ */
+class MockCommandSession implements CommandSession {
+
+    private Map<String, Object> properties = new HashMap<String, Object>();
+
+    public void close() {
+        // not implemented
+    }
+
+    public Object convert(Class<?> type, Object instance) {
+        // not implemented
+        return null;
+    }
+
+    public Object execute(CharSequence commandline) throws Exception {
+        // not implemented
+        return null;
+    }
+
+    public CharSequence format(Object target, int level) {
+        // not implemented
+        return null;
+    }
+
+    public Object get(String name) {
+        return properties.get(name);
+    }
+
+    public PrintStream getConsole() {
+        // not implemented
+        return null;
+    }
+
+    public InputStream getKeyboard() {
+        // not implemented
+        return null;
+    }
+
+    public void put(String name, Object value) {
+        properties.put(name, value);
+    }
+}
diff --git a/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/UpdateCommandTest.java b/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/UpdateCommandTest.java
new file mode 100644
index 0000000..276781a
--- /dev/null
+++ b/karaf-2.2.x/shell/config/src/test/java/org/apache/karaf/shell/config/UpdateCommandTest.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.karaf.shell.config;
+
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import org.apache.felix.service.command.CommandSession;
+import org.easymock.EasyMock;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+/**
+ * Test cases for {@link EditCommand}
+ */
+public class UpdateCommandTest extends TestCase {
+
+    private static final String PID = "my.test.persistent.id-other";
+
+    private UpdateCommand command;
+    private BundleContext context;
+    private ConfigurationAdmin admin;
+    private CommandSession session;
+
+    @Override
+    protected void setUp() throws Exception {
+        command = new UpdateCommand();
+
+        context = EasyMock.createMock(BundleContext.class);
+        command.setBundleContext(context);
+
+        ServiceReference reference = createMock(ServiceReference.class);
+        expect(context.getServiceReference(ConfigurationAdmin.class.getName())).andReturn(reference).anyTimes();
+
+        admin = createMock(ConfigurationAdmin.class);
+        expect(context.getService(reference)).andReturn(admin);
+        expect(context.ungetService(reference)).andReturn(Boolean.TRUE);
+
+        replay(context);
+
+        session = new MockCommandSession();
+    }
+
+    public void testupdateOnNewFactoryPid() throws Exception {
+        Properties props = new Properties();
+
+        session.put(ConfigCommandSupport.PROPERTY_CONFIG_PID, PID);
+        session.put(ConfigCommandSupport.PROPERTY_CONFIG_PROPS, props);
+
+        Configuration configNew = createMock(Configuration.class);
+        expect(admin.getConfiguration(PID, null)).andReturn(configNew);
+        expect(configNew.getProperties()).andReturn(null);
+
+
+        Configuration configFac = createMock(Configuration.class);
+        expect(admin.createFactoryConfiguration(PID.substring(0, PID.indexOf('-')), null)).andReturn(configFac);
+        configFac.update(props);
+        expect(configFac.getBundleLocation()).andReturn(null);
+        replay(admin);
+        replay(configNew);
+        replay(configFac);
+
+        command.execute(session);
+
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/NOTICE b/karaf-2.2.x/shell/console/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/console/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/console/pom.xml b/karaf-2.2.x/shell/console/pom.xml
new file mode 100644
index 0000000..8f8eaf1
--- /dev/null
+++ b/karaf-2.2.x/shell/console/pom.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.console</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: Console</name>
+    <description>This bundle provides OSGi shell integration and console support.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>jline</groupId>
+            <artifactId>jline</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.fusesource.jansi</groupId>
+            <artifactId>jansi</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.jaas</groupId>
+            <artifactId>org.apache.karaf.jaas.modules</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.aries.blueprint</groupId>
+            <artifactId>org.apache.aries.blueprint</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.gogo.runtime</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/filtered-resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>Main</mainClass>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.osgi.service.event;resolution:=optional,
+                            org.apache.karaf.branding;resolution:=optional,
+                            *
+                        </Import-Package>
+                        <Export-Package>
+                            org.apache.felix.gogo*;version=${felix.gogo.version};-split-package:=merge-first,
+                            org.apache.felix.service.command;version=${felix.gogo.version};status=provisional;mandatory:=status;-split-package:=merge-first,
+                            org.apache.felix.service.threadio;version=${felix.gogo.version};status=provisional;mandatory:=status;-split-package:=merge-first,
+                            org.apache.karaf.shell.console*;version=${project.version};-split-package:=merge-first,
+                            org.fusesource.jansi;version=${jansi.version};-split-package:=merge-first,
+                            jline*;version=${jline.version};-split-package:=merge-first,
+                            org.fusesource.hawtjni*;version=1.0;-split-package:=merge-first
+                        </Export-Package>
+                        <Private-Package>
+                            org.fusesource.jansi.internal;-split-package:=merge-first,
+                            org.apache.felix.gogo.runtime*;-split-package:=merge-first,
+                            META-INF.native.*;-split-package:=merge-first
+                        </Private-Package>
+                        <Bundle-NativeCode>
+                            META-INF/native/windows32/jansi.dll;osname=Win32;processor=x86,
+                            META-INF/native/windows64/jansi.dll;osname=Win32;processor=x86-64,
+                            *
+                        </Bundle-NativeCode>
+                        <Bundle-Activator>
+                            org.apache.karaf.shell.console.jline.Activator
+                        </Bundle-Activator>
+                        <Main-Class>
+                            org.apache.karaf.shell.console.Main
+                        </Main-Class>
+                        <Export-Service>
+                            org.apache.felix.service.threadio.ThreadIO,
+                            org.apache.felix.service.command.CommandProcessor,
+                            org.apache.felix.service.command.Converter
+                        </Export-Service>
+                    </instructions>
+                    <unpackBundle>true</unpackBundle>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding.properties b/karaf-2.2.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding.properties
new file mode 100644
index 0000000..d27f48f
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding.properties
@@ -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.
+##
+
+welcome = \
+\u001B[36m        __ __                  ____      \u001B[0m\r\n\
+\u001B[36m       / //_/____ __________ _/ __/      \u001B[0m\r\n\
+\u001B[36m      / ,<  / __ `/ ___/ __ `/ /_        \u001B[0m\r\n\
+\u001B[36m     / /| |/ /_/ / /  / /_/ / __/        \u001B[0m\r\n\
+\u001B[36m    /_/ |_|\\__,_/_/   \\__,_/_/         \u001B[0m\r\n\
+\r\n\
+\u001B[1m  Apache Karaf\u001B[0m (${project.version})\r\n\
+\r\n\
+Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\r\n\
+   and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\
+Hit '\u001B[1m<ctrl-d>\u001B[0m' or '\u001B[1mosgi:shutdown\u001B[0m' to shutdown Karaf.\r\n
+
+
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java
new file mode 100644
index 0000000..38c6301
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.gogo.commands;
+
+import org.apache.felix.service.command.CommandSession;
+
+
+public interface Action
+{
+
+    Object execute(CommandSession session) throws Exception;
+
+}
+
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java
new file mode 100644
index 0000000..691402b
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java
@@ -0,0 +1,50 @@
+/*
+ * 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.felix.gogo.commands;
+
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+/**
+ * Represents a positional argument on a command line (as opposed to an optional named {@link Option}
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Argument
+{
+    public static final String DEFAULT_STRING= "DEFAULT";
+
+    String DEFAULT = "##default";
+
+    String name() default DEFAULT;
+
+    String description() default "";
+
+    boolean required() default false;
+
+    int index() default 0;
+
+    boolean multiValued() default false;
+
+    String valueToShowInHelp() default DEFAULT_STRING;
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java
new file mode 100644
index 0000000..7b4558f
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.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.felix.gogo.commands;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+/**
+ * Used to denote a class represents a command which is executable within a shell/scope or as a
+ * command line process.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+public @interface Command
+{
+    /**
+     * Returns the scope or sub shell of the command
+     */
+    String scope();
+
+    /**
+     * REturns the name of the command if used inside a shell
+     */
+    String name();
+
+    /**
+     * Returns the description of the command which is used to generate command line help
+     */
+    String description() default "";
+
+    /**
+     * Returns a detailed description of the command
+     */
+    String detailedDescription() default "";
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CommandException.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CommandException.java
new file mode 100644
index 0000000..dc3821d
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CommandException.java
@@ -0,0 +1,64 @@
+/*
+ * 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.felix.gogo.commands;
+
+import org.fusesource.jansi.Ansi;
+
+/**
+ * Base class for exceptions thrown when executing commands.
+ */
+public class CommandException extends Exception {
+
+    private String help;
+
+    public CommandException() {
+    }
+
+    public CommandException(String message) {
+        super(message);
+    }
+
+    public CommandException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public CommandException(Throwable cause) {
+        super(cause);
+    }
+
+    public CommandException(String help, String message) {
+        super(message);
+        this.help = help;
+    }
+
+    public CommandException(String help, String message, Throwable cause) {
+        super(message, cause);
+        this.help = help;
+    }
+
+    public String getNiceHelp() {
+        return  help != null ? help
+                    : Ansi.ansi()
+                        .fg(Ansi.Color.RED)
+                        .a("Error executing command: ")
+                        .a(getMessage() != null ? getMessage() : getClass().getName())
+                        .fg(Ansi.Color.DEFAULT).toString();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CompleterValues.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CompleterValues.java
new file mode 100644
index 0000000..996bfc8
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CompleterValues.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.felix.gogo.commands;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Represents a method which can return a List or Array of values used for a
+ * {@link org.apache.karaf.shell.console.Completer}
+ * which is associated with the index of an
+ * {@link org.apache.felix.gogo.commands.Argument}
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.FIELD})
+public @interface CompleterValues
+{
+    int index() default 0;
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java
new file mode 100644
index 0000000..d2a730b
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java
@@ -0,0 +1,46 @@
+/*
+ * 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.felix.gogo.commands;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+/**
+ * Used to mark an optional named command line option who's name typically starts with "--"
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.FIELD})
+public @interface Option
+{
+    public static final String DEFAULT_STRING= "DEFAULT";
+
+    String name();
+
+    String[] aliases() default {};
+
+    String description() default "";
+
+    boolean required() default false;
+
+    boolean multiValued() default false;
+
+    String valueToShowInHelp() default DEFAULT_STRING;
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java
new file mode 100644
index 0000000..1bf2b96
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java
@@ -0,0 +1,64 @@
+/*
+ * 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.felix.gogo.commands.basic;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.felix.gogo.commands.basic.ActionPreparator;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Function;
+
+public abstract class AbstractCommand implements Function {
+
+    public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+        Action action = createNewAction();
+        try {
+            if (getPreparator().prepare(action, session, arguments)) {
+                return action.execute(session);
+            } else {
+                return null;
+            }
+        } finally {
+        	releaseAction(action);
+        }
+    }
+
+    public Class<? extends Action> getActionClass() {
+        return createNewAction().getClass();
+    }
+
+    public abstract Action createNewAction();
+
+    /**
+     * Release the used Action.
+     * This method has to be overridden for pool based Actions.
+     * @param action Action that was executed
+     * @throws Exception if something went wrong during the Action release
+     */
+    public void releaseAction(Action action) throws Exception {
+    	// Do nothing by default (stateful)
+    }
+
+    protected ActionPreparator getPreparator() throws Exception {
+        return new DefaultActionPreparator();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java
new file mode 100644
index 0000000..6832bb0
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.gogo.commands.basic;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.service.command.CommandSession;
+
+public interface ActionPreparator {
+
+    boolean prepare(Action action, CommandSession session, List<Object> arguments) throws Exception;
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java
new file mode 100644
index 0000000..d279eee
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java
@@ -0,0 +1,594 @@
+/*
+ * 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.felix.gogo.commands.basic;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.util.*;
+import java.io.PrintStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.CommandException;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.converter.DefaultConverter;
+import org.apache.felix.gogo.commands.converter.GenericType;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.NameScoping;
+import org.fusesource.jansi.Ansi;
+
+public class DefaultActionPreparator implements ActionPreparator {
+
+    public static final Option HELP = new Option() {
+        public String name() {
+            return "--help";
+        }
+
+        public String[] aliases() {
+            return new String[]{};
+        }
+
+        public String description() {
+            return "Display this help message";
+        }
+
+        public boolean required() {
+            return false;
+        }
+
+        public boolean multiValued() {
+            return false;
+        }
+
+        public String valueToShowInHelp() {
+            return Option.DEFAULT_STRING;
+        }
+
+        public Class<? extends Annotation> annotationType() {
+            return Option.class;
+        }
+    };
+
+    public boolean prepare(Action action, CommandSession session, List<Object> params) throws Exception {
+        Map<Option, Field> options = new HashMap<Option, Field>();
+        Map<Argument, Field> arguments = new HashMap<Argument, Field>();
+        List<Argument> orderedArguments = new ArrayList<Argument>();
+        // Introspect
+        for (Class type = action.getClass(); type != null; type = type.getSuperclass()) {
+            for (Field field : type.getDeclaredFields()) {
+                Option option = field.getAnnotation(Option.class);
+                if (option != null) {
+                    options.put(option, field);
+                }
+                Argument argument = field.getAnnotation(Argument.class);
+                if (argument != null) {
+                    if (Argument.DEFAULT.equals(argument.name())) {
+                        final Argument delegate = argument;
+                        final String name = field.getName();
+                        argument = new Argument() {
+                            public String name() {
+                                return name;
+                            }
+
+                            public String description() {
+                                return delegate.description();
+                            }
+
+                            public boolean required() {
+                                return delegate.required();
+                            }
+
+                            public int index() {
+                                return delegate.index();
+                            }
+
+                            public boolean multiValued() {
+                                return delegate.multiValued();
+                            }
+
+                            public String valueToShowInHelp() {
+                                return delegate.valueToShowInHelp();
+                            }
+
+                            public Class<? extends Annotation> annotationType() {
+                                return delegate.annotationType();
+                            }
+                        };
+                    }
+                    arguments.put(argument, field);
+                    int index = argument.index();
+                    while (orderedArguments.size() <= index) {
+                        orderedArguments.add(null);
+                    }
+                    if (orderedArguments.get(index) != null) {
+                        throw new IllegalArgumentException("Duplicate argument index: " + index);
+                    }
+                    orderedArguments.set(index, argument);
+                }
+            }
+        }
+        // Check indexes are correct
+        for (int i = 0; i < orderedArguments.size(); i++) {
+            if (orderedArguments.get(i) == null) {
+                throw new IllegalArgumentException("Missing argument for index: " + i);
+            }
+        }
+        // Populate
+        Map<Option, Object> optionValues = new HashMap<Option, Object>();
+        Map<Argument, Object> argumentValues = new HashMap<Argument, Object>();
+        boolean processOptions = true;
+        int argIndex = 0;
+        for (Iterator<Object> it = params.iterator(); it.hasNext(); ) {
+            Object param = it.next();
+            // Check for help
+            if (HELP.name().equals(param) || Arrays.asList(HELP.aliases()).contains(param)) {
+                printUsage(session, action, options, arguments, System.out);
+                return false;
+            }
+            if (processOptions && param instanceof String && ((String) param).startsWith("-")) {
+                boolean isKeyValuePair = ((String) param).indexOf('=') != -1;
+                String name;
+                Object value = null;
+                if (isKeyValuePair) {
+                    name = ((String) param).substring(0, ((String) param).indexOf('='));
+                    value = ((String) param).substring(((String) param).indexOf('=') + 1);
+                } else {
+                    name = (String) param;
+                }
+                Option option = null;
+                for (Option opt : options.keySet()) {
+                    if (name.equals(opt.name()) || Arrays.asList(opt.aliases()).contains(name)) {
+                        option = opt;
+                        break;
+                    }
+                }
+                if (option == null) {
+                    Command command = action.getClass().getAnnotation(Command.class);
+                    if (command != null) {
+                        throw new CommandException(
+                                Ansi.ansi()
+                                        .fg(Ansi.Color.RED)
+                                        .a("Error executing command ")
+                                        .a(command.scope())
+                                        .a(":")
+                                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                                        .a(command.name())
+                                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                        .a(" undefined option ")
+                                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                                        .a(param)
+                                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                        .fg(Ansi.Color.DEFAULT)
+                                        .toString(),
+                                "Undefined option: " + param
+                        );
+                    } else {
+                        throw new CommandException("Undefined option: " + param);
+                    }
+                }
+                Field field = options.get(option);
+                if (value == null && (field.getType() == boolean.class || field.getType() == Boolean.class)) {
+                    value = Boolean.TRUE;
+                }
+                if (value == null && it.hasNext()) {
+                    value = it.next();
+                }
+                if (value == null) {
+                    Command command = action.getClass().getAnnotation(Command.class);
+                    if (command != null) {
+                        throw new CommandException(
+                                Ansi.ansi()
+                                        .fg(Ansi.Color.RED)
+                                        .a("Error executing command ")
+                                        .a(command.scope())
+                                        .a(":")
+                                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                                        .a(command.name())
+                                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                        .a(" missing value for option ")
+                                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                                        .a(param)
+                                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                        .fg(Ansi.Color.DEFAULT)
+                                        .toString(),
+                                "Missing value for option: " + param
+                        );
+                    } else {
+                        throw new CommandException("Missing value for option: " + param);
+                    }
+                }
+                if (option.multiValued()) {
+                    List<Object> l = (List<Object>) optionValues.get(option);
+                    if (l == null) {
+                        l = new ArrayList<Object>();
+                        optionValues.put(option, l);
+                    }
+                    l.add(value);
+                } else {
+                    optionValues.put(option, value);
+                }
+            } else {
+                processOptions = false;
+                if (argIndex >= orderedArguments.size()) {
+                    Command command = action.getClass().getAnnotation(Command.class);
+                    if (command != null) {
+                        throw new CommandException(
+                                Ansi.ansi()
+                                        .fg(Ansi.Color.RED)
+                                        .a("Error executing command ")
+                                        .a(command.scope())
+                                        .a(":")
+                                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                                        .a(command.name())
+                                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                        .a(": too many arguments specified")
+                                        .fg(Ansi.Color.DEFAULT)
+                                        .toString(),
+                                "Too many arguments specified"
+                        );
+                    } else {
+                        throw new CommandException("Too many arguments specified");
+                    }
+                }
+                Argument argument = orderedArguments.get(argIndex);
+                if (!argument.multiValued()) {
+                    argIndex++;
+                }
+                if (argument.multiValued()) {
+                    List<Object> l = (List<Object>) argumentValues.get(argument);
+                    if (l == null) {
+                        l = new ArrayList<Object>();
+                        argumentValues.put(argument, l);
+                    }
+                    l.add(param);
+                } else {
+                    argumentValues.put(argument, param);
+                }
+            }
+        }
+        // Check required arguments / options
+        for (Option option : options.keySet()) {
+            if (option.required() && optionValues.get(option) == null) {
+                Command command = action.getClass().getAnnotation(Command.class);
+                if (command != null) {
+                    throw new CommandException(
+                            Ansi.ansi()
+                                    .fg(Ansi.Color.RED)
+                                    .a("Error executing command ")
+                                    .a(command.scope())
+                                    .a(":")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(command.name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(": option ")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(option.name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(" is required")
+                                    .fg(Ansi.Color.DEFAULT)
+                                    .toString(),
+                            "Option " + option.name() + " is required"
+                    );
+                } else {
+                    throw new CommandException("Option " + option.name() + " is required");
+                }
+            }
+        }
+        for (Argument argument : arguments.keySet()) {
+            if (argument.required() && argumentValues.get(argument) == null) {
+                Command command = action.getClass().getAnnotation(Command.class);
+                if (command != null) {
+                    throw new CommandException(
+                            Ansi.ansi()
+                                    .fg(Ansi.Color.RED)
+                                    .a("Error executing command ")
+                                    .a(command.scope())
+                                    .a(":")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(command.name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(": argument ")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(argument.name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(" is required")
+                                    .fg(Ansi.Color.DEFAULT)
+                                    .toString(),
+                            "Argument " + argument.name() + " is required"
+                    );
+                } else {
+                    throw new CommandException("Argument " + argument.name() + " is required");
+                }
+            }
+        }
+        // Convert and inject values
+        for (Map.Entry<Option, Object> entry : optionValues.entrySet()) {
+            Field field = options.get(entry.getKey());
+            Object value;
+            try {
+                value = convert(action, session, entry.getValue(), field.getGenericType());
+            } catch (Exception e) {
+                Command command = action.getClass().getAnnotation(Command.class);
+                if (command != null) {
+                    throw new CommandException(
+                            Ansi.ansi()
+                                    .fg(Ansi.Color.RED)
+                                    .a("Error executing command ")
+                                    .a(command.scope())
+                                    .a(":")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(command.name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(": unable to convert option ")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(entry.getKey().name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(" with value '")
+                                    .a(entry.getValue())
+                                    .a("' to type ")
+                                    .a(new GenericType(field.getGenericType()).toString())
+                                    .fg(Ansi.Color.DEFAULT)
+                                    .toString(),
+                            "Unable to convert option " + entry.getKey().name() + " with value '"
+                                    + entry.getValue() + "' to type " + new GenericType(field.getGenericType()).toString(),
+                            e
+                    );
+                } else {
+                    throw new CommandException("Unable to convert option " + entry.getKey().name() + " with value '"
+                            + entry.getValue() + "' to type " + new GenericType(field.getGenericType()).toString(),
+                            e);
+                }
+            }
+            field.setAccessible(true);
+            field.set(action, value);
+        }
+        for (Map.Entry<Argument, Object> entry : argumentValues.entrySet()) {
+            Field field = arguments.get(entry.getKey());
+            Object value;
+            try {
+                value = convert(action, session, entry.getValue(), field.getGenericType());
+            } catch (Exception e) {
+                Command command = action.getClass().getAnnotation(Command.class);
+                if (command != null) {
+                    throw new CommandException(
+                            Ansi.ansi()
+                                    .fg(Ansi.Color.RED)
+                                    .a("Error executing command ")
+                                    .a(command.scope())
+                                    .a(":")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(command.name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(": unable to convert argument ")
+                                    .a(Ansi.Attribute.INTENSITY_BOLD)
+                                    .a(entry.getKey().name())
+                                    .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                                    .a(" with value '")
+                                    .a(entry.getValue())
+                                    .a("' to type ")
+                                    .a(new GenericType(field.getGenericType()).toString())
+                                    .fg(Ansi.Color.DEFAULT)
+                                    .toString(),
+                            "Unable to convert argument " + entry.getKey().name() + " with value '"
+                                    + entry.getValue() + "' to type " + new GenericType(field.getGenericType()).toString(),
+                            e
+                    );
+                } else {
+                    throw new CommandException("Unable to convert argument " + entry.getKey().name() + " with value '"
+                            + entry.getValue() + "' to type " + new GenericType(field.getGenericType()).toString(),
+                            e);
+                }
+            }
+            field.setAccessible(true);
+            field.set(action, value);
+        }
+        return true;
+    }
+
+    protected void printUsage(CommandSession session, Action action, Map<Option, Field> optionsMap, Map<Argument, Field> argsMap, PrintStream out) {
+        Command command = action.getClass().getAnnotation(Command.class);
+        if (command != null) {
+            Terminal term = session != null ? (Terminal) session.get(".jline.terminal") : null;
+            List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
+            Collections.sort(arguments, new Comparator<Argument>() {
+                public int compare(Argument o1, Argument o2) {
+                    return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
+                }
+            });
+            Set<Option> options = new HashSet<Option>(optionsMap.keySet());
+            options.add(HELP);
+            boolean globalScope = NameScoping.isGlobalScope(session, command.scope());
+            if (command != null && (command.description() != null || command.name() != null)) {
+                out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("DESCRIPTION").a(Ansi.Attribute.RESET));
+                out.print("        ");
+                if (command.name() != null) {
+                    if (globalScope) {
+                        out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(command.name()).a(Ansi.Attribute.RESET));
+                    } else {
+                        out.println(Ansi.ansi().a(command.scope()).a(":").a(Ansi.Attribute.INTENSITY_BOLD).a(command.name()).a(Ansi.Attribute.RESET));
+                    }
+                    out.println();
+                }
+                out.print("\t");
+                out.println(command.description());
+                out.println();
+            }
+            StringBuffer syntax = new StringBuffer();
+            if (command != null) {
+                if (globalScope) {
+                    syntax.append(command.name());
+                } else {
+                    syntax.append(String.format("%s:%s", command.scope(), command.name()));
+                }
+            }
+            if (options.size() > 0) {
+                syntax.append(" [options]");
+            }
+            if (arguments.size() > 0) {
+                syntax.append(' ');
+                for (Argument argument : arguments) {
+                    if (!argument.required()) {
+                        syntax.append(String.format("[%s] ", argument.name()));
+                    } else {
+                        syntax.append(String.format("%s ", argument.name()));
+                    }
+                }
+            }
+
+            out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("SYNTAX").a(Ansi.Attribute.RESET));
+            out.print("        ");
+            out.println(syntax.toString());
+            out.println();
+            if (arguments.size() > 0) {
+                out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("ARGUMENTS").a(Ansi.Attribute.RESET));
+                for (Argument argument : arguments) {
+                    out.print("        ");
+                    out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(argument.name()).a(Ansi.Attribute.RESET));
+                    printFormatted("                ", argument.description(), term != null ? term.getWidth() : 80, out);
+                    if (!argument.required()) {
+                        if (argument.valueToShowInHelp() != null && argument.valueToShowInHelp().length() != 0) {
+                            try {
+                                if (Argument.DEFAULT_STRING.equals(argument.valueToShowInHelp())) {
+                                    argsMap.get(argument).setAccessible(true);
+                                    Object o = argsMap.get(argument).get(action);
+                                    printObjectDefaultsTo(out, o);
+                                } else {
+                                    printDefaultsTo(out, argument.valueToShowInHelp());
+                                }
+                            } catch (Throwable t) {
+                                // Ignore
+                            }
+                        }
+                    }
+                }
+                out.println();
+            }
+            if (options.size() > 0) {
+                out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("OPTIONS").a(Ansi.Attribute.RESET));
+                for (Option option : options) {
+                    String opt = option.name();
+                    for (String alias : option.aliases()) {
+                        opt += ", " + alias;
+                    }
+                    out.print("        ");
+                    out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(opt).a(Ansi.Attribute.RESET));
+                    printFormatted("                ", option.description(), term != null ? term.getWidth() : 80, out);
+                    if (option.valueToShowInHelp() != null && option.valueToShowInHelp().length() != 0) {
+                        try {
+                            if (Option.DEFAULT_STRING.equals(option.valueToShowInHelp())) {
+                                optionsMap.get(option).setAccessible(true);
+                                Object o = optionsMap.get(option).get(action);
+                                printObjectDefaultsTo(out, o);
+                            } else {
+                                printDefaultsTo(out, option.valueToShowInHelp());
+                            }
+                        } catch (Throwable t) {
+                            // Ignore
+                        }
+                    }
+                }
+                out.println();
+            }
+            if (command.detailedDescription().length() > 0) {
+                out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("DETAILS").a(Ansi.Attribute.RESET));
+                String desc = loadDescription(action.getClass(), command.detailedDescription());
+                printFormatted("        ", desc, term != null ? term.getWidth() : 80, out);
+            }
+        }
+    }
+
+    private void printObjectDefaultsTo(PrintStream out, Object o) {
+        if (o != null
+                && (!(o instanceof Boolean) || ((Boolean) o))
+                && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
+            printDefaultsTo(out, o.toString());
+        }
+    }
+
+    private void printDefaultsTo(PrintStream out, String value) {
+        out.print("                (defaults to ");
+        out.print(value);
+        out.println(")");
+    }
+
+    protected String loadDescription(Class clazz, String desc) {
+        if (desc.startsWith("classpath:")) {
+            InputStream is = clazz.getResourceAsStream(desc.substring("classpath:".length()));
+            if (is == null) {
+                is = clazz.getClassLoader().getResourceAsStream(desc.substring("classpath:".length()));
+            }
+            if (is == null) {
+                desc = "Unable to load description from " + desc;
+            } else {
+                try {
+                    Reader r = new InputStreamReader(is);
+                    StringWriter sw = new StringWriter();
+                    int c;
+                    while ((c = r.read()) != -1) {
+                        sw.append((char) c);
+                    }
+                    desc = sw.toString();
+                } catch (IOException e) {
+                    desc = "Unable to load description from " + desc;
+                } finally {
+                    try {
+                        is.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+                }
+            }
+        }
+        return desc;
+    }
+
+    // TODO move this to a helper class?
+    public static void printFormatted(String prefix, String str, int termWidth, PrintStream out) {
+        int pfxLen = length(prefix);
+        int maxwidth = termWidth - pfxLen;
+        Pattern wrap = Pattern.compile("(\\S\\S{" + maxwidth + ",}|.{1," + maxwidth + "})(\\s+|$)");
+        Matcher m = wrap.matcher(str);
+        while (m.find()) {
+            out.print(prefix);
+            out.println(m.group());
+        }
+    }
+
+    public static int length(String str) {
+        return str.length();
+    }
+
+    protected Object convert(Action action, CommandSession session, Object value, Type toType) throws Exception {
+        if (toType == String.class) {
+            return value != null ? value.toString() : null;
+        }
+        return new DefaultConverter(action.getClass().getClassLoader()).convert(value, toType);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
new file mode 100644
index 0000000..ad9f34b
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
@@ -0,0 +1,80 @@
+/*
+ * 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.felix.gogo.commands.basic;
+
+import java.util.Hashtable;
+
+import org.apache.felix.service.command.Function;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.BundleContext;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Command;
+
+/**
+ * A very simple {@link Function} which creates {@link Action} based on a class name.
+ */
+public class SimpleCommand extends AbstractCommand {
+
+    private Class<? extends Action> actionClass;
+
+    public SimpleCommand()
+    {
+    }
+
+    public SimpleCommand(Class<? extends Action> actionClass)
+    {
+        this.actionClass = actionClass;
+    }
+
+    public Class<? extends Action> getActionClass()
+    {
+        return actionClass;
+    }
+
+    public void setActionClass(Class<? extends Action> actionClass)
+    {
+        this.actionClass = actionClass;
+    }
+
+    public Action createNewAction() {
+        try {
+            return actionClass.newInstance();
+        } catch (InstantiationException e) {
+            throw new RuntimeException(e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public static ServiceRegistration export(BundleContext context, Class<? extends Action> actionClass)
+    {
+        Command cmd = actionClass.getAnnotation(Command.class);
+        if (cmd == null)
+        {
+            throw new IllegalArgumentException("Action class is not annotated with @Command");
+        }
+        Hashtable props = new Hashtable();
+        props.put("osgi.command.scope", cmd.scope());
+        props.put("osgi.command.function", cmd.name());
+        SimpleCommand command = new SimpleCommand(actionClass);
+        return context.registerService(Function.class.getName(), command, props);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java
new file mode 100644
index 0000000..df20321
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java
@@ -0,0 +1,403 @@
+/*
+ * 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.felix.gogo.commands.converter;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Dictionary;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.LinkedHashMap;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.Set;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Queue;
+import java.util.LinkedList;
+import java.util.regex.Pattern;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.math.BigInteger;
+import java.math.BigDecimal;
+import java.io.ByteArrayInputStream;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Array;
+import java.lang.reflect.Type;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.felix.gogo.commands.converter.ReifiedType;
+
+public class DefaultConverter
+{
+
+    private Object loader;
+
+    public DefaultConverter(Object loader) {
+        this.loader = loader;
+    }
+
+    public Object convert(Object source, Type target) throws Exception {
+        return convert( source, new GenericType(target));
+    }
+
+    public Object convert(Object fromValue, ReifiedType type) throws Exception {
+        // Discard null values
+        if (fromValue == null) {
+            return null;
+        }
+        // If the object is an instance of the type, just return it
+        if (isAssignable(fromValue, type)) {
+            return fromValue;
+        }
+        Object value = convertWithConverters(fromValue, type);
+        if (value == null) {
+            if (fromValue instanceof Number && Number.class.isAssignableFrom(unwrap(toClass(type)))) {
+                return convertToNumber((Number) fromValue, toClass(type));
+            } else if (fromValue instanceof String) {
+                return convertFromString((String) fromValue, toClass(type), loader);
+            } else if (toClass(type).isArray() && (fromValue instanceof Collection || fromValue.getClass().isArray())) {
+                return convertToArray(fromValue, type);
+            } else if (Map.class.isAssignableFrom(toClass(type)) && (fromValue instanceof Map || fromValue instanceof Dictionary)) {
+                return convertToMap(fromValue, type);
+            } else if (Dictionary.class.isAssignableFrom(toClass(type)) && (fromValue instanceof Map || fromValue instanceof Dictionary)) {
+                return convertToDictionary(fromValue, type);
+            } else if (Collection.class.isAssignableFrom(toClass(type)) && (fromValue instanceof Collection || fromValue.getClass().isArray())) {
+                return convertToCollection(fromValue, type);
+            } else {
+                throw new Exception("Unable to convert value " + fromValue + " to type " + type);
+            }
+        }
+        return value;
+    }
+
+    private Object convertWithConverters(Object source, ReifiedType type) throws Exception {
+        Object value = null;
+//        for (Converter converter : converters) {
+//            if (converter.canConvert(source, type)) {
+//                value = converter.convert(source, type);
+//                if (value != null) {
+//                    return value;
+//                }
+//            }
+//        }
+        return value;
+    }
+
+    public Object convertToNumber(Number value, Class toType) throws Exception {
+        toType = unwrap(toType);
+        if (AtomicInteger.class == toType) {
+            return new AtomicInteger((Integer) convertToNumber(value, Integer.class));
+        } else if (AtomicLong.class == toType) {
+            return new AtomicLong((Long) convertToNumber(value, Long.class));
+        } else if (Integer.class == toType) {
+            return value.intValue();
+        } else if (Short.class == toType) {
+            return value.shortValue();
+        } else if (Long.class == toType) {
+            return value.longValue();
+        } else if (Float.class == toType) {
+            return value.floatValue();
+        } else if (Double.class == toType) {
+            return value.doubleValue();
+        } else if (Byte.class == toType) {
+            return value.byteValue();
+        } else if (BigInteger.class == toType) {
+            return new BigInteger(value.toString());
+        } else if (BigDecimal.class == toType) {
+            return new BigDecimal(value.toString());
+        } else {
+            throw new Exception("Unable to convert number " + value + " to " + toType);
+        }
+    }
+
+    public Object convertFromString(String value, Class toType, Object loader) throws Exception {
+        toType = unwrap(toType);
+        if (ReifiedType.class == toType) {
+            try {
+                return GenericType.parse(value, loader);
+            } catch (ClassNotFoundException e) {
+                throw new Exception("Unable to convert", e);
+            }
+        } else if (Class.class == toType) {
+            try {
+                return GenericType.parse(value, loader).getRawClass();
+            } catch (ClassNotFoundException e) {
+                throw new Exception("Unable to convert", e);
+            }
+        } else if (Locale.class == toType) {
+            String[] tokens = value.split("_");
+            if (tokens.length == 1) {
+                return new Locale(tokens[0]);
+            } else if (tokens.length == 2) {
+                return new Locale(tokens[0], tokens[1]);
+            } else if (tokens.length == 3) {
+                return new Locale(tokens[0], tokens[1], tokens[2]);
+            } else {
+                throw new Exception("Invalid locale string:" + value);
+            }
+        } else if (Pattern.class == toType) {
+            return Pattern.compile(value);
+        } else if (Properties.class == toType) {
+            Properties props = new Properties();
+            ByteArrayInputStream in = new ByteArrayInputStream(value.getBytes("UTF8"));
+            props.load(in);
+            return props;
+        } else if (Boolean.class == toType) {
+            if ("yes".equalsIgnoreCase(value) || "true".equalsIgnoreCase(value) || "on".equalsIgnoreCase(value)) {
+                return Boolean.TRUE;
+            } else if ("no".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value) || "off".equalsIgnoreCase(value)) {
+                return Boolean.FALSE;
+            } else {
+                throw new RuntimeException("Invalid boolean value: " + value);
+            }
+        } else if (Integer.class == toType) {
+            return Integer.valueOf(value);
+        } else if (Short.class == toType) {
+            return Short.valueOf(value);
+        } else if (Long.class == toType) {
+            return Long.valueOf(value);
+        } else if (Float.class == toType) {
+            return Float.valueOf(value);
+        } else if (Double.class == toType) {
+            return Double.valueOf(value);
+        } else if (Character.class == toType) {
+            if (value.length() == 6 && value.startsWith("\\u")) {
+                int code = Integer.parseInt(value.substring(2), 16);
+                return (char)code;
+            } else if (value.length() == 1) {
+                return value.charAt(0);
+            } else {
+                throw new Exception("Invalid value for character type: " + value);
+            }
+        } else if (Byte.class == toType) {
+            return Byte.valueOf(value);
+        } else if (Enum.class.isAssignableFrom(toType)) {
+            return Enum.valueOf((Class<Enum>) toType, value);
+        } else {
+            return createObject(value, toType);
+        }
+    }
+
+    private static Object createObject(String value, Class type) throws Exception {
+        if (type.isInterface() || Modifier.isAbstract(type.getModifiers())) {
+            throw new Exception("Unable to convert value " + value + " to type " + type + ". Type " + type + " is an interface or an abstract class");
+        }
+        Constructor constructor = null;
+        try {
+            constructor = type.getConstructor(String.class);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Unable to convert to " + type);
+        }
+        try {
+            return constructor.newInstance(value);
+        } catch (Exception e) {
+            throw new Exception("Unable to convert ", getRealCause(e));
+        }
+    }
+
+    private static Throwable getRealCause(Throwable t) {
+        if (t instanceof InvocationTargetException && t.getCause() != null) {
+            return t.getCause();
+        }
+        return t;
+    }
+
+    private Object convertToCollection(Object obj, ReifiedType type) throws Exception {
+        ReifiedType valueType = type.getActualTypeArgument(0);
+        Collection newCol = (Collection) getCollection(toClass(type)).newInstance();
+        if (obj.getClass().isArray()) {
+            for (int i = 0; i < Array.getLength(obj); i++) {
+                try {
+                    newCol.add(convert(Array.get(obj, i), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting array element)", t);
+                }
+            }
+        } else {
+            for (Object item : (Collection) obj) {
+                try {
+                    newCol.add(convert(item, valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting collection entry)", t);
+                }
+            }
+        }
+        return newCol;
+    }
+
+    private Object convertToDictionary(Object obj, ReifiedType type) throws Exception {
+        ReifiedType keyType = type.getActualTypeArgument(0);
+        ReifiedType valueType = type.getActualTypeArgument(1);
+        Dictionary newDic = new Hashtable();
+        if (obj instanceof Dictionary) {
+            Dictionary dic = (Dictionary) obj;
+            for (Enumeration keyEnum = dic.keys(); keyEnum.hasMoreElements();) {
+                Object key = keyEnum.nextElement();
+                try {
+                    newDic.put(convert(key, keyType), convert(dic.get(key), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        } else {
+            for (Map.Entry e : ((Map<Object,Object>) obj).entrySet()) {
+                try {
+                    newDic.put(convert(e.getKey(), keyType), convert(e.getValue(), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        }
+        return newDic;
+    }
+
+    private Object convertToMap(Object obj, ReifiedType type) throws Exception {
+        ReifiedType keyType = type.getActualTypeArgument(0);
+        ReifiedType valueType = type.getActualTypeArgument(1);
+        Map newMap = (Map) getMap(toClass(type)).newInstance();
+        if (obj instanceof Dictionary) {
+            Dictionary dic = (Dictionary) obj;
+            for (Enumeration keyEnum = dic.keys(); keyEnum.hasMoreElements();) {
+                Object key = keyEnum.nextElement();
+                try {
+                    newMap.put(convert(key, keyType), convert(dic.get(key), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        } else {
+            for (Map.Entry e : ((Map<Object,Object>) obj).entrySet()) {
+                try {
+                    newMap.put(convert(e.getKey(), keyType), convert(e.getValue(), valueType));
+                } catch (Exception t) {
+                    throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting map entry)", t);
+                }
+            }
+        }
+        return newMap;
+    }
+
+    private Object convertToArray(Object obj, ReifiedType type) throws Exception {
+        if (obj instanceof Collection) {
+            obj = ((Collection) obj).toArray();
+        }
+        if (!obj.getClass().isArray()) {
+            throw new Exception("Unable to convert from " + obj + " to " + type);
+        }
+        ReifiedType componentType;
+        if (type.size() > 0) {
+            componentType = type.getActualTypeArgument(0);
+        } else {
+            componentType = new GenericType(type.getRawClass().getComponentType());
+        }
+        Object array = Array.newInstance(toClass(componentType), Array.getLength(obj));
+        for (int i = 0; i < Array.getLength(obj); i++) {
+            try {
+                Array.set(array, i, convert(Array.get(obj, i), componentType));
+            } catch (Exception t) {
+                throw new Exception("Unable to convert from " + obj + " to " + type + "(error converting array element)", t);
+            }
+        }
+        return array;
+    }
+
+    public static boolean isAssignable(Object source, ReifiedType target) {
+        return source == null
+                || (target.size() == 0
+                    && unwrap(target.getRawClass()).isAssignableFrom(unwrap(source.getClass())));
+    }
+
+    private static Class unwrap(Class c) {
+        Class u = primitives.get(c);
+        return u != null ? u : c;
+    }
+
+    private static Class getMap(Class type) {
+        if (hasDefaultConstructor(type)) {
+            return type;
+        } else if (SortedMap.class.isAssignableFrom(type)) {
+            return TreeMap.class;
+        } else if (ConcurrentMap.class.isAssignableFrom(type)) {
+            return ConcurrentHashMap.class;
+        } else {
+            return LinkedHashMap.class;
+        }
+    }
+
+    private static Class getCollection(Class type) {
+        if (hasDefaultConstructor(type)) {
+            return type;
+        } else if (SortedSet.class.isAssignableFrom(type)) {
+            return TreeSet.class;
+        } else if (Set.class.isAssignableFrom(type)) {
+            return LinkedHashSet.class;
+        } else if (List.class.isAssignableFrom(type)) {
+            return ArrayList.class;
+        } else if (Queue.class.isAssignableFrom(type)) {
+            return LinkedList.class;
+        } else {
+            return ArrayList.class;
+        }
+    }
+
+    private static boolean hasDefaultConstructor(Class type) {
+        if (!Modifier.isPublic(type.getModifiers())) {
+            return false;
+        }
+        if (Modifier.isAbstract(type.getModifiers())) {
+            return false;
+        }
+        Constructor[] constructors = type.getConstructors();
+        for (Constructor constructor : constructors) {
+            if (Modifier.isPublic(constructor.getModifiers()) &&
+                    constructor.getParameterTypes().length == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static final Map<Class, Class> primitives;
+    static {
+        primitives = new HashMap<Class, Class>();
+        primitives.put(byte.class, Byte.class);
+        primitives.put(short.class, Short.class);
+        primitives.put(char.class, Character.class);
+        primitives.put(int.class, Integer.class);
+        primitives.put(long.class, Long.class);
+        primitives.put(float.class, Float.class);
+        primitives.put(double.class, Double.class);
+        primitives.put(boolean.class, Boolean.class);
+    }
+
+    private Class toClass(ReifiedType type) {
+        return type.getRawClass();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java
new file mode 100644
index 0000000..43f5f91
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java
@@ -0,0 +1,196 @@
+/*
+ * 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.felix.gogo.commands.converter;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.apache.felix.gogo.commands.converter.ReifiedType;
+
+public class GenericType extends ReifiedType {
+
+	private static final GenericType[] EMPTY = new GenericType[0];
+
+    private static final Map<String, Class> primitiveClasses = new HashMap<String, Class>();
+
+    static {
+        primitiveClasses.put("int", int.class);
+        primitiveClasses.put("short", short.class);
+        primitiveClasses.put("long", long.class);
+        primitiveClasses.put("byte", byte.class);
+        primitiveClasses.put("char", char.class);
+        primitiveClasses.put("float", float.class);
+        primitiveClasses.put("double", double.class);
+        primitiveClasses.put("boolean", boolean.class);
+    }
+
+    private GenericType[] parameters;
+
+	public GenericType(Type type) {
+		this(getConcreteClass(type), parametersOf(type));
+	}
+
+    public GenericType(Class clazz, GenericType... parameters) {
+        super(clazz);
+        this.parameters = parameters;
+    }
+
+    public static GenericType parse(String type, Object loader) throws ClassNotFoundException, IllegalArgumentException {
+        type = type.trim();
+        // Check if this is an array
+        if (type.endsWith("[]")) {
+            GenericType t = parse(type.substring(0, type.length() - 2), loader);
+            return new GenericType(Array.newInstance(t.getRawClass(), 0).getClass(), t);
+        }
+        // Check if this is a generic
+        int genericIndex = type.indexOf('<');
+        if (genericIndex > 0) {
+            if (!type.endsWith(">")) {
+                throw new IllegalArgumentException("Can not load type: " + type);
+            }
+            GenericType base = parse(type.substring(0, genericIndex), loader);
+            String[] params = type.substring(genericIndex + 1, type.length() - 1).split(",");
+            GenericType[] types = new GenericType[params.length];
+            for (int i = 0; i < params.length; i++) {
+                types[i] = parse(params[i], loader);
+            }
+            return new GenericType(base.getRawClass(), types);
+        }
+        // Primitive
+        if (primitiveClasses.containsKey(type)) {
+            return new GenericType(primitiveClasses.get(type));
+        }
+        // Class
+        if (loader instanceof ClassLoader) {
+            return new GenericType(((ClassLoader) loader).loadClass(type));
+        } else if (loader instanceof Bundle) {
+            return new GenericType(((Bundle) loader).loadClass(type));
+        } else {
+            throw new IllegalArgumentException("Unsupported loader: " + loader);
+        }
+    }
+
+    @Override
+    public ReifiedType getActualTypeArgument(int i) {
+        if (parameters.length == 0) {
+            return super.getActualTypeArgument(i);
+        }
+        return parameters[i];
+    }
+
+    @Override
+    public int size() {
+        return parameters.length;
+    }
+
+    @Override
+    public String toString() {
+        Class cl = getRawClass();
+        if (cl.isArray()) {
+            if (parameters.length > 0) {
+                return parameters[0].toString() + "[]";
+            } else {
+                return cl.getComponentType().getName() + "[]";
+            }
+        }
+        if (parameters.length > 0) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(cl.getName());
+            sb.append("<");
+            for (int i = 0; i < parameters.length; i++) {
+                if (i > 0) {
+                    sb.append(",");
+                }
+                sb.append(parameters[i].toString());
+            }
+            sb.append(">");
+            return sb.toString();
+        }
+        return cl.getName();
+    }
+
+    static GenericType[] parametersOf(Type type ) {
+		if ( type instanceof Class ) {
+		    Class clazz = (Class) type;
+		    if (clazz.isArray()) {
+                GenericType t = new GenericType(clazz.getComponentType());
+                if (t.size() > 0) {
+		            return new GenericType[] { t };
+                } else {
+                    return EMPTY;
+                }
+		    } else {
+		        return EMPTY;
+		    }
+		}
+        if ( type instanceof ParameterizedType ) {
+            ParameterizedType pt = (ParameterizedType) type;
+            Type [] parameters = pt.getActualTypeArguments();
+            GenericType[] gts = new GenericType[parameters.length];
+            for ( int i =0; i<gts.length; i++) {
+                gts[i] = new GenericType(parameters[i]);
+            }
+            return gts;
+        }
+        if ( type instanceof GenericArrayType ) {
+            return new GenericType[] { new GenericType(((GenericArrayType) type).getGenericComponentType()) };
+        }
+        throw new IllegalStateException();
+	}
+
+	static Class<?> getConcreteClass(Type type) {
+		Type ntype = collapse(type);
+		if ( ntype instanceof Class )
+			return (Class<?>) ntype;
+
+		if ( ntype instanceof ParameterizedType )
+			return getConcreteClass(collapse(((ParameterizedType)ntype).getRawType()));
+
+		throw new RuntimeException("Unknown type " + type );
+	}
+
+	static Type collapse(Type target) {
+		if (target instanceof Class || target instanceof ParameterizedType ) {
+			return target;
+		} else if (target instanceof TypeVariable) {
+			return collapse(((TypeVariable<?>) target).getBounds()[0]);
+		} else if (target instanceof GenericArrayType) {
+			Type t = collapse(((GenericArrayType) target)
+					.getGenericComponentType());
+			while ( t instanceof ParameterizedType )
+				t = collapse(((ParameterizedType)t).getRawType());
+			return Array.newInstance((Class<?>)t, 0).getClass();
+		} else if (target instanceof WildcardType) {
+			WildcardType wct = (WildcardType) target;
+			if (wct.getLowerBounds().length == 0)
+				return collapse(wct.getUpperBounds()[0]);
+			else
+				return collapse(wct.getLowerBounds()[0]);
+		}
+		throw new RuntimeException("Huh? " + target);
+	}
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java
new file mode 100644
index 0000000..239616e
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) OSGi Alliance (2008, 2009). All Rights Reserved.
+ *
+ * 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.
+ */
+package org.apache.felix.gogo.commands.converter;
+
+/**
+ * Provides access to a concrete type and its optional generic type arguments.
+ *
+ * Java 5 and later support generic types. These types consist of a raw class
+ * with type arguments. This class models such a <code>Type</code> class but
+ * ensures that the type is <em>reified</em>. Reification means that the Type
+ * graph associated with a Java 5 <code>Type</code> instance is traversed
+ * until the type becomes a concrete class. In Java 1.4 a class has no
+ * arguments. This concrete class implements the Reified Type for Java 1.4.
+ *
+ * In Java 1.4, this class works with non-generic types. In that cases, a
+ * Reified Type provides access to the class and has zero type arguments, though
+ * a subclass that provide type arguments should be respected. Blueprint
+ * extender implementations can subclass this class and provide access to the
+ * generics type graph if used in a conversion. Such a subclass must
+ * <em>reify<em> the different Java 5 <code>Type</code> instances into the
+ * reified form. That is, a form where the raw Class is available with its optional type arguments as Reified Types.
+ *
+ * @Immutable
+ */
+public class ReifiedType {
+	final static ReifiedType ALL = new ReifiedType(Object.class);
+
+	private final Class clazz;
+
+	/**
+	 * Create a Reified Type for a raw Java class without any generic arguments.
+	 * Subclasses can provide the optional generic argument information. Without
+	 * subclassing, this instance has no type arguments.
+	 *
+	 * @param clazz
+	 *            The raw class of the Reified Type.
+	 */
+	public ReifiedType(Class clazz) {
+		this.clazz = clazz;
+	}
+
+	/**
+	 * Access to the raw class.
+	 *
+	 * The raw class represents the concrete class that is associated with a
+	 * type declaration. This class could have been deduced from the generics
+	 * type graph of the declaration. For example, in the following example:
+	 *
+	 * <pre>
+	 * Map&lt;String, Object&gt; map;
+	 * </pre>
+	 *
+	 * The raw class is the Map class.
+	 *
+	 * @return the collapsed raw class that represents this type.
+	 */
+	public Class getRawClass() {
+		return clazz;
+	}
+
+	/**
+	 * Access to a type argument.
+	 *
+	 * The type argument refers to a argument in a generic type declaration
+	 * given by index <code>i</code>. This method returns a Reified Type that
+	 * has Object as class when no generic type information is available. Any
+	 * object is assignable to Object and therefore no conversion is then
+	 * necessary, this is compatible with older Javas than 5. For this reason,
+	 * the implementation in this class always returns the
+	 * <code>Object<code> class, regardless of the given index.
+	 *
+	 * This method should be overridden by a subclass that provides access to
+	 * the generic information.
+	 *
+	 * For example, in the following example:
+	 *
+	 * <pre>
+	 * Map&lt;String, Object&gt; map;
+	 * </pre>
+	 *
+	 * The type argument 0 is <code>String</code>, and type argument 1 is
+	 * <code>Object</code>.
+	 *
+	 * @param i
+	 *            The index of the type argument
+	 * @return <code>ReifiedType(Object.class)<code>, subclasses must override this and return the generic argument at index <code>i</code>
+	 */
+	public ReifiedType getActualTypeArgument(int i) {
+		return ALL;
+	}
+
+	/**
+	 * Return the number of type arguments.
+	 *
+	 * This method should be overridden by a subclass to support Java 5 types.
+	 *
+	 * @return 0, subclasses must override this and return the number of generic
+	 *         arguments
+	 */
+	public int size() {
+		return 0;
+	}
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/runtime/Closure.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/runtime/Closure.java
new file mode 100644
index 0000000..9f7fa7c
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/felix/gogo/runtime/Closure.java
@@ -0,0 +1,669 @@
+/*
+ * 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.felix.gogo.runtime;
+
+import java.io.EOFException;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.felix.gogo.runtime.Tokenizer.Type;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Function;
+
+public class Closure implements Function, Evaluate
+{
+    public static final String LOCATION = ".location";
+    private static final String DEFAULT_LOCK = ".defaultLock";
+
+    private static final long serialVersionUID = 1L;
+    private static final ThreadLocal<String> location = new ThreadLocal<String>();
+
+    private final CommandSessionImpl session;
+    private final Closure parent;
+    private final CharSequence source;
+    private final List<List<List<Token>>> program;
+    private final Object script;
+
+    private Token errTok;
+    private Token errTok2;
+    private List<Object> parms = null;
+    private List<Object> parmv = null;
+
+    public Closure(CommandSessionImpl session, Closure parent, CharSequence source) throws Exception
+    {
+        this.session = session;
+        this.parent = parent;
+        this.source = source;
+        script = session.get("0"); // by convention, $0 is script name
+
+        try
+        {
+            program = new Parser(source).program();
+        }
+        catch (Exception e)
+        {
+            throw setLocation(e);
+        }
+    }
+
+    public CommandSessionImpl session()
+    {
+        return session;
+    }
+
+    private Exception setLocation(Exception e)
+    {
+        if (session.get(DEFAULT_LOCK) == null)
+        {
+            String loc = location.get();
+            if (null == loc)
+            {
+                loc = (null == script ? "" : script + ":");
+
+                if (e instanceof SyntaxError)
+                {
+                    SyntaxError se = (SyntaxError) e;
+                    loc += se.line() + "." + se.column();
+                }
+                else if (null != errTok)
+                {
+                    loc += errTok.line + "." + errTok.column;
+                }
+
+                location.set(loc);
+            }
+            else if (null != script && !loc.contains(":"))
+            {
+                location.set(script + ":" + loc);
+            }
+
+            session.put(LOCATION, location.get());
+        }
+
+        if (e instanceof EOFError)
+        { // map to public exception, so interactive clients can provide more input
+            EOFException eofe = new EOFException(e.getMessage());
+            eofe.initCause(e);
+            return eofe;
+        }
+
+        return e;
+    }
+
+    // implements Function interface
+    public Object execute(CommandSession x, List<Object> values) throws Exception
+    {
+        try
+        {
+            location.remove();
+            session.variables.remove(LOCATION);
+            return execute(values);
+        }
+        catch (Exception e)
+        {
+            throw setLocation(e);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private Object execute(List<Object> values) throws Exception
+    {
+        if (null != values)
+        {
+            parmv = values;
+            parms = new ArgList(parmv);
+        }
+        else if (null != parent)
+        {
+            // inherit parent closure parameters
+            parms = parent.parms;
+            parmv = parent.parmv;
+        }
+        else
+        {
+            // inherit session parameters
+            Object args = session.get("args");
+            if (null != args && args instanceof List<?>)
+            {
+                parmv = (List<Object>) args;
+                parms = new ArgList(parmv);
+            }
+        }
+
+        Pipe last = null;
+        Object[] mark = Pipe.mark();
+
+        for (List<List<Token>> pipeline : program)
+        {
+            ArrayList<Pipe> pipes = new ArrayList<Pipe>();
+
+            for (List<Token> statement : pipeline)
+            {
+                Pipe current = new Pipe(this, statement);
+
+                if (pipes.isEmpty())
+                {
+                    if (current.out == null)
+                    {
+                        current.setIn(session.in);
+                        current.setOut(session.out);
+                        current.setErr(session.err);
+                    }
+                }
+                else
+                {
+                    Pipe previous = pipes.get(pipes.size() - 1);
+                    previous.connect(current);
+                }
+                pipes.add(current);
+            }
+
+            if (pipes.size() == 1)
+            {
+                pipes.get(0).run();
+            }
+            else if (pipes.size() > 1)
+            {
+                for (Pipe pipe : pipes)
+                {
+                    pipe.start();
+                }
+                // FELIX-2723
+                //for (Pipe pipe : pipes)
+                //{
+                //    pipe.join();
+                //}
+                try
+                {
+                    for (Pipe pipe : pipes)
+                    {
+                        pipe.join();
+                    }
+                }
+                catch (InterruptedException e)
+                {
+                    for (Pipe pipe : pipes)
+                    {
+                        pipe.interrupt();
+                    }
+                    throw e;
+                }
+            }
+
+            last = pipes.remove(pipes.size() - 1);
+
+            for (Pipe pipe : pipes)
+            {
+                if (pipe.exception != null)
+                {
+                    // can't throw exception, as result is defined by last pipe
+                    Object oloc = session.get(LOCATION);
+                    String loc = (String.valueOf(oloc).contains(":") ? oloc + ": "
+                        : "pipe: ");
+                    session.err.println(loc + pipe.exception);
+                    session.put("pipe-exception", pipe.exception);
+                }
+            }
+
+            if (last.exception != null)
+            {
+                Pipe.reset(mark);
+                throw last.exception;
+            }
+        }
+
+        Pipe.reset(mark); // reset IO in case same thread used for new client
+
+        return last == null ? null : last.result;
+    }
+
+    private Object eval(Object v)
+    {
+        String s = v.toString();
+        if ("null".equals(s))
+        {
+            v = null;
+        }
+        else if ("false".equals(s))
+        {
+            v = false;
+        }
+        else if ("true".equals(s))
+        {
+            v = true;
+        }
+        else
+        {
+            v = s;
+        }
+        return v;
+    }
+
+    public Object eval(final Token t) throws Exception
+    {
+        Object v = null;
+
+        switch (t.type)
+        {
+            case WORD:
+                v = Tokenizer.expand(t, this);
+
+                if (t == v)
+                {
+                    v = eval(v);
+                }
+                break;
+
+            case CLOSURE:
+                v = new Closure(session, this, t);
+                break;
+
+            case EXECUTION:
+                v = new Closure(session, this, t).execute(session, parms);
+                break;
+
+            case ARRAY:
+                v = array(t);
+                break;
+
+            case ASSIGN:
+                v = t.type;
+                break;
+
+            default:
+                throw new SyntaxError(t.line, t.column, "unexpected token: " + t.type);
+        }
+
+        return v;
+    }
+
+    /*
+     * executeStatement handles the following cases:
+     *    <string> '=' word // simple assignment
+     *    <string> '=' word word.. // complex assignment
+     *    <bareword> word.. // command invocation
+     *    <object> // value of <object>
+     *    <object> word.. // method call
+     */
+    public Object executeStatement(List<Token> statement) throws Exception
+    {
+        Object echo = session.get("echo");
+        String xtrace = null;
+
+        if (echo != null && !"false".equals(echo.toString()))
+        {
+            // set -x execution trace
+            StringBuilder buf = new StringBuilder("+");
+            for (Token token : statement)
+            {
+                buf.append(' ');
+                buf.append(token.source());
+            }
+            xtrace = buf.toString();
+            session.err.println(xtrace);
+        }
+
+        List<Object> values = new ArrayList<Object>();
+        errTok = statement.get(0);
+
+        if ((statement.size() > 3) && Type.ASSIGN.equals(statement.get(1).type))
+        {
+            errTok2 = statement.get(2);
+        }
+
+        for (Token t : statement)
+        {
+            Object v = eval(t);
+
+            if ((Type.EXECUTION == t.type) && (statement.size() == 1))
+            {
+                return v;
+            }
+
+            if (parms == v && parms != null)
+            {
+                values.addAll(parms); // explode $args array
+            }
+            else
+            {
+                values.add(v);
+            }
+        }
+
+        Object cmd = values.remove(0);
+        if (cmd == null)
+        {
+            if (values.isEmpty())
+            {
+                return null;
+            }
+
+            throw new RuntimeException("Command name evaluates to null: " + errTok);
+        }
+
+        if (cmd instanceof CharSequence && values.size() > 0
+            && Type.ASSIGN.equals(values.get(0)))
+        {
+            values.remove(0);
+            String scmd = cmd.toString();
+            Object value;
+
+            if (values.size() == 0)
+            {
+                return session.variables.remove(scmd);
+            }
+
+            if (values.size() == 1)
+            {
+                value = values.get(0);
+            }
+            else
+            {
+                cmd = values.remove(0);
+                if (null == cmd)
+                {
+                    throw new RuntimeException("Command name evaluates to null: "
+                        + errTok2);
+                }
+
+                trace2(xtrace, cmd, values);
+
+                value = bareword(statement.get(2)) ? executeCmd(cmd.toString(), values)
+                    : executeMethod(cmd, values);
+            }
+
+            return assignment(scmd, value);
+        }
+
+        trace2(xtrace, cmd, values);
+
+        return bareword(statement.get(0)) ? executeCmd(cmd.toString(), values)
+            : executeMethod(cmd, values);
+    }
+
+    // second level expanded execution trace
+    private void trace2(String trace1, Object cmd, List<Object> values)
+    {
+        if ("verbose".equals(session.get("echo")))
+        {
+            StringBuilder buf = new StringBuilder("+ " + cmd);
+
+            for (Object value : values)
+            {
+                buf.append(' ');
+                buf.append(value);
+            }
+
+            String trace2 = buf.toString();
+
+            if (!trace2.equals(trace1))
+            {
+                session.err.println("+" + trace2);
+            }
+        }
+    }
+
+    private boolean bareword(Token t) throws Exception
+    {
+        return ((t.type == Type.WORD) && (t == Tokenizer.expand(t, this)) && (eval((Object) t) instanceof String));
+    }
+
+    private Object executeCmd(String scmd, List<Object> values) throws Exception
+    {
+        String scopedFunction = scmd;
+        Object x = get(scmd);
+
+        if (!(x instanceof Function))
+        {
+            if (scmd.indexOf(':') < 0)
+            {
+                scopedFunction = "*:" + scmd;
+            }
+
+            x = get(scopedFunction);
+
+            if (x == null || !(x instanceof Function))
+            {
+                // try default command handler
+                if (session.get(DEFAULT_LOCK) == null)
+                {
+                    x = get("default");
+                    if (x == null)
+                    {
+                        x = get("*:default");
+                    }
+
+                    if (x instanceof Function)
+                    {
+                        try
+                        {
+                            session.put(DEFAULT_LOCK, true);
+                            values.add(0, scmd);
+                            return ((Function) x).execute(session, values);
+                        }
+                        finally
+                        {
+                            session.variables.remove(DEFAULT_LOCK);
+                        }
+                    }
+                }
+
+                throw new CommandNotFoundException(scmd);
+            }
+        }
+        return ((Function) x).execute(session, values);
+    }
+
+    private Object executeMethod(Object cmd, List<Object> values) throws Exception
+    {
+        if (values.isEmpty())
+        {
+            return cmd;
+        }
+
+        boolean dot = values.size() > 1 && ".".equals(String.valueOf(values.get(0)));
+
+        // FELIX-1473 - allow method chaining using dot pseudo-operator, e.g.
+        //  (bundle 0) . loadClass java.net.InetAddress . localhost . hostname
+        //  (((bundle 0) loadClass java.net.InetAddress ) localhost ) hostname
+        if (dot)
+        {
+            Object target = cmd;
+            ArrayList<Object> args = new ArrayList<Object>();
+            values.remove(0);
+
+            for (Object arg : values)
+            {
+                if (".".equals(arg))
+                {
+                    target = Reflective.invoke(session, target,
+                        args.remove(0).toString(), args);
+                    args.clear();
+                }
+                else
+                {
+                    args.add(arg);
+                }
+            }
+
+            if (args.size() == 0)
+            {
+                return target;
+            }
+
+            return Reflective.invoke(session, target, args.remove(0).toString(), args);
+        }
+        else if (cmd.getClass().isArray() && values.size() == 1)
+        {
+            Object[] cmdv = (Object[]) cmd;
+            String index = values.get(0).toString();
+            return "length".equals(index) ? cmdv.length : cmdv[Integer.parseInt(index)];
+        }
+        else
+        {
+            return Reflective.invoke(session, cmd, values.remove(0).toString(), values);
+        }
+    }
+
+    private Object assignment(String name, Object value)
+    {
+        session.variables.put(name, value);
+        return value;
+    }
+
+    private Object array(Token array) throws Exception
+    {
+        List<Token> list = new ArrayList<Token>();
+        Map<Token, Token> map = new LinkedHashMap<Token, Token>();
+        (new Parser(array)).array(list, map);
+
+        if (map.isEmpty())
+        {
+            List<Object> olist = new ArrayList<Object>();
+            for (Token t : list)
+            {
+                Object oval = eval(t);
+                if (oval.getClass().isArray())
+                {
+                    for (Object o : (Object[]) oval)
+                    {
+                        olist.add(o);
+                    }
+                }
+                else
+                {
+                    olist.add(oval);
+                }
+            }
+            return olist;
+        }
+        else
+        {
+            Map<Object, Object> omap = new LinkedHashMap<Object, Object>();
+            for (Entry<Token, Token> e : map.entrySet())
+            {
+                Token key = e.getKey();
+                Object k = eval(key);
+                if (!(k instanceof String))
+                {
+                    throw new SyntaxError(key.line, key.column,
+                        "map key null or not String: " + key);
+                }
+                omap.put(k, eval(e.getValue()));
+            }
+            return omap;
+        }
+    }
+
+    public Object get(String name)
+    {
+        if (parms != null)
+        {
+            if ("args".equals(name))
+            {
+                return parms;
+            }
+
+            if ("argv".equals(name))
+            {
+                return parmv;
+            }
+
+            if ("it".equals(name))
+            {
+                return parms.get(0);
+            }
+
+            if (name.length() == 1 && Character.isDigit(name.charAt(0)))
+            {
+                int i = name.charAt(0) - '0';
+                if (i > 0)
+                {
+                    return parms.get(i - 1);
+                }
+            }
+        }
+
+        return session.get(name);
+    }
+
+    public Object put(String key, Object value)
+    {
+        return session.variables.put(key, value);
+    }
+
+    @Override
+    public String toString()
+    {
+        return source.toString().trim().replaceAll("\n+", "\n").replaceAll(
+            "([^\\\\{(\\[])\n", "\\1;").replaceAll("[ \\\\\t\n]+", " ");
+    }
+
+    /**
+     * List that overrides toString() for implicit $args expansion.
+     * Also checks for index out of bounds, so that $1 evaluates to null
+     * rather than throwing IndexOutOfBoundsException.
+     * e.g. x = { a$args }; x 1 2 => a1 2 and not a[1, 2]
+     */
+    class ArgList extends AbstractList<Object>
+    {
+        private List<Object> list;
+
+        public ArgList(List<Object> args)
+        {
+            this.list = args;
+        }
+
+        @Override
+        public String toString()
+        {
+            StringBuilder buf = new StringBuilder();
+            for (Object o : list)
+            {
+                if (buf.length() > 0)
+                    buf.append(' ');
+                buf.append(o);
+            }
+            return buf.toString();
+        }
+
+        @Override
+        public Object get(int index)
+        {
+            return index < list.size() ? list.get(index) : null;
+        }
+
+        @Override
+        public Object remove(int index)
+        {
+            return list.remove(index);
+        }
+
+        @Override
+        public int size()
+        {
+            return list.size();
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/AbstractAction.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/AbstractAction.java
new file mode 100644
index 0000000..48c80f5
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/AbstractAction.java
@@ -0,0 +1,38 @@
+/*
+ * 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.karaf.shell.console;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.service.command.CommandSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractAction implements Action {
+
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+    protected CommandSession session;
+
+    public Object execute(CommandSession session) throws Exception {
+        this.session = session;
+        return doExecute();
+    }
+
+    protected abstract Object doExecute() throws Exception;
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/BlueprintContainerAware.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/BlueprintContainerAware.java
new file mode 100644
index 0000000..d566f48
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/BlueprintContainerAware.java
@@ -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.
+ */
+package org.apache.karaf.shell.console;
+
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+public interface BlueprintContainerAware {
+
+    void setBlueprintContainer(BlueprintContainer blueprintContainer);
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/BundleContextAware.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/BundleContextAware.java
new file mode 100644
index 0000000..bbd03c5
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/BundleContextAware.java
@@ -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.
+ */
+package org.apache.karaf.shell.console;
+
+import org.osgi.framework.BundleContext;
+
+public interface BundleContextAware {
+
+    void setBundleContext(BundleContext bundleContext);
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/CloseShellException.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/CloseShellException.java
new file mode 100644
index 0000000..09d8346
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/CloseShellException.java
@@ -0,0 +1,26 @@
+/*
+ * 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.karaf.shell.console;
+
+/**
+ * Exception thrown to indicate the console to close.
+ */
+public class CloseShellException extends Exception {
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/CompletableFunction.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/CompletableFunction.java
new file mode 100644
index 0000000..fcb96da
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/CompletableFunction.java
@@ -0,0 +1,31 @@
+/*
+ * 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.karaf.shell.console;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.service.command.Function;
+
+public interface CompletableFunction extends Function {
+
+    List<Completer> getCompleters();
+    Map<String, Completer> getOptionalCompleters();
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Completer.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Completer.java
new file mode 100644
index 0000000..59f7897
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Completer.java
@@ -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.
+ */
+package org.apache.karaf.shell.console;
+
+import java.util.List;
+
+public interface Completer {
+
+    int complete(String buffer, int cursor, List<String> candidates);
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Converters.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Converters.java
new file mode 100644
index 0000000..2b0a3e5
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Converters.java
@@ -0,0 +1,293 @@
+/*
+ * 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.karaf.shell.console;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.Formatter;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.apache.felix.service.command.Converter;
+import org.apache.felix.service.command.Function;
+import org.osgi.service.startlevel.StartLevel;
+
+public class Converters implements Converter
+{
+    private final BundleContext context;
+
+    public Converters(BundleContext context)
+    {
+        this.context = context;
+    }
+
+    private CharSequence print(Bundle bundle)
+    {
+        // [ ID ] [STATE      ] [ SL ] symname
+        StartLevel sl = null;
+        ServiceReference ref = context.getServiceReference(StartLevel.class.getName());
+        if (ref != null)
+        {
+            sl = (StartLevel) context.getService(ref);
+        }
+
+        if (sl == null)
+        {
+            return String.format("%5d|%-11s|%s (%s)", bundle.getBundleId(),
+                getState(bundle), bundle.getSymbolicName(), bundle.getVersion());
+        }
+
+        int level = sl.getBundleStartLevel(bundle);
+        context.ungetService(ref);
+
+        return String.format("%5d|%-11s|%5d|%s (%s)", bundle.getBundleId(),
+            getState(bundle), level, bundle.getSymbolicName(), bundle.getVersion());
+    }
+
+    private CharSequence print(ServiceReference ref)
+    {
+        StringBuilder sb = new StringBuilder();
+        Formatter f = new Formatter(sb);
+
+        String spid = "";
+        Object pid = ref.getProperty("service.pid");
+        if (pid != null)
+        {
+            spid = pid.toString();
+        }
+
+        f.format("%06d %3s %-40s %s", ref.getProperty("service.id"),
+            ref.getBundle().getBundleId(),
+            getShortNames((String[]) ref.getProperty("objectclass")), spid);
+        return sb;
+    }
+
+    private CharSequence getShortNames(String[] list)
+    {
+        StringBuilder sb = new StringBuilder();
+        String del = "";
+        for (String s : list)
+        {
+            sb.append(del + getShortName(s));
+            del = " | ";
+        }
+        return sb;
+    }
+
+    private CharSequence getShortName(String name)
+    {
+        int n = name.lastIndexOf('.');
+        if (n < 0)
+        {
+            n = 0;
+        }
+        else
+        {
+            n++;
+        }
+        return name.subSequence(n, name.length());
+    }
+
+    private String getState(Bundle bundle)
+    {
+        switch (bundle.getState())
+        {
+            case Bundle.ACTIVE:
+                return "Active";
+
+            case Bundle.INSTALLED:
+                return "Installed";
+
+            case Bundle.RESOLVED:
+                return "Resolved";
+
+            case Bundle.STARTING:
+                return "Starting";
+
+            case Bundle.STOPPING:
+                return "Stopping";
+
+            case Bundle.UNINSTALLED:
+                return "Uninstalled ";
+        }
+        return null;
+    }
+
+    public Bundle bundle(Bundle i)
+    {
+        return i;
+    }
+
+    public Object convert(Class<?> desiredType, final Object in) throws Exception
+    {
+        if (desiredType == Bundle.class)
+        {
+            return convertBundle(in);
+        }
+
+        if (desiredType == ServiceReference.class)
+        {
+            return convertServiceReference(in);
+        }
+
+        if (desiredType == Class.class)
+        {
+            try
+            {
+                return Class.forName(in.toString());
+            }
+            catch (ClassNotFoundException e)
+            {
+                return null;
+            }
+        }
+
+        if (desiredType.isAssignableFrom(String.class) && in instanceof InputStream)
+        {
+            return read(((InputStream) in));
+        }
+
+        if (in instanceof Function && desiredType.isInterface()
+            && desiredType.getDeclaredMethods().length == 1)
+        {
+            return Proxy.newProxyInstance(desiredType.getClassLoader(),
+                new Class[] { desiredType }, new InvocationHandler()
+                {
+                    Function command = ((Function) in);
+
+                    public Object invoke(Object proxy, Method method, Object[] args)
+                        throws Throwable
+                    {
+                        return command.execute(null, Arrays.asList(args));
+                    }
+                });
+        }
+
+        return null;
+    }
+
+    private Object convertServiceReference(Object in) throws InvalidSyntaxException
+    {
+        String s = in.toString();
+        if (s.startsWith("(") && s.endsWith(")"))
+        {
+            ServiceReference refs[] = context.getServiceReferences(null, String.format(
+                "(|(service.id=%s)(service.pid=%s))", in, in));
+            if (refs != null && refs.length > 0)
+            {
+                return refs[0];
+            }
+        }
+
+        ServiceReference refs[] = context.getServiceReferences(null, String.format(
+            "(|(service.id=%s)(service.pid=%s))", in, in));
+        if (refs != null && refs.length > 0)
+        {
+            return refs[0];
+        }
+        return null;
+    }
+
+    private Object convertBundle(Object in)
+    {
+        String s = in.toString();
+        try
+        {
+            long id = Long.parseLong(s);
+            return context.getBundle(id);
+        }
+        catch (NumberFormatException nfe)
+        {
+            // Ignore
+        }
+
+        Bundle bundles[] = context.getBundles();
+        for (Bundle b : bundles)
+        {
+            if (b.getLocation().equals(s))
+            {
+                return b;
+            }
+
+            if (b.getSymbolicName().equals(s))
+            {
+                return b;
+            }
+        }
+
+        return null;
+    }
+
+    public CharSequence format(Object target, int level, Converter converter)
+        throws IOException
+    {
+        if (level == INSPECT && target instanceof InputStream)
+        {
+            return read(((InputStream) target));
+        }
+        if (level == LINE && target instanceof Bundle)
+        {
+            return print((Bundle) target);
+        }
+        if (level == LINE && target instanceof ServiceReference)
+        {
+            return print((ServiceReference) target);
+        }
+        if (level == PART && target instanceof Bundle)
+        {
+            return ((Bundle) target).getSymbolicName();
+        }
+        if (level == PART && target instanceof ServiceReference)
+        {
+            return getShortNames((String[]) ((ServiceReference) target).getProperty("objectclass"));
+        }
+        return null;
+    }
+
+    private CharSequence read(InputStream in) throws IOException
+    {
+        int c;
+        StringBuffer sb = new StringBuffer();
+        while ((c = in.read()) > 0)
+        {
+            if (c >= 32 && c <= 0x7F || c == '\n' || c == '\r')
+            {
+                sb.append((char) c);
+            }
+            else
+            {
+                String s = Integer.toHexString(c).toUpperCase();
+                sb.append("\\");
+                if (s.length() < 1)
+                {
+                    sb.append(0);
+                }
+                sb.append(s);
+            }
+        }
+        return sb;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/HelpAction.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/HelpAction.java
new file mode 100644
index 0000000..7f49872
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/HelpAction.java
@@ -0,0 +1,117 @@
+/**
+ *
+ * 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.karaf.shell.console;
+
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.felix.service.command.Function;
+import org.fusesource.jansi.Ansi;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Displays help on the available commands
+ */
+@Command(scope = "*", name = "help", description = "Displays this help or help about a command")
+public class HelpAction extends AbstractAction {
+
+    @Argument(name = "command", required = false, description = "The command to get help for")
+    private String command;
+
+    public Object doExecute() throws Exception {
+        if (command == null) {
+            Set<String> names = (Set<String>) session.get(".commands");
+            if (!names.isEmpty()) {
+                Terminal term = (Terminal) session.get(".jline.terminal");
+                PrintStream out = System.out;
+                SortedMap<String,String> commands = new TreeMap<String,String>();
+                for (String name : names) {
+                    String description = null;
+                    Function function = (Function) session.get(name);
+                    function = unProxy(function);
+                    if (function instanceof AbstractCommand) {
+                        try {
+                            Method mth = AbstractCommand.class.getDeclaredMethod("createNewAction");
+                            mth.setAccessible(true);
+                            Action action = (Action) mth.invoke(function);
+                            Class<? extends Action> clazz = action.getClass();
+                            Command ann = clazz.getAnnotation(Command.class);
+                            description = ann.description();
+                        } catch (Throwable e) {
+                        }
+                        if (name.startsWith("*:")) {
+                            name = name.substring(2);
+                        }
+                        commands.put(name, description);
+                    }
+                }
+                // Post process the commands list
+
+                out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("COMMANDS").a(Ansi.Attribute.RESET));
+                for (Map.Entry<String,String> entry : commands.entrySet()) {
+                    out.print("        ");
+                    String key = NameScoping.getCommandNameWithoutGlobalPrefix(session, entry.getKey());
+                    out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(key).a(Ansi.Attribute.RESET));
+                    if (entry.getValue() != null) {
+                        DefaultActionPreparator.printFormatted("                ", entry.getValue(), term != null ? term.getWidth() : 80, out);
+                    }
+                }
+                out.println();
+            }
+            return null;
+        } else {
+            return session.execute(command + " --help");
+        }
+    }
+
+    protected Function unProxy(Function function) {
+        try {
+            if (function.getClass().getName().contains("CommandProxy")) {
+                Field contextField = function.getClass().getDeclaredField("context");
+                Field referenceField = function.getClass().getDeclaredField("reference");
+                contextField.setAccessible(true);
+                referenceField.setAccessible(true);
+                BundleContext context = (BundleContext) contextField.get(function);
+                ServiceReference reference = (ServiceReference) referenceField.get(function);
+                Object target = context.getService(reference);
+                try {
+                    if (target instanceof Function) {
+                        function = (Function) target;
+                    }
+                } finally {
+                    context.ungetService(reference);
+                }
+            }
+        } catch (Throwable t) {
+        }
+        return function;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
new file mode 100644
index 0000000..ba1ea93
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
@@ -0,0 +1,321 @@
+/*
+ * 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.karaf.shell.console;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.CommandException;
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.runtime.CommandNotFoundException;
+import org.apache.felix.gogo.runtime.CommandProcessorImpl;
+import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Function;
+import org.apache.felix.service.threadio.ThreadIO;
+import org.apache.karaf.shell.console.jline.Console;
+import org.apache.karaf.shell.console.jline.TerminalFactory;
+import org.fusesource.jansi.Ansi;
+import org.fusesource.jansi.AnsiConsole;
+
+public class Main {
+    private String application = System.getProperty("karaf.name", "root");
+    private String user = "karaf";
+
+    public static void main(String args[]) throws Exception {
+        Main main = new Main();
+        main.run(args);
+    }
+
+    /**
+     * Use this method when the shell is being executed as a top level shell.
+     *
+     * @param args
+     * @throws Exception
+     */
+    public void run(String args[]) throws Exception {
+
+        ThreadIOImpl threadio = new ThreadIOImpl();
+        threadio.start();
+
+        CommandProcessorImpl commandProcessor = new CommandProcessorImpl(threadio);
+
+        ClassLoader cl = Main.class.getClassLoader();
+        if (args.length > 0 && args[0].startsWith("--classpath=")) {
+            String base = args[0].substring("--classpath=".length());
+            List<URL> urls = getFiles(new File(base));
+            cl = new URLClassLoader(urls.toArray(new URL[urls.size()]), cl);
+            String[] a = new String[args.length - 1];
+            System.arraycopy(args, 1, a, 0, a.length);
+            args = a;
+        }
+
+        discoverCommands(commandProcessor, cl);
+
+        InputStream in = unwrap(System.in);
+        PrintStream out = wrap(unwrap(System.out));
+        PrintStream err = wrap(unwrap(System.err));
+        run(commandProcessor, args, in, out, err);
+
+        // TODO: do we need to stop the threadio that was started?
+        // threadio.stop();
+    }
+
+    /**
+     * Use this method when the shell is being executed as a command
+     * of another shell.
+     *
+     * @param parent
+     * @param args
+     * @throws Exception
+     */
+    public void run(CommandSession parent, String args[]) throws Exception {
+
+        // TODO: find out what the down side of not using a real ThreadIO implementation is.
+        CommandProcessorImpl commandProcessor = new CommandProcessorImpl(new ThreadIO() {
+            public void setStreams(InputStream in, PrintStream out, PrintStream err) {
+            }
+            public void close() {
+            }
+        });
+
+        ClassLoader cl = Main.class.getClassLoader();
+        if (args.length > 0 && args[0].startsWith("--classpath=")) {
+            String base = args[0].substring("--classpath=".length());
+            List<URL> urls = getFiles(new File(base));
+            cl = new URLClassLoader(urls.toArray(new URL[urls.size()]), cl);
+            String[] a = new String[args.length - 1];
+            System.arraycopy(args, 1, a, 0, a.length);
+            args = a;
+        }
+
+        discoverCommands(commandProcessor, cl);
+
+        InputStream in = parent.getKeyboard();
+        PrintStream out = parent.getConsole();
+        PrintStream err = parent.getConsole();
+        run(commandProcessor, args, in, out, err);
+    }
+
+    private void run(final CommandProcessorImpl commandProcessor, String[] args, final InputStream in, final PrintStream out, final PrintStream err) throws Exception {
+
+        if (args.length > 0) {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < args.length; i++) {
+                if (i > 0) {
+                    sb.append(" ");
+                }
+                sb.append(args[i]);
+            }
+
+            // Shell is directly executing a sub/command, we don't setup a terminal and console
+            // in this case, this avoids us reading from stdin un-necessarily.
+            CommandSession session = commandProcessor.createSession(in,out, err);
+            session.put("USER", user);
+            session.put("APPLICATION", application);
+            session.put(NameScoping.MULTI_SCOPE_MODE_KEY, Boolean.toString(isMultiScopeMode()));
+
+            try {
+                session.execute(sb);
+            } catch (Throwable t) {
+                if (t instanceof CommandNotFoundException) {
+                    String str = Ansi.ansi()
+                        .fg(Ansi.Color.RED)
+                        .a("Command not found: ")
+                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                        .a(((CommandNotFoundException) t).getCommand())
+                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                        .fg(Ansi.Color.DEFAULT).toString();
+                    session.getConsole().println(str);
+                } else if (t instanceof CommandException) {
+                    session.getConsole().println(((CommandException) t).getNiceHelp());
+                } else {
+                    session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
+                    t.printStackTrace(session.getConsole());
+                    session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
+                }
+            }
+        } else {
+            // We are going into full blown interactive shell mode.
+
+            final TerminalFactory terminalFactory = new TerminalFactory();
+            final Terminal terminal = terminalFactory.getTerminal();
+            Console console = createConsole(commandProcessor, in, out, err, terminal);
+            CommandSession session = console.getSession();
+            session.put("USER", user);
+            session.put("APPLICATION", application);
+            session.put(NameScoping.MULTI_SCOPE_MODE_KEY, Boolean.toString(isMultiScopeMode()));
+            session.put("#LINES", new Function() {
+                public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+                    return Integer.toString(terminal.getHeight());
+                }
+            });
+            session.put("#COLUMNS", new Function() {
+                public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+                    return Integer.toString(terminal.getWidth());
+                }
+            });
+            session.put(".jline.terminal", terminal);
+
+            console.run();
+
+            terminalFactory.destroy();
+        }
+
+    }
+
+    /**
+     * Allow sub classes of main to change the Console implementation used.
+     * 
+     * @param commandProcessor
+     * @param in
+     * @param out
+     * @param err
+     * @param terminal
+     * @return
+     * @throws Exception
+     */
+    protected Console createConsole(CommandProcessorImpl commandProcessor, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception {
+        return new Console(commandProcessor, in, out, err, terminal, null);
+    }
+
+    /**
+     * Sub classes can override so that their registered commands do not conflict with the default shell
+     * implementation.
+     *
+     * @return
+     */
+    public String getDiscoveryResource() {
+        return "META-INF/services/org/apache/karaf/shell/commands";
+    }
+
+    private void discoverCommands(CommandProcessorImpl commandProcessor, ClassLoader cl) throws IOException, ClassNotFoundException {
+        Enumeration<URL> urls = cl.getResources(getDiscoveryResource());
+        while (urls.hasMoreElements()) {
+            URL url = urls.nextElement();
+            BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream()));
+            String line = r.readLine();
+            while (line != null) {
+                line = line.trim();
+                if (line.length() > 0 && line.charAt(0) != '#') {
+                    final Class<Action> actionClass = (Class<Action>) cl.loadClass(line);
+                    Command cmd = actionClass.getAnnotation(Command.class);
+                    Function function = new AbstractCommand() {
+                        @Override
+                        public Action createNewAction() {
+                            try {
+                                return ((Class<? extends Action>) actionClass).newInstance();
+                            } catch (InstantiationException e) {
+                                throw new RuntimeException(e);
+                            } catch (IllegalAccessException e) {
+                                throw new RuntimeException(e);
+                            }
+                        }
+                    };
+                    addCommand(cmd, function, commandProcessor);
+                }
+                line = r.readLine();
+            }
+            r.close();
+        }
+    }
+
+    protected void addCommand(Command cmd, Function function, CommandProcessorImpl commandProcessor) {
+        try {
+            commandProcessor.addCommand(cmd.scope(), function, cmd.name());
+        } catch (Exception e) {
+        }
+    }
+
+
+    public String getApplication() {
+        return application;
+    }
+
+    public void setApplication(String application) {
+        this.application = application;
+    }
+
+    public String getUser() {
+        return user;
+    }
+
+    public void setUser(String user) {
+        this.user = user;
+    }
+
+    /**
+     * Returns whether or not we are in multi-scope mode.
+     *
+     * The default mode is multi-scoped where we prefix commands by their scope. If we are in single
+     * scoped mode then we don't use scope prefixes when registering or tab completing commands.
+     */
+    public boolean isMultiScopeMode() {
+        return true;
+    }
+
+    private static PrintStream wrap(PrintStream stream) {
+        OutputStream o = AnsiConsole.wrapOutputStream(stream);
+        if (o instanceof PrintStream) {
+            return ((PrintStream) o);
+        } else {
+            return new PrintStream(o);
+        }
+    }
+
+    private static <T> T unwrap(T stream) {
+        try {
+            Method mth = stream.getClass().getMethod("getRoot");
+            return (T) mth.invoke(stream);
+        } catch (Throwable t) {
+            return stream;
+        }
+    }
+
+    private static List<URL> getFiles(File base) throws MalformedURLException {
+        List<URL> urls = new ArrayList<URL>();
+        getFiles(base, urls);
+        return urls;
+    }
+
+    private static void getFiles(File base, List<URL> urls) throws MalformedURLException {
+        for (File f : base.listFiles()) {
+            if (f.isDirectory()) {
+                getFiles(f, urls);
+            } else if (f.getName().endsWith(".jar")) {
+                urls.add(f.toURI().toURL());
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/NameScoping.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/NameScoping.java
new file mode 100644
index 0000000..614c430
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/NameScoping.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.karaf.shell.console;
+
+import org.apache.felix.service.command.CommandSession;
+
+
+/**
+ * A helper class for name scoping
+ */
+public class NameScoping {
+
+    public static final String MULTI_SCOPE_MODE_KEY = "MULTI_SCOPE_MODE";
+
+    /**
+     * Returns the name of the command which can omit the global scope prefix if the command starts with the
+     * same prefix as the current application
+     */
+    public static String getCommandNameWithoutGlobalPrefix(CommandSession session, String key) {
+        if (!isMultiScopeMode(session)) {
+            String globalScope = (String) session.get("APPLICATION");
+            if (globalScope != null) {
+                String prefix = globalScope + ":";
+                if (key.startsWith(prefix)) {
+                    // TODO we may only want to do this for single-scope mode when outside of OSGi?
+                    // so we may want to also check for a isMultiScope mode == false
+                    return key.substring(prefix.length());
+                }
+            }
+        }
+        return key;
+    }
+
+    /**
+     * Returns true if the given scope is the global scope so that it can be hidden from help messages
+     */
+    public static boolean isGlobalScope(CommandSession session, String scope) {
+        if (!isMultiScopeMode(session)) {
+            String globalScope = (String) session.get("APPLICATION");
+            if (globalScope != null) {
+                return scope.equals(globalScope);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns true if we are in multi-scope mode (the default) or if we are in single scope mode which means we
+     * avoid prefixing commands with their scope
+     */
+    public static boolean isMultiScopeMode(CommandSession session) {
+        Object value = session.get(MULTI_SCOPE_MODE_KEY);
+        if (value != null && value.equals("false")) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/OsgiCommandSupport.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/OsgiCommandSupport.java
new file mode 100644
index 0000000..71761ed
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/OsgiCommandSupport.java
@@ -0,0 +1,84 @@
+/*
+ * 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.karaf.shell.console;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.service.command.CommandSession;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public abstract class OsgiCommandSupport extends AbstractAction implements Action, BundleContextAware {
+
+    protected BundleContext bundleContext;
+    protected List<ServiceReference> usedReferences;
+
+    @Override
+    public Object execute(CommandSession session) throws Exception {
+        this.session = session;
+        try {
+            return doExecute();
+        } finally {
+            ungetServices();
+        }
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    protected <T> List<T> getAllServices(Class<T> clazz, String filter) throws Exception {
+        ServiceReference[] references = getBundleContext().getAllServiceReferences(clazz.getName(), filter);
+        if (references == null) {
+            return null;
+        }
+        List<T> services = new ArrayList<T>();
+        for (ServiceReference ref : references) {
+            T t = getService(clazz, ref);
+            services.add(t);
+        }
+        return services;
+    }
+
+    protected <T> T getService(Class<T> clazz, ServiceReference reference) {
+        T t = (T) getBundleContext().getService(reference);
+        if (t != null) {
+            if (usedReferences == null) {
+                usedReferences = new ArrayList<ServiceReference>();
+            }
+            usedReferences.add(reference);
+        }
+        return t;
+    }
+
+    protected void ungetServices() {
+        if (usedReferences != null) {
+            for (ServiceReference ref : usedReferences) {
+                getBundleContext().ungetService(ref);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BlueprintCommand.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BlueprintCommand.java
new file mode 100644
index 0000000..6212169
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BlueprintCommand.java
@@ -0,0 +1,105 @@
+/**
+ *
+ * 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.karaf.shell.console.commands;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.commands.basic.ActionPreparator;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.BlueprintContainerAware;
+import org.apache.karaf.shell.console.BundleContextAware;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.console.Completer;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.blueprint.container.Converter;
+
+public class
+        BlueprintCommand extends AbstractCommand implements CompletableFunction
+{
+
+    protected BlueprintContainer blueprintContainer;
+    protected Converter blueprintConverter;
+    protected String actionId;
+    protected List<Completer> completers;
+    protected Map<String,Completer> optionalCompleters;
+
+    public void setBlueprintContainer(BlueprintContainer blueprintContainer) {
+        this.blueprintContainer = blueprintContainer;
+    }
+
+    public void setBlueprintConverter(Converter blueprintConverter) {
+        this.blueprintConverter = blueprintConverter;
+    }
+
+    public void setActionId(String actionId) {
+        this.actionId = actionId;
+    }
+
+    public List<Completer> getCompleters() {
+        return completers;
+    }
+
+    public void setCompleters(List<Completer> completers) {
+        this.completers = completers;
+    }
+
+    public Map<String, Completer> getOptionalCompleters() {
+        return optionalCompleters;
+    }
+
+    public void setOptionalCompleters(Map<String, Completer> optionalCompleters) {
+        this.optionalCompleters = optionalCompleters;
+    }
+
+    @Override
+    protected ActionPreparator getPreparator() throws Exception {
+        return new BlueprintActionPreparator();
+    }
+
+    protected class BlueprintActionPreparator extends DefaultActionPreparator {
+
+        @Override
+        protected Object convert(Action action, CommandSession commandSession, Object o, Type type) throws Exception {
+            GenericType t = new GenericType(type);
+            if (t.getRawClass() == String.class) {
+                return o != null ? o.toString() : null;
+            }
+            return blueprintConverter.convert(o, t);
+        }
+
+    }
+
+    public Action createNewAction() {
+        Action action = (Action) blueprintContainer.getComponentInstance(actionId);
+        if (action instanceof BlueprintContainerAware) {
+            ((BlueprintContainerAware) action).setBlueprintContainer(blueprintContainer);
+        }
+        if (action instanceof BundleContextAware) {
+            BundleContext context = (BundleContext) blueprintContainer.getComponentInstance("blueprintBundleContext");
+            ((BundleContextAware) action).setBundleContext(context);
+        }
+        return action;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/GenericType.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/GenericType.java
new file mode 100644
index 0000000..faf7c18
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/GenericType.java
@@ -0,0 +1,195 @@
+/**
+ *
+ * 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.karaf.shell.console.commands;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.service.blueprint.container.ReifiedType;
+
+public class GenericType extends ReifiedType {
+
+	private static final GenericType[] EMPTY = new GenericType[0];
+
+    private static final Map<String, Class> primitiveClasses = new HashMap<String, Class>();
+
+    static {
+        primitiveClasses.put("int", int.class);
+        primitiveClasses.put("short", short.class);
+        primitiveClasses.put("long", long.class);
+        primitiveClasses.put("byte", byte.class);
+        primitiveClasses.put("char", char.class);
+        primitiveClasses.put("float", float.class);
+        primitiveClasses.put("double", double.class);
+        primitiveClasses.put("boolean", boolean.class);
+    }
+
+    private GenericType[] parameters;
+
+	public GenericType(Type type) {
+		this(getConcreteClass(type), parametersOf(type));
+	}
+
+    public GenericType(Class clazz, GenericType... parameters) {
+        super(clazz);
+        this.parameters = parameters;
+    }
+
+    public static GenericType parse(String type, Object loader) throws ClassNotFoundException, IllegalArgumentException {
+        type = type.trim();
+        // Check if this is an array
+        if (type.endsWith("[]")) {
+            GenericType t = parse(type.substring(0, type.length() - 2), loader);
+            return new GenericType(Array.newInstance(t.getRawClass(), 0).getClass(), t);
+        }
+        // Check if this is a generic
+        int genericIndex = type.indexOf('<');
+        if (genericIndex > 0) {
+            if (!type.endsWith(">")) {
+                throw new IllegalArgumentException("Can not load type: " + type);
+            }
+            GenericType base = parse(type.substring(0, genericIndex), loader);
+            String[] params = type.substring(genericIndex + 1, type.length() - 1).split(",");
+            GenericType[] types = new GenericType[params.length];
+            for (int i = 0; i < params.length; i++) {
+                types[i] = parse(params[i], loader);
+            }
+            return new GenericType(base.getRawClass(), types);
+        }
+        // Primitive
+        if (primitiveClasses.containsKey(type)) {
+            return new GenericType(primitiveClasses.get(type));
+        }
+        // Class
+        if (loader instanceof ClassLoader) {
+            return new GenericType(((ClassLoader) loader).loadClass(type));
+        } else if (loader instanceof Bundle) {
+            return new GenericType(((Bundle) loader).loadClass(type));
+        } else {
+            throw new IllegalArgumentException("Unsupported loader: " + loader);
+        }
+    }
+
+    @Override
+    public ReifiedType getActualTypeArgument(int i) {
+        if (parameters.length == 0) {
+            return super.getActualTypeArgument(i);
+        }
+        return parameters[i];
+    }
+
+    @Override
+    public int size() {
+        return parameters.length;
+    }
+
+    @Override
+    public String toString() {
+        Class cl = getRawClass();
+        if (cl.isArray()) {
+            if (parameters.length > 0) {
+                return parameters[0].toString() + "[]";
+            } else {
+                return cl.getComponentType().getName() + "[]";
+            }
+        }
+        if (parameters.length > 0) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(cl.getName());
+            sb.append("<");
+            for (int i = 0; i < parameters.length; i++) {
+                if (i > 0) {
+                    sb.append(",");
+                }
+                sb.append(parameters[i].toString());
+            }
+            sb.append(">");
+            return sb.toString();
+        }
+        return cl.getName();
+    }
+
+    static GenericType[] parametersOf(Type type ) {
+		if ( type instanceof Class ) {
+		    Class clazz = (Class) type;
+		    if (clazz.isArray()) {
+                GenericType t = new GenericType(clazz.getComponentType());
+                if (t.size() > 0) {
+		            return new GenericType[] { t };
+                } else {
+                    return EMPTY;
+                }
+		    } else {
+		        return EMPTY;
+		    }
+		}
+        if ( type instanceof ParameterizedType ) {
+            ParameterizedType pt = (ParameterizedType) type;
+            Type [] parameters = pt.getActualTypeArguments();
+            GenericType[] gts = new GenericType[parameters.length];
+            for ( int i =0; i<gts.length; i++) {
+                gts[i] = new GenericType(parameters[i]);
+            }
+            return gts;
+        }
+        if ( type instanceof GenericArrayType ) {
+            return new GenericType[] { new GenericType(((GenericArrayType) type).getGenericComponentType()) };
+        }
+        throw new IllegalStateException();
+	}
+
+	static Class<?> getConcreteClass(Type type) {
+		Type ntype = collapse(type);
+		if ( ntype instanceof Class )
+			return (Class<?>) ntype;
+
+		if ( ntype instanceof ParameterizedType )
+			return getConcreteClass(collapse(((ParameterizedType)ntype).getRawType()));
+
+		throw new RuntimeException("Unknown type " + type );
+	}
+
+	static Type collapse(Type target) {
+		if (target instanceof Class || target instanceof ParameterizedType ) {
+			return target;
+		} else if (target instanceof TypeVariable) {
+			return collapse(((TypeVariable<?>) target).getBounds()[0]);
+		} else if (target instanceof GenericArrayType) {
+			Type t = collapse(((GenericArrayType) target)
+					.getGenericComponentType());
+			while ( t instanceof ParameterizedType )
+				t = collapse(((ParameterizedType)t).getRawType());
+			return Array.newInstance((Class<?>)t, 0).getClass();
+		} else if (target instanceof WildcardType) {
+			WildcardType wct = (WildcardType) target;
+			if (wct.getLowerBounds().length == 0)
+				return collapse(wct.getUpperBounds()[0]);
+			else
+				return collapse(wct.getLowerBounds()[0]);
+		}
+		throw new RuntimeException("Huh? " + target);
+	}
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
new file mode 100644
index 0000000..662392a
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
@@ -0,0 +1,234 @@
+/*
+ * 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.karaf.shell.console.commands;
+
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.felix.service.command.Function;
+import org.osgi.service.blueprint.reflect.*;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.aries.blueprint.ParserContext;
+import org.apache.aries.blueprint.mutable.MutableBeanMetadata;
+import org.apache.aries.blueprint.mutable.MutableIdRefMetadata;
+import org.apache.aries.blueprint.mutable.MutableServiceMetadata;
+import org.apache.aries.blueprint.mutable.MutableValueMetadata;
+import org.apache.aries.blueprint.mutable.MutableRefMetadata;
+import org.apache.aries.blueprint.mutable.MutableCollectionMetadata;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+
+
+public class NamespaceHandler implements org.apache.aries.blueprint.NamespaceHandler {
+
+    public static final String ID = "id";
+    public static final String ACTION = "action";
+    public static final String ACTION_ID = "actionId";
+    public static final String COMMAND_BUNDLE = "command-bundle";
+    public static final String NAME = "name";
+    public static final String COMMAND = "command";
+    public static final String COMPLETERS = "completers";
+    public static final String OPTIONAL_COMPLETERS = "optional-completers";
+    public static final String OPTIONAL_COMPLETERS_PROPERTY = "optionalCompleters";
+    public static final String BEAN = "bean";
+    public static final String REF = "ref";
+    public static final String NULL = "null";
+    public static final String MAP = "map";
+    public static final String BLUEPRINT_CONTAINER = "blueprintContainer";
+    public static final String BLUEPRINT_CONVERTER = "blueprintConverter";
+
+    public static final String SHELL_NAMESPACE_1_0_0 = "http://karaf.apache.org/xmlns/shell/v1.0.0";
+    public static final String SHELL_NAMESPACE_1_1_0 = "http://karaf.apache.org/xmlns/shell/v1.1.0";
+
+    private int nameCounter = 0;
+
+    public URL getSchemaLocation(String namespace) {
+        if(SHELL_NAMESPACE_1_0_0.equals(namespace)) {
+            return getClass().getResource("karaf-shell-1.0.0.xsd");
+        } else if(SHELL_NAMESPACE_1_1_0.equals(namespace)) {
+            return getClass().getResource("karaf-shell-1.1.0.xsd");
+        }
+        return getClass().getResource("karaf-shell-1.1.0.xsd");
+    }
+
+	public Set<Class> getManagedClasses() {
+		return new HashSet<Class>(Arrays.asList(
+			BlueprintCommand.class
+		));
+	}
+
+    public ComponentMetadata decorate(Node node, ComponentMetadata component, ParserContext context) {
+        throw new ComponentDefinitionException("Bad xml syntax: node decoration is not supported");
+    }
+
+    public Metadata parse(Element element, ParserContext context) {
+        if (nodeNameEquals(element, COMMAND_BUNDLE)) {
+            NodeList children = element.getChildNodes();
+            for (int i = 0; i < children.getLength(); i++) {
+                Node child  = children.item(i);
+                if (child instanceof Element) {
+                    Element childElement = (Element) child;
+                    parseChildElement(childElement, context);
+                }
+            }
+            return null;
+        } else {
+            throw new IllegalStateException("Unexpected element " + element.getNodeName());
+        }
+    }
+
+    private void parseChildElement(Element element, ParserContext context) {
+        if (nodeNameEquals(element, COMMAND)) {
+            parseCommand(element, context);
+        }
+    }
+
+    private void parseCommand(Element element, ParserContext context) {
+        MutableBeanMetadata command = context.createMetadata(MutableBeanMetadata.class);
+        command.setRuntimeClass(BlueprintCommand.class);
+        command.addProperty(BLUEPRINT_CONTAINER, createRef(context, BLUEPRINT_CONTAINER));
+        command.addProperty(BLUEPRINT_CONVERTER, createRef(context, BLUEPRINT_CONVERTER));
+
+        String location = element.getAttribute(NAME);
+        location = location.replace('/', ':');
+        String scope;
+        String function;
+        if (location.lastIndexOf(':') >= 0) {
+            scope = location.substring(0, location.lastIndexOf(':'));
+            function = location.substring(location.lastIndexOf(':') + 1);
+        } else {
+            scope = "";
+            function = location;
+        }
+
+        NodeList children = element.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node child  = children.item(i);
+            if (child instanceof Element) {
+                Element childElement = (Element) child;
+                if (nodeNameEquals(childElement, ACTION)) {
+                    MutableBeanMetadata action = parseAction(context, command, childElement);
+                    action.setId(getName());
+                    context.getComponentDefinitionRegistry().registerComponentDefinition(action);
+                    command.addProperty(ACTION_ID, createIdRef(context, action.getId()));
+                } else if (nodeNameEquals(childElement, COMPLETERS)) {
+                    command.addProperty(COMPLETERS, parseCompleters(context, command, childElement));
+                } else if (nodeNameEquals(childElement, OPTIONAL_COMPLETERS)) {
+                    command.addProperty(OPTIONAL_COMPLETERS_PROPERTY, parseOptionalCompleters(context, command, childElement));
+                }
+                else {
+                    throw new ComponentDefinitionException("Bad xml syntax: unknown element '" + childElement.getNodeName() + "'");
+                }
+            }
+        }
+
+        MutableServiceMetadata commandService = context.createMetadata(MutableServiceMetadata.class);
+        commandService.setActivation(MutableServiceMetadata.ACTIVATION_LAZY);
+        commandService.setId(getName());
+        //commandService.setAutoExport(ServiceMetadata.AUTO_EXPORT_ALL_CLASSES);
+        commandService.addInterface(CompletableFunction.class.getName());
+        commandService.addInterface(Function.class.getName());
+        commandService.setServiceComponent(command);
+        commandService.addServiceProperty(createStringValue(context, "osgi.command.scope"),
+                                          createStringValue(context, scope));
+        commandService.addServiceProperty(createStringValue(context, "osgi.command.function"),
+                                          createStringValue(context, function));
+        context.getComponentDefinitionRegistry().registerComponentDefinition(commandService);
+    }
+
+    private MutableBeanMetadata parseAction(ParserContext context, ComponentMetadata enclosingComponent, Element element) {
+        MutableBeanMetadata action = context.createMetadata(MutableBeanMetadata.class);
+        action.setActivation(MutableBeanMetadata.ACTIVATION_LAZY);
+        action.setScope(MutableBeanMetadata.SCOPE_PROTOTYPE);
+        action.setClassName(element.getAttribute("class"));
+        NodeList children = element.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node child  = children.item(i);
+            if (child instanceof Element) {
+                Element childElement = (Element) child;
+                if (nodeNameEquals(childElement, "argument")) {
+                    action.addArgument(context.parseElement(BeanArgument.class, enclosingComponent, childElement));
+                } else if (nodeNameEquals(childElement, "property")) {
+                    action.addProperty(context.parseElement(BeanProperty.class, enclosingComponent, childElement));
+                }
+            }
+        }
+        return action;
+    }
+
+    private Metadata parseOptionalCompleters(ParserContext context, ComponentMetadata enclosingComponent, Element element) {
+        Metadata metadata = context.parseElement(MapMetadata.class, context.getEnclosingComponent(), (Element) element);
+        return metadata;
+    }
+
+    private Metadata parseCompleters(ParserContext context, ComponentMetadata enclosingComponent, Element element) {
+        MutableCollectionMetadata collection = context.createMetadata(MutableCollectionMetadata.class);
+        collection.setCollectionClass(List.class);
+        NodeList children = element.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node child = children.item(i);
+            if (child instanceof Element) {
+                Metadata metadata;
+                if (nodeNameEquals(child, REF)) {
+                    metadata = context.parseElement(RefMetadata.class, context.getEnclosingComponent(), (Element) child);
+                } else if (nodeNameEquals(child, NULL)) {
+                    metadata = context.parseElement(NullMetadata.class, context.getEnclosingComponent(), (Element) child);
+                } else if (nodeNameEquals(child, BEAN)) {
+                    metadata = context.parseElement(BeanMetadata.class, enclosingComponent, (Element) child);
+                } else {
+                    throw new IllegalStateException("Unexpected element " + child.getNodeName());
+                }
+                collection.addValue(metadata);
+            }
+        }
+        return collection;
+    }
+
+    private ValueMetadata createStringValue(ParserContext context, String str) {
+        MutableValueMetadata value = context.createMetadata(MutableValueMetadata.class);
+        value.setStringValue(str);
+        return value;
+    }
+
+    private RefMetadata createRef(ParserContext context, String id) {
+        MutableRefMetadata idref = context.createMetadata(MutableRefMetadata.class);
+        idref.setComponentId(id);
+        return idref;
+    }
+
+    private IdRefMetadata createIdRef(ParserContext context, String id) {
+        MutableIdRefMetadata idref = context.createMetadata(MutableIdRefMetadata.class);
+        idref.setComponentId(id);
+        return idref;
+    }
+
+    public synchronized String getName() {
+        return "shell-" + ++nameCounter;
+    }
+
+    private static boolean nodeNameEquals(Node node, String name) {
+        return (name.equals(node.getNodeName()) || name.equals(node.getLocalName()));
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/AggregateCompleter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/AggregateCompleter.java
new file mode 100644
index 0000000..1037bfc
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/AggregateCompleter.java
@@ -0,0 +1,89 @@
+/*
+ * 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.karaf.shell.console.completer;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Collection;
+
+import org.apache.karaf.shell.console.Completer;
+
+/**
+ * Completer which contains multipule completers and aggregates them together.
+ */
+public class AggregateCompleter implements Completer
+{
+    private final Collection<Completer> completers;
+
+    public AggregateCompleter(final Collection<Completer> completers) {
+        assert completers != null;
+        this.completers = completers;
+    }
+
+    public int complete(final String buffer, final int cursor, final List candidates) {
+        // buffer could be null
+        assert candidates != null;
+
+        List<Completion> completions = new ArrayList<Completion>(completers.size());
+
+        // Run each completer, saving its completion results
+        int max = -1;
+        for (Completer completer : completers) {
+            Completion completion = new Completion(candidates);
+            completion.complete(completer, buffer, cursor);
+
+            // Compute the max cursor position
+            max = Math.max(max, completion.cursor);
+
+            completions.add(completion);
+        }
+
+        // Append candiates from completions which have the same cursor position as max
+        for (Completion completion : completions) {
+            if (completion.cursor == max) {
+                // noinspection unchecked
+                candidates.addAll(completion.candidates);
+            }
+        }
+
+        return max;
+    }
+
+    private class Completion
+    {
+        public final List<String> candidates;
+
+        public int cursor;
+
+        public Completion(final List candidates) {
+            assert candidates != null;
+
+            // noinspection unchecked
+            this.candidates = new LinkedList<String>(candidates);
+        }
+
+        public void complete(final Completer completer, final String buffer, final int cursor) {
+            assert completer != null;
+
+            this.cursor = completer.complete(buffer, cursor, candidates);
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/ArgumentCompleter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/ArgumentCompleter.java
new file mode 100644
index 0000000..ee14dd4
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/ArgumentCompleter.java
@@ -0,0 +1,455 @@
+/*
+ * 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.
+ */
+/*
+ * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved.
+ *
+ * This software is distributable under the BSD license. See the terms of the
+ * BSD license in the documentation provided with this software.
+ */
+package org.apache.karaf.shell.console.completer;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.CompleterValues;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.NameScoping;
+import org.apache.karaf.shell.console.jline.CommandSessionHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ArgumentCompleter implements Completer {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ArgumentCompleter.class);
+
+    public static final String ARGUMENTS_LIST = "ARGUMENTS_LIST";
+
+    final Completer commandCompleter;
+    final Completer optionsCompleter;
+    final List<Completer> argsCompleters;
+    final Map<String, Completer> optionalCompleters;
+    final AbstractCommand function;
+    final Map<Option, Field> fields = new HashMap<Option, Field>();
+    final Map<String, Option> options = new HashMap<String, Option>();
+    final Map<Integer, Field> arguments = new HashMap<Integer, Field>();
+    boolean strict = true;
+
+    public ArgumentCompleter(CommandSession session, AbstractCommand function, String command) {
+        this.function = function;
+        // Command name completer
+        commandCompleter = new StringsCompleter(getNames(session, command));
+        // Build options completer
+        for (Class type = function.getActionClass(); type != null; type = type.getSuperclass()) {
+            for (Field field : type.getDeclaredFields()) {
+                Option option = field.getAnnotation(Option.class);
+                if (option != null) {
+                    fields.put(option, field);
+                    options.put(option.name(), option);
+                    String[] aliases = option.aliases();
+                    if (aliases != null) {
+                        for (String alias : aliases) {
+                            options.put(alias, option);
+                        }
+                    }
+                }
+                Argument argument = field.getAnnotation(Argument.class);
+                if (argument != null) {
+                    Integer key = argument.index();
+                    if (arguments.containsKey(key)) {
+                        LOGGER.warn("Duplicate @Argument annotations on class " + type.getName() + " for index: " + key + " see: " + field);
+                    } else {
+                        arguments.put(key, field);
+                    }
+                }
+            }
+        }
+        options.put(DefaultActionPreparator.HELP.name(), DefaultActionPreparator.HELP);
+        optionsCompleter = new StringsCompleter(options.keySet());
+        // Build arguments completers
+        argsCompleters = new ArrayList<Completer>();
+        optionalCompleters = new HashMap<String, Completer>();
+
+        if (function instanceof CompletableFunction) {
+            try {
+                Map completers = ((CompletableFunction) function).getOptionalCompleters();
+                if (completers != null) {
+                    optionalCompleters.putAll(completers);
+                }
+            } catch (AbstractMethodError err) {
+                // Allow old commands to not break the completers
+            }
+            List<Completer> fcl = ((CompletableFunction) function).getCompleters();
+            if (fcl != null) {
+                for (Completer c : fcl) {
+                    argsCompleters.add(c == null ? NullCompleter.INSTANCE : c);
+                }
+            } else {
+                argsCompleters.add(NullCompleter.INSTANCE);
+            }
+        } else {
+            final Map<Integer, Method> methods = new HashMap<Integer, Method>();
+            for (Class type = function.getActionClass(); type != null; type = type.getSuperclass()) {
+                for (Method method : type.getDeclaredMethods()) {
+                    CompleterValues completerMethod = method.getAnnotation(CompleterValues.class);
+                    if (completerMethod != null) {
+                        int index = completerMethod.index();
+                        Integer key = index;
+                        if (index >= arguments.size() || index < 0) {
+                            LOGGER.warn("Index out of range on @CompleterValues on class " + type.getName() + " for index: " + key + " see: " + method);
+                        }
+                        if (methods.containsKey(key)) {
+                            LOGGER.warn("Duplicate @CompleterMethod annotations on class " + type.getName() + " for index: " + key + " see: " + method);
+                        } else {
+                            methods.put(key, method);
+                        }
+                    }
+                }
+            }
+            for (int i = 0, size = arguments.size(); i < size; i++) {
+                Completer argCompleter = NullCompleter.INSTANCE;
+                Method method = methods.get(i);
+                if (method != null) {
+                    // lets invoke the method
+                    Action action = function.createNewAction();
+                    try {
+                        Object value = method.invoke(action);
+                        if (value instanceof String[]) {
+                            argCompleter = new StringsCompleter((String[]) value);
+                        } else if (value instanceof Collection) {
+                            argCompleter = new StringsCompleter((Collection<String>) value);
+                        } else {
+                            LOGGER.warn("Could not use value " + value + " as set of completions!");
+                        }
+                    } catch (IllegalAccessException e) {
+                        LOGGER.warn("Could not invoke @CompleterMethod on " + function + ". " + e, e);
+                    } catch (InvocationTargetException e) {
+                        Throwable target = e.getTargetException();
+                        if (target == null) {
+                            target = e;
+                        }
+                        LOGGER.warn("Could not invoke @CompleterMethod on " + function + ". " + target, target);
+                    } finally {
+                        try {
+                            function.releaseAction(action);
+                        } catch (Exception e) {
+                            LOGGER.warn("Failed to release action: " + action + ". " + e, e);
+                        }
+                    }
+                } else {
+                    Field field = arguments.get(i);
+                    Class<?> type = field.getType();
+                    if (type.isAssignableFrom(File.class)) {
+                        argCompleter = new FileCompleter(session);
+                    } else if (type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)) {
+                        argCompleter = new StringsCompleter(new String[] {"false", "true"}, false);
+                    } else if (type.isAssignableFrom(Enum.class)) {
+                        Set<String> values = new HashSet<String>();
+                        for (Object o : EnumSet.allOf((Class<Enum>) type)) {
+                            values.add(o.toString());
+                        }
+                        argCompleter = new StringsCompleter(values, false);
+                    } else {
+                        // TODO any other completers we can add?
+                    }
+                }
+                argsCompleters.add(argCompleter);
+            }
+        }
+    }
+
+    private String[] getNames(CommandSession session, String scopedCommand) {
+        String command = NameScoping.getCommandNameWithoutGlobalPrefix(session, scopedCommand);
+        String[] s = command.split(":");
+        if (s.length == 1) {
+            return s;
+        } else {
+            return new String[] { command, s[1] };
+        }
+    }
+
+    /**
+     *  If true, a completion at argument index N will only succeed
+     *  if all the completions from 0-(N-1) also succeed.
+     */
+    public void setStrict(final boolean strict) {
+        this.strict = strict;
+    }
+
+    /**
+     *  Returns whether a completion at argument index N will succees
+     *  if all the completions from arguments 0-(N-1) also succeed.
+     */
+    public boolean getStrict() {
+        return this.strict;
+    }
+
+    public int complete(final String buffer, final int cursor,
+                        final List<String> candidates) {
+        ArgumentList list = delimit(buffer, cursor);
+        int argpos = list.getArgumentPosition();
+        int argIndex = list.getCursorArgumentIndex();
+
+        //Store the argument list so that it can be used by completers.
+        CommandSession commandSession = CommandSessionHolder.getSession();
+        if(commandSession != null) {
+            commandSession.put(ARGUMENTS_LIST,list);
+        }
+
+        Completer comp = null;
+        String[] args = list.getArguments();
+        int index = 0;
+        // First argument is command name
+        if (index < argIndex) {
+            // Verify command name
+            if (!verifyCompleter(commandCompleter, args[index])) {
+                return -1;
+            }
+            index++;
+        } else {
+            comp = commandCompleter;
+        }
+        // Now, check options
+        if (comp == null) {
+            while (index < argIndex && args[index].startsWith("-")) {
+                if (!verifyCompleter(optionsCompleter, args[index])) {
+                    return -1;
+                }
+                Option option = options.get(args[index]);
+                if (option == null) {
+                    return -1;
+                }
+                Field field = fields.get(option);
+                if (field != null && field.getType() != boolean.class && field.getType() != Boolean.class) {
+                    if (++index == argIndex) {
+                        comp = NullCompleter.INSTANCE;
+                    }
+                }
+                index++;
+            }
+            if (comp == null && index >= argIndex && index < args.length && args[index].startsWith("-")) {
+                comp = optionsCompleter;
+            }
+        }
+        //Now check for if last Option has a completer
+        int lastAgurmentIndex = argIndex - 1;
+        if (lastAgurmentIndex >= 1) {
+            Option lastOption = options.get(args[lastAgurmentIndex]);
+            if (lastOption != null) {
+
+                Field lastField = fields.get(lastOption);
+                if (lastField != null && lastField.getType() != boolean.class && lastField.getType() != Boolean.class) {
+                    Option option = lastField.getAnnotation(Option.class);
+                    if (option != null) {
+                        Completer optionValueCompleter = null;
+                        String name = option.name();
+                        if (name != null) {
+                            optionValueCompleter = optionalCompleters.get(name);
+                            if (optionValueCompleter == null) {
+                                String[] aliases = option.aliases();
+                                if (aliases.length > 0) {
+                                    for (int i = 0; i < aliases.length && optionValueCompleter == null; i++) {
+                                        optionValueCompleter = optionalCompleters.get(option.aliases()[i]);
+                                    }
+                                }
+                            }
+                        }
+                        if(optionValueCompleter != null) {
+                            comp = optionValueCompleter;
+                        }
+                    }
+                }
+            }
+        }
+
+        // Check arguments
+        if (comp == null) {
+            int indexArg = 0;
+            while (index < argIndex) {
+                Completer sub = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
+                if (!verifyCompleter(sub, args[index])) {
+                    return -1;
+                }
+                index++;
+                indexArg++;
+            }
+            comp = argsCompleters.get(indexArg >= argsCompleters.size() ? argsCompleters.size() - 1 : indexArg);
+        }
+
+        int ret = comp.complete(list.getCursorArgument(), argpos, candidates);
+
+        if (ret == -1) {
+            return -1;
+        }
+
+        int pos = ret + (list.getBufferPosition() - argpos);
+
+        /**
+         *  Special case: when completing in the middle of a line, and the
+         *  area under the cursor is a delimiter, then trim any delimiters
+         *  from the candidates, since we do not need to have an extra
+         *  delimiter.
+         *
+         *  E.g., if we have a completion for "foo", and we
+         *  enter "f bar" into the buffer, and move to after the "f"
+         *  and hit TAB, we want "foo bar" instead of "foo  bar".
+         */
+
+        if ((buffer != null) && (cursor != buffer.length()) && isDelimiter(buffer, cursor)) {
+            for (int i = 0; i < candidates.size(); i++) {
+                String val = candidates.get(i);
+
+                while ((val.length() > 0)
+                    && isDelimiter(val, val.length() - 1)) {
+                    val = val.substring(0, val.length() - 1);
+                }
+
+                candidates.set(i, val);
+            }
+        }
+
+        return pos;
+    }
+
+    protected boolean verifyCompleter(Completer completer, String argument) {
+        List<String> candidates = new ArrayList<String>();
+        return completer.complete(argument, argument.length(), candidates) != -1 && !candidates.isEmpty();
+    }
+
+    public ArgumentList delimit(final String buffer, final int cursor) {
+        Parser parser = new Parser(buffer, cursor);
+        try {
+            List<List<List<String>>> program = parser.program();
+            List<String> pipe = program.get(parser.c0).get(parser.c1);
+            return new ArgumentList(pipe.toArray(new String[pipe.size()]), parser.c2, parser.c3, cursor);
+        } catch (Throwable t) {
+            return new ArgumentList(new String[] { buffer }, 0, cursor, cursor);
+        }
+    }
+
+    /**
+     *  Returns true if the specified character is a whitespace
+     *  parameter. Check to ensure that the character is not
+     *  escaped and returns true from
+     *  {@link #isDelimiterChar}.
+     *
+     *  @param  buffer the complete command buffer
+     *  @param  pos    the index of the character in the buffer
+     *  @return        true if the character should be a delimiter
+     */
+    public boolean isDelimiter(final String buffer, final int pos) {
+        return !isEscaped(buffer, pos) && isDelimiterChar(buffer, pos);
+    }
+
+    public boolean isEscaped(final String buffer, final int pos) {
+        return pos > 0 && buffer.charAt(pos) == '\\' && !isEscaped(buffer, pos - 1);
+    }
+
+    /**
+     *  The character is a delimiter if it is whitespace, and the
+     *  preceeding character is not an escape character.
+     */
+    public boolean isDelimiterChar(String buffer, int pos) {
+        return Character.isWhitespace(buffer.charAt(pos));
+    }
+
+    /**
+     *  The result of a delimited buffer.
+     *
+     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
+     */
+    public static class ArgumentList {
+        private String[] arguments;
+        private int cursorArgumentIndex;
+        private int argumentPosition;
+        private int bufferPosition;
+
+        /**
+         *  @param  arguments           the array of tokens
+         *  @param  cursorArgumentIndex the token index of the cursor
+         *  @param  argumentPosition    the position of the cursor in the
+         *                              current token
+         *  @param  bufferPosition      the position of the cursor in
+         *                              the whole buffer
+         */
+        public ArgumentList(String[] arguments, int cursorArgumentIndex,
+            int argumentPosition, int bufferPosition) {
+            this.arguments = arguments;
+            this.cursorArgumentIndex = cursorArgumentIndex;
+            this.argumentPosition = argumentPosition;
+            this.bufferPosition = bufferPosition;
+        }
+
+        public void setCursorArgumentIndex(int cursorArgumentIndex) {
+            this.cursorArgumentIndex = cursorArgumentIndex;
+        }
+
+        public int getCursorArgumentIndex() {
+            return this.cursorArgumentIndex;
+        }
+
+        public String getCursorArgument() {
+            if ((cursorArgumentIndex < 0)
+                || (cursorArgumentIndex >= arguments.length)) {
+                return null;
+            }
+
+            return arguments[cursorArgumentIndex];
+        }
+
+        public void setArgumentPosition(int argumentPosition) {
+            this.argumentPosition = argumentPosition;
+        }
+
+        public int getArgumentPosition() {
+            return this.argumentPosition;
+        }
+
+        public void setArguments(String[] arguments) {
+            this.arguments = arguments;
+        }
+
+        public String[] getArguments() {
+            return this.arguments;
+        }
+
+        public void setBufferPosition(int bufferPosition) {
+            this.bufferPosition = bufferPosition;
+        }
+
+        public int getBufferPosition() {
+            return this.bufferPosition;
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
new file mode 100644
index 0000000..62f4bc1
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
@@ -0,0 +1,134 @@
+/*
+ * 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.karaf.shell.console.completer;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.felix.gogo.commands.basic.AbstractCommand;
+import org.apache.felix.gogo.runtime.Closure;
+import org.apache.felix.gogo.runtime.CommandProxy;
+import org.apache.felix.gogo.runtime.CommandSessionImpl;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Function;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.console.Completer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.apache.karaf.shell.console.jline.CommandSessionHolder;
+
+/**
+ * Like the {@link org.apache.karaf.shell.console.completer.CommandsCompleter} but does not use OSGi but is
+ * instead used from the non-OSGi {@link org.apache.karaf.shell.console.Main}
+ */
+public class CommandsCompleter implements Completer {
+
+    private CommandSession session;
+    private final List<Completer> completers = new ArrayList<Completer>();
+    private final Set<String> commands = new HashSet<String>();
+
+    public CommandsCompleter() {
+        this(CommandSessionHolder.getSession());
+    }
+
+    public CommandsCompleter(CommandSession session) {
+        this.session = session;
+    }
+
+
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        if (session == null) {
+            session = CommandSessionHolder.getSession();
+        }
+        checkData();
+        int res = new AggregateCompleter(completers).complete(buffer, cursor, candidates);
+        Collections.sort(candidates);
+        return res;
+    }
+
+    protected synchronized void checkData() {
+        // Copy the set to avoid concurrent modification exceptions
+        // TODO: fix that in gogo instead
+        Set<String> names = new HashSet<String>((Set<String>) session.get(CommandSessionImpl.COMMANDS));
+        if (!names.equals(commands)) {
+            commands.clear();
+            completers.clear();
+
+            // get command aliases
+            Set<String> aliases = this.getAliases();
+            completers.add(new StringsCompleter(aliases));
+
+            // add argument completers for each command
+            for (String command : names) {
+                Function function = (Function) session.get(command);
+                function = unProxy(function);
+                if (function instanceof AbstractCommand) {
+                    completers.add(new ArgumentCompleter(session, (AbstractCommand) function, command));
+                }
+                commands.add(command);
+            }
+        }
+    }
+
+    /**
+     * Get the aliases defined in the console session.
+     *
+     * @return the aliases set
+     */
+    private Set<String> getAliases() {
+        Set<String> vars = (Set<String>) session.get(null);
+        Set<String> aliases = new HashSet<String>();
+        for (String var : vars) {
+            Object content = session.get(var);
+            if (content instanceof Closure)  {
+                aliases.add(var);
+            }
+        }
+        return aliases;
+    }
+
+    protected Function unProxy(Function function) {
+        try {
+            if (function instanceof CommandProxy) {
+                Field contextField = function.getClass().getDeclaredField("context");
+                Field referenceField = function.getClass().getDeclaredField("reference");
+                contextField.setAccessible(true);
+                referenceField.setAccessible(true);
+                BundleContext context = (BundleContext) contextField.get(function);
+                ServiceReference reference = (ServiceReference) referenceField.get(function);
+                Object target = context.getService(reference);
+                try {
+                    if (target instanceof Function) {
+                        function = (Function) target;
+                    }
+                } finally {
+                    context.ungetService(reference);
+                }
+            }
+        } catch (Throwable t) {
+        }
+        return function;
+    }
+
+}
+
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/FileCompleter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/FileCompleter.java
new file mode 100644
index 0000000..4e86797
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/FileCompleter.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.karaf.shell.console.completer;
+
+import jline.console.completer.FileNameCompleter;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.Completer;
+
+import java.util.List;
+
+/**
+ * A completer for file names
+ */
+public class FileCompleter implements Completer {
+    private final CommandSession session;
+    private FileNameCompleter completor = new FileNameCompleter();
+
+    public FileCompleter(CommandSession session) {
+        this.session = session;
+    }
+
+    public int complete(String buffer, int cursor, List candidates) {
+        return completor.complete(buffer, cursor, candidates);
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/NullCompleter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/NullCompleter.java
new file mode 100644
index 0000000..13da2df
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/NullCompleter.java
@@ -0,0 +1,32 @@
+/*
+ * 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.karaf.shell.console.completer;
+
+import java.util.List;
+
+import org.apache.karaf.shell.console.Completer;
+
+public class NullCompleter implements Completer {
+
+    public static final NullCompleter INSTANCE = new NullCompleter();
+
+    public int complete(String buffer, int cursor, List<String> candidates) {
+        return -1;
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/Parser.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/Parser.java
new file mode 100644
index 0000000..8388b27
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/Parser.java
@@ -0,0 +1,473 @@
+/*
+ * 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.
+ */
+// DWB14: parser loops if // comment at start of program
+// DWB15: allow program to have trailing ';'
+package org.apache.karaf.shell.console.completer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Parser
+{
+    int current = 0;
+    String text;
+    boolean escaped;
+    static final String SPECIAL = "<;|{[\"'$`(=";
+
+    List<List<List<String>>> program;
+    List<List<String>> statements;
+    List<String> statement;
+    int cursor;
+    int start = -1;
+    int c0;
+    int c1;
+    int c2;
+    int c3;
+
+    public Parser(String text, int cursor)
+    {
+        this.text = text;
+        this.cursor = cursor;
+    }
+
+    void ws()
+    {
+        // derek: BUGFIX: loop if comment  at beginning of input
+        //while (!eof() && Character.isWhitespace(peek())) {
+        while (!eof() && (!escaped && Character.isWhitespace(peek()) || current == 0))
+        {
+            if (current != 0 || !escaped && Character.isWhitespace(peek()))
+            {
+                current++;
+            }
+            if (peek() == '/' && current < text.length() - 2
+                && text.charAt(current + 1) == '/')
+            {
+                comment();
+            }
+            if (current == 0)
+            {
+                break;
+            }
+        }
+    }
+
+    private void comment()
+    {
+        while (!eof() && peek() != '\n' && peek() != '\r')
+        {
+            next();
+        }
+    }
+
+    boolean eof()
+    {
+        return current >= text.length();
+    }
+
+    char peek()
+    {
+        return peek(false);
+    }
+
+    char peek(boolean increment)
+    {
+        escaped = false;
+        if (eof())
+        {
+            return 0;
+        }
+
+        int last = current;
+        char c = text.charAt(current++);
+
+        if (c == '\\')
+        {
+            escaped = true;
+            if (eof())
+            {
+                throw new RuntimeException("Eof found after \\"); // derek
+            }
+
+            c = text.charAt(current++);
+
+            switch (c)
+            {
+                case 't':
+                    c = '\t';
+                    break;
+                case '\r':
+                case '\n':
+                    c = ' ';
+                    break;
+                case 'b':
+                    c = '\b';
+                    break;
+                case 'f':
+                    c = '\f';
+                    break;
+                case 'n':
+                    c = '\n';
+                    break;
+                case 'r':
+                    c = '\r';
+                    break;
+                case 'u':
+                    c = unicode();
+                    current += 4;
+                    break;
+                default:
+                    // We just take the next character literally
+                    // but have the escaped flag set, important for {},[] etc
+            }
+        }
+        if (cursor > last && cursor <= current)
+        {
+            c0 = program != null ? program.size() : 0;
+            c1 = statements != null ? statements.size() : 0;
+            c2 = statement != null ? statement.size() : 0;
+            c3 = (start >= 0) ? current - start : 0;
+        }
+        if (!increment)
+        {
+            current = last;
+        }
+        return c;
+    }
+
+    public List<List<List<String>>> program()
+    {
+        program = new ArrayList<List<List<String>>>();
+        ws();
+        if (!eof())
+        {
+            program.add(pipeline());
+            while (peek() == ';')
+            {
+                current++;
+                List<List<String>> pipeline = pipeline();
+                program.add(pipeline);
+            }
+        }
+        if (!eof())
+        {
+            throw new RuntimeException("Program has trailing text: " + context(current));
+        }
+
+        List<List<List<String>>> p = program;
+        program = null;
+        return p;
+    }
+
+    CharSequence context(int around)
+    {
+        return text.subSequence(Math.max(0, current - 20), Math.min(text.length(),
+            current + 4));
+    }
+
+    public List<List<String>> pipeline()
+    {
+        statements = new ArrayList<List<String>>();
+        statements.add(statement());
+        while (peek() == '|')
+        {
+            current++;
+            ws();
+            if (!eof())
+            {
+                statements.add(statement());
+            }
+            else
+            {
+                statements.add(new ArrayList<String>());
+                break;
+            }
+        }
+        List<List<String>> s = statements;
+        statements = null;
+        return s;
+    }
+
+    public List<String> statement()
+    {
+        statement = new ArrayList<String>();
+        statement.add(value());
+        while (!eof())
+        {
+            ws();
+            if (peek() == '|' || peek() == ';')
+            {
+                break;
+            }
+
+            if (!eof())
+            {
+                statement.add(messy());
+            }
+        }
+        List<String> s = statement;
+        statement = null;
+        return s;
+    }
+
+    public String messy()
+    {
+        start = current;
+        char c = peek();
+        if (c > 0 && SPECIAL.indexOf(c) < 0)
+        {
+            current++;
+            try {
+                while (!eof())
+                {
+                    c = peek();
+                    if (!escaped && (c == ';' || c == '|' || Character.isWhitespace(c)))
+                    {
+                        break;
+                    }
+                    next();
+                }
+                return text.substring(start, current);
+            } finally {
+                start = -1;
+            }
+        }
+        else
+        {
+            return value();
+        }
+    }
+
+    String value()
+    {
+        ws();
+
+        start = current;
+        try {
+            char c = next();
+            if (!escaped)
+            {
+                switch (c)
+                {
+                    case '{':
+                        return text.substring(start, find('}', '{'));
+                    case '(':
+                        return text.substring(start, find(')', '('));
+                    case '[':
+                        return text.substring(start, find(']', '['));
+                    case '<':
+                        return text.substring(start, find('>', '<'));
+                    case '=':
+                        return text.substring(start, current);
+                    case '"':
+                    case '\'':
+                        quote(c);
+                        break;
+                }
+            }
+
+            // Some identifier or number
+            while (!eof())
+            {
+                c = peek();
+                if (!escaped)
+                {
+                    if (Character.isWhitespace(c) || c == ';' || c == '|' || c == '=')
+                    {
+                        break;
+                    }
+                    else if (c == '{')
+                    {
+                        next();
+                        find('}', '{');
+                    }
+                    else if (c == '(')
+                    {
+                        next();
+                        find(')', '(');
+                    }
+                    else if (c == '<')
+                    {
+                        next();
+                        find('>', '<');
+                    }
+                    else if (c == '[')
+                    {
+                        next();
+                        find(']', '[');
+                    }
+                    else if (c == '\'' || c == '"')
+                    {
+                        next();
+                        quote(c);
+                        next();
+                    }
+                    else
+                    {
+                        next();
+                    }
+                }
+                else
+                {
+                    next();
+                }
+            }
+            return text.substring(start, current);
+        } finally {
+            start = -1;
+        }
+    }
+
+    boolean escaped()
+    {
+        return escaped;
+    }
+
+    char next()
+    {
+        return peek(true);
+    }
+
+    char unicode()
+    {
+        if (current + 4 > text.length())
+        {
+            throw new IllegalArgumentException("Unicode \\u escape at eof at pos ..."
+                + context(current) + "...");
+        }
+
+        String s = text.subSequence(current, current + 4).toString();
+        int n = Integer.parseInt(s, 16);
+        return (char) n;
+    }
+
+    int find(char target, char deeper)
+    {
+        int start = current;
+        int level = 1;
+
+        while (level != 0)
+        {
+            if (eof())
+            {
+                throw new RuntimeException("Eof found in the middle of a compound for '"
+                    + target + deeper + "', begins at " + context(start));
+            }
+
+            char c = next();
+            if (!escaped)
+            {
+                if (c == target)
+                {
+                    level--;
+                }
+                else
+                {
+                    if (c == deeper)
+                    {
+                        level++;
+                    }
+                    else
+                    {
+                        if (c == '"')
+                        {
+                            quote('"');
+                        }
+                        else
+                        {
+                            if (c == '\'')
+                            {
+                                quote('\'');
+                            }
+                            else
+                            {
+                                if (c == '`')
+                                {
+                                    quote('`');
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return current;
+    }
+
+    int quote(char which)
+    {
+        while (!eof() && (peek() != which || escaped))
+        {
+            next();
+        }
+
+        return current++;
+    }
+
+    CharSequence findVar()
+    {
+        int start = current;
+        char c = peek();
+
+        if (c == '{')
+        {
+            next();
+            int end = find('}', '{');
+            return text.subSequence(start, end);
+        }
+        if (c == '(')
+        {
+            next();
+            int end = find(')', '(');
+            return text.subSequence(start, end);
+        }
+
+        if (Character.isJavaIdentifierPart(c))
+        {
+            while (c == '$')
+            {
+                c = next();
+            }
+            while (!eof() && (Character.isJavaIdentifierPart(c) || c == '.') && c != '$')
+            {
+                next();
+                c = peek();
+            }
+            return text.subSequence(start, current);
+        }
+        throw new IllegalArgumentException(
+            "Reference to variable does not match syntax of a variable: "
+                + context(start));
+    }
+
+    public String toString()
+    {
+        return "..." + context(current) + "...";
+    }
+
+    public String unescape()
+    {
+        StringBuilder sb = new StringBuilder();
+        while (!eof())
+        {
+            sb.append(next());
+        }
+        return sb.toString();
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/StringsCompleter.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/StringsCompleter.java
new file mode 100644
index 0000000..fc11d04
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/StringsCompleter.java
@@ -0,0 +1,102 @@
+/*
+ * 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.karaf.shell.console.completer;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.karaf.shell.console.Completer;
+
+/**
+ * Completer for a set of strings.
+ */
+public class StringsCompleter
+    implements Completer
+{
+    private final SortedSet<String> strings = new TreeSet<String>();
+    private final boolean caseSensitive;
+
+    public StringsCompleter() {
+        this(true);
+    }
+
+
+    public StringsCompleter(final boolean caseSensitive) {
+        this.caseSensitive = caseSensitive;
+    }
+
+    public StringsCompleter(final Collection<String> strings) {
+        this();
+        assert strings != null;
+        getStrings().addAll(strings);
+    }
+
+    public StringsCompleter(final String[] strings, boolean caseSensitive) {
+        this(Arrays.asList(strings), caseSensitive);
+    }
+
+    public StringsCompleter(final Collection<String> strings, boolean caseSensitive) {
+        this(caseSensitive);
+        assert strings != null;
+        getStrings().addAll(strings);
+    }
+
+    public StringsCompleter(final String[] strings) {
+        this(Arrays.asList(strings));
+    }
+
+    public SortedSet<String> getStrings() {
+        return strings;
+    }
+
+    public int complete(String buffer, final int cursor, final List candidates) {
+        // buffer could be null
+        assert candidates != null;
+
+        if (buffer == null) {
+            buffer = "";
+        }
+        if (!caseSensitive) {
+            buffer = buffer.toLowerCase();
+        }
+
+        // KARAF-421, use getStrings() instead strings field.
+        SortedSet<String> matches = getStrings().tailSet(buffer);
+
+        for (String match : matches) {
+            String s = caseSensitive ? match : match.toLowerCase();
+            if (!s.startsWith(buffer)) {
+                break;
+            }
+
+            // noinspection unchecked
+            candidates.add(match);
+        }
+
+        if (candidates.size() == 1) {
+            // noinspection unchecked
+            candidates.set(0, candidates.get(0) + " ");
+        }
+
+        return candidates.isEmpty() ? -1 : 0;
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Activator.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Activator.java
new file mode 100644
index 0000000..35a25ac
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Activator.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.shell.console.jline;
+
+import org.fusesource.jansi.AnsiConsole;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+    private org.apache.felix.gogo.runtime.activator.Activator activator = new org.apache.felix.gogo.runtime.activator.Activator();
+
+    public void start(BundleContext context) throws Exception {
+        AnsiConsole.systemInstall();
+        activator.start(context);
+    }
+
+    public void stop(BundleContext context) throws Exception {
+        activator.stop(context);
+        AnsiConsole.systemUninstall();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CommandSessionHolder.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CommandSessionHolder.java
new file mode 100644
index 0000000..d566713
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CommandSessionHolder.java
@@ -0,0 +1,20 @@
+package org.apache.karaf.shell.console.jline;
+
+import org.apache.felix.service.command.CommandSession;
+
+public class CommandSessionHolder {
+
+    private static final ThreadLocal<CommandSession> session = new ThreadLocal<CommandSession>();
+
+    public static CommandSession getSession() {
+        return session.get();
+    }
+
+    public static void setSession(CommandSession commandSession) {
+        session.set(commandSession);
+    }
+
+    public static void unset() {
+        session.remove();
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CompleterAsCompletor.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CompleterAsCompletor.java
new file mode 100644
index 0000000..7fd6ebb
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CompleterAsCompletor.java
@@ -0,0 +1,34 @@
+/*
+ * 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.karaf.shell.console.jline;
+
+import java.util.List;
+
+public class CompleterAsCompletor implements jline.console.completer.Completer {
+
+    private final org.apache.karaf.shell.console.Completer completer;
+
+    public CompleterAsCompletor(org.apache.karaf.shell.console.Completer completer) {
+        this.completer = completer;
+    }
+
+    public int complete(String buffer, int cursor, List candidates) {
+        return completer.complete(buffer, cursor, candidates);
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
new file mode 100644
index 0000000..c827494b
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
@@ -0,0 +1,509 @@
+/*
+ * 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.karaf.shell.console.jline;
+
+import java.io.CharArrayWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jline.Terminal;
+import jline.UnsupportedTerminal;
+import jline.console.ConsoleReader;
+import jline.console.history.FileHistory;
+import jline.console.history.PersistentHistory;
+import org.apache.felix.gogo.commands.CommandException;
+import org.apache.felix.gogo.runtime.CommandNotFoundException;
+import org.apache.felix.gogo.runtime.Parser;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Converter;
+import org.apache.karaf.shell.console.CloseShellException;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.CommandsCompleter;
+import org.fusesource.jansi.Ansi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Console implements Runnable
+{
+
+    public static final String SHELL_INIT_SCRIPT = "karaf.shell.init.script";
+    public static final String PROMPT = "PROMPT";
+    public static final String DEFAULT_PROMPT = "\u001B[1m${USER}\u001B[0m@${APPLICATION}> ";
+    public static final String PRINT_STACK_TRACES = "karaf.printStackTraces";
+    public static final String LAST_EXCEPTION = "karaf.lastException";
+    public static final String IGNORE_INTERRUPTS = "karaf.ignoreInterrupts";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Console.class);
+
+    protected CommandSession session;
+    private ConsoleReader reader;
+    private BlockingQueue<Integer> queue;
+    private boolean interrupt;
+    private Thread pipe;
+    volatile private boolean running;
+    volatile private boolean eof;
+    private Runnable closeCallback;
+    private Terminal terminal;
+    private InputStream consoleInput;
+    private InputStream in;
+    private PrintStream out;
+    private PrintStream err;
+    private Thread thread;
+
+    public Console(CommandProcessor processor,
+                   InputStream in,
+                   PrintStream out,
+                   PrintStream err,
+                   Terminal term,
+                   Runnable closeCallback) throws Exception
+    {
+        this.in = in;
+        this.out = out;
+        this.err = err;
+        this.queue = new ArrayBlockingQueue<Integer>(1024);
+        this.terminal = term == null ? new UnsupportedTerminal() : term;
+        this.consoleInput = new ConsoleInputStream();
+        this.session = processor.createSession(this.consoleInput, this.out, this.err);
+        this.session.put("SCOPE", "shell:osgi:*");
+        this.closeCallback = closeCallback;
+
+        reader = new ConsoleReader(this.consoleInput,
+                                   this.out,
+                                   this.terminal);
+
+        final File file = getHistoryFile();
+        try {
+            file.getParentFile().mkdirs();
+        	reader.setHistory(new KarafFileHistory(file));
+		} catch (Exception e) {
+			LOGGER.error("Can not read history from file " + file + ". Using in memory history", e);
+		}
+        session.put(".jline.reader", reader);
+        session.put(".jline.history", reader.getHistory());
+        Completer completer = createCompleter();
+        if (completer != null) {
+            reader.addCompleter(new CompleterAsCompletor(completer));
+        }
+        pipe = new Thread(new Pipe());
+        pipe.setName("gogo shell pipe thread");
+        pipe.setDaemon(true);
+    }
+
+    /**
+     * Subclasses can override to use a different history file.
+     * @return
+     */
+    protected File getHistoryFile() {
+        String defaultHistoryPath = new File(System.getProperty("user.home"), ".karaf/karaf.history").toString();
+        return new File(System.getProperty("karaf.history", defaultHistoryPath));
+    }
+
+    public CommandSession getSession() {
+        return session;
+    }
+
+    public void close() {
+        //System.err.println("Closing");
+        if (reader.getHistory() instanceof PersistentHistory) {
+            try {
+                ((PersistentHistory) reader.getHistory()).flush();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+        running = false;
+        CommandSessionHolder.unset();
+        pipe.interrupt();
+    }
+
+    public void run()
+    {
+        ThreadLocal<CommandSessionHolder> consoleState = new ThreadLocal<CommandSessionHolder>();
+        thread = Thread.currentThread();
+        CommandSessionHolder.setSession(session);
+        running = true;
+        pipe.start();
+        welcome();
+        setSessionProperties();
+        String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT);
+        executeScript(scriptFileName);
+        while (running) {
+            try {
+                String command = readAndParseCommand();
+                if (command == null) {
+                    break;
+                }
+                Object result = session.execute(command);
+                if (result != null) {
+                    session.getConsole().println(session.format(result, Converter.INSPECT));
+                }
+            }
+            catch (InterruptedIOException e) {
+                // System.err.println("^C");
+                // TODO: interrupt current thread
+            }
+            catch (CloseShellException e) {
+                break;
+            }
+            catch (Throwable t) {
+                logException(t);
+            }
+        }
+        close();
+        //System.err.println("Exiting console...");
+        if (closeCallback != null)
+        {
+            closeCallback.run();
+        }
+    }
+
+    private void logException(Throwable t) {
+        try {
+            if (t instanceof CommandNotFoundException) {
+                LOGGER.debug("Unknown command entered", t);
+            } else {
+                LOGGER.info("Exception caught while executing command", t);
+            }
+            session.put(LAST_EXCEPTION, t);
+            if (t instanceof CommandException) {
+                session.getConsole().println(((CommandException) t).getNiceHelp());
+            } else if (t instanceof CommandNotFoundException) {
+                String str = Ansi.ansi()
+                        .fg(Ansi.Color.RED)
+                        .a("Command not found: ")
+                        .a(Ansi.Attribute.INTENSITY_BOLD)
+                        .a(((CommandNotFoundException) t).getCommand())
+                        .a(Ansi.Attribute.INTENSITY_BOLD_OFF)
+                        .fg(Ansi.Color.DEFAULT).toString();
+                session.getConsole().println(str);
+            }
+            if (getBoolean(PRINT_STACK_TRACES)) {
+                session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
+                t.printStackTrace(session.getConsole());
+                session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
+            } else if (!(t instanceof CommandException) && !(t instanceof CommandNotFoundException)) {
+                session.getConsole().print(Ansi.ansi().fg(Ansi.Color.RED).toString());
+                session.getConsole().println("Error executing command: "
+                    + (t.getMessage() != null ? t.getMessage() : t.getClass().getName()));
+                session.getConsole().print(Ansi.ansi().fg(Ansi.Color.DEFAULT).toString());
+            }
+        } catch (Exception ignore) {
+            // ignore
+        }
+    }
+
+    private String readAndParseCommand() throws IOException {
+        String command = null;
+        boolean loop = true;
+        boolean first = true;
+        while (loop) {
+            checkInterrupt();
+            String line = reader.readLine(first ? getPrompt() : "> ");
+            if (line == null)
+            {
+                break;
+            }
+            if (command == null) {
+                command = line;
+            } else {
+                command += " " + line;
+            }
+            if (reader.getHistory().size()==0) {
+                reader.getHistory().add(command);
+            } else {
+                reader.getHistory().replace(command);
+            }
+            try {
+                new Parser(command).program();
+                loop = false;
+            } catch (Exception e) {
+                loop = true;
+                first = false;
+            }
+        }
+        return command;
+    }
+
+    private void executeScript(String scriptFileName) {
+        if (scriptFileName != null) {
+            Reader r = null;
+            try {
+                File scriptFile = new File(scriptFileName);
+                r = new InputStreamReader(new FileInputStream(scriptFile));
+                CharArrayWriter w = new CharArrayWriter();
+                int n;
+                char[] buf = new char[8192];
+                while ((n = r.read(buf)) > 0) {
+                    w.write(buf, 0, n);
+                }
+                session.execute(new String(w.toCharArray()));
+            } catch (Exception e) {
+                LOGGER.debug("Error in initialization script", e);
+                System.err.println("Error in initialization script: " + e.getMessage());
+            } finally {
+                if (r != null) {
+                    try {
+                        r.close();
+                    } catch (IOException e) {
+                        // Ignore
+                    }
+                }
+            }
+        }
+    }
+
+    protected boolean getBoolean(String name) {
+        Object s = session.get(name);
+        if (s == null) {
+            s = System.getProperty(name);
+        }
+        if (s == null) {
+            return false;
+        }
+        if (s instanceof Boolean) {
+            return (Boolean) s;
+        }
+        return Boolean.parseBoolean(s.toString());
+    }
+
+    protected void welcome() {
+        Properties props = loadBrandingProperties();
+        String welcome = props.getProperty("welcome");
+        if (welcome != null && welcome.length() > 0) {
+            session.getConsole().println(welcome);
+        }
+    }
+
+    protected void setSessionProperties() {
+        Properties props = loadBrandingProperties();
+        for (Map.Entry<Object, Object> entry : props.entrySet()) {
+            String key = (String) entry.getKey();
+            if (key.startsWith("session.")) {
+                session.put(key.substring("session.".length()), entry.getValue());
+            }
+        }
+    }
+
+    protected Completer createCompleter() {
+        return new CommandsCompleter(session);
+    }
+
+    protected Properties loadBrandingProperties() {
+        Properties props = new Properties();
+        loadProps(props, "org/apache/karaf/shell/console/branding.properties");
+        loadProps(props, "org/apache/karaf/branding/branding.properties");
+        return props;
+    }
+
+    protected void loadProps(Properties props, String resource) {
+        InputStream is = null;
+        try {
+            is = getClass().getClassLoader().getResourceAsStream(resource);
+            if (is != null) {
+                props.load(is);
+            }
+        } catch (IOException e) {
+            // ignore
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+    protected String getPrompt() {
+        try {
+            String prompt;
+            try {
+                Object p = session.get(PROMPT);
+                if (p != null) {
+                    prompt = p.toString();
+                } else {
+                    Properties properties = loadBrandingProperties();
+                    if (properties.getProperty("prompt") != null) {
+                        prompt = properties.getProperty("prompt");
+                        // we put the PROMPT in ConsoleSession to avoid to read
+                        // the properties file each time.
+                        session.put(PROMPT, prompt);
+                    } else {
+                        prompt = DEFAULT_PROMPT;
+                    }
+                }
+            } catch (Throwable t) {
+                prompt = DEFAULT_PROMPT;
+            }
+            Matcher matcher = Pattern.compile("\\$\\{([^}]+)\\}").matcher(prompt);
+            while (matcher.find()) {
+                Object rep = session.get(matcher.group(1));
+                if (rep != null) {
+                    prompt = prompt.replace(matcher.group(0), rep.toString());
+                    matcher.reset(prompt);
+                }
+            }
+            return prompt;
+        } catch (Throwable t) {
+            return "$ ";
+        }
+    }
+
+    private void checkInterrupt() throws IOException {
+        if (Thread.interrupted() || interrupt) {
+            interrupt = false;
+            throw new InterruptedIOException("Keyboard interruption");
+        }
+    }
+
+    private void interrupt() {
+        interrupt = true;
+        thread.interrupt();
+    }
+
+    private class ConsoleInputStream extends InputStream
+    {
+        private int read(boolean wait) throws IOException
+        {
+            if (!running) {
+                return -1;
+            }
+            checkInterrupt();
+            if (eof && queue.isEmpty()) {
+                return -1;
+            }
+            Integer i;
+            if (wait) {
+                try {
+                    i = queue.take();
+                } catch (InterruptedException e) {
+                    throw new InterruptedIOException();
+                }
+                checkInterrupt();
+            } else {
+                i = queue.poll();
+            }
+            if (i == null) {
+                return -1;
+            }
+            return i;
+        }
+
+        @Override
+        public int read() throws IOException
+        {
+            return read(true);
+        }
+
+        @Override
+        public int read(byte b[], int off, int len) throws IOException
+        {
+            if (b == null) {
+                throw new NullPointerException();
+            } else if (off < 0 || len < 0 || len > b.length - off) {
+                throw new IndexOutOfBoundsException();
+            } else if (len == 0) {
+                return 0;
+            }
+
+            int nb = 1;
+            int i = read(true);
+            if (i < 0) {
+                return -1;
+            }
+            b[off++] = (byte) i;
+            while (nb < len) {
+                i = read(false);
+                if (i < 0) {
+                    return nb;
+                }
+                b[off++] = (byte) i;
+                nb++;
+            }
+            return nb;
+        }
+
+        @Override
+        public int available() throws IOException {
+            return queue.size();
+        }
+    }
+
+    private class Pipe implements Runnable
+    {
+        public void run()
+        {
+            try {
+                while (running)
+                {
+                    try
+                    {
+                        int c = in.read();
+                        if (c == -1)
+                        {
+                            return;
+                        }
+                        else if (c == 4 && !getBoolean(IGNORE_INTERRUPTS))
+                        {
+                            err.println("^D");
+                            return;
+                        }
+                        else if (c == 3 && !getBoolean(IGNORE_INTERRUPTS))
+                        {
+                            err.println("^C");
+                            reader.getCursorBuffer().clear();
+                            interrupt();
+                        }
+                        queue.put(c);
+                    }
+                    catch (Throwable t) {
+                        return;
+                    }
+                }
+            }
+            finally
+            {
+                eof = true;
+                try
+                {
+                    queue.put(-1);
+                }
+                catch (InterruptedException e)
+                {
+                }
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
new file mode 100644
index 0000000..db23c1e
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
@@ -0,0 +1,163 @@
+/*
+ * 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.karaf.shell.console.jline;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.lang.reflect.Method;
+import java.security.PrivilegedExceptionAction;
+import java.util.List;
+import javax.security.auth.Subject;
+
+import jline.Terminal;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Function;
+import org.apache.karaf.jaas.modules.UserPrincipal;
+import org.fusesource.jansi.AnsiConsole;
+import org.osgi.framework.BundleContext;
+
+public class ConsoleFactory {
+
+    private BundleContext bundleContext;
+    private CommandProcessor commandProcessor;
+    private TerminalFactory terminalFactory;
+    private Console console;
+    private boolean start;
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public synchronized void registerCommandProcessor(CommandProcessor commandProcessor) throws Exception {
+        this.commandProcessor = commandProcessor;
+        start();
+    }
+
+    public synchronized void unregisterCommandProcessor(CommandProcessor commandProcessor) throws Exception {
+        this.commandProcessor = null;
+        stop();
+    }
+
+    public void setTerminalFactory(TerminalFactory terminalFactory) {
+        this.terminalFactory = terminalFactory;
+    }
+
+    public void setStart(boolean start) {
+        this.start = start;
+    }
+
+    protected void start() throws Exception {
+        if (start) {
+            Subject subject = new Subject();
+            final String user = "karaf";
+            subject.getPrincipals().add(new UserPrincipal(user));
+            Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
+                public Object run() throws Exception {
+                    doStart(user);
+                    return null;
+                }
+            });
+        }
+    }
+
+    public static Object invokePrivateMethod(Object o, String methodName, Object[] params) throws Exception {
+        final Method methods[] = o.getClass().getDeclaredMethods();
+        for (int i = 0; i < methods.length; ++i) {
+            if (methodName.equals(methods[i].getName())) {
+                methods[i].setAccessible(true);
+                return methods[i].invoke(o, params);
+            }
+        }
+        return null;
+    }
+    
+    private static <T> T unwrapBIS(T stream) {
+        try {
+             return (T) invokePrivateMethod(stream, "getInIfOpen", null);
+        } catch (Throwable t) {
+             return stream;
+        }
+    }
+
+    protected void doStart(String user) throws Exception {
+        final Terminal terminal = terminalFactory.getTerminal();
+        // unwrap stream so it can be recognized by the terminal and wrapped to get 
+        // special keys in windows
+        InputStream unwrappedIn = unwrapBIS(unwrap(System.in));
+        InputStream in = terminal.wrapInIfNeeded(unwrappedIn);
+        PrintStream out = unwrap(System.out);
+        PrintStream err = unwrap(System.err);
+        Runnable callback = new Runnable() {
+            public void run() {
+                try {
+                    bundleContext.getBundle(0).stop();
+                } catch (Exception e) {
+                    // Ignore
+                }
+            }
+        };
+        this.console = new Console(commandProcessor,
+                                   in,
+                                   wrap(out),
+                                   wrap(err),
+                                   terminal,
+                                   callback);
+        CommandSession session = console.getSession();
+        session.put("USER", user);
+        session.put("APPLICATION", System.getProperty("karaf.name", "root"));
+        session.put("#LINES", new Function() {
+            public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+                return Integer.toString(terminal.getHeight());
+            }
+        });
+        session.put("#COLUMNS", new Function() {
+            public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+                return Integer.toString(terminal.getWidth());
+            }
+        });
+        session.put(".jline.terminal", terminal);
+        new Thread(console, "Karaf Shell Console Thread").start();
+    }
+
+    protected void stop() throws Exception {
+        if (console != null) {
+            console.close();
+        }
+    }
+
+    private static PrintStream wrap(PrintStream stream) {
+        OutputStream o = AnsiConsole.wrapOutputStream(stream);
+        if (o instanceof PrintStream) {
+            return ((PrintStream) o);
+        } else {
+            return new PrintStream(o);
+        }
+    }
+
+    private static <T> T unwrap(T stream) {
+        try {
+            Method mth = stream.getClass().getMethod("getRoot");
+            return (T) mth.invoke(stream);
+        } catch (Throwable t) {
+            return stream;
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/KarafFileHistory.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/KarafFileHistory.java
new file mode 100644
index 0000000..e03650c
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/KarafFileHistory.java
@@ -0,0 +1,65 @@
+package org.apache.karaf.shell.console.jline;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+
+import jline.console.history.FileHistory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Override the FileHistory impl to trap failures due to the
+ * user does not having write access to the history file.
+ */
+public final class KarafFileHistory extends FileHistory {
+	static final Logger LOGGER = LoggerFactory.getLogger(KarafFileHistory.class);
+	boolean failed = false;
+    boolean loading = false;
+
+	public KarafFileHistory(File file) throws IOException {
+		super(file);
+	}
+
+    @Override
+    public void add(CharSequence item) {
+        if (!loading) {
+            item = item.toString().replaceAll("\\!", "\\\\!");
+        }
+        super.add(item);
+    }
+
+    @Override
+    public void load(Reader reader) throws IOException {
+        loading = true;
+        try {
+            super.load(reader);
+        } finally {
+            loading = false;
+        }
+    }
+
+    @Override
+	public void flush() throws IOException {
+	    if( !failed ) {
+	        try {
+	            super.flush();
+	        } catch (IOException e) {
+	            failed = true;
+	            LOGGER.debug("Could not write history file: "+ getFile(), e);
+	        }
+	    }
+	}
+
+	@Override
+	public void purge() throws IOException {
+	    if( !failed ) {
+	        try {
+	            super.purge();
+	        } catch (IOException e) {
+	            failed = true;
+	            LOGGER.debug("Could not delete history file: "+ getFile(), e);
+	        }
+	    }
+	}
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java
new file mode 100644
index 0000000..79f7f4b
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java
@@ -0,0 +1,47 @@
+/*
+ * 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.karaf.shell.console.jline;
+
+import jline.NoInterruptUnixTerminal;
+import jline.Terminal;
+
+public class TerminalFactory {
+
+    private Terminal term;
+
+    public synchronized Terminal getTerminal() throws Exception {
+        if (term == null) {
+            init();
+        }
+        return term;
+    }
+
+    public void init() throws Exception {
+        jline.TerminalFactory.registerFlavor(jline.TerminalFactory.Flavor.UNIX, NoInterruptUnixTerminal.class);
+        term = jline.TerminalFactory.create();
+    }
+
+    public synchronized void destroy() throws Exception {
+        if (term != null) {
+            term.restore();
+            term = null;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/main/resources/META-INF/services/org/apache/karaf/shell/commands b/karaf-2.2.x/shell/console/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
new file mode 100644
index 0000000..3f110a7
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
@@ -0,0 +1,17 @@
+##---------------------------------------------------------------------------
+##  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.
+##---------------------------------------------------------------------------
+org.apache.karaf.shell.console.HelpAction
diff --git a/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml b/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
new file mode 100644
index 0000000..a129fbd
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
@@ -0,0 +1,67 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]">
+        <ext:default-properties>
+            <ext:property name="karaf.startLocalConsole" value="true" />
+        </ext:default-properties>
+    </ext:property-placeholder>
+
+    <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor">
+        <reference-listener ref="consoleFactory"
+                            bind-method="registerCommandProcessor"
+                            unbind-method="unregisterCommandProcessor"/>
+    </reference>
+
+    <bean id="consoleFactory" class="org.apache.karaf.shell.console.jline.ConsoleFactory">
+        <property name="start" value="$[karaf.startLocalConsole]"/>
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="terminalFactory" ref="terminalFactory"/>
+    </bean>
+
+    <bean id="converters" class="org.apache.karaf.shell.console.Converters">
+        <argument ref="blueprintBundleContext"/>
+    </bean>
+    <service ref="converters" interface="org.apache.felix.service.command.Converter"/>
+
+    <bean id="terminalFactory" class="org.apache.karaf.shell.console.jline.TerminalFactory"
+          destroy-method="destroy"/>
+
+    <service>
+        <interfaces>
+            <value>org.apache.felix.service.command.Function</value>
+            <value>org.apache.karaf.shell.console.CompletableFunction</value>
+        </interfaces>
+        <service-properties>
+            <entry key="osgi.command.scope" value="*"/>
+            <entry key="osgi.command.function" value="help"/>
+        </service-properties>
+        <bean class="org.apache.karaf.shell.console.commands.BlueprintCommand">
+            <property name="blueprintContainer" ref="blueprintContainer"/>
+            <property name="blueprintConverter" ref="blueprintConverter"/>
+            <property name="actionId" value="help"/>
+        </bean>
+    </service>
+    <bean id="help" class="org.apache.karaf.shell.console.HelpAction" activation="lazy" scope="prototype" />
+
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml b/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
new file mode 100644
index 0000000..77ec1f0
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
@@ -0,0 +1,34 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <service interface="org.apache.aries.blueprint.NamespaceHandler">
+        <service-properties>
+            <entry key="osgi.service.blueprint.namespace">
+                <array>
+                    <value>http://karaf.apache.org/xmlns/shell/v1.0.0</value>
+                    <value>http://karaf.apache.org/xmlns/shell/v1.1.0</value>
+                </array>
+            </entry>
+        </service-properties>
+        <bean class="org.apache.karaf.shell.console.commands.NamespaceHandler"/>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..84522f7
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,14 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides for integration of Apache Felix Gogo, shell, and console.
+
+    It provides the default Karaf branding including the default welcome message.
+
+\u001B[1mSEE ALSO\u001B[0m
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.0.0.xsd b/karaf-2.2.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.0.0.xsd
new file mode 100644
index 0000000..0e0dafd
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.0.0.xsd
@@ -0,0 +1,217 @@
+<?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.
+-->
+
+<!-- $Rev: 699828 $ $Date: 2008-09-28 16:35:27 +0200 (Sun, 28 Sep 2008) $ -->
+
+<xsd:schema xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0"
+        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+        targetNamespace="http://karaf.apache.org/xmlns/shell/v1.0.0"
+        elementFormDefault="qualified"
+        attributeFormDefault="unqualified">
+
+    <xsd:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+    <xsd:annotation>
+        <xsd:documentation>
+            Defines the configuration elements for Apache Karaf commands support.
+        </xsd:documentation>
+    </xsd:annotation>
+
+    <xsd:element name="command-bundle">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command bundle.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <xsd:choice minOccurs="0" maxOccurs="unbounded">
+					<xsd:element ref="command"/>
+					<xsd:element ref="alias"/>
+                    <xsd:element ref="link"/>
+				</xsd:choice>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="command">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <!--
+                NOTE: Not using an xsd:choice here, as I can't seem to figure out how to get it to properly
+                      validate the min/max of the containted elements.  W/o the xsd:choice the validation
+                      works, though have to define elements in order :-(
+                -->
+                <xsd:element ref="action" minOccurs="1" maxOccurs="1"/>
+                <xsd:element ref="documenter" minOccurs="0" maxOccurs="1"/>
+                <xsd:choice minOccurs="0" maxOccurs="1">
+                    <xsd:element ref="completer"/>
+                    <xsd:element ref="completers"/>
+                </xsd:choice>
+                <xsd:element ref="message-source" minOccurs="0" maxOccurs="1"/>
+            </xsd:sequence>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="link">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a link command.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+            <xsd:attribute name="target" type="xsd:string" use="required"/>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:group name="commandComponentElements">
+        <xsd:annotation>
+            <xsd:documentation>
+                Defines the valid elements for command components.  This is based on beans:beanElements,
+                stripping off the bits which are not valid in the command component context.
+            </xsd:documentation>
+        </xsd:annotation>
+		<xsd:sequence>
+			<xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="argument" type="bp:Targument"/>
+                <xsd:element name="property" type="bp:Tproperty"/>
+				<!--
+				NOTE: This seems to cause schema validation problems... not really sure why
+				<xsd:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
+				-->
+			</xsd:choice>
+		</xsd:sequence>
+	</xsd:group>
+
+    <xsd:attributeGroup name="commandComponentAttributes">
+        <xsd:annotation>
+            <xsd:documentation>
+                Defines the valid attributes for command components.  This is based on beans:beanAttributes,
+                stripping off the bits which are not valid in the command component context.
+            </xsd:documentation>
+        </xsd:annotation>
+		<xsd:attribute name="class" type="xsd:string"/>
+		<xsd:attribute name="depends-on" type="xsd:string"/>
+		<xsd:attribute name="init-method" type="xsd:string"/>
+		<xsd:attribute name="factory-method" type="xsd:string"/>
+		<xsd:attribute name="factory-bean" type="xsd:string"/>
+		<xsd:anyAttribute namespace="##other" processContents="lax"/>
+	</xsd:attributeGroup>
+
+    <xsd:complexType name="commandComponent" abstract="true">
+        <xsd:annotation>
+            <xsd:documentation>
+                Support for command component elements, which are all basically just beans.
+            </xsd:documentation>
+        </xsd:annotation>
+        <xsd:group ref="commandComponentElements"/>
+        <xsd:attributeGroup ref="commandComponentAttributes"/>
+    </xsd:complexType>
+
+    <xsd:element name="action">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command action.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="documenter">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command documenter.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="completer">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command completer.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="completers">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a configurable command completer with a set of completers.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <xsd:choice minOccurs="1" maxOccurs="unbounded">
+                    <xsd:element name="bean" type="bp:Tbean"/>
+                    <xsd:element name="ref" type="bp:Tref"/>
+                    <xsd:element name="null" type="bp:Tnull"/>
+                </xsd:choice>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="message-source">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command message source.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="alias">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command alias.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+            <xsd:attribute name="alias" type="xsd:string" use="required"/>
+        </xsd:complexType>
+    </xsd:element>
+
+</xsd:schema>
diff --git a/karaf-2.2.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.1.0.xsd b/karaf-2.2.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.1.0.xsd
new file mode 100644
index 0000000..7ad126f
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.1.0.xsd
@@ -0,0 +1,238 @@
+<?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.
+-->
+
+<!-- $Rev: 699828 $ $Date: 2008-09-28 16:35:27 +0200 (Sun, 28 Sep 2008) $ -->
+
+<xsd:schema xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"
+        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+        targetNamespace="http://karaf.apache.org/xmlns/shell/v1.1.0"
+        elementFormDefault="qualified"
+        attributeFormDefault="unqualified">
+
+    <xsd:import namespace="http://www.osgi.org/xmlns/blueprint/v1.0.0"/>
+
+    <xsd:annotation>
+        <xsd:documentation>
+            Defines the configuration elements for Apache Karaf commands support.
+        </xsd:documentation>
+    </xsd:annotation>
+
+    <xsd:element name="command-bundle">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command bundle.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <xsd:choice minOccurs="0" maxOccurs="unbounded">
+					<xsd:element ref="command"/>
+					<xsd:element ref="alias"/>
+                    <xsd:element ref="link"/>
+				</xsd:choice>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="command">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <!--
+                NOTE: Not using an xsd:choice here, as I can't seem to figure out how to get it to properly
+                      validate the min/max of the containted elements.  W/o the xsd:choice the validation
+                      works, though have to define elements in order :-(
+                -->
+                <xsd:element ref="action" minOccurs="1" maxOccurs="1"/>
+                <xsd:element ref="documenter" minOccurs="0" maxOccurs="1"/>
+                <xsd:choice minOccurs="0" maxOccurs="1">
+                    <xsd:element ref="completer"/>
+                    <xsd:element ref="completers"/>
+                </xsd:choice>
+                <xsd:element ref="optional-completers" minOccurs="0" maxOccurs="1"/>
+                <xsd:element ref="message-source" minOccurs="0" maxOccurs="1"/>
+            </xsd:sequence>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="link">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a link command.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+            <xsd:attribute name="target" type="xsd:string" use="required"/>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:group name="commandComponentElements">
+        <xsd:annotation>
+            <xsd:documentation>
+                Defines the valid elements for command components.  This is based on beans:beanElements,
+                stripping off the bits which are not valid in the command component context.
+            </xsd:documentation>
+        </xsd:annotation>
+		<xsd:sequence>
+			<xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="argument" type="bp:Targument"/>
+                <xsd:element name="property" type="bp:Tproperty"/>
+				<!--
+				NOTE: This seems to cause schema validation problems... not really sure why
+				<xsd:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
+				-->
+			</xsd:choice>
+		</xsd:sequence>
+	</xsd:group>
+
+    <xsd:attributeGroup name="commandComponentAttributes">
+        <xsd:annotation>
+            <xsd:documentation>
+                Defines the valid attributes for command components.  This is based on beans:beanAttributes,
+                stripping off the bits which are not valid in the command component context.
+            </xsd:documentation>
+        </xsd:annotation>
+		<xsd:attribute name="class" type="xsd:string"/>
+		<xsd:attribute name="depends-on" type="xsd:string"/>
+		<xsd:attribute name="init-method" type="xsd:string"/>
+		<xsd:attribute name="factory-method" type="xsd:string"/>
+		<xsd:attribute name="factory-bean" type="xsd:string"/>
+		<xsd:anyAttribute namespace="##other" processContents="lax"/>
+	</xsd:attributeGroup>
+
+    <xsd:complexType name="commandComponent" abstract="true">
+        <xsd:annotation>
+            <xsd:documentation>
+                Support for command component elements, which are all basically just beans.
+            </xsd:documentation>
+        </xsd:annotation>
+        <xsd:group ref="commandComponentElements"/>
+        <xsd:attributeGroup ref="commandComponentAttributes"/>
+    </xsd:complexType>
+
+    <xsd:element name="action">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command action.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="documenter">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command documenter.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="completer">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command completer.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="completers">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a configurable command completer with a set of completers.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:sequence>
+                <xsd:choice minOccurs="1" maxOccurs="unbounded">
+                    <xsd:element name="bean" type="bp:Tbean"/>
+                    <xsd:element name="ref" type="bp:Tref"/>
+                    <xsd:element name="null" type="bp:Tnull"/>
+                </xsd:choice>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+        <xsd:element name="optional-completers">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a configurable command completer with a set of completers.
+                    These completers are used for option value completion.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+			<xsd:extension base="bp:TtypedCollection">
+				<xsd:sequence>
+					<xsd:element name="entry" type="bp:TmapEntry" minOccurs="0"
+						maxOccurs="unbounded" />
+				</xsd:sequence>
+				<xsd:attribute name="key-type" type="bp:Ttype" />
+			</xsd:extension>
+		</xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="message-source">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command message source.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:complexContent>
+                <xsd:extension base="commandComponent"/>
+            </xsd:complexContent>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:element name="alias">
+        <xsd:complexType>
+            <xsd:annotation>
+                <xsd:documentation>
+                    Defines a command alias.
+                </xsd:documentation>
+            </xsd:annotation>
+            <xsd:attribute name="name" type="xsd:string" use="required"/>
+            <xsd:attribute name="alias" type="xsd:string" use="required"/>
+        </xsd:complexType>
+    </xsd:element>
+
+</xsd:schema>
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java
new file mode 100644
index 0000000..80f5309
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.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.felix.gogo.commands;
+
+import org.apache.felix.gogo.runtime.CommandProcessorImpl;
+import org.apache.felix.gogo.runtime.CommandSessionImpl;
+import org.apache.felix.gogo.runtime.threadio.ThreadIOImpl;
+
+public class Context extends CommandProcessorImpl
+{
+    public static final String EMPTY = "";
+    CommandSessionImpl session;
+    static ThreadIOImpl threadio;
+
+    static
+    {
+        threadio = new ThreadIOImpl();
+        threadio.start();
+    }
+
+    public Context()
+    {
+        super(threadio);
+        addCommand("osgi", this, "addCommand");
+        addCommand("osgi", this, "removeCommand");
+        addCommand("osgi", this, "eval");
+        session = (CommandSessionImpl) createSession(System.in, System.out, System.err);
+    }
+
+
+    public Object execute(CharSequence source) throws Exception
+    {
+        return session.execute(source);
+    }
+
+    public void addCommand(String name, Object target)
+    {
+        put("test:" + name, target);
+    }
+
+    public void set(String name, Object value)
+    {
+        session.put(name, value);
+    }
+
+
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java
new file mode 100644
index 0000000..e2ffd88
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.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.felix.gogo.commands;
+
+import java.util.List;
+import java.util.Arrays;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+import junit.framework.TestCase;
+import org.apache.felix.gogo.commands.basic.SimpleCommand;
+import org.apache.felix.service.command.CommandSession;
+
+public class TestCommands extends TestCase {
+
+
+    public void testPrompt() throws Exception {
+        Context c = new Context();
+        c.addCommand("echo", this);
+        c.set("USER", "gnodet");
+        c.set("APPLICATION", "karaf");
+        //c.set("SCOPE", "");
+        Object p = c.execute("echo \"@|bold ${USER}|@${APPLICATION}:@|bold ${SCOPE}|> \"");
+        System.out.println("Prompt: " + p);
+    }
+
+    public void testCommand() throws Exception {
+        Context c= new Context();
+        c.addCommand("capture", this);
+        c.addCommand("my-action", new SimpleCommand(MyAction.class));
+
+        // Test help
+        Object help = c.execute("my-action --help | capture");
+        assertTrue(help instanceof String);
+        assertTrue(((String) help).indexOf("My Action") >= 0);
+        assertTrue(((String) help).indexOf("First option") >= 0);
+        assertTrue(((String) help).indexOf("Bundle ids") >= 0);
+
+
+        // Test required argument
+        try
+        {
+            c.execute("my-action");
+            fail("Action should have thrown an exception because of a missing argument");
+        }
+        catch (CommandException e)
+        {
+        }
+
+        // Test required argument
+        assertEquals(Arrays.asList(3), c.execute("my-action 3"));
+
+        // Test required argument
+        assertEquals(Arrays.asList(3), c.execute("my-action 3"));
+
+        // Test required argument
+        assertEquals(Arrays.asList(3, 5), c.execute("my-action 3 5"));
+
+        // Test option
+        assertEquals(Arrays.asList(4), c.execute("my-action -i 3"));
+
+        // Test option alias
+        assertEquals(Arrays.asList(4), c.execute("my-action --increment 3"));
+    }
+
+    public String capture() throws IOException
+    {
+        StringWriter sw = new StringWriter();
+        BufferedReader rdr = new BufferedReader(new InputStreamReader(System.in));
+        String s = rdr.readLine();
+        while (s != null)
+        {
+            sw.write(s);
+            s = rdr.readLine();
+        }
+        return sw.toString();
+    }
+
+    public CharSequence echo(Object args[])
+    {
+        if (args == null)
+        {
+            return "";
+        }
+
+        StringBuilder sb = new StringBuilder();
+        String del = "";
+        for (Object arg : args)
+        {
+            sb.append(del);
+            if (arg != null)
+            {
+                sb.append(arg);
+                del = " ";
+            }
+        }
+        return sb;
+    }
+
+    @Command(scope = "test", name = "my-action", description = "My Action")
+    public static class MyAction implements Action
+    {
+
+        @Option(name = "-i", aliases = { "--increment" }, description = "First option")
+        private boolean increment;
+
+        @Argument(name = "ids", description = "Bundle ids", required = true, multiValued = true)
+        private List<Integer> ids;
+
+        public Object execute(CommandSession session) throws Exception {
+            if (increment)
+            {
+                for (int i = 0; i < ids.size(); i++)
+                {
+                    ids.set(i, ids.get(i) + 1);
+                }
+            }
+            return ids;
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
new file mode 100644
index 0000000..82a290a
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
@@ -0,0 +1,100 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.console;
+
+import jline.Terminal;
+import org.apache.felix.gogo.runtime.CommandProcessorImpl;
+import org.apache.karaf.shell.console.jline.Console;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+
+/**
+ * This class is mostly here so that folks can see an example of how you can extend the Karaf Main shell.  Also
+ * lets Karaf developers see how changes the Main class can affect the interface comparability
+ * with sub classes.
+ */
+public class ExampleSubclassMain extends Main  {
+
+    public static void main(String args[]) throws Exception {
+        ExampleSubclassMain main = new ExampleSubclassMain();
+        main.run(args);
+    }
+
+    public void ExampleSubclassMain() {
+        // Sets the name of the shell and the current user.
+        setApplication("example");
+        setUser("unknown");
+    }
+
+    @Override
+    protected Console createConsole(CommandProcessorImpl commandProcessor, InputStream in, PrintStream out, PrintStream err, Terminal terminal) throws Exception {
+        return new Console(commandProcessor, in, out, err, terminal, null) {
+
+            /**
+             * If you don't overwrite, then karaf will use the welcome message found in the
+             * following resource files:
+             * <ul>
+             *   <li>org/apache/karaf/shell/console/branding.properties</li>
+             *   <li>org/apache/karaf/branding/branding.properties</li>
+             * <ul>
+             */
+            @Override
+            protected void welcome() {
+                session.getConsole().println("===============================================");
+                session.getConsole().println(" Example Shell ");
+                session.getConsole().println("===============================================");
+            }
+
+            /**
+             * If you don't overwrite then Karaf builds a prompt based on the current app and user.
+             * @return
+             */
+            @Override
+            protected String getPrompt() {
+                return "example>";
+            }
+
+            /**
+             * If you don't overwrite, then karaf automatically adds session properties
+             * found in the following resource files:
+             * <ul>
+             *   <li>org/apache/karaf/shell/console/branding.properties</li>
+             *   <li>org/apache/karaf/branding/branding.properties</li>
+             * <ul>
+             */
+            @Override
+            protected void setSessionProperties() {
+                // we won't add any session properties.
+            }
+
+        };
+    }
+
+    /**
+     * if you don't override, then Karaf will discover the commands listed in the
+     * "META-INF/services/org/apache/karaf/shell/commands" resource file.
+     *
+     * @return
+     */
+    @Override
+    public String getDiscoveryResource() {
+        return "META-INF/services/org/example/commands.index";
+    }
+
+
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/ArgumentCompleterTest.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/ArgumentCompleterTest.java
new file mode 100644
index 0000000..9774857
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/ArgumentCompleterTest.java
@@ -0,0 +1,146 @@
+/**
+ * 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.karaf.shell.console.completer;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.basic.SimpleCommand;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.console.Completer;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class ArgumentCompleterTest extends CompleterTestSupport {
+
+    @Test
+    public void testParser1() throws Exception {
+        Parser parser = new Parser("echo foo | cat bar ; ta", 23);
+        List<List<List<String>>> p = parser.program();
+        assertEquals(1, parser.c0);
+        assertEquals(0, parser.c1);
+        assertEquals(0, parser.c2);
+        assertEquals(2, parser.c3);
+    }
+
+    @Test
+    public void testParser2() throws Exception {
+        Parser parser = new Parser("echo foo ; cat bar | ta", 23);
+        List<List<List<String>>> p = parser.program();
+        assertEquals(1, parser.c0);
+        assertEquals(1, parser.c1);
+        assertEquals(0, parser.c2);
+        assertEquals(2, parser.c3);
+    }
+
+    @Test
+    public void testParser3() throws Exception {
+        Parser parser = new Parser("echo foo ; cat bar | ta", 22);
+        List<List<List<String>>> p = parser.program();
+        assertEquals(1, parser.c0);
+        assertEquals(1, parser.c1);
+        assertEquals(0, parser.c2);
+        assertEquals(1, parser.c3);
+    }
+
+    @Test
+    public void testParser4() throws Exception {
+        Parser parser = new Parser("echo foo ; cat bar | ta reta", 27);
+        List<List<List<String>>> p = parser.program();
+        assertEquals(1, parser.c0);
+        assertEquals(1, parser.c1);
+        assertEquals(1, parser.c2);
+        assertEquals(3, parser.c3);
+    }
+
+    @Test
+    public void testParser5() throws Exception {
+        Parser parser = new Parser("echo foo ; cat bar | ta reta", 24);
+        List<List<List<String>>> p = parser.program();
+        assertEquals(1, parser.c0);
+        assertEquals(1, parser.c1);
+        assertEquals(1, parser.c2);
+        assertEquals(0, parser.c3);
+    }
+
+    @Test
+    public void testCompleteOptions() throws Exception {
+        CommandSession session = new DummyCommandSession();
+        Completer comp = new ArgumentCompleter(session, new MyFunction(), "my:action");
+        assertEquals(Arrays.asList("--check", "--foo", "--help", "--int", "--string", "-c", "-f", "-i", "-s"), complete(comp, "action -"));
+        assertEquals(Arrays.asList(), complete(comp, "action --foo "));
+        assertEquals(Arrays.asList("action "), complete(comp, "acti"));
+        assertEquals(Arrays.asList("my:action "), complete(comp, "my:ac"));
+        assertEquals(Arrays.asList("--foo "), complete(comp, "action --f"));
+        assertEquals(Arrays.asList("--help "), complete(comp, "action --h"));
+        assertEquals(Arrays.asList("-c "), complete(comp, "action -c"));
+        assertEquals(Arrays.asList("--check "), complete(comp, "action -f 2 --c"));
+        assertEquals(Arrays.asList("foo1 "), complete(comp, "action -f 2 --check foo1"));
+        assertEquals(Arrays.asList("bar1", "bar2"), complete(comp, "action -f 2 --check foo1 "));
+        assertEquals(Arrays.asList("one", "two"), complete(comp, "action -s "));
+        assertEquals(Arrays.asList("one", "two"), complete(comp, "action --string "));
+        assertEquals(Arrays.asList("two "), complete(comp, "action -s t"));
+        assertEquals(Arrays.asList("1", "2"), complete(comp, "action -i "));
+        assertEquals(Arrays.asList("1", "2"), complete(comp, "action --int "));
+        assertEquals(Arrays.asList("2 "), complete(comp, "action -i 2"));
+    }
+
+    public static class MyFunction extends SimpleCommand implements CompletableFunction {
+        public MyFunction() {
+            super(MyAction.class);
+        }
+        public List<Completer> getCompleters() {
+            return Arrays.<Completer>asList(
+                    new StringsCompleter(Arrays.asList("foo1", "foo2")),
+                    new StringsCompleter(Arrays.asList("bar1", "bar2"))
+            );
+        }
+
+        public Map<String,Completer> getOptionalCompleters() {
+            Map<String,Completer> completers = new HashMap<String,Completer>();
+            completers.put("-s",new StringsCompleter(Arrays.asList("one","two")));
+            completers.put("--int",new StringsCompleter(Arrays.asList("1","2")));
+            return completers;
+        }
+    }
+
+    public static class MyAction implements Action {
+        @Option(name = "-f", aliases = { "--foo" })
+        int f;
+
+        @Option(name = "-c", aliases = "--check")
+        boolean check;
+
+        @Option(name = "-s", aliases = "--string")
+        String string;
+
+        @Option(name = "-i", aliases = "--int")
+        String integer;
+
+        public Object execute(CommandSession session) throws Exception {
+            return null;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/BooleanCompleterTest.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/BooleanCompleterTest.java
new file mode 100644
index 0000000..2c01cc6
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/BooleanCompleterTest.java
@@ -0,0 +1,65 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.console.completer;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.CompleterValues;
+import org.apache.felix.gogo.commands.basic.SimpleCommand;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.Completer;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class BooleanCompleterTest extends CompleterTestSupport {
+
+    @Test
+    public void testCompleteArgumnets() throws Exception {
+        CommandSession session = new DummyCommandSession();
+        Completer comp = new ArgumentCompleter(session, new SimpleCommand(MyAction.class), "my:action");
+
+        // arg 0
+        assertEquals(Arrays.asList("true "), complete(comp, "action t"));
+        assertEquals(Arrays.asList("false "), complete(comp, "action f"));
+
+        // arg 1
+        assertEquals(Arrays.asList("true "), complete(comp, "action false t"));
+        assertEquals(Arrays.asList("false "), complete(comp, "action true f"));
+
+        // unknown args
+        assertEquals(Arrays.asList(), complete(comp, "action c"));
+        assertEquals(Arrays.asList(), complete(comp, "action true true a"));
+    }
+
+    public static class MyAction implements Action {
+        @Argument(index = 0)
+        Boolean foo;
+        @Argument(index = 1)
+        boolean bar;
+
+        public Object execute(CommandSession session) throws Exception {
+            return null;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterTestSupport.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterTestSupport.java
new file mode 100644
index 0000000..e5341a5
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterTestSupport.java
@@ -0,0 +1,34 @@
+/**
+ *
+ * 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.karaf.shell.console.completer;
+
+import org.apache.karaf.shell.console.Completer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Useful base class for completion related test cases
+ */
+public abstract class CompleterTestSupport {
+    protected List<String> complete(Completer completer, String buf) {
+        List<String> candidates = new ArrayList<String>();
+        completer.complete(buf, buf.length(), candidates);
+        return candidates;
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterValuesTest.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterValuesTest.java
new file mode 100644
index 0000000..abb0a07
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterValuesTest.java
@@ -0,0 +1,74 @@
+/**
+ *
+ * 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.karaf.shell.console.completer;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.CompleterValues;
+import org.apache.felix.gogo.commands.basic.SimpleCommand;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.Completer;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class CompleterValuesTest extends CompleterTestSupport {
+
+    @Test
+    public void testCompleteArgumnets() throws Exception {
+        CommandSession session = new DummyCommandSession();
+        Completer comp = new ArgumentCompleter(session, new SimpleCommand(MyAction.class), "my:action");
+
+        // arg 0
+        assertEquals(Arrays.asList("a1", "a2", "a3"), complete(comp, "action a"));
+        assertEquals(Arrays.asList("b4", "b5"), complete(comp, "action b"));
+
+        // arg 1
+        assertEquals(Arrays.asList("c2", "c3"), complete(comp, "action a1 c"));
+        assertEquals(Arrays.asList("d5", "d6", "d7"), complete(comp, "action b4 d"));
+
+        // unknown args
+        assertEquals(Arrays.asList(), complete(comp, "action c"));
+        assertEquals(Arrays.asList(), complete(comp, "action a1 d5 a"));
+    }
+
+    public static class MyAction implements Action {
+        @Argument(index = 0)
+        String foo;
+        @Argument(index = 1)
+        String bar;
+
+        public Object execute(CommandSession session) throws Exception {
+            return null;
+        }
+
+        @CompleterValues(index = 0)
+        public String[] getFooValues() {
+            return new String[]{"a1", "a2", "a3", "b4", "b5"};
+        }
+
+        @CompleterValues(index = 1)
+        public List<String> getBarValues() {
+            return Arrays.asList("c2", "c3", "d5", "d6", "d7");
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/DummyCommandSession.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/DummyCommandSession.java
new file mode 100644
index 0000000..ac1a894
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/DummyCommandSession.java
@@ -0,0 +1,48 @@
+/**
+ *
+ * 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.karaf.shell.console.completer;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import org.apache.felix.service.command.CommandSession;
+
+public class DummyCommandSession implements CommandSession {
+    public Object convert(Class<?> type, Object instance) {
+        return null;
+    }
+    public CharSequence format(Object target, int level) {
+        return null;
+    }
+    public void put(String name, Object value) {
+    }
+    public Object get(String name) {
+        return null;
+    }
+    public PrintStream getConsole() {
+        return null;
+    }
+    public InputStream getKeyboard() {
+        return null;
+    }
+    public void close() {
+    }
+    public Object execute(CharSequence commandline) throws Exception {
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/FileCompleterTest.java b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/FileCompleterTest.java
new file mode 100644
index 0000000..48cbedb
--- /dev/null
+++ b/karaf-2.2.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/FileCompleterTest.java
@@ -0,0 +1,56 @@
+/**
+ *
+ * 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.karaf.shell.console.completer;
+
+import java.io.File;
+import java.util.Arrays;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.basic.SimpleCommand;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.Completer;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class FileCompleterTest extends CompleterTestSupport {
+
+    @Test
+    public void testCompleteArgumnets() throws Exception {
+        CommandSession session = new DummyCommandSession();
+        Completer comp = new ArgumentCompleter(session, new SimpleCommand(MyAction.class), "my:action");
+
+        // arg 0
+        assertEquals(Arrays.asList("src"+File.separator), complete(comp, "action s"));
+        assertEquals(Arrays.asList("main"+File.separator), complete(comp, "action src/m"));
+        assertEquals(Arrays.asList("java"+File.separator), complete(comp, "action src/main/j"));
+    }
+
+    public static class MyAction implements Action {
+        @Argument(index = 0)
+        File foo;
+        @Argument(index = 1)
+        File bar;
+
+        public Object execute(CommandSession session) throws Exception {
+            return null;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/dev/NOTICE b/karaf-2.2.x/shell/dev/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/dev/pom.xml b/karaf-2.2.x/shell/dev/pom.xml
new file mode 100644
index 0000000..e75f35a
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>shell</artifactId>
+        <groupId>org.apache.karaf.shell</groupId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.dev</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: Development Commands</name>
+    <description>This bundle provides Karaf shell commands aim to help the developer.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-wrap</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-mvn</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Embed-Dependency>pax-url-mvn</Embed-Dependency>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.felix.utils.version,
+                            org.apache.karaf.util;-split-package:=merge-first,
+                            org.ops4j.pax.url.mvn,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/AbstractBundleCommand.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/AbstractBundleCommand.java
new file mode 100644
index 0000000..baaf2cf
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/AbstractBundleCommand.java
@@ -0,0 +1,93 @@
+/*
+ * 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.karaf.shell.dev;
+
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * Base class for a dev: command that takes a bundle id as an argument
+ *
+ * It also provides convient access to the PackageAdmin service
+ */
+public abstract class AbstractBundleCommand extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "id", description = "The bundle ID", required = true)
+    Long id;
+
+    private PackageAdmin admin;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        // Get package admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("PackageAdmin service is unavailable.");
+            return null;
+        }
+
+        // using the getService call ensures that the reference will be released at the end
+        admin = getService(PackageAdmin.class, ref);
+
+        Bundle bundle = getBundleContext().getBundle(id);
+        if (bundle == null) {
+            System.err.println("Bundle ID " + id + " is invalid");
+            return null;
+        }
+
+        doExecute(bundle);
+        
+        return null;
+    }
+
+    protected abstract void doExecute(Bundle bundle) throws Exception;
+
+    /*
+     * Get the list of bundles from which the given bundle imports packages
+     */
+    protected Map<String, Bundle> getWiredBundles(Bundle bundle) {
+        // the set of bundles from which the bundle imports packages
+        Map<String, Bundle> exporters = new HashMap<String, Bundle>();
+
+        for (ExportedPackage pkg : getPackageAdmin().getExportedPackages((Bundle) null)) {
+            Bundle[] bundles = pkg.getImportingBundles();
+            if (bundles != null) {
+                for (Bundle importingBundle : bundles) {
+                    if (bundle.equals(importingBundle)
+                            && !(pkg.getExportingBundle().getBundleId() == 0)
+                            && !(pkg.getExportingBundle().equals(bundle))) {
+                        exporters.put(pkg.getName(), pkg.getExportingBundle());
+                    }
+                }
+            }
+        }
+        return exporters;
+    }
+
+    protected PackageAdmin getPackageAdmin() {
+        return admin;    
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/DynamicImport.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/DynamicImport.java
new file mode 100644
index 0000000..7f81dbd
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/DynamicImport.java
@@ -0,0 +1,127 @@
+/*
+ * 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.karaf.shell.dev;
+
+import java.io.IOException;
+import static java.lang.String.format;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.ops4j.pax.url.wrap.Handler;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Command for enabling/disabling debug logging on a bundle and calculating the difference in
+ * wired imports.
+ */
+@Command(scope = "dev", name = "dynamic-import", description = "Enables/disables dynamic-import for a given bundle.")
+public class DynamicImport extends AbstractBundleCommand {
+
+    private final Logger LOG = LoggerFactory.getLogger(DynamicImport.class);
+
+    /**
+     * The header key where we store the active wires when we enable DynamicImport=*
+     */
+    protected static final String ORIGINAL_WIRES = "Original-Wires";
+
+    @Override
+    protected void doExecute(Bundle bundle) throws Exception {
+        if (bundle.getHeaders().get(ORIGINAL_WIRES) == null) {
+            enableDynamicImports(bundle);
+        } else {
+            disableDynamicImports(bundle);
+        }
+    }
+
+    /*
+     * Enable DynamicImport=* on the bundle
+     */
+    private void enableDynamicImports(Bundle bundle) throws IOException, BundleException {
+        System.out.printf("Enabling dynamic imports on bundle %s%n", bundle);
+
+        String location =
+                String.format("wrap:%s$" +
+                        "Bundle-UpdateLocation=%s&" +
+                        "DynamicImport-Package=*&" +
+                        "%s=%s&" +
+                        "overwrite=merge",
+                        bundle.getLocation(),
+                        bundle.getLocation(),
+                        ORIGINAL_WIRES,
+                        explode(getWiredBundles(bundle).keySet()));
+        LOG.debug(format("Updating %s with URL %s", bundle, location));
+
+        URL url = new URL(location);
+        bundle.update(url.openStream());
+        getPackageAdmin().refreshPackages(new Bundle[] {bundle});
+    }
+
+    /*
+     * Disable DynamicImport=* on the bundle
+     *
+     * At this time, we will also calculate the difference in package wiring for the bundle compared to
+     * when we enabled the DynamicImport
+     */
+    private void disableDynamicImports(Bundle bundle) throws BundleException {
+        System.out.printf("Disabling dynamic imports on bundle %s%n", bundle);
+
+        Set<String> current = getWiredBundles(bundle).keySet();
+        for (String original : bundle.getHeaders().get(ORIGINAL_WIRES).toString().split(",")) {
+            current.remove(original);
+        }
+
+        if (current.isEmpty()) {
+            System.out.println("(no additional packages have been wired since dynamic import was enabled)");
+        } else {
+            System.out.printf("%nAdditional packages wired since dynamic import was enabled:%n");
+            for (String pkg : current) {
+                System.out.printf("- %s%n", pkg);
+            }
+        }
+
+        bundle.update();
+    }
+
+    /*
+     * Explode a set of string values in to a ,-delimited string
+     */
+    private String explode(Set<String> set) {
+        StringBuffer result = new StringBuffer();
+        Iterator<String> it = set.iterator();
+        while (it.hasNext()) {
+            result.append(it.next());
+            if (it.hasNext()) {
+                result.append(",");
+            }
+        }
+        if (result.length() == 0) {
+            return "--none--";
+        }
+        return result.toString();
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/FrameworkOptions.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/FrameworkOptions.java
new file mode 100644
index 0000000..093e8b1
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/FrameworkOptions.java
@@ -0,0 +1,93 @@
+/*
+ * 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.karaf.shell.dev;
+
+import java.io.File;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.dev.framework.Equinox;
+import org.apache.karaf.shell.dev.framework.Felix;
+import org.apache.karaf.shell.dev.framework.Framework;
+import org.apache.karaf.util.Properties;
+
+/**
+ * Command for enabling/disabling debug logging on the OSGi framework
+ */
+@Command(scope = "dev", name = "framework", description = "OSGi Framework options.")
+public class FrameworkOptions extends OsgiCommandSupport {
+
+    private static final String KARAF_BASE = System.getProperty("karaf.base");
+
+    @Option(name = "-debug", aliases={"--enable-debug"}, description="Enable debug for the OSGi framework", required = false, multiValued = false)
+    boolean debug;
+
+    @Option(name = "-nodebug", aliases={"--disable-debug"}, description="Disable debug for the OSGi framework", required = false, multiValued = false)
+    boolean nodebug;
+
+    @Argument(name = "framework", required = false, description = "Name of the OSGi framework to use")
+    String framework;
+
+    @Override
+    protected Object doExecute() throws Exception {
+
+        if (!debug^nodebug && framework == null) {
+            System.out.printf("Current OSGi framework is %s%n", getFramework().getName());
+            return null;
+        }
+        Framework frwk = null;
+        if (framework != null) {
+            if (!Felix.NAME.equalsIgnoreCase(framework) && !Equinox.NAME.equalsIgnoreCase(framework)) {
+                System.err.printf("Unsupported framework: %s%n", framework);
+                return null;
+            }
+            if (Felix.NAME.equalsIgnoreCase(framework))
+                frwk = new Felix(new File(KARAF_BASE));
+            else
+                frwk = new Equinox(new File(KARAF_BASE));
+            Properties props = new Properties(new File(System.getProperty("karaf.base"), "etc/config.properties"));
+            props.put("karaf.framework", framework.toLowerCase());
+            props.save();
+        }
+        if (debug) {
+            if (frwk == null)
+                frwk = getFramework();
+            System.out.printf("Enabling debug for OSGi framework (%s)%n", frwk.getName());
+            frwk.enableDebug(new File(KARAF_BASE));
+        }
+        if (nodebug) {
+            if (frwk == null)
+                frwk = getFramework();
+            System.out.printf("Disabling debug for OSGi framework (%s)%n", frwk.getName());
+            frwk.disableDebug(new File(KARAF_BASE));
+        }
+
+        return null;
+    }
+
+
+    public Framework getFramework() {
+        if (bundleContext.getBundle(0).getSymbolicName().contains("felix")) {
+            return new Felix(new File(KARAF_BASE));
+        } else {
+            return new Equinox(new File(KARAF_BASE));
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/PrintStackTraces.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/PrintStackTraces.java
new file mode 100644
index 0000000..4eacd19
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/PrintStackTraces.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.shell.dev;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.console.jline.Console;
+import org.osgi.framework.Bundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.lang.String.format;
+
+/**
+ * Command for showing the full tree of bundles that have been used to resolve
+ * a given bundle.
+ */
+@Command(scope = "dev", name = "print-stack-traces", description = "Prints the full stack trace in the console when the execution of a command throws an exception.")
+public class PrintStackTraces extends OsgiCommandSupport {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(PrintStackTraces.class);
+
+    @Argument(name = "print", description="Print stack traces or not", required = false, multiValued = false)
+    boolean print = true;
+
+    protected Object doExecute() throws Exception {
+        session.put(Console.PRINT_STACK_TRACES, Boolean.valueOf(print));
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java
new file mode 100644
index 0000000..dddc5f4
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.dev;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+/**
+ * A command to restart karaf
+ */
+@Command(scope = "dev", name = "restart", description = "Restart Karaf.")
+public class Restart  extends OsgiCommandSupport {
+
+    @Option(name = "-c", aliases = { "--clean" }, description = "Force a clean restart by deleteting the working directory")
+    private boolean clean;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        System.setProperty("karaf.restart", "true");
+        System.setProperty("karaf.restart.clean", Boolean.toString(clean));
+        bundleContext.getBundle(0).stop();
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/ShowBundleTree.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/ShowBundleTree.java
new file mode 100644
index 0000000..ffe0572
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/ShowBundleTree.java
@@ -0,0 +1,190 @@
+/*
+ * 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.karaf.shell.dev;
+
+import static java.lang.String.format;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.dev.util.Bundles;
+import org.apache.karaf.shell.dev.util.Import;
+import org.apache.karaf.shell.dev.util.Node;
+import org.apache.karaf.shell.dev.util.Tree;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Command for showing the full tree of bundles that have been used to resolve
+ * a given bundle.
+ */
+@Command(scope = "dev", name = "show-tree", description = "Shows the tree of bundles based on the wiring information.")
+public class ShowBundleTree extends AbstractBundleCommand {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ShowBundleTree.class);
+
+    private Tree<Bundle> tree;
+
+    @Override
+    protected void doExecute(Bundle bundle) throws Exception {
+        long start = System.currentTimeMillis();
+        // let's do the real work here
+        printHeader(bundle);
+        tree = new Tree<Bundle>(bundle);
+        createTree(bundle);
+        printTree(tree);
+        printDuplicatePackages(tree);
+        LOGGER.debug(format("Dependency tree calculated in %d ms",
+                            System.currentTimeMillis() - start));
+    }
+
+    /*
+     * Print the header
+     */
+    private void printHeader(Bundle bundle) {
+        System.out.printf("Bundle %s [%s] is currently %s%n",
+                bundle.getSymbolicName(),
+                bundle.getBundleId(),
+                Bundles.toString(bundle.getState()));
+    }
+
+    /*
+     * Print the dependency tree
+     */
+    private void printTree(Tree<Bundle> tree) {
+        System.out.printf("%n");
+        tree.write(System.out, new Tree.Converter<Bundle>() {
+
+            public String toString(Node<Bundle> node) {
+                return String.format("%s [%s]",
+                                     node.getValue().getSymbolicName(),
+                                     node.getValue().getBundleId());
+            }
+        });
+    }
+
+    /*
+     * Check for bundles in the tree exporting the same package
+     * as a possible cause for 'Unresolved constraint...' on a uses-conflict
+     */
+    private void printDuplicatePackages(Tree<Bundle> tree) {
+        Set<Bundle> bundles = tree.flatten();
+        Map<String, Set<Bundle>> exports = new HashMap<String, Set<Bundle>>();
+
+        for (Bundle bundle : bundles) {
+            ExportedPackage[] packages = getPackageAdmin().getExportedPackages(bundle);
+            if (packages != null) {
+                for (ExportedPackage p : packages) {
+                    if (exports.get(p.getName()) == null) {
+                        exports.put(p.getName(), new HashSet<Bundle>());
+                    }
+                    exports.get(p.getName()).add(bundle);
+                }
+            }
+        }
+
+        for (String pkg : exports.keySet()) {
+            if (exports.get(pkg).size() > 1) {
+                System.out.printf("%n");
+                System.out.printf("WARNING: multiple bundles are exporting package %s%n", pkg);
+                for (Bundle bundle : exports.get(pkg)) {
+                    System.out.printf("- %s%n", bundle);
+                }
+            }
+        }
+    }
+
+    /*
+     * Creates the bundle tree
+     */
+    protected void createTree(Bundle bundle) {
+        if (bundle.getState() >= Bundle.RESOLVED) {
+            createNode(tree);
+        } else {
+            createNodesForImports(tree, bundle);
+        }
+    }
+
+    /*
+     * Creates nodes for the imports of the bundle (instead of reporting wiring information
+     */
+    private void createNodesForImports(Node node, Bundle bundle) {
+        for (Import i : Import.parse(String.valueOf(bundle.getHeaders().get("Import-Package")),
+                                     String.valueOf(bundle.getHeaders().get("Export-Package")))) {
+            createNodeForImport(node, bundle, i);
+        }
+    }
+
+    /*
+     * Create a child node for a given import (by finding a matching export in the currently installed bundles)
+     */
+    private void createNodeForImport(Node node, Bundle bundle, Import i) {
+        ExportedPackage[] exporters = getPackageAdmin().getExportedPackages(i.getPackage());
+        boolean foundMatch = false;
+        if (exporters != null) {
+            for (ExportedPackage ep : exporters) {
+                if (i.getVersion().contains(ep.getVersion())) {
+                    if (bundle.equals(ep.getExportingBundle())) {
+                        foundMatch = true;
+                    } else {
+                        Node child = node.addChild(ep.getExportingBundle());
+                        System.out.printf("- import %s: resolved using %s%n", i, ep.getExportingBundle());
+                        foundMatch = true;
+                        createNode(child);
+                    }
+                }
+            }
+        }
+        if (!foundMatch) {
+            System.out.printf("- import %s: WARNING - unable to find matching export%n", i);            
+        }
+    }
+
+    /*
+     * Creates a node in the bundle tree
+     */
+    private void createNode(Node<Bundle> node) {
+        Bundle bundle = node.getValue();
+        Collection<Bundle> exporters = new HashSet<Bundle>();
+        exporters.addAll(getWiredBundles(bundle).values());
+
+        for (Bundle exporter : exporters) {
+            if (node.hasAncestor(exporter)) {                
+                LOGGER.debug(format("Skipping %s (already exists in the current branch)", exporter));
+            } else {
+                boolean existing = tree.flatten().contains(exporter);
+                LOGGER.debug(format("Adding %s as a dependency for %s", exporter, bundle));
+                Node child = node.addChild(exporter);
+                if (existing) {
+                    LOGGER.debug(format("Skipping children of %s (already exists in another branch)", exporter));
+                } else {
+                    createNode(child);
+                }
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java
new file mode 100644
index 0000000..e4de87f
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.dev;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.dev.watch.BundleWatcher;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+@Command(scope = "dev", name = "watch", description = "Watches and updates bundles.", detailedDescription="classpath:watch.txt")
+public class Watch extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "The bundle IDs or URLs", required = false, multiValued = true)
+    List<String> urls;
+
+    @Option(name = "-i", aliases = {}, description = "Watch interval", required = false, multiValued = false)
+    private long interval;
+
+    @Option(name = "--start", description = "Starts watching the selected bundles", required = false, multiValued = false)
+    protected boolean start;
+
+    @Option(name = "--stop", description = "Stops watching all bundles", required = false, multiValued = false)
+    protected boolean stop;
+
+    @Option(name = "--remove", description = "Removes bundles from the watch list", required = false, multiValued = false)
+    protected boolean remove;
+
+    @Option(name = "--list", description = "Displays the watch list", required = false, multiValued = false)
+    protected boolean list;
+
+    private BundleWatcher watcher;
+
+    @Override
+    protected Object doExecute() throws Exception {
+
+        if (start && stop) {
+            System.err.println("Please use only one of --start and --stop options!");
+            return null;
+        }
+
+        if (interval > 0) {
+            System.out.println("Setting watch interval to " + interval + " ms");
+            watcher.setInterval(interval);
+        }
+        if (stop) {
+            System.out.println("Stopping watch");
+            watcher.stop();
+        }
+        if (urls != null) {
+            if (remove) {
+                for (String url : urls) {
+                    watcher.remove(url);
+                }
+            } else {
+                for (String url : urls) {
+                    watcher.add(url);
+                }
+            }
+        }
+        if (start) {
+            System.out.println("Starting watch");
+            watcher.start();
+        }
+
+        if (list) { //List the watched bundles.
+            String format = "%-40s %6s %-80s";
+            System.out.println(String.format(format, "URL", "ID", "Bundle Name"));
+            for (String url : watcher.getWatchURLs()) {
+
+                List<Bundle> bundleList = watcher.getBundlesByURL(url);
+                if (bundleList != null && bundleList.size() > 0) {
+                    for (Bundle bundle : bundleList) {
+                        System.out.println(String.format(format, url, bundle.getBundleId(), bundle.getHeaders().get(Constants.BUNDLE_NAME)));
+                    }
+                } else {
+                    System.out.println(String.format(format, url, "", ""));
+                }
+            }
+        } else {
+            List<String> urls = watcher.getWatchURLs();
+            if (urls != null && urls.size()>0) {
+                System.out.println("Watched URLs/IDs: ");
+                for (String url : watcher.getWatchURLs()) {
+                    System.out.println(url);
+                }
+            } else {
+                System.out.println("No watched URLs/IDs");
+            }
+        }
+
+        return null;
+    }
+
+    public BundleWatcher getWatcher() {
+        return watcher;
+    }
+
+    public void setWatcher(BundleWatcher watcher) {
+        this.watcher = watcher;
+    }
+}
+
+
+
+
+
+
+
+
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Equinox.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Equinox.java
new file mode 100644
index 0000000..8229c35
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Equinox.java
@@ -0,0 +1,71 @@
+/*
+ * 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.karaf.shell.dev.framework;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.karaf.shell.dev.util.IO;
+
+/**
+ * Represents Eclipse's Equinox as the underlying OSGi framework
+ */
+public class Equinox extends Framework {
+
+    public static final String NAME = "Equinox";
+
+    /**
+     * Create a new instance
+     *
+     * @param base 
+     */
+    public Equinox(File base) {
+        super(base);
+    }
+
+    public String getName() {
+        return NAME;
+    }
+
+    public void enableDebug(File directory) throws IOException {
+        setConfigProperty("osgi.debug", "etc/equinox-debug.properties");
+        saveConfigProperties();
+
+        System.out.printf("- set osgi.debug=etc/equinox-debug.properties in etc/config.properties%n");
+
+        File debug = new File(directory, "etc/equinox-debug.properties");
+        if (!debug.exists()) {
+            IO.copyTextToFile(
+                    Equinox.class.getResourceAsStream("equinox-debug.properties"),
+                    debug);
+            System.out.printf("- created etc/equinox-debug.properties to configure Equinox debugging options%n");
+        }
+
+        System.out.printf("%nEnable specific debug options in etc/equinox-debug.properties%n");
+        System.out.printf("and restart Karaf now to enable Equinox debug logging%n");
+    }
+
+    @Override
+    public void disableDebug(File directory) throws IOException {
+        removeConfigProperty("osgi.debug");
+        saveConfigProperties();
+        
+        System.out.printf("- removed osgi.debug from etc/config.properties%n%n");
+        System.out.printf("Restart Karaf now to disable Equinox debug logging%n");
+
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Felix.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Felix.java
new file mode 100644
index 0000000..ec1fc93
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Felix.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.dev.framework;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Represents Apache Felix as the underlying OSGi platform
+ */
+public class Felix extends Framework {
+
+    public static final String NAME = "Felix";
+
+    /**
+     * Create a instance of Karaf running with Felix in the given base directory
+     *
+     * @param base the base directory
+     */
+    public Felix(File base) {
+        super(base);
+    }
+
+    public String getName() {
+        return NAME;
+    }
+
+    public void enableDebug(File directory) throws IOException {
+        setConfigProperty("felix.log.level", "4");
+        saveConfigProperties();
+        
+        System.out.printf("- set felix.log.level=4 in etc/config.properties%n%n");
+        System.out.printf("Restart Karaf now to enable Felix debug logging%n");
+    }
+
+    public void disableDebug(File directory) throws IOException {
+        removeConfigProperty("felix.log.level");
+        saveConfigProperties();
+
+        System.out.printf("- removed felix.log.level from etc/config.properties%n%n");
+        System.out.printf("Restart Karaf now to disable Felix debug logging%n");
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Framework.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Framework.java
new file mode 100644
index 0000000..94a1ae3
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Framework.java
@@ -0,0 +1,154 @@
+/*
+ * 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.karaf.shell.dev.framework;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Class to represent the underlying OSGi framework
+ */
+public abstract class Framework {
+
+    /*
+     * The Karaf base directory
+     */
+    private File base;
+
+    /*
+     * The contents of the etc/config.properties file
+     */
+    private List<String> config;
+
+    /**
+     * Create a instance of this framework in the given base directory
+     *
+     * @param base the base directory
+     */
+    public Framework(File base) {
+        super();
+        this.base = base;
+    }
+
+    /**
+     * Get the underlying OSGi framework name
+     */
+    public abstract String getName();
+
+    /**
+     * Enable the OSGi framework's debug logging
+     *
+     * @param directory the directory containing the Karaf installation
+     * @throws IOException when a problem occurs configuring debug settings
+     */
+    public abstract void enableDebug(File directory) throws IOException;
+
+    /**
+     * Disable the OSGI framework's debug logging
+     *
+     * @param directory the Karaf base installation directory
+     * @throws IOException when a problem occurs removing debug configuration settings
+     */
+    public abstract void disableDebug(File directory) throws IOException;
+
+    /*
+     * Save the etc/config.properties file
+     */
+    protected void saveConfigProperties() throws IOException {
+        PrintWriter writer = null;
+        try {
+            writer = new PrintWriter(new File(base, "etc/config.properties"));
+            for (String line : getConfig()) {
+                writer.printf("%s%n", line);
+            }
+            writer.flush();
+            writer.close();
+        } finally {
+            if (writer != null) {
+                writer.close();
+            }
+        }
+    }
+
+    protected List<String> readPropertyFile(File config) throws IOException {
+        List<String> result = new LinkedList<String>();
+        BufferedReader reader = new BufferedReader(new FileReader(config));
+        String line = reader.readLine();
+        while (line != null) {
+            result.add(line);
+            line = reader.readLine();
+        }
+        return result;
+    }
+
+    /**
+     * Set a new key and value in the etc/config.properties - if the given key
+     * already exists, the existing value will be overwritten
+     *
+     * @param key property key
+     * @param value property value
+     * @throws IOException if the etc/config.properties file can not be read
+     */
+    protected void setConfigProperty(String key, String value) throws IOException {
+        boolean done = false;
+
+        for (int i = 0 ; i < getConfig().size() ; i++) {
+            if (getConfig().get(i).startsWith(key)) {
+                getConfig().set(i, java.lang.String.format("%s=%s", key, value));
+                done = true;
+            }
+        }
+
+        if (!done) {
+            getConfig().add("");
+            getConfig().add(java.lang.String.format("%s=%s", key, value, new Date()));
+        }
+    }
+
+    /**
+     * Remove an existing key from the etc/config.properties file
+     *
+     * @param key the key
+     * @throws IOException if the etc/config.properties file can not be read
+     */
+    protected void removeConfigProperty(String key) throws IOException {
+        for (int i = 0 ; i < getConfig().size() ; i++) {
+            if (getConfig().get(i).startsWith(key)) {
+                getConfig().remove(i);
+            }
+        }
+    }
+
+    /**
+     * Access the contents of the etc/config.properties file
+     *
+     * @return the contents of the file
+     * @throws IOException if the etc/config.properties file can not be read
+     */
+    public List<String> getConfig() throws IOException {
+        if (config == null) {
+            config = readPropertyFile(new File(base, "etc/config.properties"));
+        }
+        return config;
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Bundles.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Bundles.java
new file mode 100644
index 0000000..6b6adaf
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Bundles.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.karaf.shell.dev.util;
+
+import org.osgi.framework.Bundle;
+
+/**
+ * A set of utility methods for working with {@link org.osgi.framework.Bundle}s
+ */
+public class Bundles {
+
+    /**
+     * Return a String representation of a bundle state
+     */
+    public static String toString(int state) {
+        switch (state) {
+            case Bundle.UNINSTALLED : return "UNINSTALLED";
+            case Bundle.INSTALLED : return "INSTALLED";
+            case Bundle.RESOLVED: return "RESOLVED";
+            case Bundle.STARTING : return "STARTING";
+            case Bundle.STOPPING : return "STOPPING";
+            case Bundle.ACTIVE : return "ACTIVE";
+            default : return "UNKNOWN";
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/IO.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/IO.java
new file mode 100644
index 0000000..7873f3e
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/IO.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.karaf.shell.dev.util;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.util.Scanner;
+
+/**
+ * Helper class for I/O operations
+ */
+public class IO {
+
+    /**
+     * Write text from an InputStream to a file
+     */
+    public static void copyTextToFile(InputStream stream, File file) throws IOException {
+        PrintWriter writer = null;
+        Scanner scanner = null;
+
+        try {
+            scanner = new Scanner(stream);
+            writer = new PrintWriter(file);
+
+            while (scanner.hasNextLine()) {
+                writer.printf("%s%n", scanner.nextLine());
+            }
+
+            writer.flush();
+        } finally {
+            if (scanner != null) {
+                scanner.close();
+            }
+            if (writer != null) {
+                writer.close();
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Import.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Import.java
new file mode 100644
index 0000000..842e065
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Import.java
@@ -0,0 +1,151 @@
+/*
+ * 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.karaf.shell.dev.util;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.felix.utils.version.VersionRange;
+
+/**
+ * Simple class to model an OSGi Import-Package
+ */
+public class Import {
+
+    private final String packageName;
+    private final VersionRange version;
+    private final String value;
+
+    /**
+     * Create a new import based on the string value found in MANIFEST.MF
+     *
+     * @param value the MANIFEST.MF value
+     */
+    protected Import(String value) {
+        super();
+        this.value = value;
+        this.packageName = extractPackageName(value);
+        if (value.contains("version=")) {
+            this.version = extractVersion(value);
+        } else {
+            this.version = VersionRange.ANY_VERSION;
+        }
+    }
+
+    /*
+     * Extract the version from the string
+     */
+    private VersionRange extractVersion(String value) {
+        int begin = value.indexOf("version=") + 8;
+        int end = value.indexOf(";", begin);
+        if (end < 0) {
+            return VersionRange.parseVersionRange(unquote(value.substring(begin)));
+        } else {
+            return VersionRange.parseVersionRange(unquote(value.substring(begin, end)));
+        }
+    }
+
+    /*
+     * Remove leading/trailing quotes
+     */
+    private String unquote(String string) {
+        return string.replace("\"", "");
+    }
+
+    public String getPackage() {
+        return packageName;  
+    }
+
+    public VersionRange getVersion() {
+        return version;
+    }
+
+    @Override
+    public String toString() {
+        return value;
+    }
+
+    /**
+     * Parse the value of an Import-Package META-INF header and return
+     * a list of Import instances
+     */
+    public static List<Import> parse(String value) {
+        LinkedList<Import> imports = new LinkedList<Import>();
+        for (String imp : split(value)) {
+            imports.add(new Import(imp));
+        }
+        return imports;
+    }
+
+    /**
+     * Parse the value of an Import-Package META-INF header and return
+     * a list of Import instances, filtering out packages that are in the
+     * Export-Package META-INF header
+     *
+     * @param importValue the value of the Import-Package header
+     * @param exportValue the value of the Export-Package header
+     */
+    public static List<Import> parse(String importValue, String exportValue) {
+        LinkedList<String> exports = new LinkedList<String>();
+        for (String exp : split(exportValue)) {
+            exports.add(extractPackageName(exp));
+        }
+        LinkedList<Import> imports = new LinkedList<Import>();
+        for (Import imp : parse(importValue)) {
+            if (!exports.contains(imp.getPackage())) {
+                imports.add(imp);
+            }
+        }
+        return imports;
+    }
+
+    /*
+     * Extract the package name from the value
+     * e.g. org.apache.karaf;version="1.x" -> org.apache.karaf
+     */
+    private static String extractPackageName(String value) {
+        if (value.contains(";")) {
+            return value.split(";")[0];
+        } else {
+            return value;
+        }
+    }
+
+    /*
+     * Counts the number of quotes in a String value
+     */
+    private static int quotes(String value) {
+        return value.replaceAll("[^\"]", "").length();
+    }
+
+    /*
+     * Split the OSGi headers on the , symbol
+     */
+    private static List<String> split(String value) {
+        List<String> result = new LinkedList<String>();
+        String[] elements = value.split(",");
+        for (int i = 0; i < elements.length ; i++) {
+            if (quotes(elements[i]) % 2 == 1) {
+                // we probably split a version range, so joining it again with the next element
+                result.add(elements[i] + "," + elements[++i]);
+            } else {
+                result.add(elements[i]);
+            }
+        }
+        return result;
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Node.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Node.java
new file mode 100644
index 0000000..b3a867d
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Node.java
@@ -0,0 +1,150 @@
+/*
+ * 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.karaf.shell.dev.util;
+
+import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Represents a node in a {@link org.apache.karaf.shell.dev.util.Tree}
+ */
+public class Node<T> {
+    
+    private final T value;
+    private Node<T> parent;
+    private List<Node<T>> children = new LinkedList<Node<T>>();
+
+    /**
+     * Creates a new node. Only meant for internal use,
+     * new nodes should be added using the {@link #addChild(Object)} method
+     *
+     * @param value the node value
+     */
+    protected Node(T value) {
+        super();
+        this.value = value;
+    }
+
+    /**
+     * Creates a new node. Only meant for internal use,
+     * new nodes should be added using the {@link #addChild(Object)} method
+     *
+     * @param value the node value
+     */
+    protected Node(T value, Node<T> parent) {
+        this(value);
+        this.parent = parent;
+    }
+
+    /**
+     * Access the node's value
+     */
+    public T getValue() {
+        return value;
+    }
+
+    /**
+     * Access the node's child nodes
+     */
+    public List<Node<T>> getChildren() {
+        return children;
+    }
+
+    /**
+     * Adds a child to this node
+     *
+     * @param value the child's value
+     * @return the child node
+     */
+    public Node addChild(T value) {
+        Node node = new Node(value, this);
+        children.add(node);
+        return node;
+    }
+
+    /**
+     * Give a set of values in the tree.
+     *
+     * @return
+     */
+    public Set<T> flatten() {
+        Set<T> result = new HashSet<T>();
+        result.add(getValue());
+        for (Node<T> child : getChildren()) {
+            result.addAll(child.flatten());
+        }
+        return result;
+    }
+
+    /**
+     * Check if the node has an ancestor that represents the given value
+     *
+     * @param value the node value
+     * @return <code>true</code> it there's an ancestor that represents the value
+     */
+    public boolean hasAncestor(T value) {
+        if (parent == null) {
+            return false;
+        } else {
+            return value.equals(parent.value) || parent.hasAncestor(value);
+        }
+    }
+
+    /*
+     * Write this node to the PrintWriter.  It should be indented one step
+     * further for every element in the indents array.  If an element in the
+     * array is <code>true</code>, there should be a | to connect to the next
+     * sibling.
+     */
+    protected void write(PrintWriter writer, Tree.Converter<T> converter, boolean... indents) {
+        for (boolean indent : indents) {
+            writer.printf("%-3s", indent ? "|" : "");
+        }
+        writer.printf("+- %s%n", converter.toString(this));
+        for (Node<T> child : getChildren()) {
+            child.write(writer, converter, concat(indents, hasNextSibling()));
+        }
+    }
+
+    /*
+     * Is this node the last child node for its parent
+     * or is there a next sibling?
+     */
+    private boolean hasNextSibling() {
+        if (parent == null) {
+            return false;
+        } else {
+            return parent.getChildren().size() > 1
+                    && parent.getChildren().indexOf(this) < parent.getChildren().size() - 1;
+        }
+    }
+
+    /*
+     * Add an element to the end of the array
+     */
+    private boolean[] concat(boolean[] array, boolean element) {
+        boolean[] result = new boolean[array.length + 1];
+        for (int i = 0 ; i < array.length ; i++) {
+            result[i] = array[i];
+        }
+        result[array.length] = element;
+        return result;
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Tree.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Tree.java
new file mode 100644
index 0000000..6c92faf
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Tree.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.dev.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Represents a tree that can be written to the console.
+ *
+ * The output will look like this:
+ * <pre>
+ * root
+ * +- child1
+ * |  +- grandchild
+ * +- child2
+ * </pre>
+ */
+public class Tree<T> extends Node<T> {
+
+    /**
+     * Creates a new tree with the given root node
+     *
+     * @param root the root node
+     */
+    public Tree(T root) {
+        super(root);
+    }
+
+    /**
+     * Write the tree to a PrintStream, using the default toString() method to output the node values
+     *
+     * @param stream
+     */
+    public void write(PrintStream stream) {
+        write(new PrintWriter(stream));
+    }
+
+    /**
+     * Write the tree to a PrintStream, using the provided converter to output the node values
+     *
+     * @param stream
+     * @param converter
+     */
+    public void write(PrintStream stream, Converter<T> converter) {
+        write(new PrintWriter(stream), converter);
+    }
+
+    /**
+     * Write the tree to a PrintWriter, using the default toString() method to output the node values
+     *
+     * @param writer
+     */
+    public void write(PrintWriter writer) {
+        write(writer, new Converter() {
+            public String toString(Node node) {
+                return node.getValue().toString();
+            }
+        });
+    }
+
+    /**
+     * Write the tree to a PrintWriter, using the provided converter to output the node values
+     *
+     * @param writer
+     * @param converter
+     */
+    public void write(PrintWriter writer, Converter<T> converter) {
+        writer.printf("%s%n", converter.toString(this));
+        for (Node<T> child : getChildren()) {
+            child.write(writer, converter);
+        }
+        writer.flush();
+    }
+
+    /**
+     * Interface to convert node values to string
+     *
+     * @param <T> the object type for the node value
+     */
+    public static interface Converter<T> {
+
+        public String toString(Node<T> node);
+
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
new file mode 100644
index 0000000..e7b492d
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
@@ -0,0 +1,323 @@
+/*
+ * 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.karaf.shell.dev.watch;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.ops4j.pax.url.maven.commons.MavenConfiguration;
+import org.ops4j.pax.url.maven.commons.MavenConfigurationImpl;
+import org.ops4j.pax.url.maven.commons.MavenRepositoryURL;
+import org.ops4j.pax.url.mvn.ServiceConstants;
+import org.ops4j.pax.url.mvn.internal.Parser;
+import org.ops4j.util.property.DictionaryPropertyResolver;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A Runnable singleton which watches at the defined location for bundle updates.
+ */
+public class BundleWatcher implements Runnable, BundleListener {
+
+    private final Logger logger = LoggerFactory.getLogger(BundleWatcher.class);
+
+    private BundleContext bundleContext;
+    private ConfigurationAdmin configurationAdmin;
+
+    private AtomicBoolean running = new AtomicBoolean(false);
+    private long interval = 1000L;
+    private List<String> watchURLs = new CopyOnWriteArrayList<String>();
+    private AtomicInteger counter = new AtomicInteger(0);
+
+
+    /**
+     * Constructor
+     */
+    public BundleWatcher() {
+    }
+
+    public void bundleChanged(BundleEvent event) {
+        if (event.getType() == BundleEvent.INSTALLED
+                || event.getType() == BundleEvent.UNINSTALLED) {
+            counter.incrementAndGet();
+        }
+    }
+
+    public void run() {
+        logger.debug("Bundle watcher thread started");
+        int oldCounter = -1;
+        Set<Bundle> watchedBundles = new HashSet<Bundle>();
+        while (running.get() && watchURLs.size()>0) {
+            if (oldCounter != counter.get()) {
+                oldCounter = counter.get();
+                watchedBundles.clear();
+                for (String bundleURL : watchURLs) {
+                    for (Bundle bundle : getBundlesByURL(bundleURL)) {
+                        watchedBundles.add(bundle);
+                    }
+                }
+            }
+            if (watchedBundles.size()>0) {
+                File localRepository = getLocalRepository();
+                List<Bundle> updated = new ArrayList<Bundle>();
+                for (Bundle bundle : watchedBundles) {
+                    try {
+                        File location = getBundleExternalLocation(localRepository, bundle);
+                        if (location != null
+                                && location.exists()
+                                && location.lastModified() > bundle.getLastModified())
+                        {
+                            InputStream is = new FileInputStream(location);
+                            try {
+                                logger.info("[Watch] Updating watched bundle: " + bundle.getSymbolicName() + " (" + bundle.getVersion() + ")");
+                                System.out.println("[Watch] Updating watched bundle: " + bundle.getSymbolicName() + " (" + bundle.getVersion() + ")");
+                                bundle.update(is);
+                                updated.add(bundle);
+                            } finally {
+                                is.close();
+                            }
+                        }
+                    } catch (IOException ex) {
+                        logger.error("Error watching bundle.", ex);
+                    } catch (BundleException ex) {
+                        logger.error("Error updating bundle.", ex);
+                    }
+                }
+                ServiceReference ref = null;
+                try {
+                    ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+                    PackageAdmin pa = (PackageAdmin) getBundleContext().getService(ref);
+                    pa.refreshPackages(updated.toArray(new Bundle[updated.size()]));
+                } finally {
+                    if (ref != null) {
+                        getBundleContext().ungetService(ref);
+                    }
+                }
+            }
+            try {
+                Thread.sleep(interval);
+            } catch (InterruptedException ex) {
+                running.set(false);
+            }
+        }
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("Bundle watcher thread stopped");
+        }
+    }
+
+    /**
+     * Adds a Bundle URLs to the watch list.
+     * @param url
+     */
+    public void add(String url) {
+        boolean shouldStart = running.get() && (watchURLs.size()==0);
+        if (!watchURLs.contains(url)) {
+            watchURLs.add(url);
+            counter.incrementAndGet();
+        }
+        if (shouldStart) {
+            Thread thread = new Thread(this);
+            thread.start();
+        }
+    }
+
+    /**
+     * Removes a bundle URLs from the watch list.
+     * @param url
+     */
+    public void remove(String url) {
+        watchURLs.remove(url);
+        counter.incrementAndGet();
+    }
+
+    /**
+     * Returns the location of the Bundle inside the local maven repository.
+     * @param bundle
+     * @return
+     */
+    public File getBundleExternalLocation(File localRepository, Bundle bundle) {
+        try {
+            Parser p = new Parser(bundle.getLocation().substring(4));
+            return new File(localRepository.getPath() + File.separator + p.getArtifactPath());
+        } catch (MalformedURLException e) {
+            logger.error("Could not parse artifact path for bundle" + bundle.getSymbolicName(), e);
+        }
+        return null;
+    }
+
+    public File getLocalRepository() {
+        // Attempt to retrieve local repository location from MavenConfiguration
+        MavenConfiguration configuration = retrieveMavenConfiguration();
+        if (configuration != null) {
+            MavenRepositoryURL localRepositoryURL = configuration.getLocalRepository();
+            if (localRepositoryURL != null) {
+                return localRepositoryURL.getFile().getAbsoluteFile();
+            }
+        }
+        // If local repository not found assume default.
+        String localRepo = System.getProperty("user.home") + File.separator + ".m2" + File.separator + "repository";
+        return new File(localRepo).getAbsoluteFile();
+    }
+
+    protected MavenConfiguration retrieveMavenConfiguration() {
+        MavenConfiguration mavenConfiguration = null;
+        try {
+            Configuration configuration = configurationAdmin.getConfiguration(ServiceConstants.PID);
+            if (configuration != null) {
+                Dictionary dictonary = configuration.getProperties();
+                if (dictonary != null) {
+                    DictionaryPropertyResolver resolver = new DictionaryPropertyResolver(dictonary);
+                    mavenConfiguration = new MavenConfigurationImpl(resolver, ServiceConstants.PID);
+                }
+            }
+        } catch (IOException e) {
+            logger.error("Error retrieving maven configuration",e);
+        }
+        return mavenConfiguration;
+    }
+
+    /**
+     * Returns the bundles that match
+     * @param url
+     * @return
+     */
+    public List<Bundle> getBundlesByURL(String url) {
+        List<Bundle> bundleList = new ArrayList<Bundle>();
+        try {
+            Long id = Long.parseLong(url);
+            Bundle bundle = bundleContext.getBundle(id);
+            if (bundle != null) {
+                bundleList.add(bundle);
+            }
+        } catch (NumberFormatException e) {
+            for (int i = 0; i < bundleContext.getBundles().length; i++) {
+                Bundle bundle = bundleContext.getBundles()[i];
+                if (isMavenSnapshotUrl(bundle.getLocation()) && wildCardMatch(bundle.getLocation(), url)) {
+                    bundleList.add(bundle);
+                }
+            }
+        }
+        return bundleList;
+    }
+
+    protected boolean isMavenSnapshotUrl(String url) {
+        return url.startsWith("mvn:") && url.contains("SNAPSHOT");
+    }
+
+    /**
+     * Matches text using a pattern containing wildcards.
+     *
+     * @param text
+     * @param pattern
+     * @return
+     */
+    protected boolean wildCardMatch(String text, String pattern) {
+        String[] cards = pattern.split("\\*");
+        // Iterate over the cards.
+        for (String card : cards) {
+            int idx = text.indexOf(card);
+            // Card not detected in the text.
+            if (idx == -1) {
+                return false;
+            }
+
+            // Move ahead, towards the right of the text.
+            text = text.substring(idx + card.length());
+        }
+        return true;
+    }
+
+
+    public void start() {
+        // register the bundle listener
+        bundleContext.addBundleListener(this);
+        // start the watch thread
+        if (running.compareAndSet(false, true)) {
+            if (watchURLs.size()>0) {
+                Thread thread = new Thread(this);
+                thread.start();
+            }
+        }
+    }
+
+    /**
+     * Stops the execution of the thread and releases the singleton instance
+     */
+    public void stop() {
+        running.set(false);
+        // unregister the bundle listener
+        bundleContext.removeBundleListener(this);
+    }
+
+    public ConfigurationAdmin getConfigurationAdmin() {
+        return configurationAdmin;
+    }
+
+    public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
+        this.configurationAdmin = configurationAdmin;
+    }
+
+    public BundleContext getBundleContext() {
+        return bundleContext;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public List<String> getWatchURLs() {
+        return watchURLs;
+    }
+
+    public void setWatchURLs(List<String> watchURLs) {
+        this.watchURLs = watchURLs;
+    }
+
+    public long getInterval() {
+        return interval;
+    }
+
+    public void setInterval(long interval) {
+        this.interval = interval;
+    }
+
+    public boolean isRunning() {
+        return running.get();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml b/karaf-2.2.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
new file mode 100644
index 0000000..1b45f83
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
@@ -0,0 +1,53 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="dev/show-tree">
+            <action class="org.apache.karaf.shell.dev.ShowBundleTree"/>
+        </command>
+        <command name="dev/framework">
+            <action class="org.apache.karaf.shell.dev.FrameworkOptions" />
+        </command>
+        <command name="dev/dynamic-import">
+            <action class="org.apache.karaf.shell.dev.DynamicImport" />
+        </command>
+        <command name="dev/print-stack-traces">
+            <action class="org.apache.karaf.shell.dev.PrintStackTraces" />
+        </command>
+        <command name="dev/restart">
+            <action class="org.apache.karaf.shell.dev.Restart" />
+        </command>
+        <command name="dev/watch">
+            <action class="org.apache.karaf.shell.dev.Watch" >
+                <property name="watcher" ref="watcher"/>
+            </action>
+        </command>
+    </command-bundle>
+
+    <!-- Referenace to the Configuration Admin Service -->
+    <reference id="configurationAdmin" interface="org.osgi.service.cm.ConfigurationAdmin"/>
+
+    <bean id="watcher" class="org.apache.karaf.shell.dev.watch.BundleWatcher" init-method="start" destroy-method="stop">
+        <property name="bundleContext" ref="blueprintBundleContext"/>
+        <property name="configurationAdmin" ref="configurationAdmin"/>
+    </bean>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/dev/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/dev/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..584148a
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,24 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides shell commands aimed at helping the developer.
+
+    The purpose is provide tooling to help the developer to identify eventual leaks or issues.
+
+    The following commands are available:
+    \u001B[36mdev:dynamic-import\u001B[0m Enables/disables dynamic-import for a given bundle.
+    \u001B[36mdev:framework\u001B[0m OSGi Framework options.
+    \u001B[36mdev:print-stack-traces\u001B[0m Prints the full stack trace in the console when the execution of a command
+     throws an exception.
+    \u001B[36mdev:restart\u001B[0m Restart Karaf.
+    \u001B[36mdev:show-tree\u001B[0m Shows the tree of bundles based on the wiring information.
+    \u001B[36mdev:watch\u001B[0m Watches and updates bundles.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/framework/equinox-debug.properties b/karaf-2.2.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/framework/equinox-debug.properties
new file mode 100644
index 0000000..b842875
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/framework/equinox-debug.properties
@@ -0,0 +1,111 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+
+#    http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+#### Debugging options for org.eclipse.osgi
+
+# Turn on general debugging for org.eclipse.osgi
+org.eclipse.osgi/debug=false
+# Prints out class loading debug information
+org.eclipse.osgi/debug/loader=false
+# Prints out event (FrameworkEvent/BundleEvent/ServiceEvent) and listener debug information
+org.eclipse.osgi/debug/events=false
+# Prints out OSGi service debug information (registration/getting/ungetting etc.)
+org.eclipse.osgi/debug/services=false
+# Prints out bundle manifest parsing debug information
+org.eclipse.osgi/debug/manifest=false
+# Prints out LDAP filter debug information
+org.eclipse.osgi/debug/filter=false
+# Prints out security (PermissionAdmin service) debug information
+org.eclipse.osgi/debug/security=false
+# Prints out start level service debug information
+org.eclipse.osgi/debug/startlevel=false
+# Prints out package admin service debug information
+org.eclipse.osgi/debug/packageadmin=false
+# Prints out timing information for bundle activation
+org.eclipse.osgi/debug/bundleTime=false
+# Debug the loading of message bundles
+org.eclipse.osgi/debug/messageBundles=false
+
+# Eclipse adaptor options
+org.eclipse.osgi/eclipseadaptor/debug = false
+org.eclipse.osgi/eclipseadaptor/debug/location = false
+org.eclipse.osgi/eclipseadaptor/debug/platformadmin=false
+org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver=false
+org.eclipse.osgi/eclipseadaptor/converter/debug = false
+
+### OSGi resolver options
+# Turns on debugging for the resolver
+org.eclipse.osgi/resolver/debug = false
+# Prints out wiring information after the resolver has completed the resolve process
+org.eclipse.osgi/resolver/wiring = false
+# Prints out Import-Package information
+org.eclipse.osgi/resolver/imports = false
+# Prints out Require-Bundle information
+org.eclipse.osgi/resolver/requires = false
+# Prints out package grouping information form the "uses" clause
+org.eclipse.osgi/resolver/grouping = false
+# Prints out cycle information
+org.eclipse.osgi/resolver/cycles = false
+# Prints out Eclipse-GenericRequire information
+org.eclipse.osgi/resolver/generics = false
+
+#### Profile settings
+org.eclipse.osgi/profile/startup = false
+org.eclipse.osgi/profile/benchmark = false
+org.eclipse.osgi/profile/debug = false
+
+# Override the default implemenation 
+org.eclipse.osgi/profile/impl = org.eclipse.osgi.internal.profile.DefaultProfileLogger
+
+# Append all profile messages to the filename specified
+org.eclipse.osgi/defaultprofile/logfilename =  
+
+# Output all profile log messages synchronously to the jvm console.
+# By default, all log messages are cached until the log buffer is
+# requested.
+org.eclipse.osgi/defaultprofile/logsynchronously = false
+
+# Specify the size of the default profile implementation log buffer.
+org.eclipse.osgi/defaultprofile/buffersize = 256
+
+#### Monitoring settings
+# monitor class loading
+org.eclipse.osgi/monitor/classes=false
+
+# monitor bundle activation
+org.eclipse.osgi/monitor/activation=false
+
+# monitor resource bundle (*.properties) loading
+org.eclipse.osgi/monitor/resources=false
+
+
+#### Trace settings
+# trace class loading - snapshot the execution stack when a class is loaded
+org.eclipse.osgi/trace/classLoading=false
+
+# trace location - file in which execution traces are written
+org.eclipse.osgi/trace/filename=runtime.traces
+
+# trace filters - Java properties file defining which classes should 
+# be traced (if trace/classLoading is true)
+# File format:
+# plugins=<comma separated list of plugins whose classes to trace>
+# packages=<comma separated list of package prefixes of classes to trace>
+# Note that there may be many 'plugins' and 'packages' lines in one file.
+org.eclipse.osgi/trace/filters=trace.properties
+
+# trace bundle activation - snapshot the execution stack when a bundle is activated
+org.eclipse.osgi/trace/activation=false
diff --git a/karaf-2.2.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/watch.txt b/karaf-2.2.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/watch.txt
new file mode 100644
index 0000000..ef4016e
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/watch.txt
@@ -0,0 +1,3 @@
+The watch command can be used to help at developement time.  It allows you to configure a set of URLs that will be monitored.  All bundles location matching the given URL will be automatically updated.  This avoids the need for manually updating the bundles or even copying the bundle to the system folder if needed.  Note that only maven based urls and maven snapshots will actually be updated automatically, so if you run
+  > dev:watch *
+It will actually monitor all bundles that have a location matching mvn:* that have '-SNAPSHOT' in their url.
diff --git a/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/EquinoxTest.java b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/EquinoxTest.java
new file mode 100644
index 0000000..02d5b9e
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/EquinoxTest.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.dev.framework;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.karaf.shell.dev.util.IO;
+import static org.junit.Assert.*;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link org.apache.karaf.shell.dev.framework.Equinox}
+ */
+public class EquinoxTest {
+
+    private File base;
+    private File etc;
+
+    private Equinox equinox;
+
+    @Before
+    public void setUp() {
+        // creating a dummy karaf instance folder
+        base = new File("target/instances/" + System.currentTimeMillis());
+        base.mkdirs();
+
+        // make sure the etc directory exists
+        etc = new File(base, "etc");
+        etc.mkdirs();
+
+        equinox = new Equinox(base);
+    }
+
+    @Test
+    public void enableDebug() throws IOException {
+        IO.copyTextToFile(
+                EquinoxTest.class.getResourceAsStream("config.properties"),
+                new File(etc, "config.properties"));
+
+        equinox.enableDebug(base);
+
+        Properties properties = new Properties();
+        properties.load(new FileInputStream(new File(base, "etc/config.properties")));
+        assertNotNull(properties.get("osgi.debug"));
+        assertEquals("etc/equinox-debug.properties", properties.get("osgi.debug"));
+
+        assertTrue("Should have created the default Equinox debug config file",
+                   new File(etc, "equinox-debug.properties").exists());
+    }
+
+    @Test
+    public void testDisableDebug() throws IOException {
+        IO.copyTextToFile(
+                EquinoxTest.class.getResourceAsStream("enabled-config.properties"),
+                new File(etc, "config.properties"));
+
+        equinox.disableDebug(base);
+
+        Properties properties = new Properties();
+        properties.load(new FileInputStream(new File(etc, "config.properties")));
+        assertFalse("osgi.debug property should have been removed from the file",
+                    properties.containsKey("osgi.debug"));
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/FelixTest.java b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/FelixTest.java
new file mode 100644
index 0000000..b48c76b
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/FelixTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.karaf.shell.dev.framework;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.karaf.shell.dev.util.IO;
+import static org.junit.Assert.*;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link org.apache.karaf.shell.dev.framework.Felix}
+ */
+public class FelixTest {
+
+    private File base;
+    private File etc;
+    
+    private Felix felix;
+
+    @Before
+    public void setUp() {
+        // creating a dummy karaf instance folder
+        base = new File("target/instances/" + System.currentTimeMillis());
+        base.mkdirs();
+
+        // make sure the etc directory exists
+        etc = new File(base, "etc");
+        etc.mkdirs();
+
+        felix = new Felix(base);
+    }
+
+    @Test
+    public void enableDebug() throws IOException {
+        IO.copyTextToFile(
+                FelixTest.class.getResourceAsStream("config.properties"),
+                new File(etc, "config.properties"));
+
+        felix.enableDebug(base);
+
+        Properties properties = new Properties();
+        properties.load(new FileInputStream(new File(etc, "config.properties")));
+        assertNotNull(properties.get("felix.log.level"));
+        assertEquals("4", properties.get("felix.log.level"));
+    }
+
+    @Test
+    public void testDisableDebug() throws IOException {
+        IO.copyTextToFile(
+                FelixTest.class.getResourceAsStream("enabled-config.properties"),
+                new File(etc, "config.properties"));
+
+        felix.disableDebug(base);
+
+        Properties properties = new Properties();
+        properties.load(new FileInputStream(new File(etc, "config.properties")));
+        assertFalse(properties.containsKey("felix.log.level"));
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/BundlesTest.java b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/BundlesTest.java
new file mode 100644
index 0000000..6e6d7d0
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/BundlesTest.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.karaf.shell.dev.util;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+
+/**
+ * Test cases for {@link org.apache.karaf.shell.dev.util.Bundles}
+ */
+public class BundlesTest {
+
+    @Test
+    public void testToString() {
+        assertEquals("UNINSTALLED", Bundles.toString(Bundle.UNINSTALLED));
+        assertEquals("INSTALLED", Bundles.toString(Bundle.INSTALLED));
+        assertEquals("RESOLVED", Bundles.toString(Bundle.RESOLVED));
+        assertEquals("STARTING", Bundles.toString(Bundle.STARTING));
+        assertEquals("STOPPING", Bundles.toString(Bundle.STOPPING));
+        assertEquals("ACTIVE", Bundles.toString(Bundle.ACTIVE));
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/ImportTest.java b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/ImportTest.java
new file mode 100644
index 0000000..97dcbc0
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/ImportTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.karaf.shell.dev.util;
+
+import java.util.List;
+
+import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.felix.utils.version.VersionRange;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link org.apache.karaf.shell.dev.util.Import}
+ */
+public class ImportTest {
+
+    @Test
+    public void createWithPackageName() {
+        Import i = new Import("org.wip.foo");
+        assertEquals("org.wip.foo", i.getPackage());
+    }
+
+    @Test
+    public void createWithPackageNameAndVersion() {
+        Import i = new Import("org.wip.bar;version=\"2.0.0\"");
+        assertEquals("org.wip.bar", i.getPackage());
+        assertEquals(VersionRange.parseVersionRange("2.0.0"), i.getVersion());
+    }
+
+    @Test
+    public void createListOfImports() {
+        List<Import> imports = Import.parse("org.wip.bar;version=\"2.0.0\",org.wip.foo");
+        assertNotNull(imports);
+        assertEquals(2, imports.size());
+        assertEquals("org.wip.bar", imports.get(0).getPackage());
+        assertEquals("org.wip.foo", imports.get(1).getPackage());
+    }
+
+    @Test
+    public void createListOfImportsWithVersionRanges() {
+        List<Import> imports =
+                Import.parse("javax.activation;version=\"[0.0,2)\",javax.annotation;version=\"[0.0,2)\"");
+        assertNotNull(imports);
+        assertEquals(2, imports.size());
+        assertEquals("javax.activation", imports.get(0).getPackage());
+        assertEquals("javax.annotation", imports.get(1).getPackage());
+    }
+
+    @Test
+    public void createListOfImportsWithExports() {
+        List<Import> imports = Import.parse("org.wip.bar;version=\"2.0.0\",org.wip.foo", "org.wip.bar;version=\"2.0.0\"");
+        assertNotNull(imports);
+        assertEquals(1, imports.size());
+        assertEquals("org.wip.foo", imports.get(0).getPackage());
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/TreeTest.java b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/TreeTest.java
new file mode 100644
index 0000000..95880fc
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/TreeTest.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.karaf.shell.dev.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link org.apache.karaf.shell.dev.util.Tree}
+ * and {@link org.apache.karaf.shell.dev.util.Node}
+ */
+public class TreeTest {
+
+    @Test
+    public void writeTreeWithOneChild() throws IOException {
+        Tree<String> tree = new Tree<String>("root");
+        tree.addChild("child");
+
+        BufferedReader reader = read(tree);
+
+        assertEquals("root"     , reader.readLine());
+        assertEquals("+- child" , reader.readLine());
+    }
+
+    @Test
+    public void writeTreeWithOneChildAndNodeConverter() throws IOException {
+        Tree<String> tree = new Tree<String>("root");
+        tree.addChild("child");
+
+        StringWriter writer = new StringWriter();
+        tree.write(new PrintWriter(writer), new Tree.Converter<String>() {
+            public String toString(Node<String> node) {
+                return "my " + node.getValue();
+            }
+        });
+
+        BufferedReader reader = new BufferedReader(new StringReader(writer.getBuffer().toString()));
+
+        assertEquals("my root"     , reader.readLine());
+        assertEquals("+- my child" , reader.readLine());
+    }
+
+    @Test
+    public void writeTreeWithChildAndGrandChild() throws IOException {
+        Tree<String> tree = new Tree<String>("root");
+        Node<String> node = tree.addChild("child");
+        node.addChild("grandchild");
+
+        BufferedReader reader = read(tree);
+
+        assertEquals("root"            , reader.readLine());
+        assertEquals("+- child"        , reader.readLine());
+        assertEquals("   +- grandchild", reader.readLine());
+    }
+
+    @Test
+    public void writeTreeWithTwoChildrenAndOneGrandchild() throws IOException {
+        Tree<String> tree = new Tree<String>("root");
+        Node<String> child = tree.addChild("child1");
+        child.addChild("grandchild");
+        tree.addChild("child2");
+
+        BufferedReader reader = read(tree);
+
+        assertEquals("root"            , reader.readLine());
+        assertEquals("+- child1"       , reader.readLine());
+        assertEquals("|  +- grandchild", reader.readLine());
+        assertEquals("+- child2"       , reader.readLine());
+    }
+
+    @Test
+    public void flattenTree() throws IOException {
+        Tree<String> tree = new Tree<String>("root");
+        Node<String> child1 = tree.addChild("child1");
+        child1.addChild("grandchild");
+        Node child2 = tree.addChild("child2");
+        child2.addChild("grandchild");
+
+        Set<String> elements = tree.flatten();
+        assertNotNull(elements);
+        assertEquals(4, elements.size());
+        assertTrue(elements.contains("root"));
+        assertTrue(elements.contains("child1"));
+        assertTrue(elements.contains("child2"));
+        assertTrue(elements.contains("grandchild"));
+    }
+
+    @Test
+    public void hasAncestor() throws IOException {
+        Tree<String> tree = new Tree<String>("root");
+        Node<String> child1 = tree.addChild("child1");
+        child1.addChild("grandchild");
+        Node child2 = tree.addChild("child2");
+        Node node = child2.addChild("grandchild2");
+
+        assertTrue(node.hasAncestor("child2"));
+        assertTrue(node.hasAncestor("root"));
+        assertFalse(node.hasAncestor("child1"));
+    }
+
+    private BufferedReader read(Tree<String> tree) {
+        StringWriter writer = new StringWriter();
+        tree.write(new PrintWriter(writer));
+
+        BufferedReader reader = new BufferedReader(new StringReader(writer.getBuffer().toString()));
+        return reader;
+    }
+}
diff --git a/karaf-2.2.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/config.properties b/karaf-2.2.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/config.properties
new file mode 100644
index 0000000..9a5e11c
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/config.properties
@@ -0,0 +1,351 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# Framework selection properties
+#
+karaf.framework=felix
+
+karaf.framework.equinox=${karaf.default.repository}/org/eclipse/osgi/${equinox.version}/osgi-${equinox.version}.jar
+karaf.framework.felix=${karaf.default.repository}/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
+
+#
+# Framework config properties.
+#
+org.osgi.framework.system.packages=org.osgi.framework; version=1.5.0, \
+ org.osgi.framework.launch; version=1.0.0, \
+ org.osgi.framework.hooks.service; version=1.0.0, \
+ org.osgi.service.packageadmin; version=1.2.0, \
+ org.osgi.service.startlevel; version=1.1.0, \
+ org.osgi.service.url; version=1.0.0, \
+ org.osgi.util.tracker; version=1.4.0 \
+ ${jre-${java.specification.version}}
+
+org.osgi.framework.system.packages.extra=\
+ org.apache.karaf.jaas.boot; version=${karaf.osgi.version}, \
+ org.apache.karaf.version; version=${karaf.osgi.version}
+
+# javax.transaction is needed to avoid class loader constraint violation when using javax.sql  
+org.osgi.framework.bootdelegation=sun.*,com.sun.*,javax.transaction,javax.transaction.*
+
+# To enable the use of the startup.properties file to control the start level:
+karaf.auto.start=startup.properties
+#felix.auto.start=all
+
+org.osgi.framework.startlevel.beginning=100
+karaf.startlevel.bundle=60
+
+#
+# FileMonitor properties
+#
+felix.fileinstall.dir    = ${karaf.base}/etc
+felix.fileinstall.filter = .*\\.cfg
+felix.fileinstall.poll   = 1000
+felix.fileinstall.noInitialDelay = true
+
+#
+# Java platform package export properties.
+#
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute 
+jre-1.5=, \
+ javax.accessibility, \
+ javax.activity, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute 
+jre-1.6=, \
+ javax.accessibility, \
+ javax.activation, \
+ javax.activity, \
+ javax.annotation, \
+ javax.annotation.processing, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.jws, \
+ javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.bind, \
+ javax.xml.bind.annotation, \
+ javax.xml.bind.annotation.adapters, \
+ javax.xml.bind.attachment, \
+ javax.xml.bind.helpers, \
+ javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.soap, \
+ javax.xml.stream, \
+ javax.xml.stream.events, \
+ javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.ws, \
+ javax.xml.ws.handler, \
+ javax.xml.ws.handler.soap, \
+ javax.xml.ws.http, \
+ javax.xml.ws.soap, \
+ javax.xml.ws.spi, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
diff --git a/karaf-2.2.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/enabled-config.properties b/karaf-2.2.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/enabled-config.properties
new file mode 100644
index 0000000..9e6ffd4
--- /dev/null
+++ b/karaf-2.2.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/enabled-config.properties
@@ -0,0 +1,355 @@
+################################################################################
+#
+#    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.
+#
+################################################################################
+
+#
+# Framework selection properties
+#
+karaf.framework=felix
+
+karaf.framework.equinox=${karaf.default.repository}/org/eclipse/osgi/${equinox.version}/osgi-${equinox.version}.jar
+karaf.framework.felix=${karaf.default.repository}/org/apache/felix/org.apache.felix.framework/${felix.framework.version}/org.apache.felix.framework-${felix.framework.version}.jar
+
+# Here are the properties to enable debugging
+felix.log.level=4
+osgi.debug=etc/equinox-debug.properties
+
+#
+# Framework config properties.
+#
+org.osgi.framework.system.packages=org.osgi.framework; version=1.5.0, \
+ org.osgi.framework.launch; version=1.0.0, \
+ org.osgi.framework.hooks.service; version=1.0.0, \
+ org.osgi.service.packageadmin; version=1.2.0, \
+ org.osgi.service.startlevel; version=1.1.0, \
+ org.osgi.service.url; version=1.0.0, \
+ org.osgi.util.tracker; version=1.4.0 \
+ ${jre-${java.specification.version}}
+
+org.osgi.framework.system.packages.extra=\
+ org.apache.karaf.jaas.boot; version=${karaf.osgi.version}, \
+ org.apache.karaf.version; version=${karaf.osgi.version}
+
+# javax.transaction is needed to avoid class loader constraint violation when using javax.sql  
+org.osgi.framework.bootdelegation=sun.*,com.sun.*,javax.transaction,javax.transaction.*
+
+# To enable the use of the startup.properties file to control the start level:
+karaf.auto.start=startup.properties
+#felix.auto.start=all
+
+org.osgi.framework.startlevel.beginning=100
+karaf.startlevel.bundle=60
+
+#
+# FileMonitor properties
+#
+felix.fileinstall.dir    = ${karaf.base}/etc
+felix.fileinstall.filter = .*\\.cfg
+felix.fileinstall.poll   = 1000
+felix.fileinstall.noInitialDelay = true
+
+#
+# Java platform package export properties.
+#
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute 
+jre-1.5=, \
+ javax.accessibility, \
+ javax.activity, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
+
+# Standard package set.  Note that:
+#   - javax.transaction* is exported with a mandatory attribute 
+jre-1.6=, \
+ javax.accessibility, \
+ javax.activation, \
+ javax.activity, \
+ javax.annotation, \
+ javax.annotation.processing, \
+ javax.crypto, \
+ javax.crypto.interfaces, \
+ javax.crypto.spec, \
+ javax.imageio, \
+ javax.imageio.event, \
+ javax.imageio.metadata, \
+ javax.imageio.plugins.bmp, \
+ javax.imageio.plugins.jpeg, \
+ javax.imageio.spi, \
+ javax.imageio.stream, \
+ javax.jws, \
+ javax.jws.soap, \
+ javax.lang.model, \
+ javax.lang.model.element, \
+ javax.lang.model.type, \
+ javax.lang.model.util, \
+ javax.management, \
+ javax.management.loading, \
+ javax.management.modelmbean, \
+ javax.management.monitor, \
+ javax.management.openmbean, \
+ javax.management.relation, \
+ javax.management.remote, \
+ javax.management.remote.rmi, \
+ javax.management.timer, \
+ javax.naming, \
+ javax.naming.directory, \
+ javax.naming.event, \
+ javax.naming.ldap, \
+ javax.naming.spi, \
+ javax.net, \
+ javax.net.ssl, \
+ javax.print, \
+ javax.print.attribute, \
+ javax.print.attribute.standard, \
+ javax.print.event, \
+ javax.rmi, \
+ javax.rmi.CORBA, \
+ javax.rmi.ssl, \
+ javax.script, \
+ javax.security.auth, \
+ javax.security.auth.callback, \
+ javax.security.auth.kerberos, \
+ javax.security.auth.login, \
+ javax.security.auth.spi, \
+ javax.security.auth.x500, \
+ javax.security.cert, \
+ javax.security.sasl, \
+ javax.sound.midi, \
+ javax.sound.midi.spi, \
+ javax.sound.sampled, \
+ javax.sound.sampled.spi, \
+ javax.sql, \
+ javax.sql.rowset, \
+ javax.sql.rowset.serial, \
+ javax.sql.rowset.spi, \
+ javax.swing, \
+ javax.swing.border, \
+ javax.swing.colorchooser, \
+ javax.swing.event, \
+ javax.swing.filechooser, \
+ javax.swing.plaf, \
+ javax.swing.plaf.basic, \
+ javax.swing.plaf.metal, \
+ javax.swing.plaf.multi, \
+ javax.swing.plaf.synth, \
+ javax.swing.table, \
+ javax.swing.text, \
+ javax.swing.text.html, \
+ javax.swing.text.html.parser, \
+ javax.swing.text.rtf, \
+ javax.swing.tree, \
+ javax.swing.undo, \
+ javax.tools, \
+ javax.transaction; javax.transaction.xa; partial=true; mandatory:=partial, \
+ javax.xml, \
+ javax.xml.bind, \
+ javax.xml.bind.annotation, \
+ javax.xml.bind.annotation.adapters, \
+ javax.xml.bind.attachment, \
+ javax.xml.bind.helpers, \
+ javax.xml.bind.util, \
+ javax.xml.crypto, \
+ javax.xml.crypto.dom, \
+ javax.xml.crypto.dsig, \
+ javax.xml.crypto.dsig.dom, \
+ javax.xml.crypto.dsig.keyinfo, \
+ javax.xml.crypto.dsig.spec, \
+ javax.xml.datatype, \
+ javax.xml.namespace, \
+ javax.xml.parsers, \
+ javax.xml.soap, \
+ javax.xml.stream, \
+ javax.xml.stream.events, \
+ javax.xml.stream.util, \
+ javax.xml.transform, \
+ javax.xml.transform.dom, \
+ javax.xml.transform.sax, \
+ javax.xml.transform.stax, \
+ javax.xml.transform.stream, \
+ javax.xml.validation, \
+ javax.xml.ws, \
+ javax.xml.ws.handler, \
+ javax.xml.ws.handler.soap, \
+ javax.xml.ws.http, \
+ javax.xml.ws.soap, \
+ javax.xml.ws.spi, \
+ javax.xml.xpath, \
+ org.ietf.jgss, \
+ org.omg.CORBA, \
+ org.omg.CORBA_2_3, \
+ org.omg.CORBA_2_3.portable, \
+ org.omg.CORBA.DynAnyPackage, \
+ org.omg.CORBA.ORBPackage, \
+ org.omg.CORBA.portable, \
+ org.omg.CORBA.TypeCodePackage, \
+ org.omg.CosNaming, \
+ org.omg.CosNaming.NamingContextExtPackage, \
+ org.omg.CosNaming.NamingContextPackage, \
+ org.omg.Dynamic, \
+ org.omg.DynamicAny, \
+ org.omg.DynamicAny.DynAnyFactoryPackage, \
+ org.omg.DynamicAny.DynAnyPackage, \
+ org.omg.IOP, \
+ org.omg.IOP.CodecFactoryPackage, \
+ org.omg.IOP.CodecPackage, \
+ org.omg.Messaging, \
+ org.omg.PortableInterceptor, \
+ org.omg.PortableInterceptor.ORBInitInfoPackage, \
+ org.omg.PortableServer, \
+ org.omg.PortableServer.CurrentPackage, \
+ org.omg.PortableServer.POAManagerPackage, \
+ org.omg.PortableServer.POAPackage, \
+ org.omg.PortableServer.portable, \
+ org.omg.PortableServer.ServantLocatorPackage, \
+ org.omg.SendingContext, \
+ org.omg.stub.java.rmi, \
+ org.omg.stub.javax.management.remote.rmi, \
+ org.w3c.dom, \
+ org.w3c.dom.bootstrap, \
+ org.w3c.dom.css, \
+ org.w3c.dom.events, \
+ org.w3c.dom.html, \
+ org.w3c.dom.ls, \
+ org.w3c.dom.ranges, \
+ org.w3c.dom.stylesheets, \
+ org.w3c.dom.traversal, \
+ org.w3c.dom.views, \
+ org.w3c.dom.xpath, \
+ org.xml.sax, \
+ org.xml.sax.ext, \
+ org.xml.sax.helpers
diff --git a/karaf-2.2.x/shell/log/NOTICE b/karaf-2.2.x/shell/log/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/log/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/log/pom.xml b/karaf-2.2.x/shell/log/pom.xml
new file mode 100644
index 0000000..25d3dd5
--- /dev/null
+++ b/karaf-2.2.x/shell/log/pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.log</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: Log Commands</name>
+    <description>This bundle provides Karaf shell commands to manipulate Log service.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-service</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.logging</groupId>
+            <artifactId>pax-logging-api</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/ClearLog.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/ClearLog.java
new file mode 100644
index 0000000..df0549e
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/ClearLog.java
@@ -0,0 +1,43 @@
+/*
+ * 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.karaf.shell.log;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+
+/**
+ * Clear the last log entries.
+ */
+@Command(scope = "log", name = "clear", description = "Clear log entries.")
+public class ClearLog extends OsgiCommandSupport {
+
+    protected LruList events;
+   
+    public LruList getEvents() {
+        return events;
+    }
+
+    public void setEvents(LruList events) {
+        this.events = events;
+    }
+
+    protected Object doExecute() throws Exception {
+        events.clear();
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayException.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayException.java
new file mode 100644
index 0000000..095a647
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayException.java
@@ -0,0 +1,54 @@
+/*
+ * 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.karaf.shell.log;
+
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "log", name = "display-exception", description = "Displays the last occurred exception from the log.")
+public class DisplayException extends OsgiCommandSupport {
+
+    protected LruList events;
+
+    public LruList getEvents() {
+        return events;
+    }
+
+    public void setEvents(LruList events) {
+        this.events = events;
+    }
+
+    protected Object doExecute() throws Exception {
+        PaxLoggingEvent throwableEvent = null;
+        Iterable<PaxLoggingEvent> le = events.getElements(Integer.MAX_VALUE);
+        for (PaxLoggingEvent event : le) {
+            if (event.getThrowableStrRep() != null) {
+                throwableEvent = event;
+                // Do not break, as we iterate from the oldest to the newest event
+            }
+        }
+        if (throwableEvent != null) {
+            for (String r : throwableEvent.getThrowableStrRep()) {
+                System.out.println(r);
+            }
+            System.out.println();
+        }
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java
new file mode 100644
index 0000000..fa6f202
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java
@@ -0,0 +1,193 @@
+/*
+ * 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.karaf.shell.log;
+
+import java.io.PrintStream;
+
+import org.apache.karaf.shell.log.layout.PatternConverter;
+import org.apache.karaf.shell.log.layout.PatternParser;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+/**
+ * Displays the last log entries
+ */
+@Command(scope = "log", name = "display", description = "Displays log entries.")
+public class DisplayLog extends OsgiCommandSupport {
+
+    @Option(name = "-n", aliases = {}, description="Number of entries to display", required = false, multiValued = false)
+    protected int entries;
+
+    @Option(name = "-p", aliases = {}, description="Pattern for formatting the output", required = false, multiValued = false)
+    protected String overridenPattern;
+
+    @Option(name = "--no-color", description="Disable syntax coloring of log events", required = false, multiValued = false)
+    protected boolean noColor;
+
+    protected String pattern;
+    protected LruList events;
+    protected String fatalColor;
+    protected String errorColor;
+    protected String warnColor;
+    protected String infoColor;
+    protected String debugColor;
+    protected String traceColor;
+
+    private static final String FATAL = "fatal";
+    private static final String ERROR = "error";
+    private static final String WARN = "warn";
+    private static final String INFO = "info";
+    private static final String DEBUG = "debug";
+    private static final String TRACE = "trace";
+
+    private static final char FIRST_ESC_CHAR = 27;
+	private static final char SECOND_ESC_CHAR = '[';
+    private static final char COMMAND_CHAR = 'm';
+
+    public LruList getEvents() {
+        return events;
+    }
+
+    public void setEvents(LruList events) {
+        this.events = events;
+    }
+
+    public String getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(String pattern) {
+        this.pattern = pattern;
+    }
+
+    public String getFatalColor() {
+        return fatalColor;
+    }
+
+    public void setFatalColor(String fatalColor) {
+        this.fatalColor = fatalColor;
+    }
+
+    public String getErrorColor() {
+        return errorColor;
+    }
+
+    public void setErrorColor(String errorColor) {
+        this.errorColor = errorColor;
+    }
+
+    public String getWarnColor() {
+        return warnColor;
+    }
+
+    public void setWarnColor(String warnColor) {
+        this.warnColor = warnColor;
+    }
+
+    public String getInfoColor() {
+        return infoColor;
+    }
+
+    public void setInfoColor(String infoColor) {
+        this.infoColor = infoColor;
+    }
+
+    public String getDebugColor() {
+        return debugColor;
+    }
+
+    public void setDebugColor(String debugColor) {
+        this.debugColor = debugColor;
+    }
+
+    public String getTraceColor() {
+        return traceColor;
+    }
+
+    public void setTraceColor(String traceColor) {
+        this.traceColor = traceColor;
+    }
+
+    protected Object doExecute() throws Exception {
+        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        final PrintStream out = System.out;
+
+        Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
+        for (PaxLoggingEvent event : le) {
+            if (event != null) {
+            display(cnv, event, out);
+        }
+        }
+        out.println();
+        return null;
+    }
+
+    protected void display(PatternConverter cnv, PaxLoggingEvent event, PrintStream stream) {
+        String color = getColor(event);
+        StringBuffer sb = new StringBuffer();
+        sb.setLength(0);
+        if (color != null) {
+            sb.append(FIRST_ESC_CHAR);
+            sb.append(SECOND_ESC_CHAR);
+            sb.append(color);
+            sb.append(COMMAND_CHAR);
+        }
+        for (PatternConverter pc = cnv; pc != null; pc = pc.next) {
+            pc.format(sb, event);
+        }
+        if (event.getThrowableStrRep() != null) {
+            for (String r : event.getThrowableStrRep()) {
+                sb.append(r).append('\n');
+            }
+        }
+        if (color != null) {
+            sb.append(FIRST_ESC_CHAR);
+            sb.append(SECOND_ESC_CHAR);
+            sb.append("0");
+            sb.append(COMMAND_CHAR);
+        }
+        stream.print(sb.toString());
+    }
+
+    private String getColor(PaxLoggingEvent event) {
+        String color = null;
+        if (!noColor) {
+            String lvl = event.getLevel().toString().toLowerCase();
+            if (FATAL.equals(lvl)) {
+                color = fatalColor;
+            } else if (ERROR.equals(lvl)) {
+                color = errorColor;
+            } else if (WARN.equals(lvl)) {
+                color = warnColor;
+            } else if (INFO.equals(lvl)) {
+                color = infoColor;
+            } else if (DEBUG.equals(lvl)) {
+                color = debugColor;
+            } else if (TRACE.equals(lvl)) {
+                color = traceColor;
+            }
+            if (color != null && color.length() == 0) {
+                color = null;
+            }
+        }
+        return color;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/GetLogLevel.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/GetLogLevel.java
new file mode 100644
index 0000000..7c3c508
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/GetLogLevel.java
@@ -0,0 +1,119 @@
+/*
+ * 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.karaf.shell.log;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+/**
+ * Get the log level for a given logger
+ */
+@Command(scope = "log", name = "get", description = "Shows the currently set log level.")
+public class GetLogLevel extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "logger", description = "The name of the logger, ALL or ROOT (default)", required = false, multiValued = false)
+    String logger;
+
+    static final String CONFIGURATION_PID  = "org.ops4j.pax.logging";
+    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
+    static final String LOGGER_PREFIX      = "log4j.logger.";
+    static final String ALL_LOGGER         = "ALL";
+    static final String ROOT_LOGGER        = "ROOT";
+
+    protected Object doExecute() throws Exception {
+        ConfigurationAdmin cfgAdmin = getConfigAdmin();
+        Configuration cfg = cfgAdmin.getConfiguration(CONFIGURATION_PID, null);
+        Dictionary props = cfg.getProperties();
+
+        if (ROOT_LOGGER.equalsIgnoreCase(this.logger)) {
+            this.logger = null;
+        }
+        if (ALL_LOGGER.equalsIgnoreCase(logger)) {
+            String root = getLevel((String) props.get(ROOT_LOGGER_PREFIX));
+            Map<String, String> loggers = new TreeMap<String, String>();
+            for (Enumeration e = props.keys(); e.hasMoreElements();) {
+                String prop = (String) e.nextElement();
+                if (prop.startsWith(LOGGER_PREFIX)) {
+                    String val = getLevel((String) props.get(prop));
+                    loggers.put(prop.substring(LOGGER_PREFIX.length()), val);
+                }
+            }
+            System.out.println("ROOT: " + root);
+            for (String logger : loggers.keySet()) {
+                System.out.println(logger + ": " + loggers.get(logger));
+            }
+        } else {
+            String logger = this.logger;
+            String val;
+            for (;;) {
+                String prop;
+                if (logger == null) {
+                    prop = ROOT_LOGGER_PREFIX;
+                } else {
+                    prop = LOGGER_PREFIX + logger;
+                }
+                val = (String) props.get(prop);
+                val = getLevel(val);
+                if (val != null || logger == null) {
+                    break;
+                }
+                int idx = logger.lastIndexOf('.');
+                if (idx < 0) {
+                    logger = null;
+                } else {
+                    logger = logger.substring(0, idx);
+                }
+            }
+            String st = "Level: " + val;
+            if (logger != this.logger) {
+                st += " (inherited from " + (logger != null ? logger : "ROOT") + ")";
+            }
+            System.out.println(st);
+        }
+        return null;
+    }
+
+    protected String getLevel(String prop) {
+        if (prop == null) {
+            return null;
+        } else {
+            String val = prop.trim();
+            int idx = val.indexOf(",");
+            if (idx == 0) {
+                val = null;
+            } else if (idx > 0) {
+                val = val.substring(0, idx);
+            }
+            return val;
+        }
+    }
+
+    protected ConfigurationAdmin getConfigAdmin() {
+        ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName());
+        return getService(ConfigurationAdmin.class, ref);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java
new file mode 100644
index 0000000..9605a72
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java
@@ -0,0 +1,54 @@
+/*
+ * 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.karaf.shell.log;
+
+/**
+ * Enumeration of available log levels for the log:set command and
+ * the command completer
+ */
+public enum Level {
+
+    TRACE,
+    DEBUG,
+    INFO,
+    WARN,
+    ERROR,
+    DEFAULT;
+    
+    /**
+     * Convert the list of values into a String array
+     * 
+     * @return all the values as a String array
+     */
+    public static String[] strings() {
+        String[] values = new String[values().length];
+        for (int i = 0 ; i < values.length ; i++) {
+            values[i] = values()[i].name();
+        }
+        return values;
+    }
+    
+    /**
+     * Check if the string value represents the default level
+     * 
+     * @param level the level value
+     * @return <code>true</code> if the value represents the {@link #DEFAULT} level
+     */
+    public static boolean isDefault(String level) {
+        return valueOf(level).equals(DEFAULT);
+    }
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
new file mode 100644
index 0000000..d5343d7
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.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.karaf.shell.log;
+
+import java.io.PrintStream;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.log.layout.PatternConverter;
+import org.apache.karaf.shell.log.layout.PatternParser;
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+@Command(scope = "log", name = "tail", description = "Continuously display log entries.")
+public class LogTail extends DisplayLog {
+
+    protected Object doExecute() throws Exception {
+        final PatternConverter cnv = new PatternParser(overridenPattern != null ? overridenPattern : pattern).parse();
+        final PrintStream out = System.out;
+
+        Iterable<PaxLoggingEvent> le = events.getElements(entries == 0 ? Integer.MAX_VALUE : entries);
+        for (PaxLoggingEvent event : le) {
+            display(cnv, event, out);
+        }
+        // Tail
+        final BlockingQueue<PaxLoggingEvent> queue = new LinkedBlockingQueue<PaxLoggingEvent>();
+        PaxAppender appender = new PaxAppender() {
+            public void doAppend(PaxLoggingEvent event) {
+                queue.add(event);
+            }
+        };
+        try {
+            events.addAppender(appender);
+            for (;;) {
+                display(cnv, queue.take(), out);
+            }
+        } catch (InterruptedException e) {
+            // Ignore
+        } finally {
+            events.removeAppender(appender);
+        }
+        out.println();
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
new file mode 100644
index 0000000..bcd1b10
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
@@ -0,0 +1,119 @@
+/*
+ * 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.karaf.shell.log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+/**
+ * A list that only keep the last N elements added
+ */
+public class LruList {
+
+    private PaxLoggingEvent[] elements;
+    private transient int start = 0;
+    private transient int end = 0;
+    private transient boolean full = false;
+    private final int maxElements;
+    private final List<PaxAppender> appenders;
+
+    public LruList(int size) {
+        if (size <= 0) {
+            throw new IllegalArgumentException("The size must be greater than 0");
+        }
+        elements = new PaxLoggingEvent[size];
+        maxElements = elements.length;
+        appenders = new ArrayList<PaxAppender>();
+    }
+
+    public synchronized int size() {
+        int size = 0;
+        if (end < start) {
+            size = maxElements - start + end;
+        } else if (end == start) {
+            size = (full ? maxElements : 0);
+        } else {
+            size = end - start;
+        }
+        return size;
+    }
+
+    public synchronized void clear() {
+        start = 0;
+        end = 0;
+        elements = new PaxLoggingEvent[maxElements];
+    }
+
+    public synchronized void add(PaxLoggingEvent element) {
+        if (null == element) {
+             throw new NullPointerException("Attempted to add null object to buffer");
+        }
+        if (size() == maxElements) {
+            Object e = elements[start];
+            if (null != e) {
+                elements[start++] = null;
+                if (start >= maxElements) {
+                    start = 0;
+                }
+                full = false;
+            }
+        }
+        elements[end++] = element;
+        if (end >= maxElements) {
+            end = 0;
+        }
+        if (end == start) {
+            full = true;
+        }
+        for (PaxAppender appender : appenders) {
+            try {
+                appender.doAppend(element);
+            } catch (Throwable t) {
+                // Ignore
+            }
+        }
+    }
+
+    public synchronized Iterable<PaxLoggingEvent> getElements() {
+        return getElements(size());
+    }
+
+    public synchronized Iterable<PaxLoggingEvent> getElements(int nb) {
+        int s = size();
+        nb = Math.min(Math.max(0, nb), s);
+        PaxLoggingEvent[] e = new PaxLoggingEvent[nb];
+        for (int i = 0; i < nb; i++) {
+            e[i] = elements[(i + s - nb + start) % maxElements];
+        }
+        return Arrays.asList(e);
+    }
+
+    public synchronized void addAppender(PaxAppender appender) {
+        this.appenders.add(appender);
+    }
+
+    public synchronized void removeAppender(PaxAppender appender) {
+        this.appenders.remove(appender);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/SetLogLevel.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/SetLogLevel.java
new file mode 100644
index 0000000..7c7fab2
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/SetLogLevel.java
@@ -0,0 +1,123 @@
+/*
+ * 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.karaf.shell.log;
+
+import java.io.IOException;
+import java.util.Dictionary;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+
+/**
+ * Set the log level for a given logger
+ */
+@Command(scope = "log", name = "set", description = "Sets the log level.")
+public class SetLogLevel extends OsgiCommandSupport {
+    
+    @Argument(index = 0, name = "level", description = "The log level to set (TRACE, DEBUG, INFO, WARN, ERROR) or DEFAULT to unset", required = true, multiValued = false)
+    String level;
+
+    @Argument(index = 1, name = "logger", description = "Logger name or ROOT (default)", required = false, multiValued = false)
+    String logger;
+
+    static final String CONFIGURATION_PID  = "org.ops4j.pax.logging";
+    static final String ROOT_LOGGER_PREFIX = "log4j.rootLogger";
+    static final String LOGGER_PREFIX      = "log4j.logger.";
+    static final String ROOT_LOGGER        = "ROOT";
+
+    protected Object doExecute() throws Exception {
+        if (ROOT_LOGGER.equalsIgnoreCase(this.logger)) {
+            this.logger = null;
+        }
+        
+        // make sure both uppercase and lowercase levels are supported
+        level = level.toUpperCase();
+        
+        try {
+            Level.valueOf(level);
+        } catch (IllegalArgumentException e) {
+            System.err.println("level must be set to TRACE, DEBUG, INFO, WARN or ERROR (or DEFAULT to unset it)");
+            return null;
+        }
+        
+        if (Level.isDefault(level) && logger == null) {
+            System.err.println("Can not unset the ROOT logger");
+            return null;
+        }
+
+        Configuration cfg = getConfiguration();
+        Dictionary props = cfg.getProperties();
+
+        String logger = this.logger;
+        String val;
+        String prop;
+        if (logger == null) {
+            prop = ROOT_LOGGER_PREFIX;
+        } else {
+            prop = LOGGER_PREFIX + logger;
+        }
+        val = (String) props.get(prop);
+        if (Level.isDefault(level)) {
+            if (val != null) {
+                val = val.trim();
+                int idx = val.indexOf(",");
+                if (idx < 0) {
+                    val = null;
+                } else {
+                    val = val.substring(idx);
+                }
+            }
+        } else {
+            if (val == null) {
+                val = level;
+            } else {
+                val = val.trim();
+                int idx = val.indexOf(",");
+                if (idx < 0) {
+                    val = level;
+                } else {
+                    val = level + val.substring(idx);
+                }
+            }
+        }
+        if (val == null) {
+            props.remove(prop);
+        } else {
+            props.put(prop, val);
+        }
+        cfg.update(props);
+
+        return null;
+    }
+    
+    
+
+    protected Configuration getConfiguration() throws IOException {
+        Configuration cfg = getConfigAdmin().getConfiguration(CONFIGURATION_PID, null);
+        return cfg;
+    }
+
+    protected ConfigurationAdmin getConfigAdmin() {
+        ServiceReference ref = getBundleContext().getServiceReference(ConfigurationAdmin.class.getName());
+        return getService(ConfigurationAdmin.class, ref);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/VmLogAppender.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/VmLogAppender.java
new file mode 100644
index 0000000..4cf3c3b
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/VmLogAppender.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.shell.log;
+
+import org.ops4j.pax.logging.spi.PaxAppender;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+/**
+ * A Pax Logging appender that keep a list of last events
+ */
+public class VmLogAppender implements PaxAppender {
+
+    protected LruList events;
+
+    public LruList getEvents() {
+        return events;
+    }
+
+    public void setEvents(LruList events) {
+        this.events = events;
+    }
+
+    public void doAppend(PaxLoggingEvent event) {
+        if (events != null) {
+            event.getProperties(); // ensure MDC properties are copied
+            events.add(event);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/completers/LogLevelCompleter.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/completers/LogLevelCompleter.java
new file mode 100644
index 0000000..124bd36
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/completers/LogLevelCompleter.java
@@ -0,0 +1,43 @@
+/*
+ * 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.karaf.shell.log.completers;
+
+import java.util.List;
+
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.log.Level;
+
+/**
+ * {@link Completer} implementation for completing log levels  
+ */
+public class LogLevelCompleter extends StringsCompleter {
+    
+    public LogLevelCompleter() {
+        super(Level.strings());
+    }
+    
+    @Override @SuppressWarnings("unchecked")
+    public int complete(String buffer, int cursor, List candidates) {
+        if (buffer == null) {
+            return super.complete(null, cursor, candidates);
+        } else {
+            // support completing lower case as well with the toUpperCase() call
+            return super.complete(buffer.toUpperCase(), cursor, candidates);
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/AbsoluteTimeDateFormat.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/AbsoluteTimeDateFormat.java
new file mode 100644
index 0000000..72dc398
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/AbsoluteTimeDateFormat.java
@@ -0,0 +1,140 @@
+/*
+ * 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.karaf.shell.log.layout;
+
+import java.text.DateFormat;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * Copied from log4j
+ */
+/**
+   Formats a {@link Date} in the format "HH:mm:ss,SSS" for example,
+   "15:49:37,459".
+*/
+public class AbsoluteTimeDateFormat extends DateFormat {
+
+  /**
+     String constant used to specify {@link
+     org.apache.log4j.helpers.AbsoluteTimeDateFormat} in layouts. Current
+     value is <b>ABSOLUTE</b>.  */
+  public final static String ABS_TIME_DATE_FORMAT = "ABSOLUTE";
+
+  /**
+     String constant used to specify {@link
+     org.apache.log4j.helpers.DateTimeDateFormat} in layouts.  Current
+     value is <b>DATE</b>.
+  */
+  public final static String DATE_AND_TIME_DATE_FORMAT = "DATE";
+
+  /**
+     String constant used to specify {@link
+     org.apache.log4j.helpers.ISO8601DateFormat} in layouts. Current
+     value is <b>ISO8601</b>.
+  */
+  public final static String ISO8601_DATE_FORMAT = "ISO8601";
+
+  public
+  AbsoluteTimeDateFormat() {
+    setCalendar(Calendar.getInstance());
+  }
+
+  public
+  AbsoluteTimeDateFormat(TimeZone timeZone) {
+    setCalendar(Calendar.getInstance(timeZone));
+  }
+
+  private static long   previousTime;
+  private static char[] previousTimeWithoutMillis = new char[9]; // "HH:mm:ss."
+
+  /**
+     Appends to <code>sbuf</code> the time in the format
+     "HH:mm:ss,SSS" for example, "15:49:37,459"
+
+     @param date the date to format
+     @param sbuf the string buffer to write to
+     @param fieldPosition remains untouched
+    */
+  public
+  StringBuffer format(Date date, StringBuffer sbuf,
+		      FieldPosition fieldPosition) {
+
+    long now = date.getTime();
+    int millis = (int)(now % 1000);
+
+    if ((now - millis) != previousTime) {
+      // We reach this point at most once per second
+      // across all threads instead of each time format()
+      // is called. This saves considerable CPU time.
+
+      calendar.setTime(date);
+
+      int start = sbuf.length();
+
+      int hour = calendar.get(Calendar.HOUR_OF_DAY);
+      if(hour < 10) {
+	sbuf.append('0');
+      }
+      sbuf.append(hour);
+      sbuf.append(':');
+
+      int mins = calendar.get(Calendar.MINUTE);
+      if(mins < 10) {
+	sbuf.append('0');
+      }
+      sbuf.append(mins);
+      sbuf.append(':');
+
+      int secs = calendar.get(Calendar.SECOND);
+      if(secs < 10) {
+	sbuf.append('0');
+      }
+      sbuf.append(secs);
+      sbuf.append(',');
+
+      // store the time string for next time to avoid recomputation
+      sbuf.getChars(start, sbuf.length(), previousTimeWithoutMillis, 0);
+
+      previousTime = now - millis;
+    }
+    else {
+      sbuf.append(previousTimeWithoutMillis);
+    }
+
+
+
+    if(millis < 100)
+      sbuf.append('0');
+    if(millis < 10)
+      sbuf.append('0');
+
+    sbuf.append(millis);
+    return sbuf;
+  }
+
+  /**
+     This method does not do anything but return <code>null</code>.
+   */
+  public
+  Date parse(String s, ParsePosition pos) {
+    return null;
+  }
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/DateTimeDateFormat.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/DateTimeDateFormat.java
new file mode 100644
index 0000000..b01b36e
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/DateTimeDateFormat.java
@@ -0,0 +1,83 @@
+/*
+ * 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.karaf.shell.log.layout;
+
+import java.text.DateFormatSymbols;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * Copied from log4j
+ */
+/**
+   Formats a {@link Date} in the format "dd MMM yyyy HH:mm:ss,SSS" for example,
+   "06 Nov 1994 15:49:37,459".
+*/
+public class DateTimeDateFormat extends AbsoluteTimeDateFormat {
+
+  String[] shortMonths;
+
+  public
+  DateTimeDateFormat() {
+    super();
+    shortMonths = new DateFormatSymbols().getShortMonths();
+  }
+
+  public
+  DateTimeDateFormat(TimeZone timeZone) {
+    this();
+    setCalendar(Calendar.getInstance(timeZone));
+  }
+
+  /**
+     Appends to <code>sbuf</code> the date in the format "dd MMM yyyy
+     HH:mm:ss,SSS" for example, "06 Nov 1994 08:49:37,459".
+
+     @param sbuf the string buffer to write to
+  */
+  public
+  StringBuffer format(Date date, StringBuffer sbuf,
+		      FieldPosition fieldPosition) {
+
+    calendar.setTime(date);
+
+    int day = calendar.get(Calendar.DAY_OF_MONTH);
+    if(day < 10)
+      sbuf.append('0');
+    sbuf.append(day);
+    sbuf.append(' ');
+    sbuf.append(shortMonths[calendar.get(Calendar.MONTH)]);
+    sbuf.append(' ');
+
+    int year =  calendar.get(Calendar.YEAR);
+    sbuf.append(year);
+    sbuf.append(' ');
+
+    return super.format(date, sbuf, fieldPosition);
+  }
+
+  /**
+     This method does not do anything but return <code>null</code>.
+   */
+  public
+  Date parse(java.lang.String s, ParsePosition pos) {
+    return null;
+  }
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/FormattingInfo.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/FormattingInfo.java
new file mode 100644
index 0000000..d7bf0bc
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/FormattingInfo.java
@@ -0,0 +1,41 @@
+/*
+ * 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.karaf.shell.log.layout;
+
+/**
+ * Copied from log4j
+ */
+/**
+   FormattingInfo instances contain the information obtained when parsing
+   formatting modifiers in conversion modifiers.
+ */
+public class FormattingInfo {
+  int min = -1;
+  int max = 0x7FFFFFFF;
+  boolean leftAlign = false;
+
+  void reset() {
+    min = -1;
+    max = 0x7FFFFFFF;
+    leftAlign = false;
+  }
+
+  void dump() {
+    //LogLog.debug("min="+min+", max="+max+", leftAlign="+leftAlign);
+  }
+}
+
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/ISO8601DateFormat.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/ISO8601DateFormat.java
new file mode 100644
index 0000000..a9565ec
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/ISO8601DateFormat.java
@@ -0,0 +1,149 @@
+/*
+ * 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.karaf.shell.log.layout;
+
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * Copied from log4j
+ */
+/**
+   Formats a {@link Date} in the format "yyyy-MM-dd HH:mm:ss,SSS" for example
+   "1999-11-27 15:49:37,459".
+
+   <p>Refer to the <a
+   href=http://www.cl.cam.ac.uk/~mgk25/iso-time.html>summary of the
+   International Standard Date and Time Notation</a> for more
+   information on this format.
+*/
+public class ISO8601DateFormat extends AbsoluteTimeDateFormat {
+
+  public
+  ISO8601DateFormat() {
+  }
+
+  public
+  ISO8601DateFormat(TimeZone timeZone) {
+    super(timeZone);
+  }
+
+  static private long   lastTime;
+  static private char[] lastTimeString = new char[20];
+
+  /**
+     Appends a date in the format "YYYY-mm-dd HH:mm:ss,SSS"
+     to <code>sbuf</code>. For example: "1999-11-27 15:49:37,459".
+
+     @param sbuf the <code>StringBuffer</code> to write to
+  */
+  public
+  StringBuffer format(Date date, StringBuffer sbuf,
+		      FieldPosition fieldPosition) {
+
+    long now = date.getTime();
+    int millis = (int)(now % 1000);
+
+    if ((now - millis) != lastTime) {
+      // We reach this point at most once per second
+      // across all threads instead of each time format()
+      // is called. This saves considerable CPU time.
+
+      calendar.setTime(date);
+
+      int start = sbuf.length();
+
+      int year =  calendar.get(Calendar.YEAR);
+      sbuf.append(year);
+
+      String month;
+      switch(calendar.get(Calendar.MONTH)) {
+      case Calendar.JANUARY: month = "-01-"; break;
+      case Calendar.FEBRUARY: month = "-02-";  break;
+      case Calendar.MARCH: month = "-03-"; break;
+      case Calendar.APRIL: month = "-04-";  break;
+      case Calendar.MAY: month = "-05-"; break;
+      case Calendar.JUNE: month = "-06-";  break;
+      case Calendar.JULY: month = "-07-"; break;
+      case Calendar.AUGUST: month = "-08-";  break;
+      case Calendar.SEPTEMBER: month = "-09-"; break;
+      case Calendar.OCTOBER: month = "-10-"; break;
+      case Calendar.NOVEMBER: month = "-11-";  break;
+      case Calendar.DECEMBER: month = "-12-";  break;
+      default: month = "-NA-"; break;
+      }
+      sbuf.append(month);
+
+      int day = calendar.get(Calendar.DAY_OF_MONTH);
+      if(day < 10)
+	sbuf.append('0');
+      sbuf.append(day);
+
+      sbuf.append(' ');
+
+      int hour = calendar.get(Calendar.HOUR_OF_DAY);
+      if(hour < 10) {
+	sbuf.append('0');
+      }
+      sbuf.append(hour);
+      sbuf.append(':');
+
+      int mins = calendar.get(Calendar.MINUTE);
+      if(mins < 10) {
+	sbuf.append('0');
+      }
+      sbuf.append(mins);
+      sbuf.append(':');
+
+      int secs = calendar.get(Calendar.SECOND);
+      if(secs < 10) {
+	sbuf.append('0');
+      }
+      sbuf.append(secs);
+
+      sbuf.append(',');
+
+      // store the time string for next time to avoid recomputation
+      sbuf.getChars(start, sbuf.length(), lastTimeString, 0);
+      lastTime = now - millis;
+    }
+    else {
+      sbuf.append(lastTimeString);
+    }
+
+
+    if (millis < 100)
+      sbuf.append('0');
+    if (millis < 10)
+      sbuf.append('0');
+
+    sbuf.append(millis);
+    return sbuf;
+  }
+
+  /**
+    This method does not do anything but return <code>null</code>.
+   */
+  public
+  Date parse(java.lang.String s, ParsePosition pos) {
+    return null;
+  }
+}
+
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternConverter.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternConverter.java
new file mode 100644
index 0000000..5649220
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternConverter.java
@@ -0,0 +1,107 @@
+/*
+ * 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.karaf.shell.log.layout;
+
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+/**
+ * Copied from log4j.
+ */
+/**
+   <p>PatternConverter is an abtract class that provides the
+   formatting functionality that derived classes need.
+
+   <p>Conversion specifiers in a conversion patterns are parsed to
+   individual PatternConverters. Each of which is responsible for
+   converting a logging event in a converter specific manner.
+ */
+public abstract class PatternConverter {
+  public PatternConverter next;
+  int min = -1;
+  int max = 0x7FFFFFFF;
+  boolean leftAlign = false;
+
+  protected
+  PatternConverter() {  }
+
+  protected
+  PatternConverter(FormattingInfo fi) {
+    min = fi.min;
+    max = fi.max;
+    leftAlign = fi.leftAlign;
+  }
+
+  /**
+     Derived pattern converters must override this method in order to
+     convert conversion specifiers in the correct way.
+  */
+  abstract
+  protected
+  String convert(PaxLoggingEvent event);
+
+  /**
+     A template method for formatting in a converter specific way.
+   */
+  public
+  void format(StringBuffer sbuf, PaxLoggingEvent e) {
+    String s = convert(e);
+
+    if(s == null) {
+      if(0 < min)
+	spacePad(sbuf, min);
+      return;
+    }
+
+    int len = s.length();
+
+    if(len > max)
+      sbuf.append(s.substring(len-max));
+    else if(len < min) {
+      if(leftAlign) {
+	sbuf.append(s);
+	spacePad(sbuf, min-len);
+      }
+      else {
+	spacePad(sbuf, min-len);
+	sbuf.append(s);
+      }
+    }
+    else
+      sbuf.append(s);
+  }
+
+  static String[] SPACES = {" ", "  ", "    ", "        ", //1,2,4,8 spaces
+			    "                ", // 16 spaces
+			    "                                " }; // 32 spaces
+
+  /**
+     Fast space padding method.
+  */
+  public
+  void spacePad(StringBuffer sbuf, int length) {
+    while(length >= 32) {
+      sbuf.append(SPACES[5]);
+      length -= 32;
+    }
+
+    for(int i = 4; i >= 0; i--) {
+      if((length & (1<<i)) != 0) {
+	sbuf.append(SPACES[i]);
+      }
+    }
+  }
+}
diff --git a/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternParser.java b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternParser.java
new file mode 100644
index 0000000..ecba15c
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternParser.java
@@ -0,0 +1,558 @@
+/*
+ * 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.karaf.shell.log.layout;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.log4j.spi.LoggingEvent;
+import org.ops4j.pax.logging.spi.PaxLocationInfo;
+import org.ops4j.pax.logging.spi.PaxLoggingEvent;
+
+/**
+ * Copied from log4j
+ */
+/**
+   Most of the work of the {@link org.apache.log4j.PatternLayout} class
+   is delegated to the PatternParser class.
+*/
+public class PatternParser {
+
+  private static final String LINE_SEP = System.getProperty("line.separator");
+
+  private static final char ESCAPE_CHAR = '%';
+
+  private static final int LITERAL_STATE = 0;
+  private static final int CONVERTER_STATE = 1;
+  private static final int MINUS_STATE = 2;
+  private static final int DOT_STATE = 3;
+  private static final int MIN_STATE = 4;
+  private static final int MAX_STATE = 5;
+
+  static final int FULL_LOCATION_CONVERTER = 1000;
+  static final int METHOD_LOCATION_CONVERTER = 1001;
+  static final int CLASS_LOCATION_CONVERTER = 1002;
+  static final int LINE_LOCATION_CONVERTER = 1003;
+  static final int FILE_LOCATION_CONVERTER = 1004;
+
+  static final int RELATIVE_TIME_CONVERTER = 2000;
+  static final int THREAD_CONVERTER = 2001;
+  static final int LEVEL_CONVERTER = 2002;
+  static final int NDC_CONVERTER = 2003;
+  static final int MESSAGE_CONVERTER = 2004;
+
+  int state;
+  protected StringBuffer currentLiteral = new StringBuffer(32);
+  protected int patternLength;
+  protected int i;
+  PatternConverter head;
+  PatternConverter tail;
+  protected FormattingInfo formattingInfo = new FormattingInfo();
+  protected String pattern;
+
+  public
+  PatternParser(String pattern) {
+    this.pattern = pattern;
+    patternLength =  pattern.length();
+    state = LITERAL_STATE;
+  }
+
+  private
+  void  addToList(PatternConverter pc) {
+    if(head == null) {
+      head = tail = pc;
+    } else {
+      tail.next = pc;
+      tail = pc;
+    }
+  }
+
+  protected
+  String extractOption() {
+    if((i < patternLength) && (pattern.charAt(i) == '{')) {
+      int end = pattern.indexOf('}', i);
+      if (end > i) {
+	String r = pattern.substring(i + 1, end);
+	i = end+1;
+	return r;
+      }
+    }
+    return null;
+  }
+
+
+  /**
+     The option is expected to be in decimal and positive. In case of
+     error, zero is returned.  */
+  protected
+  int extractPrecisionOption() {
+    String opt = extractOption();
+    int r = 0;
+    if(opt != null) {
+      try {
+	r = Integer.parseInt(opt);
+	if(r <= 0) {
+	    //LogLog.error("Precision option (" + opt + ") isn't a positive integer.");
+	    r = 0;
+	}
+      }
+      catch (NumberFormatException e) {
+	//LogLog.error("Category option \""+opt+"\" not a decimal integer.", e);
+      }
+    }
+    return r;
+  }
+
+  public
+  PatternConverter parse() {
+    char c;
+    i = 0;
+    while(i < patternLength) {
+      c = pattern.charAt(i++);
+      switch(state) {
+      case LITERAL_STATE:
+        // In literal state, the last char is always a literal.
+        if(i == patternLength) {
+          currentLiteral.append(c);
+          continue;
+        }
+        if(c == ESCAPE_CHAR) {
+          // peek at the next char.
+          switch(pattern.charAt(i)) {
+          case ESCAPE_CHAR:
+            currentLiteral.append(c);
+            i++; // move pointer
+            break;
+          case 'n':
+            currentLiteral.append(LINE_SEP);
+            i++; // move pointer
+            break;
+          default:
+            if(currentLiteral.length() != 0) {
+              addToList(new LiteralPatternConverter(
+                                                  currentLiteral.toString()));
+              //LogLog.debug("Parsed LITERAL converter: \""
+              //           +currentLiteral+"\".");
+            }
+            currentLiteral.setLength(0);
+            currentLiteral.append(c); // append %
+            state = CONVERTER_STATE;
+            formattingInfo.reset();
+          }
+        }
+        else {
+          currentLiteral.append(c);
+        }
+        break;
+      case CONVERTER_STATE:
+	currentLiteral.append(c);
+	switch(c) {
+	case '-':
+	  formattingInfo.leftAlign = true;
+	  break;
+	case '.':
+	  state = DOT_STATE;
+	  break;
+	default:
+	  if(c >= '0' && c <= '9') {
+	    formattingInfo.min = c - '0';
+	    state = MIN_STATE;
+	  }
+	  else
+	    finalizeConverter(c);
+	} // switch
+	break;
+      case MIN_STATE:
+	currentLiteral.append(c);
+	if(c >= '0' && c <= '9')
+	  formattingInfo.min = formattingInfo.min*10 + (c - '0');
+	else if(c == '.')
+	  state = DOT_STATE;
+	else {
+	  finalizeConverter(c);
+	}
+	break;
+      case DOT_STATE:
+	currentLiteral.append(c);
+	if(c >= '0' && c <= '9') {
+	  formattingInfo.max = c - '0';
+	   state = MAX_STATE;
+	}
+	else {
+	  //LogLog.error("Error occured in position "+i+".\n Was expecting digit, instead got char \""+c+"\".");
+	  state = LITERAL_STATE;
+	}
+	break;
+      case MAX_STATE:
+	currentLiteral.append(c);
+	if(c >= '0' && c <= '9')
+	  formattingInfo.max = formattingInfo.max*10 + (c - '0');
+	else {
+	  finalizeConverter(c);
+	  state = LITERAL_STATE;
+	}
+	break;
+      } // switch
+    } // while
+    if(currentLiteral.length() != 0) {
+      addToList(new LiteralPatternConverter(currentLiteral.toString()));
+      //LogLog.debug("Parsed LITERAL converter: \""+currentLiteral+"\".");
+    }
+    return head;
+  }
+
+  protected
+  void finalizeConverter(char c) {
+    PatternConverter pc = null;
+    switch(c) {
+    case 'c':
+      pc = new CategoryPatternConverter(formattingInfo,
+					extractPrecisionOption());
+      //LogLog.debug("CATEGORY converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'C':
+      pc = new ClassNamePatternConverter(formattingInfo,
+					 extractPrecisionOption());
+      //LogLog.debug("CLASS_NAME converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'd':
+      String dateFormatStr = AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT;
+      DateFormat df;
+      String dOpt = extractOption();
+      if(dOpt != null)
+	dateFormatStr = dOpt;
+
+      if(dateFormatStr.equalsIgnoreCase(
+                                    AbsoluteTimeDateFormat.ISO8601_DATE_FORMAT))
+	df = new  ISO8601DateFormat();
+      else if(dateFormatStr.equalsIgnoreCase(
+                                   AbsoluteTimeDateFormat.ABS_TIME_DATE_FORMAT))
+	df = new AbsoluteTimeDateFormat();
+      else if(dateFormatStr.equalsIgnoreCase(
+                              AbsoluteTimeDateFormat.DATE_AND_TIME_DATE_FORMAT))
+	df = new DateTimeDateFormat();
+      else {
+	try {
+	  df = new SimpleDateFormat(dateFormatStr);
+	}
+	catch (IllegalArgumentException e) {
+	  //LogLog.error("Could not instantiate SimpleDateFormat with " + dateFormatStr, e);
+	  df = new ISO8601DateFormat();
+	}
+      }
+      pc = new DatePatternConverter(formattingInfo, df);
+      //LogLog.debug("DATE converter {"+dateFormatStr+"}.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'F':
+      pc = new LocationPatternConverter(formattingInfo,
+					FILE_LOCATION_CONVERTER);
+      //LogLog.debug("File name converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    /*case 'l':
+      pc = new LocationPatternConverter(formattingInfo,
+					FULL_LOCATION_CONVERTER);
+      //LogLog.debug("Location converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;*/
+    case 'L':
+      pc = new LocationPatternConverter(formattingInfo,
+					LINE_LOCATION_CONVERTER);
+      //LogLog.debug("LINE NUMBER converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'm':
+      pc = new BasicPatternConverter(formattingInfo, MESSAGE_CONVERTER);
+      //LogLog.debug("MESSAGE converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'M':
+      pc = new LocationPatternConverter(formattingInfo,
+					METHOD_LOCATION_CONVERTER);
+      //LogLog.debug("METHOD converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'p':
+      pc = new BasicPatternConverter(formattingInfo, LEVEL_CONVERTER);
+      //LogLog.debug("LEVEL converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 'r':
+      pc = new BasicPatternConverter(formattingInfo,
+					 RELATIVE_TIME_CONVERTER);
+      //LogLog.debug("RELATIVE time converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+    case 't':
+      pc = new BasicPatternConverter(formattingInfo, THREAD_CONVERTER);
+      //LogLog.debug("THREAD converter.");
+      //formattingInfo.dump();
+      currentLiteral.setLength(0);
+      break;
+      /*case 'u':
+      if(i < patternLength) {
+	char cNext = pattern.charAt(i);
+	if(cNext >= '0' && cNext <= '9') {
+	  pc = new UserFieldPatternConverter(formattingInfo, cNext - '0');
+	  LogLog.debug("USER converter ["+cNext+"].");
+	  formattingInfo.dump();
+	  currentLiteral.setLength(0);
+	  i++;
+	}
+	else
+	  LogLog.error("Unexpected char" +cNext+" at position "+i);
+      }
+      break;*/
+    /*case 'x':
+      pc = new BasicPatternConverter(formattingInfo, NDC_CONVERTER);
+      //LogLog.debug("NDC converter.");
+      currentLiteral.setLength(0);
+      break;*/
+    case 'X':
+      String xOpt = extractOption();
+      pc = new MDCPatternConverter(formattingInfo, xOpt);
+      currentLiteral.setLength(0);
+      break;
+    default:
+      //LogLog.error("Unexpected char [" +c+"] at position "+i+" in conversion patterrn.");
+      pc = new LiteralPatternConverter(currentLiteral.toString());
+      currentLiteral.setLength(0);
+    }
+
+    addConverter(pc);
+  }
+
+  protected
+  void addConverter(PatternConverter pc) {
+    currentLiteral.setLength(0);
+    // Add the pattern converter to the list.
+    addToList(pc);
+    // Next pattern is assumed to be a literal.
+    state = LITERAL_STATE;
+    // Reset formatting info
+    formattingInfo.reset();
+  }
+
+  // ---------------------------------------------------------------------
+  //                      PatternConverters
+  // ---------------------------------------------------------------------
+
+  private static class BasicPatternConverter extends PatternConverter {
+    int type;
+
+    BasicPatternConverter(FormattingInfo formattingInfo, int type) {
+      super(formattingInfo);
+      this.type = type;
+    }
+
+    public
+    String convert(PaxLoggingEvent event) {
+      switch(type) {
+      case RELATIVE_TIME_CONVERTER:
+	return (Long.toString(event.getTimeStamp() - LoggingEvent.getStartTime()));
+      case THREAD_CONVERTER:
+	return event.getThreadName();
+      case LEVEL_CONVERTER:
+	return event.getLevel().toString();
+    //  case NDC_CONVERTER:
+	//return event.getNDC();
+      case MESSAGE_CONVERTER: {
+	return event.getRenderedMessage();
+      }
+      default: return null;
+      }
+    }
+  }
+
+  private static class LiteralPatternConverter extends PatternConverter {
+    private String literal;
+
+    LiteralPatternConverter(String value) {
+      literal = value;
+    }
+
+    public
+    final
+    void format(StringBuffer sbuf, LoggingEvent event) {
+      sbuf.append(literal);
+    }
+
+    public
+    String convert(PaxLoggingEvent event) {
+      return literal;
+    }
+  }
+
+  private static class DatePatternConverter extends PatternConverter {
+    private DateFormat df;
+    private Date date;
+
+    DatePatternConverter(FormattingInfo formattingInfo, DateFormat df) {
+      super(formattingInfo);
+      date = new Date();
+      this.df = df;
+    }
+
+    public
+    String convert(PaxLoggingEvent event) {
+      date.setTime(event.getTimeStamp());
+      String converted = null;
+      try {
+        converted = df.format(date);
+      }
+      catch (Exception ex) {
+        //LogLog.error("Error occured while converting date.", ex);
+      }
+      return converted;
+    }
+  }
+
+  private class LocationPatternConverter extends PatternConverter {
+    int type;
+
+    LocationPatternConverter(FormattingInfo formattingInfo, int type) {
+      super(formattingInfo);
+      this.type = type;
+    }
+
+    public
+    String convert(PaxLoggingEvent event) {
+      PaxLocationInfo locationInfo = event.getLocationInformation();
+      switch(type) {
+      /*case FULL_LOCATION_CONVERTER:
+	return locationInfo.fullInfo;*/
+      case METHOD_LOCATION_CONVERTER:
+	return locationInfo.getMethodName();
+      case LINE_LOCATION_CONVERTER:
+	return locationInfo.getLineNumber();
+      case FILE_LOCATION_CONVERTER:
+	return locationInfo.getFileName();
+      default: return null;
+      }
+    }
+  }
+
+  private static abstract class NamedPatternConverter extends PatternConverter {
+    int precision;
+
+    NamedPatternConverter(FormattingInfo formattingInfo, int precision) {
+      super(formattingInfo);
+      this.precision =  precision;
+    }
+
+    abstract
+    String getFullyQualifiedName(PaxLoggingEvent event);
+
+    public
+    String convert(PaxLoggingEvent event) {
+      String n = getFullyQualifiedName(event);
+      if(precision <= 0)
+	return n;
+      else {
+	int len = n.length();
+
+	// We substract 1 from 'len' when assigning to 'end' to avoid out of
+	// bounds exception in return r.substring(end+1, len). This can happen if
+	// precision is 1 and the category name ends with a dot.
+	int end = len -1 ;
+	for(int i = precision; i > 0; i--) {
+	  end = n.lastIndexOf('.', end-1);
+	  if(end == -1)
+	    return n;
+	}
+	return n.substring(end+1, len);
+      }
+    }
+  }
+
+  private class ClassNamePatternConverter extends NamedPatternConverter {
+
+    ClassNamePatternConverter(FormattingInfo formattingInfo, int precision) {
+      super(formattingInfo, precision);
+    }
+
+    String getFullyQualifiedName(PaxLoggingEvent event) {
+      return event.getLocationInformation().getClassName();
+    }
+  }
+
+  private class CategoryPatternConverter extends NamedPatternConverter {
+
+    CategoryPatternConverter(FormattingInfo formattingInfo, int precision) {
+      super(formattingInfo, precision);
+    }
+
+    String getFullyQualifiedName(PaxLoggingEvent event) {
+      return event.getLoggerName();
+    }
+  }
+
+  private class MDCPatternConverter extends PatternConverter {
+    String key;
+
+    MDCPatternConverter(FormattingInfo formattingInfo, String key) {
+      super(formattingInfo);
+      this.key = key;
+    }
+
+    public
+    String convert(PaxLoggingEvent event) {
+        if (key == null) {
+            StringBuffer buf = new StringBuffer("{");
+            Map properties = event.getProperties();
+            if (properties.size() > 0) {
+              Object[] keys = properties.keySet().toArray();
+              Arrays.sort(keys);
+              for (int i = 0; i < keys.length; i++) {
+                  buf.append('{');
+                  buf.append(keys[i]);
+                  buf.append(',');
+                  buf.append(properties.get(keys[i]));
+                  buf.append('}');
+              }
+            }
+            buf.append('}');
+            return buf.toString();
+        } else {
+          Object val = event.getProperties().get(key);
+          if(val == null) {
+              return null;
+          } else {
+              return val.toString();
+          }
+        }
+    }
+
+  }
+}
+
diff --git a/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
new file mode 100644
index 0000000..b8fcf96
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
@@ -0,0 +1,102 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+           default-activation="lazy">
+
+    <!-- TODO: use dynamic CM config -->
+
+    <cm:property-placeholder persistent-id="org.apache.karaf.log" update-strategy="reload">
+        <cm:default-properties>
+            <cm:property name="size" value="500"/>
+            <cm:property name="pattern" value="%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n"/>
+            <cm:property name="fatalColor" value="31"/>
+            <cm:property name="errorColor" value="31"/>
+            <cm:property name="warnColor" value="35"/>
+            <cm:property name="infoColor" value="36"/>
+            <cm:property name="debugColor" value="39"/>
+            <cm:property name="traceColor" value="39"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="log/display">
+            <action class="org.apache.karaf.shell.log.DisplayLog">
+                <property name="events" ref="events"/>
+                <property name="pattern" value="${pattern}"/>
+                <property name="fatalColor" value="${fatalColor}"/>
+                <property name="errorColor" value="${errorColor}"/>
+                <property name="warnColor" value="${warnColor}"/>
+                <property name="infoColor" value="${infoColor}"/>
+                <property name="debugColor" value="${debugColor}"/>
+                <property name="traceColor" value="${traceColor}"/>
+            </action>
+        </command>
+        <command name="log/display-exception">
+            <action class="org.apache.karaf.shell.log.DisplayException">
+                <property name="events" ref="events"/>
+            </action>
+        </command>
+        <command name="log/clear">
+            <action class="org.apache.karaf.shell.log.ClearLog">
+                <property name="events" ref="events"/>
+            </action>
+        </command>
+        <command name="log/get">
+            <action class="org.apache.karaf.shell.log.GetLogLevel" />
+        </command>
+        <command name="log/set">
+            <action class="org.apache.karaf.shell.log.SetLogLevel" />
+            <completers>
+            	<ref component-id="logLevelCompleter"/>
+            	<null/>
+            </completers>
+        </command>
+        <command name="log/tail">
+            <action class="org.apache.karaf.shell.log.LogTail">
+                <property name="events" ref="events"/>
+                <property name="pattern" value="${pattern}"/>
+                <property name="fatalColor" value="${fatalColor}"/>
+                <property name="errorColor" value="${errorColor}"/>
+                <property name="warnColor" value="${warnColor}"/>
+                <property name="infoColor" value="${infoColor}"/>
+                <property name="debugColor" value="${debugColor}"/>
+                <property name="traceColor" value="${traceColor}"/>
+            </action>
+        </command>
+    </command-bundle>
+
+    <bean id="vmLogAppender" class="org.apache.karaf.shell.log.VmLogAppender">
+        <property name="events" ref="events"/>
+    </bean>
+
+    <bean id="events" class="org.apache.karaf.shell.log.LruList">
+        <argument value="${size}"/>
+    </bean>
+    
+    <bean id="logLevelCompleter" class="org.apache.karaf.shell.log.completers.LogLevelCompleter"/>
+
+    <service ref="vmLogAppender" interface="org.ops4j.pax.logging.spi.PaxAppender">
+        <service-properties>
+                <entry key="org.ops4j.pax.logging.appender.name" value="VmLogAppender"/>
+        </service-properties>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..8cbe50b
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,21 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Karaf shell commands to manipulate the Log service.
+
+    The following commands are available:
+    \u001B[36mlog:clear\u001B[0m Clear log entries.
+    \u001B[36mlog:display-exception\u001B[0m Displays the last occurred exception from the log.
+    \u001B[36mlog:display\u001B[0m Displays log entries.
+    \u001B[36mlog:get\u001B[0m Shows the currently set log level.
+    \u001B[36mlog:tail\u001B[0m Continuously display log entries.
+    \u001B[36mlog:set\u001B[0m Sets the log level.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m and \u001B[36mLogging system\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties
new file mode 100644
index 0000000..713283f
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties
@@ -0,0 +1,31 @@
+#
+#  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.
+#
+
+#
+# This file contains localization strings for configuration labels and
+# descriptions as used in the metatype.xml descriptor
+
+log.name = Apache Karaf Log
+log.description = Configuration of Apache Karaf Log
+
+size.name = Size
+size.description = size of the log to keep in memory
+
+pattern.name = Pattern
+pattern.description = Pattern used to display log entries
diff --git a/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml
new file mode 100644
index 0000000..147cb82
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml
@@ -0,0 +1,30 @@
+<?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.
+
+-->
+<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0" localization="OSGI-INF/metatype/metatype">
+    <OCD id="org.apache.karaf.log" name="%log.name" description="%log.description">
+        <AD id="size" type="Integer" default="500" name="%size.name"
+            description="%size.description"/>
+        <AD id="pattern" type="String" default="%d{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n" name="%pattern.name"
+            description="%pattern.description"/>
+    </OCD>
+    <Designate pid="org.apache.karaf.log">
+        <Object ocdref="org.apache.karaf.log"/>
+    </Designate>
+</metatype:MetaData>
diff --git a/karaf-2.2.x/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java b/karaf-2.2.x/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java
new file mode 100644
index 0000000..cedeb6a
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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.karaf.shell.log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Hashtable;
+
+import junit.framework.TestCase;
+
+import org.easymock.EasyMock;
+import org.osgi.service.cm.Configuration;
+
+/**
+ * Test cases for {@link SetLogLevel}
+ */
+@SuppressWarnings("unchecked")
+public class SetLogLevelTest extends TestCase {
+    
+    private static final String ROOT_LOGGER = "log4j.rootLogger";
+    private static final String PACKAGE_LOGGER = "log4j.logger.org.apache.karaf.test";
+    private static final PrintStream ORIGINAL_STDERR = System.err;
+    
+    private SetLogLevel command;
+    private Hashtable properties;
+    private ByteArrayOutputStream stderr;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        properties = new Hashtable();
+        stderr = new ByteArrayOutputStream();
+        System.setErr(new PrintStream(stderr));
+
+        final Configuration configuration = EasyMock.createMock(Configuration.class);
+        EasyMock.expect(configuration.getProperties()).andReturn(properties);
+        configuration.update(properties);
+        EasyMock.replay(configuration);
+        
+        command = new SetLogLevel() {
+            @Override
+            protected Configuration getConfiguration() throws IOException {
+                return configuration;
+            }
+        };
+    }
+    
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        System.setErr(ORIGINAL_STDERR);
+    }
+    
+    public void testInvalidLogLevel() throws Exception {
+        runCommand("log:set INVALID");
+        assertTrue("Expected an error message on System.err",
+                   stderr.toString().contains("level must be set to"));
+    }
+    
+    public void testSetLogLevel() throws Exception {
+        runCommand("log:set INFO org.apache.karaf.test");
+        
+        assertEquals("INFO", properties.get(PACKAGE_LOGGER));
+    }
+    
+    public void testSetRootLogLevel() throws Exception {
+        runCommand("log:set INFO");
+        
+        assertEquals("INFO", properties.get(ROOT_LOGGER));
+    }
+    
+    public void testSetLogLevelLowerCase() throws Exception {
+        runCommand("log:set info org.apache.karaf.test");
+        
+        assertEquals("INFO", properties.get(PACKAGE_LOGGER));
+    }
+    
+    public void testSetRootLogLevelLowerCase() throws Exception {
+        runCommand("log:set info");
+        
+        assertEquals("INFO", properties.get(ROOT_LOGGER));
+    }
+    
+    public void testChangeLogLevel() throws Exception {
+        properties.put(PACKAGE_LOGGER, "DEBUG");
+        
+        runCommand("log:set INFO org.apache.karaf.test");
+        
+        assertEquals("INFO", properties.get(PACKAGE_LOGGER));
+    }
+    
+    public void testChangeRootLogLevel() throws Exception {
+        properties.put(ROOT_LOGGER, "DEBUG");
+        
+        runCommand("log:set INFO");
+        
+        assertEquals("INFO", properties.get(ROOT_LOGGER));
+    }
+    
+    public void testChangeLogLevelWithAppender() throws Exception {
+        properties.put(PACKAGE_LOGGER, "DEBUG, APPENDER1");
+        
+        runCommand("log:set INFO org.apache.karaf.test");
+        
+        assertEquals("INFO, APPENDER1", properties.get(PACKAGE_LOGGER));
+    }
+    
+    public void testChangeRootLogLevelWithAppender() throws Exception {
+        properties.put(ROOT_LOGGER, "DEBUG, APPENDER1");
+        
+        runCommand("log:set INFO");
+        
+        assertEquals("INFO, APPENDER1", properties.get(ROOT_LOGGER));
+    }
+    
+    
+    public void testUnsetLogLevel() throws Exception {
+        properties.put(PACKAGE_LOGGER, "DEBUG");
+
+        runCommand("log:set DEFAULT org.apache.karaf.test");
+        
+        assertFalse("Configuration for logger org.apache.karaf.test has been removed", 
+                    properties.containsKey(PACKAGE_LOGGER));
+    }
+    
+    
+    public void testUnsetRootLogLevel() throws Exception {
+        properties.put(ROOT_LOGGER, "INFO");
+        
+        runCommand("log:set DEFAULT");
+        
+        assertEquals("Configuration for root logger should not be removed",
+                     "INFO", properties.get(ROOT_LOGGER));
+        assertTrue("Expected an error message on System.err",
+                   stderr.toString().contains("Can not unset the ROOT logger"));
+    }
+    
+    /*
+     * Simulate running the log:set command
+     */
+    private void runCommand(String commandline) throws Exception {
+        String[] parts = commandline.split(" ");
+
+        command.level = parts[1];
+        if (parts.length == 3) {
+            command.logger = "org.apache.karaf.test";
+        }
+        
+        command.doExecute();
+    }
+}
diff --git a/karaf-2.2.x/shell/log/src/test/java/org/apache/karaf/shell/log/completers/LogLevelCompleterTest.java b/karaf-2.2.x/shell/log/src/test/java/org/apache/karaf/shell/log/completers/LogLevelCompleterTest.java
new file mode 100644
index 0000000..6bc34cd
--- /dev/null
+++ b/karaf-2.2.x/shell/log/src/test/java/org/apache/karaf/shell/log/completers/LogLevelCompleterTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.log.completers;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.karaf.shell.log.Level;
+
+import junit.framework.TestCase;
+
+/**
+ * Test cases for {@link LogLevelCompleter}
+ */
+public class LogLevelCompleterTest extends TestCase {
+    
+    private final LogLevelCompleter completer = new LogLevelCompleter();
+    
+    public void testComplete() throws Exception {
+        assertCompletions("I", Level.INFO.name());
+        assertCompletions("D", Level.DEBUG.name(), Level.DEFAULT.name());
+    }
+    
+    public void testCompleteLowerCase() throws Exception {
+        assertCompletions("i", Level.INFO.name());
+        assertCompletions("d", Level.DEBUG.name(), Level.DEFAULT.name());
+    }
+    
+    public void testCompleteWithNullBuffer() throws Exception {
+        // an empty buffer should return all available options
+        assertCompletions(null, Level.strings());
+    }
+
+    private void assertCompletions(String buffer, String... results) {
+        List<String> candidates = new LinkedList<String>();
+        assertEquals("Completer should have found a match", 0, completer.complete(buffer, 0, candidates));
+        assertEquals(results.length, candidates.size());
+        for (String result : results) {
+            assertContains(result, candidates);
+        }
+    }
+    
+    private void assertContains(String value, List<String> values) {
+        for (String element : values) {
+            if (value.trim().equals(element.trim())) {
+                return;
+            }
+        }
+        fail("Element " + value + " not found in array");
+    }
+}
diff --git a/karaf-2.2.x/shell/obr/NOTICE b/karaf-2.2.x/shell/obr/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/obr/pom.xml b/karaf-2.2.x/shell/obr/pom.xml
new file mode 100644
index 0000000..ca28872
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.obr</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: OBR Commands</name>
+    <description>This bundle provides Karaf shell commands to manipulate the OBR service.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.bundlerepository</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/AddUrlCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/AddUrlCommand.java
new file mode 100644
index 0000000..7118e81
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/AddUrlCommand.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.karaf.shell.obr;
+
+import java.util.List;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "addUrl", description = "Adds a list of repository URLs to the OBR service.")
+public class AddUrlCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "Repository URLs to add to the OBR service separated by whitespaces", required = true, multiValued = true)
+    List<String> urls;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        for (String url : urls) {
+            admin.addRepository(url);
+        }
+        persistRepositoryList(admin);
+    }
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/DeployCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/DeployCommand.java
new file mode 100644
index 0000000..16cdbec
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/DeployCommand.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.obr;
+
+import java.util.List;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+
+@Command(scope = "obr", name = "deploy", description = "Deploys a list of bundles using OBR service.")
+public class DeployCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "bundles", description = "List of bundle names to deploy (separated by whitespaces)", required = true, multiValued = true)
+    protected List<String> bundles;
+
+    @Option(name = "-s", aliases = { "--start" }, description = "Start all deployed bundles", required = false, multiValued = false)
+    protected boolean start = false;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        doDeploy(admin, bundles, start);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/FindCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/FindCommand.java
new file mode 100644
index 0000000..f9dc70e
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/FindCommand.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.obr;
+
+import org.apache.felix.bundlerepository.Capability;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+import java.io.PrintStream;
+import java.lang.reflect.Array;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+@Command(scope = "obr", name = "find", description = "Find OBR bundles for a given filter.")
+public class FindCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "requirements", description = "Requirement", required = true, multiValued = true)
+    List<String> requirements;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        Resource[] resources = admin.discoverResources(parseRequirements(admin, requirements));
+        if (resources == null)
+        {
+            System.err.println("No matching resources.");
+        }
+        else
+        {
+            for (int resIdx = 0; resIdx < resources.length; resIdx++)
+            {
+                if (resIdx > 0)
+                {
+                    System.out.println("");
+                }
+                printResource(System.out, resources[resIdx]);
+            }
+        }
+    }
+
+    private void printResource(PrintStream out, Resource resource)
+    {
+        String name = resource.getPresentationName();
+        if (name == null) {
+            name = resource.getSymbolicName();
+        }
+
+        printUnderline(out, name.length());
+        out.println(name);
+        printUnderline(out, name    .length());
+
+        Map map = resource.getProperties();
+        for (Iterator iter = map.entrySet().iterator(); iter.hasNext(); )
+        {
+            Map.Entry entry = (Map.Entry) iter.next();
+            if (entry.getValue().getClass().isArray())
+            {
+                out.println(entry.getKey() + ":");
+                for (int j = 0; j < Array.getLength(entry.getValue()); j++)
+                {
+                    out.println("   " + Array.get(entry.getValue(), j));
+                }
+            }
+            else
+            {
+                out.println(entry.getKey() + ": " + entry.getValue());
+            }
+        }
+
+        Requirement[] reqs = resource.getRequirements();
+        if ((reqs != null) && (reqs.length > 0))
+        {
+            boolean hdr = false;
+            for (int i = 0; i < reqs.length; i++)
+            {
+                if (!reqs[i].isOptional())
+                {
+                    if (!hdr)
+                    {
+                        hdr = true;
+                        out.println("Requirements:");
+                    }
+                    out.println("   " + reqs[i].getName() + ":" + reqs[i].getFilter());
+                }
+            }
+            hdr = false;
+            for (int i = 0; i < reqs.length; i++)
+            {
+                if (reqs[i].isOptional())
+                {
+                    if (!hdr)
+                    {
+                        hdr = true;
+                        out.println("Optional Requirements:");
+                    }
+                    out.println("   " + reqs[i].getName() + ":" + reqs[i].getFilter());
+                }
+            }
+        }
+
+        Capability[] caps = resource.getCapabilities();
+        if ((caps != null) && (caps.length > 0))
+        {
+            out.println("Capabilities:");
+            for (int i = 0; i < caps.length; i++)
+            {
+                out.println("   " + caps[i].getName() + ":" + caps[i].getPropertiesAsMap());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/InfoCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/InfoCommand.java
new file mode 100644
index 0000000..0dbc918
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/InfoCommand.java
@@ -0,0 +1,106 @@
+/*
+ * 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.karaf.shell.obr;
+
+import java.io.PrintStream;
+import java.lang.reflect.Array;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.bundlerepository.Capability;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "info", description = "Prints information about OBR bundles.")
+public class InfoCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "bundles", description = "Specify bundles to query for information (separated by whitespaces)", required = true, multiValued = true)
+    List<String> bundles;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        for (String bundle : bundles) {
+            String[] target = getTarget(bundle);
+            Resource[] resources = searchRepository(admin, target[0], target[1]);
+            if (resources == null)
+            {
+                System.err.println("Unknown bundle and/or version: "
+                    + target[0]);
+            }
+            else
+            {
+                for (int resIdx = 0; resIdx < resources.length; resIdx++)
+                {
+                    if (resIdx > 0)
+                    {
+                        System.out.println("");
+                    }
+                    printResource(System.out, resources[resIdx]);
+                }
+            }
+        }
+    }
+
+    private void printResource(PrintStream out, Resource resource)
+    {
+        printUnderline(out, resource.getPresentationName().length());
+        out.println(resource.getPresentationName());
+        printUnderline(out, resource.getPresentationName().length());
+
+        Map map = resource.getProperties();
+        for (Iterator iter = map.entrySet().iterator(); iter.hasNext(); )
+        {
+            Map.Entry entry = (Map.Entry) iter.next();
+            if (entry.getValue().getClass().isArray())
+            {
+                out.println(entry.getKey() + ":");
+                for (int j = 0; j < Array.getLength(entry.getValue()); j++)
+                {
+                    out.println("   " + Array.get(entry.getValue(), j));
+                }
+            }
+            else
+            {
+                out.println(entry.getKey() + ": " + entry.getValue());
+            }
+        }
+
+        Requirement[] reqs = resource.getRequirements();
+        if ((reqs != null) && (reqs.length > 0))
+        {
+            out.println("Requires:");
+            for (int i = 0; i < reqs.length; i++)
+            {
+                out.println("   " + reqs[i].getName() + ":" + reqs[i].getFilter());
+            }
+        }
+
+        Capability[] caps = resource.getCapabilities();
+        if ((caps != null) && (caps.length > 0))
+        {
+            out.println("Capabilities:");
+            for (int i = 0; i < caps.length; i++)
+            {
+                out.println("   " + caps[i].getName() + ":" + caps[i].getPropertiesAsMap());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListCommand.java
new file mode 100644
index 0000000..ad3b185
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListCommand.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.obr;
+
+import java.util.List;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Resource;
+import org.osgi.framework.Version;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "list", description = "Lists OBR bundles, optionally providing the given packages.")
+public class ListCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "packages", description = "A list of packages separated by whitespaces.", required = false, multiValued = true)
+    List<String> packages;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        String substr = null;
+
+        if (packages != null) {
+            for (String arg : packages)
+            {
+                // Add a space in between tokens.
+                if (substr == null)
+                {
+                    substr = "";
+                }
+                else
+                {
+                    substr += " ";
+                }
+
+                substr += arg;
+            }
+        }
+        
+        StringBuffer sb = new StringBuffer();
+        if ((substr == null) || (substr.length() == 0))
+        {
+            sb.append("(|(presentationname=*)(symbolicname=*))");
+        }
+        else
+        {
+            sb.append("(|(presentationname=*");
+            sb.append(substr);
+            sb.append("*)(symbolicname=*");
+            sb.append(substr);
+            sb.append("*))");
+        }
+        Resource[] resources = admin.discoverResources(sb.toString());
+        for (int resIdx = 0; (resources != null) && (resIdx < resources.length); resIdx++)
+        {
+            String name = resources[resIdx].getPresentationName();
+            String bundleSymbolicName = resources[resIdx].getSymbolicName();
+            Version version = resources[resIdx].getVersion();
+            
+            StringBuffer outputString = new StringBuffer();
+            if(bundleSymbolicName != null )
+            {
+            	outputString.append(bundleSymbolicName);
+            	outputString.append(" - ");            	
+            }
+            if(name != null)
+            {
+            	outputString.append(name);
+            	outputString.append(" ");
+            }
+            if(version != null)
+            {
+            	outputString.append("(");
+            	outputString.append(version);
+            	outputString.append(")");
+            }
+            
+            System.out.println(outputString.toString());
+        }
+
+        if (resources == null)
+        {
+            System.out.println("No matching bundles.");
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListUrlCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListUrlCommand.java
new file mode 100644
index 0000000..c5abc0e
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListUrlCommand.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.karaf.shell.obr;
+
+import org.apache.felix.bundlerepository.Repository;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "listUrl", description = "Displays the repository URLs currently associated with the OBR service.")
+public class ListUrlCommand extends ObrCommandSupport {
+
+    protected void doExecute(RepositoryAdmin admin) {
+        Repository[] repos = admin.listRepositories();
+        if ((repos != null) && (repos.length > 0)) {
+            for (int i = 0; i < repos.length; i++) {
+                System.out.println(repos[i].getURI());
+            }
+        } else {
+            System.out.println("No repository URLs are set.");
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ObrCommandSupport.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ObrCommandSupport.java
new file mode 100644
index 0000000..67b0409
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ObrCommandSupport.java
@@ -0,0 +1,313 @@
+/*
+ * 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.karaf.shell.obr;
+
+import java.io.*;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.bundlerepository.Reason;
+import org.apache.felix.bundlerepository.Repository;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.bundlerepository.Resolver;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+
+public abstract class ObrCommandSupport extends OsgiCommandSupport {
+
+    protected static final char VERSION_DELIM = ',';
+
+    protected Object doExecute() throws Exception {
+        // Get repository admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(RepositoryAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("RepositoryAdmin service is unavailable.");
+            return null;
+        }
+        try {
+            RepositoryAdmin admin = (RepositoryAdmin) getBundleContext().getService(ref);
+            if (admin == null) {
+                System.out.println("RepositoryAdmin service is unavailable.");
+                return null;
+            }
+
+            doExecute(admin);
+        }
+        finally {
+            getBundleContext().ungetService(ref);
+        }
+        return null;
+    }
+
+    protected abstract void doExecute(RepositoryAdmin admin) throws Exception;
+
+    protected Resource[] searchRepository(RepositoryAdmin admin, String targetId, String targetVersion) throws InvalidSyntaxException
+    {
+        // Try to see if the targetId is a bundle ID.
+        try
+        {
+            Bundle bundle = getBundleContext().getBundle(Long.parseLong(targetId));
+            targetId = bundle.getSymbolicName();
+        }
+        catch (NumberFormatException ex)
+        {
+            // It was not a number, so ignore.
+        }
+
+        // The targetId may be a bundle name or a bundle symbolic name,
+        // so create the appropriate LDAP query.
+        StringBuffer sb = new StringBuffer("(|(presentationname=");
+        sb.append(targetId);
+        sb.append(")(symbolicname=");
+        sb.append(targetId);
+        sb.append("))");
+        if (targetVersion != null)
+        {
+            sb.insert(0, "(&");
+            sb.append("(version=");
+            sb.append(targetVersion);
+            sb.append("))");
+        }
+        return admin.discoverResources(sb.toString());
+    }
+
+    public Resource selectNewestVersion(Resource[] resources)
+    {
+        int idx = -1;
+        Version v = null;
+        for (int i = 0; (resources != null) && (i < resources.length); i++)
+        {
+            if (i == 0)
+            {
+                idx = 0;
+                v = resources[i].getVersion();
+            }
+            else
+            {
+                Version vtmp = resources[i].getVersion();
+                if (vtmp.compareTo(v) > 0)
+                {
+                    idx = i;
+                    v = vtmp;
+                }
+            }
+        }
+        return (idx < 0) ? null : resources[idx];
+    }
+
+    protected String[] getTarget(String bundle) {
+        String[] target;
+        int idx = bundle.indexOf(VERSION_DELIM);
+        if (idx > 0) {
+            target = new String[] { bundle.substring(0, idx), bundle.substring(idx+1) };
+        }
+        else
+        {
+            target = new String[] { bundle, null };
+        }
+        return target;
+    }
+
+    protected void printUnderline(PrintStream out, int length)
+    {
+        for (int i = 0; i < length; i++)
+        {
+            out.print('-');
+        }
+        out.println("");
+    }
+
+    protected void doDeploy(RepositoryAdmin admin, List<String> bundles, boolean start) throws Exception {
+        Resolver resolver = admin.resolver();
+        for (String bundle : bundles) {
+            String[] target = getTarget(bundle);
+            Resource resource = selectNewestVersion(searchRepository(admin, target[0], target[1]));
+            if (resource != null)
+            {
+                resolver.add(resource);
+            }
+            else
+            {
+                System.err.println("Unknown bundle - " + target[0]);
+            }
+        }
+        if ((resolver.getAddedResources() != null) &&
+            (resolver.getAddedResources().length > 0))
+        {
+            if (resolver.resolve())
+            {
+                System.out.println("Target resource(s):");
+                printUnderline(System.out, 19);
+                Resource[] resources = resolver.getAddedResources();
+                for (int resIdx = 0; (resources != null) && (resIdx < resources.length); resIdx++)
+                {
+                    System.out.println("   " + resources[resIdx].getPresentationName()
+                        + " (" + resources[resIdx].getVersion() + ")");
+                }
+                resources = resolver.getRequiredResources();
+                if ((resources != null) && (resources.length > 0))
+                {
+                    System.out.println("\nRequired resource(s):");
+                    printUnderline(System.out, 21);
+                    for (int resIdx = 0; resIdx < resources.length; resIdx++)
+                    {
+                        System.out.println("   " + resources[resIdx].getPresentationName()
+                            + " (" + resources[resIdx].getVersion() + ")");
+                    }
+                }
+                resources = resolver.getOptionalResources();
+                if ((resources != null) && (resources.length > 0))
+                {
+                    System.out.println("\nOptional resource(s):");
+                    printUnderline(System.out, 21);
+                    for (int resIdx = 0; resIdx < resources.length; resIdx++)
+                    {
+                        System.out.println("   " + resources[resIdx].getPresentationName()
+                            + " (" + resources[resIdx].getVersion() + ")");
+                    }
+                }
+
+                try
+                {
+                    System.out.print("\nDeploying...");
+                    resolver.deploy(start ? Resolver.START : 0);
+                    System.out.println("done.");
+                }
+                catch (IllegalStateException ex)
+                {
+                    System.err.println(ex);
+                }
+            }
+            else
+            {
+                Reason[] reqs = resolver.getUnsatisfiedRequirements();
+                if ((reqs != null) && (reqs.length > 0))
+                {
+                    System.out.println("Unsatisfied requirement(s):");
+                    printUnderline(System.out, 27);
+                    for (int reqIdx = 0; reqIdx < reqs.length; reqIdx++)
+                    {
+                        System.out.println("   " + reqs[reqIdx].getRequirement().getFilter());
+                        System.out.println("      " + reqs[reqIdx].getResource().getPresentationName());
+                    }
+                }
+                else
+                {
+                    System.out.println("Could not resolve targets.");
+                }
+            }
+        }
+
+    }
+
+
+    protected Requirement parseRequirement(RepositoryAdmin admin, String req) throws InvalidSyntaxException {
+        int p = req.indexOf(':');
+        String name;
+        String filter;
+        if (p > 0) {
+            name = req.substring(0, p);
+            filter = req.substring(p + 1);
+        } else {
+            if (req.contains("package")) {
+                name = "package";
+            } else if (req.contains("service")) {
+                name = "service";
+            } else {
+                name = "bundle";
+            }
+            filter = req;
+        }
+        if (!filter.startsWith("(")) {
+            filter = "(" + filter + ")";
+        }
+        return admin.getHelper().requirement(name, filter);
+    }
+
+    protected Requirement[] parseRequirements(RepositoryAdmin admin, List<String> requirements) throws InvalidSyntaxException {
+        Requirement[] reqs = new Requirement[requirements.size()];
+        for (int i = 0; i < reqs.length; i++) {
+            reqs[i] = parseRequirement(admin, requirements.get(i));
+        }
+        return reqs;
+    }
+
+    public static final String REPOSITORY_URL_PROP = "obr.repository.url";
+
+    protected void persistRepositoryList(RepositoryAdmin admin) {
+        try {
+            StringBuilder sb = new StringBuilder();
+            for (Repository repo : admin.listRepositories()) {
+                if (sb.length() > 0) {
+                    sb.append(" ");
+                }
+                sb.append(repo.getURI());
+            }
+            File base = new File(System.getProperty("karaf.base"));
+            File sys = new File(base, "etc/config.properties");
+            File sysTmp = new File(base, "etc/config.properties.tmp");
+
+            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(sysTmp)));
+            boolean modified = false;
+            try {
+                if (sys.exists()) {
+                    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(sys)));
+                    try {
+                        String line = reader.readLine();
+                        while (line != null) {
+                            if (line.matches("obr\\.repository\\.url[:= ].*")) {
+                                modified = true;
+                                line = "obr.repository.url = " + sb.toString();
+                            }
+                            writer.write(line);
+                            writer.newLine();
+                            line = reader.readLine();
+                        }
+                    } finally {
+                        reader.close();
+                    }
+                }
+                if (!modified) {
+                    writer.newLine();
+                    writer.write("# ");
+                    writer.newLine();
+                    writer.write("# OBR Repository list");
+                    writer.newLine();
+                    writer.write("# ");
+                    writer.newLine();
+                    writer.write("obr.repository.url = " + sb.toString());
+                    writer.newLine();
+                    writer.newLine();
+                }
+            } finally {
+                writer.close();
+            }
+
+            sys.delete();
+            sysTmp.renameTo(sys);
+
+        } catch (Exception e) {
+            System.err.println("Error while persisting repository list");
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RefreshUrlCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RefreshUrlCommand.java
new file mode 100644
index 0000000..514def9
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RefreshUrlCommand.java
@@ -0,0 +1,47 @@
+/*
+ * 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.karaf.shell.obr;
+
+import java.util.List;
+
+import org.apache.felix.bundlerepository.Repository;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "refreshUrl", description = "Reloads the repositories to obtain a fresh list of bundles.")
+public class RefreshUrlCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "Repository URLs to refresh (leave empty for all)", required = false, multiValued = true)
+    List<String> urls;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+		if (urls != null && !urls.isEmpty()) {
+			for (String url : urls) {
+				admin.addRepository(url);
+			}
+		} else {
+			Repository[] repos = admin.listRepositories();
+			if ((repos != null) && (repos.length > 0)) {
+				for (int i = 0; i < repos.length; i++) {
+					admin.addRepository(repos[i].getURI());
+				}
+			}
+		}
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RemoveUrlCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RemoveUrlCommand.java
new file mode 100644
index 0000000..7468d57
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RemoveUrlCommand.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.karaf.shell.obr;
+
+import java.util.List;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "removeUrl", description = "Removes a list of repository URLs from the OBR service.")
+public class RemoveUrlCommand extends ObrCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "Repository URLs to remove from OBR service", required = true, multiValued = true)
+    List<String> urls;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        for (String url : urls) {
+            admin.removeRepository(url);
+        }
+        persistRepositoryList(admin);
+    }
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ResolveCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ResolveCommand.java
new file mode 100644
index 0000000..4cd4954
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ResolveCommand.java
@@ -0,0 +1,143 @@
+/*
+ * 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.karaf.shell.obr;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.felix.bundlerepository.Reason;
+import org.apache.felix.bundlerepository.Repository;
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Requirement;
+import org.apache.felix.bundlerepository.Resolver;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+
+@Command(scope = "obr", name = "resolve", description = "Shows the resolution output for a given set of requirements.")
+public class ResolveCommand extends ObrCommandSupport {
+
+    @Option(name = "-w", aliases = "--why", description = "Display the reason of the inclusion of the resource")
+    boolean why;
+
+    @Option(name = "-l", aliases = "--no-local", description = "Ignore local resources during resolution")
+    boolean noLocal;
+
+    @Option(name = "--no-remote", description = "Ignore remote resources during resolution")
+    boolean noRemote;
+
+    @Option(name = "--deploy", description = "Deploy the selected bundles")
+    boolean deploy;
+
+    @Option(name = "--start", description = "Deploy and start the selected bundles")
+    boolean start;
+
+    @Option(name = "--optional", description = "Resolve optional dependencies")
+    boolean optional;
+
+    @Argument(index = 0, name = "requirements", description = "Requirements", required = true, multiValued = true)
+    List<String> requirements;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        List<Repository> repositories = new ArrayList<Repository>();
+        repositories.add(admin.getSystemRepository());
+        if (!noLocal) {
+            repositories.add(admin.getLocalRepository());
+        }
+        if (!noRemote) {
+            repositories.addAll(Arrays.asList(admin.listRepositories()));
+        }
+        Resolver resolver = admin.resolver(repositories.toArray(new Repository[repositories.size()]));
+        for (Requirement requirement : parseRequirements(admin, requirements)) {
+            resolver.add(requirement);
+        }
+        if (resolver.resolve(optional ? 0 : Resolver.NO_OPTIONAL_RESOURCES)) {
+            Resource[] resources;
+            resources = resolver.getRequiredResources();
+            if ((resources != null) && (resources.length > 0)) {
+                System.out.println("Required resource(s):");
+                printUnderline(System.out, 21);
+                for (int resIdx = 0; resIdx < resources.length; resIdx++) {
+                    System.out.println("   " + resources[resIdx].getPresentationName() + " (" + resources[resIdx].getVersion() + ")");
+                    if (why) {
+                        Reason[] req = resolver.getReason(resources[resIdx]);
+                        for (int reqIdx = 0; req != null && reqIdx < req.length; reqIdx++) {
+                            if (!req[reqIdx].getRequirement().isOptional()) {
+                                Resource r = req[reqIdx].getResource();
+                                if (r != null) {
+                                    System.out.println("      - " + r.getPresentationName() + " / " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
+                                } else {
+                                    System.out.println("      - " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            resources = resolver.getOptionalResources();
+            if ((resources != null) && (resources.length > 0)) {
+                System.out.println();
+                System.out.println("Optional resource(s):");
+                printUnderline(System.out, 21);
+                for (int resIdx = 0; resIdx < resources.length; resIdx++) {
+                    System.out.println("   " + resources[resIdx].getPresentationName()
+                        + " (" + resources[resIdx].getVersion() + ")");
+                    if (why) {
+                        Reason[] req = resolver.getReason(resources[resIdx]);
+                        for (int reqIdx = 0; req != null && reqIdx < req.length; reqIdx++) {
+                            if (!req[reqIdx].getRequirement().isOptional()) {
+                                Resource r = req[reqIdx].getResource();
+                                if (r != null) {
+                                    System.out.println("      - " + r.getPresentationName() + " / " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
+                                } else {
+                                    System.out.println("      - " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if (deploy || start) {
+                try
+                {
+                    System.out.print("\nDeploying...");
+                    resolver.deploy(start ? Resolver.START : 0);
+                    System.out.println("done.");
+                }
+                catch (IllegalStateException ex)
+                {
+                    System.err.println(ex);
+                }
+            }
+        } else {
+            Reason[] reqs = resolver.getUnsatisfiedRequirements();
+            if ((reqs != null) && (reqs.length > 0)) {
+                System.out.println("Unsatisfied requirement(s):");
+                printUnderline(System.out, 27);
+                for (int reqIdx = 0; reqIdx < reqs.length; reqIdx++) {
+                    System.out.println("   " + reqs[reqIdx].getRequirement().getName() + ":" + reqs[reqIdx].getRequirement().getFilter());
+                    System.out.println("      " +reqs[reqIdx].getResource().getPresentationName());
+                }
+            } else {
+                System.out.println("Could not resolve targets.");
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/SourceCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/SourceCommand.java
new file mode 100644
index 0000000..8f977fc
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/SourceCommand.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.obr;
+
+import java.net.URI;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.bundlerepository.Resource;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.obr.util.FileUtil;
+
+@Command(scope = "obr", name = "source", description = "Downloads the sources for an OBR bundle.")
+public class SourceCommand extends ObrCommandSupport {
+
+    @Option(name = "-x", aliases = {}, description = "Extract the archive", required = false, multiValued = false)
+    boolean extract;
+
+    @Argument(index = 0, name = "folder", description = "Local folder for storing sources", required = true, multiValued = false)
+    String localDir;
+
+    @Argument(index = 1, name = "bundles", description = "List of bundles to download the sources for", required = true, multiValued = true)
+    List<String> bundles;
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        for (String bundle : bundles) {
+            String[] target = getTarget(bundle);
+            Resource resource = selectNewestVersion(searchRepository(admin, target[0], target[1]));
+            if (resource == null)
+            {
+                System.err.println("Unknown bundle and/or version: " + target[0]);
+            }
+            else
+            {
+                URI srcURL = (URI) resource.getProperties().get(Resource.SOURCE_URI);
+                if (srcURL != null)
+                {
+                    FileUtil.downloadSource(System.out, System.err, srcURL.toURL(), localDir, extract);
+                }
+                else
+                {
+                    System.err.println("Missing source URL: " + target[0]);
+                }
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/StartCommand.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/StartCommand.java
new file mode 100644
index 0000000..0abcdc1
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/StartCommand.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.obr;
+
+import org.apache.felix.bundlerepository.RepositoryAdmin;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "obr", name = "start", description = "Deploys and starts a list of bundles using OBR.")
+public class StartCommand extends DeployCommand {
+
+    protected void doExecute(RepositoryAdmin admin) throws Exception {
+        doDeploy(admin, bundles, true);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/util/FileUtil.java b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/util/FileUtil.java
new file mode 100644
index 0000000..fcc9580
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/util/FileUtil.java
@@ -0,0 +1,178 @@
+/*
+ * 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.karaf.shell.obr.util;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.PrintStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+
+public class FileUtil
+{
+    public static void downloadSource(
+        PrintStream out, PrintStream err,
+        URL srcURL, String dirStr, boolean extract)
+    {
+        // Get the file name from the URL.
+        String fileName = (srcURL.getFile().lastIndexOf('/') > 0)
+            ? srcURL.getFile().substring(srcURL.getFile().lastIndexOf('/') + 1)
+            : srcURL.getFile();
+
+        try
+        {
+            out.println("Connecting...");
+
+            File dir = new File(dirStr);
+            if (!dir.exists())
+            {
+                err.println("Destination directory does not exist.");
+            }
+            File file = new File(dir, fileName);
+
+            OutputStream os = new FileOutputStream(file);
+            URLConnection conn = srcURL.openConnection();
+            int total = conn.getContentLength();
+            InputStream is = conn.getInputStream();
+
+            if (total > 0)
+            {
+                out.println("Downloading " + fileName
+                    + " ( " + total + " bytes ).");
+            }
+            else
+            {
+                out.println("Downloading " + fileName + ".");
+            }
+            byte[] buffer = new byte[4096];
+            int count = 0;
+            for (int len = is.read(buffer); len > 0; len = is.read(buffer))
+            {
+                count += len;
+                os.write(buffer, 0, len);
+            }
+
+            os.close();
+            is.close();
+
+            if (extract)
+            {
+                is = new FileInputStream(file);
+                JarInputStream jis = new JarInputStream(is);
+                out.println("Extracting...");
+                unjar(jis, dir);
+                jis.close();
+                file.delete();
+            }
+        }
+        catch (Exception ex)
+        {
+            err.println(ex);
+        }
+    }
+
+    public static void unjar(JarInputStream jis, File dir)
+        throws IOException
+    {
+        // Reusable buffer.
+        byte[] buffer = new byte[4096];
+
+        // Loop through JAR entries.
+        for (JarEntry je = jis.getNextJarEntry();
+             je != null;
+             je = jis.getNextJarEntry())
+        {
+            if (je.getName().startsWith("/"))
+            {
+                throw new IOException("JAR resource cannot contain absolute paths.");
+            }
+
+            File target = new File(dir, je.getName());
+
+            // Check to see if the JAR entry is a directory.
+            if (je.isDirectory())
+            {
+                if (!target.exists())
+                {
+                    if (!target.mkdirs())
+                    {
+                        throw new IOException("Unable to create target directory: "
+                            + target);
+                    }
+                }
+                // Just continue since directories do not have content to copy.
+                continue;
+            }
+
+            int lastIndex = je.getName().lastIndexOf('/');
+            String name = (lastIndex >= 0) ?
+                je.getName().substring(lastIndex + 1) : je.getName();
+            String destination = (lastIndex >= 0) ?
+                je.getName().substring(0, lastIndex) : "";
+
+            // JAR files use '/', so convert it to platform separator.
+            destination = destination.replace('/', File.separatorChar);
+            copy(jis, dir, name, destination, buffer);
+        }
+    }
+
+    public static void copy(
+        InputStream is, File dir, String destName, String destDir, byte[] buffer)
+        throws IOException
+    {
+        if (destDir == null)
+        {
+            destDir = "";
+        }
+
+        // Make sure the target directory exists and
+        // that is actually a directory.
+        File targetDir = new File(dir, destDir);
+        if (!targetDir.exists())
+        {
+            if (!targetDir.mkdirs())
+            {
+                throw new IOException("Unable to create target directory: "
+                    + targetDir);
+            }
+        }
+        else if (!targetDir.isDirectory())
+        {
+            throw new IOException("Target is not a directory: "
+                + targetDir);
+        }
+
+        BufferedOutputStream bos = new BufferedOutputStream(
+            new FileOutputStream(new File(targetDir, destName)));
+        int count = 0;
+        while ((count = is.read(buffer)) > 0)
+        {
+            bos.write(buffer, 0, count);
+        }
+        bos.close();
+    }
+}
diff --git a/karaf-2.2.x/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml b/karaf-2.2.x/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml
new file mode 100644
index 0000000..62c60fc
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml
@@ -0,0 +1,58 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="obr/addUrl">
+            <action class="org.apache.karaf.shell.obr.AddUrlCommand"/>
+        </command>
+        <command name="obr/deploy">
+            <action class="org.apache.karaf.shell.obr.DeployCommand"/>
+        </command>
+        <command name="obr/find">
+            <action class="org.apache.karaf.shell.obr.FindCommand"/>
+        </command>
+        <command name="obr/info">
+            <action class="org.apache.karaf.shell.obr.InfoCommand"/>
+        </command>
+        <command name="obr/list">
+            <action class="org.apache.karaf.shell.obr.ListCommand"/>
+        </command>
+        <command name="obr/listUrl">
+            <action class="org.apache.karaf.shell.obr.ListUrlCommand"/>
+        </command>
+        <command name="obr/refreshUrl">
+            <action class="org.apache.karaf.shell.obr.RefreshUrlCommand"/>
+        </command>
+        <command name="obr/removeUrl">
+            <action class="org.apache.karaf.shell.obr.RemoveUrlCommand"/>
+        </command>
+        <command name="obr/resolve">
+            <action class="org.apache.karaf.shell.obr.ResolveCommand"/>
+        </command>
+        <command name="obr/source">
+            <action class="org.apache.karaf.shell.obr.SourceCommand"/>
+        </command>
+        <command name="obr/start">
+            <action class="org.apache.karaf.shell.obr.StartCommand"/>
+        </command>
+    </command-bundle>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/obr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/obr/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..a04b1e6
--- /dev/null
+++ b/karaf-2.2.x/shell/obr/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,26 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Karaf shell commands to manipulate the Karaf embedded OBR (OSGi Bundle Repository).
+
+    The following commands are available:
+    \u001B[36mobr:addUrl\u001B[0m Adds a list of repository URLs to the OBR service.
+    \u001B[36mobr:deploy\u001B[0m Deploys a list of bundles using OBR service.
+    \u001B[36mobr:find\u001B[0m Find OBR bundles for a given filter.
+    \u001B[36mobr:info\u001B[0m Prints information about OBR bundles.
+    \u001B[36mobr:list\u001B[0m Lists OBR bundles.
+    \u001B[36mobr:listUrl\u001B[0m Displays the repository URLs currently associated with the OBR service.
+    \u001B[36mobr:refreshUrl\u001B[0m Reloads the repositories to obtain a fresh list of bundles.
+    \u001B[36mobr:removeUrl\u001B[0m Removes a list of repository URLs from the OBR service.
+    \u001B[36mobr:resolve\u001B[0m Shows the resolution output for a given set of requirements.
+    \u001B[36mobr:source\u001B[0m Downloads the sources for an OBR bundle.
+    \u001B[36mobr:start\u001B[0m Deploys and starts a list of bundles using OBR.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m and \u001B[36mProvisioning\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/osgi/NOTICE b/karaf-2.2.x/shell/osgi/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/osgi/pom.xml b/karaf-2.2.x/shell/osgi/pom.xml
new file mode 100644
index 0000000..7adeabd
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/pom.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.osgi</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: OSGi Commands</name>
+    <description>This bundle provides the low level OSGi Karaf shell commands.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-core</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.osgi</groupId>
+            <artifactId>spring-osgi-extender</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            org.springframework*;resolution:=optional,
+                            *
+                        </Import-Package>
+                        <DynamicImport-Package>
+                            org.springframework.*
+                        </DynamicImport-Package>
+                        <Private-Package>
+                            org.apache.karaf.util;-split-package:=merge-first,
+                            org.apache.felix.utils.version,
+                            org.apache.felix.utils.manifest,
+                            !*
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BlueprintListener.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BlueprintListener.java
new file mode 100644
index 0000000..c262f62
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BlueprintListener.java
@@ -0,0 +1,127 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.blueprint.container.BlueprintEvent;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+
+/**
+ *
+ * TODO: use event admin to receive WAIT topics notifications from blueprint extender
+ *
+ */
+public class BlueprintListener implements org.osgi.service.blueprint.container.BlueprintListener, BundleListener,
+                                            BundleStateListener, BundleStateListener.Factory
+{
+
+    public static enum BlueprintState {
+        Unknown,
+        Creating,
+        Created,
+        Destroying,
+        Destroyed,
+        Failure,
+        GracePeriod,
+        Waiting
+    }
+
+    private static final Logger LOG = LoggerFactory.getLogger(BlueprintListener.class);
+
+    private final Map<Long, BlueprintState> states;
+    private BundleContext bundleContext;
+
+    public BlueprintListener() {
+        this.states = new ConcurrentHashMap<Long, BlueprintState>();
+    }
+
+    public String getName() {
+        return "Blueprint   ";
+    }
+
+    public String getState(Bundle bundle) {
+        BlueprintState state = states.get(bundle.getBundleId());
+        if (state == null || bundle.getState() != Bundle.ACTIVE || state == BlueprintState.Unknown) {
+            return null;
+        }
+        return state.toString();
+    }
+
+    public BundleStateListener getListener() {
+        return this;
+    }
+
+    public BlueprintState getBlueprintState(Bundle bundle) {
+        BlueprintState state = states.get(bundle.getBundleId());
+        if (state == null || bundle.getState() != Bundle.ACTIVE) {
+            state = BlueprintState.Unknown;
+        }
+        return state;
+    }
+
+    public void blueprintEvent(BlueprintEvent blueprintEvent) {
+        BlueprintState state = getState(blueprintEvent);
+        LOG.debug("Blueprint app state changed to " + state + " for bundle " + blueprintEvent.getBundle().getBundleId());
+        states.put(blueprintEvent.getBundle().getBundleId(), state);
+    }
+
+    public void bundleChanged(BundleEvent event) {
+        if (event.getType() == BundleEvent.UNINSTALLED) {
+            states.remove(event.getBundle().getBundleId());
+        }
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void init() throws Exception {
+        bundleContext.addBundleListener(this);
+    }
+
+    public void destroy() throws Exception {
+        bundleContext.removeBundleListener(this);
+    }
+
+    private BlueprintState getState(BlueprintEvent blueprintEvent) {
+        switch (blueprintEvent.getType()) {
+            case BlueprintEvent.CREATING:
+                return BlueprintState.Creating;
+            case BlueprintEvent.CREATED:
+                return BlueprintState.Created;
+            case BlueprintEvent.DESTROYING:
+                return BlueprintState.Destroying;
+            case BlueprintEvent.DESTROYED:
+                return BlueprintState.Destroyed;
+            case BlueprintEvent.FAILURE:
+                return BlueprintState.Failure;
+            case BlueprintEvent.GRACE_PERIOD:
+                return BlueprintState.GracePeriod;
+            case BlueprintEvent.WAITING:
+                return BlueprintState.Waiting;
+            default:
+                return BlueprintState.Unknown;
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleCommand.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleCommand.java
new file mode 100644
index 0000000..474f94c
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleCommand.java
@@ -0,0 +1,48 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Argument;
+import org.osgi.framework.Bundle;
+
+public abstract class BundleCommand extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "id", description = "The bundle ID", required = true, multiValued  = false)
+    long id;
+
+    @Option(name = "--force", aliases = {}, description = "Forces the command to execute", required = false, multiValued = false)
+    boolean force;
+
+    protected Object doExecute() throws Exception {
+        Bundle bundle = getBundleContext().getBundle(id);
+        if (bundle == null) {
+            System.out.println("Bundle " + id + " not found");
+            return null;
+        }
+
+        if (!force && Util.isASystemBundle(getBundleContext(), bundle) && !Util.accessToSystemBundleIsAllowed(bundle.getBundleId(), session)) {
+            return null;
+        } else {
+            doExecute(bundle);
+            return null;
+        }
+    }
+
+    protected abstract void doExecute(Bundle bundle) throws Exception;
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleLevel.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleLevel.java
new file mode 100644
index 0000000..e61b6f9
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleLevel.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.osgi;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.startlevel.StartLevel;
+
+@Command(scope = "osgi", name = "bundle-level", description = "Gets or sets the start level of a given bundle.")
+public class BundleLevel extends BundleCommand {
+
+    @Argument(index = 1, name = "startLevel", description = "The bundle's new start level", required = false, multiValued = false)
+    Integer level;
+
+    protected void doExecute(Bundle bundle) throws Exception {
+        // Get package admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(StartLevel.class.getName());
+        if (ref == null) {
+            System.out.println("StartLevel service is unavailable.");
+            return;
+        }
+        StartLevel sl = getService(StartLevel.class, ref);
+        if (sl == null) {
+            System.out.println("StartLevel service is unavailable.");
+            return;
+        }
+
+        if (level == null) {
+            System.out.println("Level " + sl.getBundleStartLevel(bundle));
+        }
+        else if ((level < 50) && sl.getBundleStartLevel(bundle) > 50){
+            for (;;) {
+                StringBuffer sb = new StringBuffer();
+                System.err.println("You are about to designate bundle as a system bundle.  Do you wish to continue (yes/no): ");
+                System.err.flush();
+                for (;;) {
+                    int c = System.in.read();
+                    if (c < 0) {
+                        return;
+                    }
+                    System.err.println((char) c);
+                    if (c == '\r' || c == '\n') {
+                        break;
+                    }
+                    sb.append((char) c);
+                }
+                String str = sb.toString();
+                if ("yes".equals(str)) {
+                    sl.setBundleStartLevel(bundle, level);
+                    break;
+                } else if ("no".equals(str)) {
+                    break;
+                }
+            }
+        } else {
+            sl.setBundleStartLevel(bundle, level);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleSelector.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleSelector.java
new file mode 100644
index 0000000..afb04e0
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleSelector.java
@@ -0,0 +1,178 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.felix.service.command.CommandSession;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+public class BundleSelector {
+
+    private final CommandSession session;
+    private final BundleContext bundleContext;
+    
+    public BundleSelector(BundleContext bundleContext, CommandSession session) {
+        this.bundleContext = bundleContext;
+        this.session = session;
+    }
+    
+    public List<Bundle> selectBundles(List<String> ids, boolean force) throws Exception {
+        List<Bundle> bundles = new ArrayList<Bundle>();
+        if (ids != null && !ids.isEmpty()) {
+            for (String id : ids) {
+
+                // id is a number
+                Pattern pattern = Pattern.compile("^\\d+$");
+                Matcher matcher = pattern.matcher(id);
+                if (matcher.find()) {
+                    Bundle bundle = this.getBundleById(id);
+                    addBundle(bundle, id, force, bundles);
+                    continue;
+                }
+
+                // id as a number range
+                pattern = Pattern.compile("^(\\d+)-(\\d+)$");
+                matcher = pattern.matcher(id);
+                if (matcher.find()) {
+                    int index = id.indexOf('-');
+                    long startId = Long.parseLong(id.substring(0, index));
+                    long endId = Long.parseLong(id.substring(index + 1));
+                    if (startId < endId) {
+                        for (long i = startId; i <= endId; i++) {
+                            Bundle bundle = bundleContext.getBundle(i);
+                            addBundle(bundle, String.valueOf(i), force, bundles);
+                        }
+                    }
+                    continue;
+                }
+
+                int index = id.indexOf('/');
+                List<Bundle> bundlesByName = null;
+                if (index != -1) {
+                    // user has provided name and version
+                    bundlesByName = getBundleByNameAndVersion(id.substring(0, index), id.substring(index + 1));
+                } else {
+                    // user has provided only the name
+                    bundlesByName = getBundleByName(id);
+                }
+                for (Bundle bundleByName : bundlesByName) {
+                    addBundle(bundleByName, id, force, bundles);
+                }
+            }
+
+        }
+
+        return bundles;
+    }
+
+    private void addBundle(Bundle bundle, String id, boolean force, List<Bundle> bundles) throws Exception {
+        if (bundle == null) {
+            // if the bundle is null here, it's because we didn't find it
+            System.err.println("Bundle " + id + " is invalid");
+        } else {
+            if (force || !Util.isASystemBundle(bundleContext, bundle) || Util.accessToSystemBundleIsAllowed(bundle.getBundleId(), session)) {
+                bundles.add(bundle);
+            }
+        }
+    }
+
+    /**
+     * Get a bundle identified by an id number.
+     *
+     * @param id the id number.
+     * @return the bundle or null if not found.
+     */
+    private Bundle getBundleById(String id) {
+        Bundle bundle = null;
+        try {
+            long idNumber = Long.parseLong(id);
+            bundle = bundleContext.getBundle(idNumber);
+        } catch (NumberFormatException nfe) {
+            // ignore
+        }
+        return bundle;
+    }
+
+    /**
+     * Get a bundles list with the name or symbolic name matching the pattern.
+     *
+     * @param name the bundle name or symbolic name pattern to match.
+     * @return the bundles list.
+     */
+    private List<Bundle> getBundleByName(String name) {
+        return getBundleByNameAndVersion(name, null);
+    }
+
+    /**
+     * Get a bundles list with the name or symbolic name matching the name pattern and version matching the version pattern.
+     *
+     * @param name    the bundle name or symbolic name regex to match.
+     * @param version the bundle version regex to match.
+     * @return the bundles list.
+     */
+    private List<Bundle> getBundleByNameAndVersion(String name, String version) {
+        Bundle[] bundles = bundleContext.getBundles();
+
+        ArrayList<Bundle> result = new ArrayList<Bundle>();
+
+        Pattern namePattern = Pattern.compile(name);
+
+        for (int i = 0; i < bundles.length; i++) {
+
+            String bundleSymbolicName = bundles[i].getSymbolicName();
+            // skip bundles without Bundle-SymbolicName header
+            if (bundleSymbolicName == null) {
+                continue;
+            }
+            
+            Matcher symbolicNameMatcher = namePattern.matcher(bundleSymbolicName);
+            
+            Matcher nameMatcher = null;
+            String bundleName = (String) bundles[i].getHeaders().get(Constants.BUNDLE_NAME);
+            if (bundleName != null) {
+                nameMatcher = namePattern.matcher(bundleName);
+            }
+
+            if (version != null) {
+                String bundleVersion = (String) bundles[i].getHeaders().get(Constants.BUNDLE_VERSION);
+                if (bundleVersion != null) {
+                    boolean nameMatch = (nameMatcher != null && nameMatcher.find()) || symbolicNameMatcher.find();
+                    if (nameMatch) {
+                        Pattern versionPattern = Pattern.compile(version);
+                        Matcher versionMatcher = versionPattern.matcher(bundleVersion);                    
+                        if (versionMatcher.find()) {
+                            result.add(bundles[i]);
+                        }
+                    }
+                }
+            } else {
+                boolean nameMatch = (nameMatcher != null && nameMatcher.find()) || symbolicNameMatcher.find();
+                if (nameMatch) {
+                    result.add(bundles[i]);
+                }
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleStateListener.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleStateListener.java
new file mode 100644
index 0000000..5324096
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleStateListener.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.karaf.shell.osgi;
+
+import org.osgi.framework.Bundle;
+
+public interface BundleStateListener {
+
+    public interface Factory {
+
+        BundleStateListener getListener();
+
+    }
+
+    String getName();
+
+    String getState(Bundle bundle);
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommand.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommand.java
new file mode 100644
index 0000000..a08048b
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommand.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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.osgi.framework.Bundle;
+
+public abstract class BundlesCommand extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "ids", description = "The list of bundle (identified by IDs or name or name/version) separated by whitespaces", required = true, multiValued = true)
+    List<String> ids;
+
+    @Option(name = "--force", aliases = {}, description = "Forces the command to execute", required = false, multiValued = false)
+    boolean force;
+
+    protected Object doExecute() throws Exception {
+        BundleSelector selector = new BundleSelector(getBundleContext(), session);      
+        List<Bundle> bundles = selector.selectBundles(ids, force);
+        doExecute(bundles);
+        return null;
+    }
+      
+    protected abstract void doExecute(List<Bundle> bundles) throws Exception;
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommandOptional.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommandOptional.java
new file mode 100644
index 0000000..85ba12e
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommandOptional.java
@@ -0,0 +1,50 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.osgi.framework.Bundle;
+
+public abstract class BundlesCommandOptional extends OsgiCommandSupport {
+    
+    @Argument(index = 0, name = "ids", description = "The list of bundle (identified by IDs or name or name/version) separated by whitespaces", required = false, multiValued = true)
+    List<String> ids;
+
+    @Option(name = "--force", aliases = {}, description = "Forces the command to execute", required = false, multiValued = false)
+    boolean force;
+
+    protected Object doExecute() throws Exception {
+        List<Bundle> bundles = null;
+        if (ids != null && !ids.isEmpty()) {
+            BundleSelector selector = new BundleSelector(getBundleContext(), session);      
+            bundles = selector.selectBundles(ids, force);
+        }
+        doExecute(bundles);
+        return null;
+    }
+
+    /**
+     * 
+     * @param bundles null if no bundle ids or names were specified.
+     * @throws Exception
+     */
+    protected abstract void doExecute(List<Bundle> bundles) throws Exception;
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Headers.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Headers.java
new file mode 100644
index 0000000..0f3218e
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Headers.java
@@ -0,0 +1,332 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.utils.manifest.Attribute;
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Directive;
+import org.apache.felix.utils.manifest.Parser;
+import org.apache.felix.utils.version.VersionRange;
+import org.fusesource.jansi.Ansi;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+@Command(scope = "osgi", name = "headers", description = "Displays OSGi headers of a given bundle.")
+public class Headers extends BundlesCommandOptional {
+
+    protected final static String BUNDLE_PREFIX = "Bundle-";
+    protected final static String PACKAGE_SUFFFIX = "-Package";
+    protected final static String SERVICE_SUFFIX = "-Service";
+    protected final static String IMPORT_PACKAGES_ATTRIB = "Import-Package";
+    protected final static String REQUIRE_BUNDLE_ATTRIB = "Require-Bundle";
+
+    private ServiceReference ref;
+    private PackageAdmin admin;
+
+    @Option(name = "--indent", description = "Indentation method")
+    int indent = -1;
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        // Get package admin service.
+        ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("PackageAdmin service is unavailable.");
+            return;
+        }
+
+        try {
+            admin = (PackageAdmin) getBundleContext().getService(ref);
+            if (admin == null) {
+                System.out.println("PackageAdmin service is unavailable.");
+                return;
+            }
+
+            if (bundles == null) {
+                Bundle[] allBundles = getBundleContext().getBundles();
+                for (int i = 0; i < allBundles.length; i++) {
+                    printHeaders(allBundles[i]);
+                }
+            } else {
+                for (Bundle bundle : bundles) {
+                    printHeaders(bundle);
+                }
+            }
+        } finally {
+            getBundleContext().ungetService(ref);
+        }
+    }
+
+    protected void printHeaders(Bundle bundle) {
+        String title = Util.getBundleName(bundle);
+        System.out.println("\n" + title);
+        System.out.println(Util.getUnderlineString(title));
+        if (indent == 0) {
+            Dictionary dict = bundle.getHeaders();
+            Enumeration keys = dict.keys();
+            while (keys.hasMoreElements()) {
+                Object k = keys.nextElement();
+                Object v = dict.get(k);
+                System.out.println(k + " = " + Util.getValueString(v));
+            }
+        } else {
+            System.out.println(generateFormattedOutput(bundle));
+        }
+    }
+
+    protected String generateFormattedOutput(Bundle bundle) {
+        StringBuilder output = new StringBuilder();
+        Map<String, Object> otherAttribs = new HashMap<String, Object>();
+        Map<String, Object> bundleAttribs = new HashMap<String, Object>();
+        Map<String, Object> serviceAttribs = new HashMap<String, Object>();
+        Map<String, Object> packagesAttribs = new HashMap<String, Object>();
+        Dictionary dict = bundle.getHeaders();
+        Enumeration keys = dict.keys();
+
+        // do an initial loop and separate the attributes in different groups
+        while (keys.hasMoreElements()) {
+            String k = (String) keys.nextElement();
+            Object v = dict.get(k);
+            if (k.startsWith(BUNDLE_PREFIX)) {
+                // starts with Bundle-xxx
+                bundleAttribs.put(k, v);
+            } else if (k.endsWith(SERVICE_SUFFIX)) {
+                // ends with xxx-Service
+                serviceAttribs.put(k, v);
+            } else if (k.endsWith(PACKAGE_SUFFFIX)) {
+                // ends with xxx-Package
+                packagesAttribs.put(k, v);
+            } else if (k.endsWith(REQUIRE_BUNDLE_ATTRIB)) {
+                // require bundle statement
+                packagesAttribs.put(k, v);
+            } else {
+                // the remaining attribs
+                otherAttribs.put(k, v);
+            }
+        }
+
+        // we will display the formatted result like this:
+        // Bundle-Name (ID)
+        // -----------------------
+        // all other attributes
+        //
+        // all Bundle attributes
+        //
+        // all Service attributes
+        //
+        // all Package attributes
+        Iterator<Map.Entry<String, Object>> it = otherAttribs.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> e = it.next();
+            output.append(String.format("%s = %s\n", e.getKey(), Util.getValueString(e.getValue())));
+        }
+        if (otherAttribs.size() > 0) {
+            output.append('\n');
+        }
+
+        it = bundleAttribs.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> e = it.next();
+            output.append(String.format("%s = %s\n", e.getKey(), Util.getValueString(e.getValue())));
+        }
+        if (bundleAttribs.size() > 0) {
+            output.append('\n');
+        }
+
+        it = serviceAttribs.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> e = it.next();
+            output.append(e.getKey());
+            output.append(" = \n");
+            formatHeader(Util.getValueString(e.getValue()), null, output, indent);
+            output.append("\n");
+        }
+        if (serviceAttribs.size() > 0) {
+            output.append('\n');
+        }
+
+        Map<String, ClauseFormatter> formatters = new HashMap<String, ClauseFormatter>();
+        formatters.put(REQUIRE_BUNDLE_ATTRIB, new ClauseFormatter() {
+            public void pre(Clause clause, StringBuilder output) {
+                boolean isSatisfied = checkBundle(clause.getName(), clause.getAttribute("version"));
+                Ansi.ansi(output).fg(isSatisfied ? Ansi.Color.DEFAULT : Ansi.Color.RED).a("");
+            }
+            public void post(Clause clause, StringBuilder output) {
+                Ansi.ansi(output).reset().a("");
+            }
+        });
+        formatters.put(IMPORT_PACKAGES_ATTRIB, new ClauseFormatter() {
+            public void pre(Clause clause, StringBuilder output) {
+                boolean isSatisfied = checkPackage(clause.getName(), clause.getAttribute("version"));
+                boolean isOptional = "optional".equals(clause.getDirective("resolution"));
+                Ansi.ansi(output).fg(isSatisfied ? Ansi.Color.DEFAULT : Ansi.Color.RED)
+                                 .a(isSatisfied || isOptional ? Ansi.Attribute.INTENSITY_BOLD_OFF : Ansi.Attribute.INTENSITY_BOLD)
+                                 .a("");
+            }
+            public void post(Clause clause, StringBuilder output) {
+                Ansi.ansi(output).reset().a("");
+            }
+        });
+
+        it = packagesAttribs.entrySet().iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> e = it.next();
+            output.append(e.getKey());
+            output.append(" = \n");
+            formatHeader(Util.getValueString(e.getValue()), formatters.get(e.getKey()), output, indent);
+            output.append("\n");
+        }
+        if (packagesAttribs.size() > 0) {
+            output.append('\n');
+        }
+
+        return output.toString();
+    }
+
+    protected interface ClauseFormatter {
+        void pre(Clause clause, StringBuilder output);
+        void post(Clause clause, StringBuilder output);
+    }
+
+    protected void formatHeader(String header, ClauseFormatter formatter, StringBuilder builder, int indent) {
+        Clause[] clauses = Parser.parseHeader(header);
+        formatClauses(clauses, formatter, builder, indent);
+    }
+
+    protected void formatClauses(Clause[] clauses, ClauseFormatter formatter, StringBuilder builder, int indent) {
+        boolean first = true;
+        for (Clause clause : clauses) {
+            if (first) {
+                first = false;
+            } else {
+                builder.append(",\n");
+            }
+            formatClause(clause, formatter, builder, indent);
+        }
+    }
+
+    protected void formatClause(Clause clause, ClauseFormatter formatter, StringBuilder builder, int indent) {
+        builder.append("\t");
+        if (formatter != null) {
+            formatter.pre(clause, builder);
+        }
+        formatClause(clause, builder, indent);
+        if (formatter != null) {
+            formatter.post(clause, builder);
+        }
+    }
+
+    protected int getTermWidth() {
+        Terminal term = (Terminal) session.get(".jline.terminal");
+        return term != null ? term.getWidth() : 80;
+
+    }
+
+    protected void formatClause(Clause clause, StringBuilder builder, int indent) {
+        if (indent < 0) {
+            if (clause.toString().length() < getTermWidth() - 8) { // -8 for tabs
+                indent = 1;
+            } else {
+                indent = 3;
+            }
+        }
+        String name = clause.getName();
+        Directive[] directives = clause.getDirectives();
+        Attribute[] attributes = clause.getAttributes();
+        Arrays.sort(directives, new Comparator<Directive>() {
+            public int compare(Directive o1, Directive o2) {
+                return o1.getName().compareTo(o2.getName());
+            }
+        });
+        Arrays.sort(attributes, new Comparator<Attribute>() {
+            public int compare(Attribute o1, Attribute o2) {
+                return o1.getName().compareTo(o2.getName());
+            }
+        });
+        builder.append(name);
+        for (int i = 0; directives != null && i < directives.length; i++) {
+            builder.append(";");
+            if (indent > 1) {
+                builder.append("\n\t\t");
+            }
+            builder.append(directives[i].getName()).append(":=");
+            String v = directives[i].getValue();
+            if (v.contains(",")) {
+                if (indent > 2 && v.length() > 20) {
+                    v = v.replace(",", ",\n\t\t\t");
+                }
+                builder.append("\"").append(v).append("\"");
+            } else {
+                builder.append(v);
+            }
+        }
+        for (int i = 0; attributes != null && i < attributes.length; i++) {
+            builder.append(";");
+            if (indent > 1) {
+                builder.append("\n\t\t");
+            }
+            builder.append(attributes[i].getName()).append("=");
+            String v = attributes[i].getValue();
+            if (v.contains(",")) {
+                if (indent > 2 && v.length() > 20) {
+                    v = v.replace(",", ",\n\t\t\t");
+                }
+                builder.append("\"").append(v).append("\"");
+            } else {
+                builder.append(v);
+            }
+        }
+    }
+
+
+   private boolean checkBundle(String bundleName, String version) {
+        if (admin != null) {
+            Bundle[] bundles = admin.getBundles(bundleName, version);
+            return bundles != null && bundles.length > 0;
+        }
+        return false;
+    }
+
+    private boolean checkPackage(String packageName, String version) {
+        VersionRange range = VersionRange.parseVersionRange(version);
+        if (admin != null) {
+            ExportedPackage[] packages = admin.getExportedPackages(packageName);
+            if (packages != null) {
+                for (ExportedPackage export : packages) {
+                    if (range.contains(export.getVersion())) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Info.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Info.java
new file mode 100644
index 0000000..d101c2d
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Info.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.osgi;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.util.StringEscapeUtils;
+import org.osgi.framework.Bundle;
+
+@Command(scope = "osgi", name = "info", description = "Displays detailed information of a given bundle.")
+public class Info extends BundlesCommandOptional {
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        if (bundles == null) {
+            Bundle[] allBundles = getBundleContext().getBundles();
+            for (int i = 0; i < allBundles.length; i++) {
+                printInfo(allBundles[i]);
+            }
+        } else {
+            for (Bundle bundle : bundles) {
+                printInfo(bundle);
+            }
+        }
+    }
+
+    /**
+     * <p>
+     * Get the OSGI-INF/bundle.info entry from the bundle and display it.
+     * </p>
+     *
+     * @param bundle the bundle.
+     */
+    protected void printInfo(Bundle bundle) {
+        String title = Util.getBundleName(bundle);
+        System.out.println("\n" + title);
+        System.out.println(Util.getUnderlineString(title));
+        URL bundleInfo = bundle.getEntry("OSGI-INF/bundle.info");
+        if (bundleInfo != null) {
+            try {
+                BufferedReader reader = new BufferedReader(new InputStreamReader(bundleInfo.openStream()));
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    System.out.println(StringEscapeUtils.unescapeJava(line));
+                }
+                reader.close();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/InstallBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/InstallBundle.java
new file mode 100644
index 0000000..04886bf
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/InstallBundle.java
@@ -0,0 +1,86 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+@Command(scope = "osgi", name = "install", description = "Installs one or more bundles.")
+public class InstallBundle extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "urls", description = "Bundle URLs separated by whitespaces", required = true, multiValued = true)
+    List<String> urls;
+
+    @Option(name = "-s", aliases={"--start"}, description="Starts the bundles after installation", required = false, multiValued = false)
+    boolean start;
+
+    protected Object doExecute() throws Exception {
+        List<Bundle> bundles = new ArrayList<Bundle>();
+        StringBuffer sb = new StringBuffer();
+        for (String url : urls) {
+            Bundle bundle = install(url, System.out, System.err);
+            if (bundle != null) {
+                bundles.add(bundle);
+                if (sb.length() > 0) {
+                    sb.append(", ");
+                }
+                sb.append(bundle.getBundleId());
+            }
+        }
+        if (start) {
+            for (Bundle bundle : bundles) {
+                try {
+                    bundle.start();
+                } catch (Exception e) {
+                    System.err.println(e.toString());
+                }
+            }
+        }
+        if (sb.toString().indexOf(',') > 0) {
+            System.out.println("Bundle IDs: " + sb.toString());
+        } else if (sb.length() > 0) {
+            System.out.println("Bundle ID: " + sb.toString());
+        }
+        return null;
+    }
+
+    protected Bundle install(String location, PrintStream out, PrintStream err) {
+        try {
+            return getBundleContext().installBundle(location, null);
+        } catch (IllegalStateException ex) {
+            err.println(ex.toString());
+        } catch (BundleException ex) {
+            if (ex.getNestedException() != null) {
+                err.println(ex.getNestedException().toString());
+            } else {
+                err.println(ex.toString());
+            }
+        } catch (Exception ex) {
+            err.println(ex.toString());
+        }
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundles.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundles.java
new file mode 100644
index 0000000..1456300
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundles.java
@@ -0,0 +1,232 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.osgi.service.startlevel.StartLevel;
+
+@Command(scope = "osgi", name = "list", description = "Lists all installed bundles.")
+public class ListBundles extends OsgiCommandSupport {
+
+    @Option(name = "-l", aliases = {}, description = "Show the locations", required = false, multiValued = false)
+    boolean showLoc;
+
+    @Option(name = "-s", description = "Shows the symbolic name", required = false, multiValued = false)
+    boolean showSymbolic;
+
+    @Option(name = "-u", description = "Shows the update locations", required = false, multiValued = false)
+    boolean showUpdate;
+    
+    @Option(name = "-t", valueToShowInHelp = "", description = "Specifies the bundle threshold; bundles with a start-level less than this value will not get printed out.", required = false, multiValued = false)
+    int bundleLevelThreshold = -1;
+
+    private List<BundleStateListener.Factory> bundleStateListenerFactories;
+
+    public void setBundleStateListenerFactories(List<BundleStateListener.Factory> bundleStateListenerFactories) {
+        this.bundleStateListenerFactories = bundleStateListenerFactories;
+    }
+
+    protected Object doExecute() throws Exception {
+        ServiceReference ref = getBundleContext().getServiceReference(StartLevel.class.getName());
+        StartLevel sl = null;
+        if (ref != null) {
+            sl = (StartLevel) getBundleContext().getService(ref);
+        }
+        if (sl == null) {
+            System.out.println("StartLevel service is unavailable.");
+        }
+
+        ServiceReference pkgref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        PackageAdmin admin = null;
+        if (pkgref != null) {
+            admin = (PackageAdmin) getBundleContext().getService(pkgref);
+            if (admin == null) {
+                System.out.println("PackageAdmin service is unavailable.");
+            }
+        }
+
+        Bundle[] bundles = getBundleContext().getBundles();
+        if (bundles != null) {
+            // Determine threshold
+            final String sbslProp = bundleContext.getProperty("karaf.systemBundlesStartLevel");
+            if (sbslProp != null) {
+                try {
+                   if (bundleLevelThreshold < 0) {
+                       bundleLevelThreshold = Integer.valueOf( sbslProp );
+                   }
+                }
+                catch( Exception ignore ) {
+                   // ignore
+                }
+            }
+            // Display active start level.
+            if (sl != null) {
+                System.out.println("START LEVEL " + sl.getStartLevel() + 
+                                   " , List Threshold: " + bundleLevelThreshold);
+            }
+
+            // Print column headers.
+            String msg = " Name";
+            if (showLoc) {
+               msg = " Location";
+            }
+            else if (showSymbolic) {
+               msg = " Symbolic name";
+            }
+            else if (showUpdate) {
+               msg = " Update location";
+            }
+            String level = (sl == null) ? "" : "  Level ";
+            String headers = "   ID   State       ";
+            for (BundleStateListener.Factory factory : bundleStateListenerFactories) {
+                BundleStateListener listener = factory.getListener();
+                if (listener != null) {
+                    headers += "  " + listener.getName() + " ";
+                }
+            }
+            headers += level + msg;
+            System.out.println(headers);
+            for (int i = 0; i < bundles.length; i++) {
+            	if (sl.getBundleStartLevel(bundles[i]) >= bundleLevelThreshold) { 
+	                // Get the bundle name or location.
+	                String name = (String) bundles[i].getHeaders().get(Constants.BUNDLE_NAME);
+	                // If there is no name, then default to symbolic name.
+	                name = (name == null) ? bundles[i].getSymbolicName() : name;
+	                // If there is no symbolic name, resort to location.
+	                name = (name == null) ? bundles[i].getLocation() : name;
+	
+	                // Overwrite the default value is the user specifically
+	                // requested to display one or the other.
+	                if (showLoc) {
+	                    name = bundles[i].getLocation();
+	                }
+	                else if (showSymbolic) {
+	                    name = bundles[i].getSymbolicName();
+	                    name = (name == null) ? "<no symbolic name>" : name;
+	                }
+	                else if (showUpdate) {
+	                    name = (String) bundles[i].getHeaders().get(Constants.BUNDLE_UPDATELOCATION);
+	                    name = (name == null) ? bundles[i].getLocation() : name;
+	                }
+	                // Show bundle version if not showing location.
+	                String version = (String) bundles[i].getHeaders().get(Constants.BUNDLE_VERSION);
+	                name = (!showLoc && !showUpdate && (version != null)) ? name + " (" + version + ")" : name;
+	                long l = bundles[i].getBundleId();
+	                String id = String.valueOf(l);
+	                if (sl == null) {
+	                    level = "1";
+	                }
+	                else {
+	                    level = String.valueOf(sl.getBundleStartLevel(bundles[i]));
+	                }
+	                while (level.length() < 5) {
+	                    level = " " + level;
+	                }
+	                while (id.length() < 4) {
+	                    id = " " + id;
+	                }
+	                String line = "[" + id + "] [" + getStateString(bundles[i]) + "]";
+	                for (BundleStateListener.Factory factory : bundleStateListenerFactories) {
+	                    BundleStateListener listener = factory.getListener();
+	                    if (listener != null) {
+	                        String state = listener.getState(bundles[i]);
+	                        line += " [" + getStateString(state, listener.getName().length()) + "]";
+	                    }
+	                }
+	                line += " [" + level + "] " + name;
+	                System.out.println(line);
+	
+	                if (admin != null) {
+	                    Bundle[] fragments = admin.getFragments(bundles[i]);
+	                    Bundle[] hosts = admin.getHosts(bundles[i]);
+	
+	                    if (fragments != null) {
+	                        System.out.print("                                       Fragments: ");
+	                        int ii = 0;
+	                        for (Bundle fragment : fragments) {
+	                            ii++;
+	                            System.out.print(fragment.getBundleId());
+	                            if ((fragments.length > 1) && ii < (fragments.length)) {
+	                                System.out.print(",");
+	                            }
+	                        }
+	                        System.out.println();
+	                    }
+	
+	                    if (hosts != null) {
+	                        System.out.print("                                       Hosts: ");
+	                        int ii = 0;
+	                        for (Bundle host : hosts) {
+	                            ii++;
+	                            System.out.print(host.getBundleId());
+	                            if ((hosts.length > 1) && ii < (hosts.length)) {
+	                                System.out.print(",");
+	                            }
+	                        }
+	                        System.out.println();
+	                    }
+	
+	                }
+	            }
+            }
+        }
+        else {
+            System.out.println("There are no installed bundles.");
+        }
+
+        getBundleContext().ungetService(ref);
+        getBundleContext().ungetService(pkgref);
+
+        return null;
+    }
+
+    public String getStateString(Bundle bundle)
+    {
+        int state = bundle.getState();
+        if (state == Bundle.ACTIVE) {
+            return "Active     ";
+        } else if (state == Bundle.INSTALLED) {
+            return "Installed  ";
+        } else if (state == Bundle.RESOLVED) {
+            return "Resolved   ";
+        } else if (state == Bundle.STARTING) {
+            return "Starting   ";
+        } else if (state == Bundle.STOPPING) {
+            return "Stopping   ";
+        } else {
+            return "Unknown    ";
+        }
+    }
+
+    public String getStateString(String state, int length) {
+        if (state == null) {
+            state = "";
+        }
+        while (state.length() < length) {
+            state += " ";
+        }
+        return state;
+    }
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListServices.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListServices.java
new file mode 100644
index 0000000..591ae98
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListServices.java
@@ -0,0 +1,140 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.service.command.Function;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+@Command(scope = "osgi", name = "ls", description = "Lists OSGi services.")
+public class ListServices extends BundlesCommandOptional {
+
+    @Option(name = "-a", aliases = {}, description = "Shows all services", required = false, multiValued = false)
+    boolean showAll;
+
+    @Option(name = "-u", aliases = {}, description = "Shows services which are in use", required = false, multiValued = false)
+    boolean inUse;
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        if (bundles == null) {
+            Bundle[] allBundles = getBundleContext().getBundles();
+            for (int i = 0; i < allBundles.length; i++) {
+                printServicesShort(allBundles[i]);
+            }
+        } else {
+            for (Bundle bundle : bundles) {
+                printServices(bundle);
+            }
+        }
+    }
+
+    private void printServices(Bundle bundle) {
+        boolean headerPrinted = false;
+        boolean needSeparator = false;
+        ServiceReference[] refs = null;
+
+        // Get registered or in-use services.
+        if (inUse) {
+            refs = bundle.getServicesInUse();
+        } else {
+            refs = bundle.getRegisteredServices();
+        }
+
+        // Print properties for each service.
+        for (int refIdx = 0; (refs != null) && (refIdx < refs.length); refIdx++) {
+            String[] objectClass = (String[]) refs[refIdx].getProperty("objectClass");
+
+            // Determine if we need to print the service, depending
+            // on whether it is a command service or not.
+            boolean print = true;
+            for (int ocIdx = 0; !showAll && (ocIdx < objectClass.length); ocIdx++) {
+                if (objectClass[ocIdx].equals(Function.class.getName())) {
+                    print = false;
+                }
+            }
+
+            // Print header if we have not already done so.
+            if (!headerPrinted) {
+                headerPrinted = true;
+                String title = Util.getBundleName(bundle);
+                title = (inUse) ? title + " uses:" : title + " provides:";
+                System.out.println("");
+                System.out.println(title);
+                System.out.println(Util.getUnderlineString(title));
+            }
+
+            if (showAll || print) {
+                // Print service separator if necessary.
+                if (needSeparator) {
+                    System.out.println("----");
+                }
+
+                // Print service properties.
+                String[] keys = refs[refIdx].getPropertyKeys();
+                for (int keyIdx = 0; (keys != null) && (keyIdx < keys.length); keyIdx++) {
+                    Object v = refs[refIdx].getProperty(keys[keyIdx]);
+                    System.out.println(keys[keyIdx] + " = " + Util.getValueString(v));
+                }
+
+                needSeparator = true;
+            }
+        }
+    }
+
+    private void printServicesShort(Bundle bundle) {
+        boolean headerPrinted = false;
+        ServiceReference[] refs = null;
+
+        // Get registered or in-use services.
+        if (inUse) {
+            refs = bundle.getServicesInUse();
+        } else {
+            refs = bundle.getRegisteredServices();
+        }
+
+        for (int refIdx = 0; (refs != null) && (refIdx < refs.length); refIdx++) {
+            String[] objectClass = (String[]) refs[refIdx].getProperty("objectClass");
+
+            // Determine if we need to print the service, depending
+            // on whether it is a command service or not.
+            boolean print = true;
+            for (int ocIdx = 0; !showAll && (ocIdx < objectClass.length); ocIdx++) {
+                if (objectClass[ocIdx].equals(Function.class.getName())) {
+                    print = false;
+                }
+            }
+
+            // Print the service if necessary.
+            if (showAll || print) {
+                if (!headerPrinted) {
+                    headerPrinted = true;
+                    String title = Util.getBundleName(bundle);
+                    title = (inUse) ? title + " uses:" : title + " provides:";
+                    System.out.println("\n" + title);
+                    System.out.println(Util.getUnderlineString(title));
+                }
+                System.out.println(Util.getValueString(objectClass));
+            }
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RefreshBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RefreshBundle.java
new file mode 100644
index 0000000..5c784e1
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RefreshBundle.java
@@ -0,0 +1,52 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+@Command(scope = "osgi", name = "refresh", description = "Refresh a bundle.")
+public class RefreshBundle extends BundlesCommandOptional {
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        // Get package admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("PackageAdmin service is unavailable.");
+            return;
+        }
+        try {
+            PackageAdmin pa = (PackageAdmin) getBundleContext().getService(ref);
+            if (pa == null) {
+                System.out.println("PackageAdmin service is unavailable.");
+                return;
+            }
+            if (bundles == null) {
+                pa.refreshPackages(null);
+            } else {
+                pa.refreshPackages(bundles.toArray(new Bundle[bundles.size()]));
+            }
+        }
+        finally {
+            getBundleContext().ungetService(ref);
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ResolveBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ResolveBundle.java
new file mode 100644
index 0000000..45853e3
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ResolveBundle.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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "osgi", name = "resolve", description = "Resolve bundle(s).")
+public class ResolveBundle extends BundlesCommandOptional {
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        // Get package admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("PackageAdmin service is unavailable.");
+            return;
+        }
+        try {
+            PackageAdmin pa = (PackageAdmin) getBundleContext().getService(ref);
+            if (pa == null) {
+                System.out.println("PackageAdmin service is unavailable.");
+                return;
+            }
+            if (bundles == null) {
+                pa.resolveBundles(null);
+            } else {
+                pa.resolveBundles(bundles.toArray(new Bundle[bundles.size()]));
+            }
+        }
+        finally {
+            getBundleContext().ungetService(ref);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RestartBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RestartBundle.java
new file mode 100644
index 0000000..28b2f1b
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RestartBundle.java
@@ -0,0 +1,38 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "osgi", name = "restart", description = "Stops and restarts bundle(s).")
+public class RestartBundle extends BundlesCommand {
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        for (Bundle bundle : bundles) {
+            try {
+                bundle.stop();
+                bundle.start();
+            } catch (Exception e) {
+                System.err.println(e.toString());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java
new file mode 100644
index 0000000..06f1729
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.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.karaf.shell.osgi;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+/**
+ * Command to shut down Karaf
+ */
+@Command(scope = "osgi", name = "shutdown", description = "Shuts the framework down.")
+public class Shutdown extends OsgiCommandSupport {
+
+    @Option(name = "-f", aliases = "--force", description = "Force the shutdown without confirmation message.", required = false, multiValued = false)
+    boolean force = false;
+
+    @Argument(name = "time", index = 0, description = "Shutdown after a specified delay. The time argument can have different" +
+            " formats. First, it can be an abolute time in the format hh:mm, in which hh is the hour (1 or 2 digits) and mm" +
+            " is the minute of the hour (in two digits). Second, it can be in the format +m, in which m is the number of minutes" +
+            " to wait. The word now is an alias for +0.", required = false, multiValued = false)
+    String time;
+
+    protected Object doExecute() throws Exception {
+
+        long sleep = 0;
+        if (time != null) {
+            if (!time.equals("now")) {
+                if (time.startsWith("+")) {
+                    // delay in number of minutes provided
+                    time = time.substring(1);
+                    try {
+                        sleep = Long.parseLong(time) * 60 * 1000;
+                    } catch (Exception e) {
+                        System.err.println("Invalid time argument.");
+                        return null;
+                    }
+                } else {
+                    // try to parse the date in hh:mm
+                    String[] strings = time.split(":");
+                    if (strings.length != 2) {
+                        System.err.println("Invalid time argument.");
+                        return null;
+                    }
+                    GregorianCalendar currentDate = new GregorianCalendar();
+                    GregorianCalendar shutdownDate = new GregorianCalendar(currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE), Integer.parseInt(strings[0]), Integer.parseInt(strings[1]));
+                    if (shutdownDate.before(currentDate)) {
+                        shutdownDate.set(Calendar.DATE, shutdownDate.get(Calendar.DATE) + 1);
+                    }
+                    sleep = shutdownDate.getTimeInMillis() - currentDate.getTimeInMillis();
+                }
+            }
+        }
+
+        if (force) {
+            this.shutdown(sleep);
+            return null;
+        }
+
+        for (; ; ) {
+            StringBuffer sb = new StringBuffer();
+            String karafName = System.getProperty("karaf.name");
+            System.err.println(String.format("Confirm: shutdown instance %s (yes/no): ", karafName));
+
+            System.err.flush();
+            for (; ; ) {
+                int c = session.getKeyboard().read();
+                if (c < 0) {
+                    return null;
+                }
+                System.err.print((char) c);
+                System.err.flush();
+                if (c == '\r' || c == '\n') {
+                    break;
+                }
+                sb.append((char) c);
+            }
+            String str = sb.toString();
+            if (str.equals("yes")) {
+                this.shutdown(sleep);
+            }
+            return null;
+        }
+    }
+
+    private void shutdown(final long sleep) {
+        new Thread() {
+            public void run() {
+                try {
+                    if (sleep > 0) {
+                        System.err.println("Shutdown in " + sleep/1000/60 + " minute(s).");
+                    }
+                    Thread.sleep(sleep);
+                    Bundle bundle = getBundleContext().getBundle(0);
+                    bundle.stop();
+                } catch (Exception e) {
+                    log.error("Error when shutting down", e);
+                }
+            }
+        }.start();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/SpringStateListenerFactory.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/SpringStateListenerFactory.java
new file mode 100644
index 0000000..4eae552
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/SpringStateListenerFactory.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.osgi;
+
+import java.util.Map;
+import java.util.Hashtable;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.osgi.context.event.OsgiBundleApplicationContextListener;
+import org.springframework.osgi.context.event.OsgiBundleApplicationContextEvent;
+import org.springframework.osgi.context.event.OsgiBundleContextFailedEvent;
+import org.springframework.osgi.context.event.OsgiBundleContextRefreshedEvent;
+import org.springframework.osgi.extender.event.BootstrappingDependencyEvent;
+import org.springframework.osgi.service.importer.event.OsgiServiceDependencyEvent;
+import org.springframework.osgi.service.importer.event.OsgiServiceDependencyWaitStartingEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.ServiceRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class SpringStateListenerFactory implements BundleStateListener.Factory {
+
+    private BundleContext bundleContext;
+    private BundleStateListener listener;
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+    public void init() {
+        getListener();
+    }
+
+    public void destroy() throws Exception {
+        if (listener instanceof Destroyable) {
+            ((Destroyable) listener).destroy();
+        }
+    }
+
+    public synchronized BundleStateListener getListener() {
+        if (listener == null) {
+            listener = createListener();
+        }
+        return listener;
+    }
+
+    private BundleStateListener createListener() {
+        try {
+            // Use dynamic class loading to make sure we actually try to reload the class for
+            // dynamic imports to kick in   if possible
+            Class cl = getClass().getClassLoader().loadClass("org.apache.karaf.shell.osgi.SpringStateListenerFactory$SpringApplicationListener");
+            return (BundleStateListener) cl.getConstructor(BundleContext.class).newInstance(bundleContext);
+//            return new SpringApplicationListener(bundleContext);
+        } catch (Throwable t) {
+            return null;
+        }
+    }
+
+    public static interface Destroyable {
+
+        public void destroy() throws Exception;
+
+    }
+
+    public static class SpringApplicationListener implements OsgiBundleApplicationContextListener,
+            BundleListener, Destroyable, BundleStateListener {
+
+        public static enum SpringState {
+            Unknown,
+            Waiting,
+            Started,
+            Failed,
+        }
+
+        private static final Logger LOG = LoggerFactory.getLogger(BlueprintListener.class);
+
+        private final Map<Long, SpringState> states;
+        private BundleContext bundleContext;
+        private ServiceRegistration registration;
+
+        public SpringApplicationListener(BundleContext bundleContext) {
+            this.states = new ConcurrentHashMap<Long, SpringState>();
+            this.bundleContext = bundleContext;
+            this.bundleContext.addBundleListener(this);
+            this.registration = this.bundleContext.registerService(OsgiBundleApplicationContextListener.class.getName(), this, new Hashtable());
+        }
+
+        public void destroy() throws Exception {
+            bundleContext.removeBundleListener(this);
+            registration.unregister();
+        }
+
+        public String getName() {
+            return "Spring ";
+        }
+
+        public String getState(Bundle bundle) {
+            SpringState state = states.get(bundle.getBundleId());
+            if (state == null || bundle.getState() != Bundle.ACTIVE || state == SpringState.Unknown) {
+                return null;
+            }
+            return state.toString();
+        }
+
+        public SpringState getSpringState(Bundle bundle) {
+            SpringState state = states.get(bundle.getBundleId());
+            if (state == null || bundle.getState() != Bundle.ACTIVE) {
+                state = SpringState.Unknown;
+            }
+            return state;
+        }
+
+        public void onOsgiApplicationEvent(OsgiBundleApplicationContextEvent event) {
+            SpringState state = null;
+            if (event instanceof BootstrappingDependencyEvent) {
+                OsgiServiceDependencyEvent de = ((BootstrappingDependencyEvent) event).getDependencyEvent();
+                if (de instanceof OsgiServiceDependencyWaitStartingEvent) {
+                    state = SpringState.Waiting;
+                }
+            } else if (event instanceof OsgiBundleContextFailedEvent) {
+                state = SpringState.Failed;
+            } else if (event instanceof OsgiBundleContextRefreshedEvent) {
+                state = SpringState.Started;
+            }
+            if (state != null) {
+                LOG.debug("Spring app state changed to " + state + " for bundle " + event.getBundle().getBundleId());
+                states.put(event.getBundle().getBundleId(), state);
+            }
+        }
+
+        public void bundleChanged(BundleEvent event) {
+            if (event.getType() == BundleEvent.UNINSTALLED) {
+                states.remove(event.getBundle().getBundleId());
+            }
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartBundle.java
new file mode 100644
index 0000000..8bf1bf9
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartBundle.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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "osgi", name = "start", description = "Starts bundle(s).")
+public class StartBundle extends BundlesCommand {
+    
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        for (Bundle bundle : bundles) {
+            try {
+                bundle.start();
+            } catch (Exception e) {
+                System.err.println(e.toString());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartLevel.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartLevel.java
new file mode 100644
index 0000000..29aafcf
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartLevel.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.shell.osgi;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.ServiceReference;
+
+@Command(scope = "osgi", name = "start-level", description = "Gets or sets the system start level.")
+public class StartLevel extends OsgiCommandSupport {
+
+    @Argument(index = 0, name = "level", description = "The new system start level to set", required = false, multiValued = false)
+    Integer level;
+
+    protected Object doExecute() throws Exception {
+        // Get package admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(org.osgi.service.startlevel.StartLevel.class.getName());
+        if (ref == null) {
+            System.out.println("StartLevel service is unavailable.");
+            return null;
+        }
+        try {
+            org.osgi.service.startlevel.StartLevel sl = (org.osgi.service.startlevel.StartLevel) getBundleContext().getService(ref);
+            if (sl == null) {
+                System.out.println("StartLevel service is unavailable.");
+                return null;
+            }
+
+            if (level == null) {
+                System.out.println("Level " + sl.getStartLevel());
+            }
+            else {
+                sl.setStartLevel(level);
+            }
+        }
+        finally {
+            getBundleContext().ungetService(ref);
+        }
+        return null;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StopBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StopBundle.java
new file mode 100644
index 0000000..6f55b37
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StopBundle.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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "osgi", name = "stop", description = "Stop bundle(s).")
+public class StopBundle extends BundlesCommand {
+	
+	protected void doExecute(List<Bundle> bundles) throws Exception {
+        for (Bundle bundle : bundles) {
+            try {
+                bundle.stop();
+            } catch (Exception e) {
+                System.err.println(e.toString());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UninstallBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UninstallBundle.java
new file mode 100644
index 0000000..70a7ad2
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UninstallBundle.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.karaf.shell.osgi;
+
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.apache.felix.gogo.commands.Command;
+
+@Command(scope = "osgi", name = "uninstall", description = "Uninstall bundle(s).")
+public class UninstallBundle extends BundlesCommand {
+
+    protected void doExecute(List<Bundle> bundles) throws Exception {
+        for (Bundle bundle : bundles) {
+            try {
+                bundle.uninstall();
+            } catch (Exception e) {
+                System.err.println(e.toString());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UpdateBundle.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UpdateBundle.java
new file mode 100644
index 0000000..02a0ae8
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UpdateBundle.java
@@ -0,0 +1,41 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.io.InputStream;
+import java.net.URL;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+
+@Command(scope = "osgi", name = "update", description = "Update bundle.")
+public class UpdateBundle extends BundleCommand {
+
+	@Argument(index = 1, name = "location", description = "The bundles update location", required = false, multiValued = false)
+	String location;
+
+	protected void doExecute(Bundle bundle) throws Exception {
+		if (location != null) {
+			InputStream is = new URL(location).openStream();
+			bundle.update(is);
+		} else {
+			bundle.update();
+		}
+	}
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Util.java b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Util.java
new file mode 100644
index 0000000..465da06
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Util.java
@@ -0,0 +1,234 @@
+/*
+ * 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.karaf.shell.osgi;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+
+import org.apache.felix.service.command.CommandSession;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.startlevel.StartLevel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Util
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(Util.class);
+
+    public static String getBundleName(Bundle bundle)
+    {
+        if (bundle != null)
+        {
+            String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
+            return (name == null)
+                ? "Bundle " + Long.toString(bundle.getBundleId())
+                : name + " (" + Long.toString(bundle.getBundleId()) + ")";
+        }
+        return "[STALE BUNDLE]";
+    }
+
+    private static StringBuffer m_sb = new StringBuffer();
+
+    public static String getUnderlineString(String s)
+    {
+        synchronized (m_sb)
+        {
+            m_sb.delete(0, m_sb.length());
+            for (int i = 0; i < s.length(); i++)
+            {
+                m_sb.append('-');
+            }
+            return m_sb.toString();
+        }
+    }
+
+    public static String getValueString(Object obj)
+    {
+        synchronized (m_sb)
+        {
+            if (obj instanceof String)
+            {
+                return (String) obj;
+            }
+            else if (obj instanceof String[])
+            {
+                String[] array = (String[]) obj;
+                return convertTypedArrayToString(array, new StringConverter<String>() {
+                    public String convertObjectToString(String toConvert) {
+                        return toConvert;
+                    }
+                });
+            }
+            else if (obj instanceof Boolean)
+            {
+                return ((Boolean) obj).toString();
+            }
+            else if (obj instanceof Long)
+            {
+                return ((Long) obj).toString();
+            }
+            else if (obj instanceof Integer)
+            {
+                return ((Integer) obj).toString();
+            }
+            else if (obj instanceof Short)
+            {
+                return ((Short) obj).toString();
+            }
+            else if (obj instanceof Double)
+            {
+                return ((Double) obj).toString();
+            }
+            else if (obj instanceof Float)
+            {
+                return ((Float) obj).toString();
+            }
+            else if (obj instanceof URL)
+            {
+                return ((URL)obj).toExternalForm();
+            }
+            else if (obj instanceof URL[])
+            {
+                URL[] array = (URL[]) obj;
+                return convertTypedArrayToString(array, new StringConverter<URL>() {
+                    public String convertObjectToString(URL toConvert) {
+                        return toConvert.toExternalForm();
+                    }
+                });
+            }
+            else if (obj instanceof URI)
+            {
+                try {
+                    return ((URI)obj).toURL().toExternalForm();
+                } catch (MalformedURLException e) {
+                    LOGGER.error("URI could not be transformed to URL",e);
+                    return obj.toString();
+                }
+            }
+            else if (obj instanceof URI[])
+            {
+                URI[] array = (URI[]) obj;
+                return convertTypedArrayToString(array, new StringConverter<URI>() {
+                    public String convertObjectToString(URI toConvert) {
+                        try {
+                            return toConvert.toURL().toExternalForm();
+                        } catch (MalformedURLException e) {
+                            LOGGER.error("URI could not be transformed to URL",e);
+                            return toConvert.toString();
+                        }
+                    }
+                });
+            }
+            else if (obj == null)
+            {
+                return "null";
+            }
+            else
+            {
+                return obj.toString();
+            }
+        }
+    }
+
+    private static <Type> String convertTypedArrayToString(Type[] array, StringConverter<Type> converter) {
+        m_sb.delete(0, m_sb.length());
+        for (int i = 0; i < array.length; i++)
+        {
+            if (i != 0)
+            {
+                m_sb.append(", ");
+            }
+            m_sb.append(converter.convertObjectToString(array[i]));
+        }
+        return m_sb.toString();
+    }
+
+    private static interface StringConverter<Type> {
+      String convertObjectToString(Type toConvert);
+    }
+
+    /**
+     * Check if a bundle is a system bundle (start level < 50)
+     * 
+     * @param bundleContext
+     * @param bundle
+     * @return true if the bundle has start level minor than 50
+     */
+    public static boolean isASystemBundle(BundleContext bundleContext, Bundle bundle) {
+        ServiceReference ref = bundleContext.getServiceReference(StartLevel.class.getName());
+        if (ref != null) {
+            StartLevel sl = (StartLevel) bundleContext.getService(ref);
+            if (sl != null) {
+                int level = sl.getBundleStartLevel(bundle);
+                int sbsl = 49;
+                final String sbslProp = bundleContext.getProperty( "karaf.systemBundlesStartLevel" );
+                if (sbslProp != null) {
+                    try {
+                       sbsl = Integer.valueOf( sbslProp );
+                    }
+                    catch( Exception ignore ) {
+                      // ignore
+                    }
+                }
+                return level <= sbsl;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Ask the user to confirm the access to a system bundle
+     * 
+     * @param bundleId
+     * @param session
+     * @return true if the user confirm
+     * @throws IOException
+     */
+    public static boolean accessToSystemBundleIsAllowed(long bundleId, CommandSession session) throws IOException {
+        for (;;) {
+            StringBuffer sb = new StringBuffer();
+            System.err.print("You are about to access system bundle " + bundleId + ".  Do you wish to continue (yes/no): ");
+            System.err.flush();
+            for (;;) {
+                int c = session.getKeyboard().read();
+                if (c < 0) {
+                    return false;
+                }
+                System.err.print((char) c);
+                if (c == '\r' || c == '\n') {
+                    break;
+                }
+                sb.append((char) c);
+            }
+            String str = sb.toString();
+            if ("yes".equals(str)) {
+                return true;
+            }
+            if ("no".equals(str)) {
+                return false;
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml b/karaf-2.2.x/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml
new file mode 100644
index 0000000..f08f981
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml
@@ -0,0 +1,84 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="osgi/bundle-level">
+            <action class="org.apache.karaf.shell.osgi.BundleLevel"/>
+        </command>
+        <command name="osgi/headers">
+            <action class="org.apache.karaf.shell.osgi.Headers"/>
+        </command>
+        <command name="osgi/info">
+            <action class="org.apache.karaf.shell.osgi.Info"/>
+        </command>
+        <command name="osgi/install">
+            <action class="org.apache.karaf.shell.osgi.InstallBundle"/>
+        </command>
+        <command name="osgi/list">
+            <action class="org.apache.karaf.shell.osgi.ListBundles">
+                <property name="bundleStateListenerFactories">
+                    <list xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+                        <ref component-id="blueprintListener" />
+                        <ref component-id="springListener" />
+                    </list>
+                </property>
+            </action>
+        </command>
+        <command name="osgi/ls">
+            <action class="org.apache.karaf.shell.osgi.ListServices"/>
+        </command>
+        <command name="osgi/refresh">
+            <action class="org.apache.karaf.shell.osgi.RefreshBundle"/>
+        </command>
+        <command name="osgi/update">
+            <action class="org.apache.karaf.shell.osgi.UpdateBundle"/>
+        </command>
+        <command name="osgi/resolve">
+            <action class="org.apache.karaf.shell.osgi.ResolveBundle"/>
+        </command>
+        <command name="osgi/restart">
+            <action class="org.apache.karaf.shell.osgi.RestartBundle"/>
+        </command>
+        <command name="osgi/shutdown">
+            <action class="org.apache.karaf.shell.osgi.Shutdown"/>
+        </command>
+        <command name="osgi/start">
+            <action class="org.apache.karaf.shell.osgi.StartBundle"/>
+        </command>
+        <command name="osgi/start-level">
+            <action class="org.apache.karaf.shell.osgi.StartLevel"/>
+        </command>
+        <command name="osgi/stop">
+            <action class="org.apache.karaf.shell.osgi.StopBundle"/>
+        </command>
+        <command name="osgi/uninstall">
+            <action class="org.apache.karaf.shell.osgi.UninstallBundle"/>
+        </command>
+    </command-bundle>
+
+    <bean id="blueprintListener" class="org.apache.karaf.shell.osgi.BlueprintListener" />
+    <service ref="blueprintListener" interface="org.osgi.service.blueprint.container.BlueprintListener" />
+
+    <bean id="springListener" class="org.apache.karaf.shell.osgi.SpringStateListenerFactory" init-method="init" destroy-method="destroy">
+        <property name="bundleContext" ref="blueprintBundleContext" />
+    </bean>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/osgi/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/osgi/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..969cefe
--- /dev/null
+++ b/karaf-2.2.x/shell/osgi/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,30 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides the low level OSGi shell commands.
+
+    The following commands are available:
+    \u001B[36mosgi:bundle-level\u001B[0m Gets or sets the start level of a given bundle.
+    \u001B[36mosgi:headers\u001B[0m Displays OSGi headers of a given bundle.
+    \u001B[36mosgi:info\u001B[0m Displays detailed information of a given bundle.
+    \u001B[36mosgi:installs\u001B[0m Installs one or more bundles.
+    \u001B[36mosgi:list\u001B[0m Lists all installed bundles.
+    \u001B[36mosgi:ls\u001B[0m Lists OSGi services.
+    \u001B[36mosgi:refresh\u001B[0m Refresh a bundle.
+    \u001B[36mosgi:resolve\u001B[0m Resolve bundle(s).
+    \u001B[36mosgi:restart\u001B[0m Stops and restarts bundle(s).
+    \u001B[36mosgi:shutdown\u001B[0m Shuts the framework down.
+    \u001B[36mosgi:start\u001B[0m Starts bundle(s).
+    \u001B[36mosgi:start-level\u001B[0m Gets or sets the system start level.
+    \u001B[36mosgi:stop\u001B[0m Stop bundle(s).
+    \u001B[36mosgi:uninstall\u001B[0m Uninstall bundle(s).
+    \u001B[36mosgi:update\u001B[0m Update bundle.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m and \u001B[36mUsing the console\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/packages/NOTICE b/karaf-2.2.x/shell/packages/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/packages/pom.xml b/karaf-2.2.x/shell/packages/pom.xml
new file mode 100644
index 0000000..1bc11f1
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.packages</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: PackageAdmin Commands</name>
+    <description>This bundle provides Karaf shell commands to manipulate the PackageAdmin service.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>!*</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ExportsCommand.java b/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ExportsCommand.java
new file mode 100644
index 0000000..24f7dfa
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ExportsCommand.java
@@ -0,0 +1,163 @@
+/*
+ * 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.karaf.shell.packages;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+@Command(scope = "packages", name = "exports", description = "Displays exported packages.")
+public class ExportsCommand extends PackageCommandSupport {
+
+    @Option(name = "-i", aliases = {"--imports"}, description = "List bundles importing the specified packages")
+    boolean imports;
+    @Option(name = "-s", description = "Shows the symbolic name", required = false, multiValued = false)
+    boolean showSymbolic;
+    @Option(name = "-d", aliases = {"--details"}, description = "List bundles in a master detail table")
+    boolean details;
+    @Argument(index = 0, name = "ids", description = "The IDs of bundles to check", required = false, multiValued = true)
+    List<Long> ids;
+
+    protected void doExecute(PackageAdmin admin) throws Exception {
+        String format = "";
+        int index = 1;
+        List<String> headers = new ArrayList<String>();
+        headers.add("ID");
+        format += "%" + (index++) + "$6s";
+
+        if (showSymbolic) {
+            headers.add("Symbolic name");
+            format += " %" + (index++) + "$-40s ";
+        }
+
+        headers.add("Packages");
+        format += " %" + (index++) + "$-40s";
+
+        if (imports) {
+            headers.add("Imported by");
+            format += " %" + (index++) + "$-40s";
+        }
+        format += "\n";
+        System.out.format(format, headers.toArray());
+
+        if (ids != null && !ids.isEmpty()) {
+            for (long id : ids) {
+                Bundle bundle = getBundleContext().getBundle(id);
+                if (bundle != null) {
+                    printExports(System.out, format, bundle, admin.getExportedPackages(bundle));
+                } else {
+                    System.err.println("Bundle ID " + id + " is invalid.");
+                }
+            }
+        } else {
+            for (Bundle bundle : getBundleContext().getBundles()) {
+                printExports(System.out, format, bundle, admin.getExportedPackages((Bundle) bundle));
+            }
+        }
+    }
+
+    protected void printExports(PrintStream out, String format, Bundle target, ExportedPackage[] exports) {
+        List<String> columns = new ArrayList<String>();
+
+        if ((exports != null) && (exports.length > 0)) {
+            for (int i = 0; i < exports.length; i++) {
+                columns = new ArrayList<String>();
+                Bundle bundle = exports[i].getExportingBundle();
+                columns.add(String.valueOf(bundle.getBundleId()));
+
+                if (showSymbolic) {
+                    columns.add(bundle.getSymbolicName());
+                }
+
+                //Do not repeat ID, Symbolic names etc when bundle exports more that one package
+                if (i > 0) {
+                    int size = columns.size();
+                    if (details) {
+                        columns = new ArrayList<String>();
+                        fillDetailRecord(columns, size);
+                    }
+                }
+                
+                columns.add(exports[i].toString());
+
+                if (imports) {
+                    Bundle[] bs = exports[i].getImportingBundles();
+                    if (bs != null && bs.length > 0) {
+                        for (int j = 0; j < bs.length; j++) {
+                            columns.add(getBundleName(bs[j]));
+                            out.format(format, columns.toArray());
+                            //Do not repeat ID, Symbolic names etc when package is imported by more than one bundles
+                            if (details) {
+                                int size = columns.size();
+                                columns = new ArrayList<String>();
+                                fillDetailRecord(columns, size - 1);
+                            } else {
+                                columns.remove(columns.size() - 1);
+                            }
+                        }
+                    } else {
+                        columns.add("");
+                        out.format(format, columns.toArray());
+                    }
+                } else {
+                    out.format(format, columns.toArray());
+                }
+            }
+        } else {
+            columns.add(String.valueOf(target.getBundleId()));
+
+            if (showSymbolic) {
+                columns.add(target.getSymbolicName());
+            }
+
+            columns.add("No active exported packages.");
+            if (imports) {
+                columns.add("");
+            }
+            out.format(format, columns.toArray());
+        }
+    }
+
+    public static String getBundleName(Bundle bundle) {
+        if (bundle != null) {
+            String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
+            return (name == null)
+                    ? "Bundle " + Long.toString(bundle.getBundleId())
+                    : name + " (" + Long.toString(bundle.getBundleId()) + ")";
+        }
+        return "[STALE BUNDLE]";
+    }
+
+    /**
+     * Method that creates an empty list of string that serves as detail record.
+     * @param colums
+     * @param size
+     */
+    public void fillDetailRecord(List<String> colums, int size) {
+        for (int i = 0; i < size; i++) {
+            colums.add("");
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ImportsCommand.java b/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ImportsCommand.java
new file mode 100644
index 0000000..198aed7
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ImportsCommand.java
@@ -0,0 +1,121 @@
+/*
+ * 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.karaf.shell.packages;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.service.packageadmin.ExportedPackage;
+import org.osgi.service.packageadmin.PackageAdmin;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+
+@Command(scope = "packages", name = "imports", description = "Displays imported packages.")
+public class ImportsCommand extends PackageCommandSupport {
+
+	@Argument(index = 0, name = "ids", description = "The IDs of bundles to check", required = false, multiValued = true)
+    List<Long> ids;
+	
+    @Option(name = "-i", aliases = { "--show-importer" }, description = "show the bundle that is importing a package", required = false, multiValued = false)
+    private boolean showImporter;
+
+    protected void doExecute(PackageAdmin admin) throws Exception {
+        Map<Long, List<ExportedPackage>> packages = new HashMap<Long, List<ExportedPackage>>();
+        ExportedPackage[] exported = admin.getExportedPackages((Bundle) null);
+        for (ExportedPackage pkg : exported) {
+            Bundle[] bundles = pkg.getImportingBundles();
+            if (bundles != null) {
+                for (Bundle b : bundles) {
+                    List<ExportedPackage> p = packages.get(b.getBundleId());
+                    if (p == null) {
+                        p = new ArrayList<ExportedPackage>();
+                        packages.put(b.getBundleId(), p);
+                    }
+                    p.add(pkg);
+                }
+            }
+        }
+        if (ids != null && !ids.isEmpty()) {
+            for (long id : ids) {
+                Bundle bundle = getBundleContext().getBundle(id);
+                if (bundle != null) {
+                    printImports(System.out, bundle, packages.get(bundle.getBundleId()));
+                } else {
+                    System.err.println("Bundle ID " + id + " is invalid.");
+                }
+            }
+        }
+        else {
+            if (showImporter) {
+                printImports(System.out, packages);
+            } else {
+                List<ExportedPackage> pkgs = new ArrayList<ExportedPackage>();
+                for (List<ExportedPackage> l : packages.values()) {
+                    pkgs.addAll(l);
+                }
+                printImports(System.out, null, pkgs);
+            }
+        }
+    }   
+    
+    protected void printImports(PrintStream out, Map<Long, List<ExportedPackage>> imports) {
+        for (Map.Entry<Long, List<ExportedPackage>> entry : imports.entrySet()) {
+            for (ExportedPackage p : entry.getValue()) {
+                // print bundle that is importing this package
+                Bundle importer = getBundleContext().getBundle(entry.getKey());
+                out.print(getBundleName(importer));
+                out.print(" imports: ");
+                
+                // print bundle that is exporting this package
+                Bundle exporter = p.getExportingBundle();
+                out.print(getBundleName(exporter));
+                
+                // print the package
+                out.println(": " + p);
+            }
+        }
+    }
+    
+    protected void printImports(PrintStream out, Bundle target, List<ExportedPackage> imports) {
+        if ((imports != null) && (imports.size() > 0)) {
+            for (ExportedPackage p : imports) {
+                Bundle bundle = p.getExportingBundle();
+                out.print(getBundleName(bundle));
+                out.println(": " + p);
+            }
+        } else {
+            out.println(getBundleName(target) + ": No active imported packages.");
+        }
+    }
+
+    public static String getBundleName(Bundle bundle) {
+        if (bundle != null) {
+            String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
+            return (name == null)
+                ? "Bundle " + Long.toString(bundle.getBundleId())
+                : name + " (" + Long.toString(bundle.getBundleId()) + ")";
+        }
+        return "[STALE BUNDLE]";
+    }
+
+}
diff --git a/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/PackageCommandSupport.java b/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/PackageCommandSupport.java
new file mode 100644
index 0000000..8dfa1e9
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/PackageCommandSupport.java
@@ -0,0 +1,55 @@
+/*
+ * 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.karaf.shell.packages;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+/**
+ * Abstract class from which all commands related to the PackageAdmin
+ * service should derive.
+ * This command retrieves a reference to the PackageAdmin service before
+ * calling another method to actually process the command.
+ */
+public abstract class PackageCommandSupport extends OsgiCommandSupport {
+
+    protected Object doExecute() throws Exception {
+        // Get package admin service.
+        ServiceReference ref = getBundleContext().getServiceReference(PackageAdmin.class.getName());
+        if (ref == null) {
+            System.out.println("PackageAdmin service is unavailable.");
+            return null;
+        }
+        try {
+            PackageAdmin admin = (PackageAdmin) getBundleContext().getService(ref);
+            if (admin == null) {
+                System.out.println("PackageAdmin service is unavailable.");
+                return null;
+            }
+
+            doExecute(admin);
+        }
+        finally {
+            getBundleContext().ungetService(ref);
+        }
+        return null;
+    }
+
+    protected abstract void doExecute(PackageAdmin admin) throws Exception;
+
+}
diff --git a/karaf-2.2.x/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml b/karaf-2.2.x/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml
new file mode 100644
index 0000000..379ebe8
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml
@@ -0,0 +1,31 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="packages/exports">
+            <action class="org.apache.karaf.shell.packages.ExportsCommand"/>
+        </command>
+        <command name="packages/imports">
+            <action class="org.apache.karaf.shell.packages.ImportsCommand"/>
+        </command>
+    </command-bundle>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/packages/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/packages/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..431b7fc
--- /dev/null
+++ b/karaf-2.2.x/shell/packages/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,19 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Karaf shell commands to manipulate the PackageAdmin service.
+
+    It allows you to get the export/import packages present in the OSGi framework.
+
+    The following commands are available:
+    \u001B[36mpackages:exports\u001B[0m Displays exported packages.
+    \u001B[36mpackages:imports\u001B[0m Displays imported packages.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mCommands\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/pom.xml b/karaf-2.2.x/shell/pom.xml
new file mode 100644
index 0000000..2d6eccf
--- /dev/null
+++ b/karaf-2.2.x/shell/pom.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.shell</groupId>
+    <artifactId>shell</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Shell</name>
+
+    <modules>
+        <module>commands</module>
+        <module>config</module>
+        <module>console</module>
+        <module>log</module>
+        <module>obr</module>
+        <module>osgi</module>
+        <module>packages</module>
+        <module>ssh</module>
+        <module>wrapper</module>
+        <module>dev</module>
+        <module>web</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/shell/ssh/NOTICE b/karaf-2.2.x/shell/ssh/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/ssh/pom.xml b/karaf-2.2.x/shell/ssh/pom.xml
new file mode 100644
index 0000000..2736be3
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/pom.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.ssh</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: SSH</name>
+    <description>This bundle provides SSH support to the Karaf console.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.sshd</groupId>
+            <artifactId>sshd-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            org.apache.sshd.server.keyprovider,
+                            org.apache.sshd.server.jaas,
+                            *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
new file mode 100644
index 0000000..403479b
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.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.karaf.shell.ssh;
+
+import org.apache.sshd.server.FileSystemFactory;
+import org.apache.sshd.server.FileSystemView;
+
+/**
+ * SSHd file system factory to reduce the visibility to the KARAF_BASE.
+ */
+public class KarafFileSystemFactory implements FileSystemFactory {
+
+    public FileSystemView createFileSystemView(String s) {
+        return new KarafFileSystemView();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
new file mode 100644
index 0000000..33b64fe
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.karaf.shell.ssh;
+
+import org.apache.sshd.server.FileSystemView;
+import org.apache.sshd.server.SshFile;
+import org.apache.sshd.server.filesystem.NativeSshFile;
+
+import java.io.File;
+
+/**
+ * Karaf file system view reduced to the KARAF_BASE location
+ */
+public class KarafFileSystemView implements FileSystemView {
+
+    private String location;
+
+    public KarafFileSystemView() {
+        location = System.getProperty("karaf.base");
+    }
+
+    public SshFile getFile(String file) {
+        return getFile(location, file);
+    }
+
+    public SshFile getFile(SshFile baseDir, String file) {
+        return getFile(baseDir.getAbsolutePath(), file);
+    }
+
+    protected SshFile getFile(String dir, String file) {
+        // get actual file object
+        String physicalName = NativeSshFile.getPhysicalName("/", dir, file, false);
+
+        if (!physicalName.startsWith(location)) {
+            throw new IllegalArgumentException("The path is not relative to KARAF_BASE. For security reason, it's not allowed.");
+        }
+
+        File fileObj = new File(physicalName);
+
+        // strip the root directory and return
+        String karafFileName = physicalName.substring("/".length() - 1);
+        return new KarafSshFile(karafFileName, fileObj);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasPasswordAuthenticator.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasPasswordAuthenticator.java
new file mode 100644
index 0000000..5556a21
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasPasswordAuthenticator.java
@@ -0,0 +1,108 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import java.io.IOException;
+import java.security.Principal;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginContext;
+
+import org.apache.sshd.common.Session;
+import org.apache.sshd.server.PasswordAuthenticator;
+import org.apache.sshd.server.session.ServerSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class KarafJaasPasswordAuthenticator implements PasswordAuthenticator {
+
+    public static final Session.AttributeKey<Subject> SUBJECT_ATTRIBUTE_KEY = new Session.AttributeKey<Subject>();
+    private final Logger LOGGER = LoggerFactory.getLogger(KarafJaasPasswordAuthenticator.class);
+
+    private String realm;
+    private String role;
+
+    public String getRealm() {
+        return realm;
+    }
+
+    public void setRealm(String realm) {
+        this.realm = realm;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public boolean authenticate(final String username, final String password, final ServerSession session) {
+        try {
+            Subject subject = new Subject();
+            LoginContext loginContext = new LoginContext(realm, subject, new CallbackHandler() {
+                public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+                    for (Callback callback : callbacks) {
+                        if (callback instanceof NameCallback) {
+                            ((NameCallback) callback).setName(username);
+                        } else if (callback instanceof PasswordCallback) {
+                            ((PasswordCallback) callback).setPassword(password.toCharArray());
+                        } else {
+                            throw new UnsupportedCallbackException(callback);
+                        }
+                    }
+                }
+            });
+            loginContext.login();
+            if (role != null && role.length() > 0) {
+                String clazz = "org.apache.karaf.jaas.modules.RolePrincipal";
+                String name = role;
+                int idx = role.indexOf(':');
+                if (idx > 0) {
+                    clazz = role.substring(0, idx);
+                    name = role.substring(idx + 1);
+                }
+                boolean found = false;
+                for (Principal p : subject.getPrincipals()) {
+                    if (p.getClass().getName().equals(clazz)
+                            && p.getName().equals(name)) {
+                        found = true;
+                        break;
+                    }
+                }
+                if (!found) {
+                    throw new FailedLoginException("User does not have the required role " + role);
+                }
+            }
+            session.setAttribute(SUBJECT_ATTRIBUTE_KEY, subject);
+            return true;
+        } catch (Exception e) {
+            LOGGER.debug("User authentication failed with " + e.getMessage(), e);
+            return false;
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafPublickeyAuthenticator.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafPublickeyAuthenticator.java
new file mode 100644
index 0000000..bfa9a8a
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafPublickeyAuthenticator.java
@@ -0,0 +1,313 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import org.apache.mina.util.Base64;
+import org.apache.sshd.server.PublickeyAuthenticator;
+import org.apache.sshd.server.session.ServerSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.math.BigInteger;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.DSAPublicKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.RSAPublicKeySpec;
+import java.util.*;
+
+/**
+ * A public key authenticator, which reads an OpenSSL2 <code>authorized_keys</code> file.
+ */
+public class KarafPublickeyAuthenticator implements PublickeyAuthenticator {
+
+    private static final transient Logger LOGGER = LoggerFactory.getLogger(KarafPublickeyAuthenticator.class);
+
+    private String authorizedKeys;
+    private boolean active;
+
+    public static final class AuthorizedKey {
+
+        private final String alias;
+        private final String format;
+        private final PublicKey publicKey;
+
+        public AuthorizedKey(String alias, String format, PublicKey publicKey) {
+            super();
+            this.alias = alias;
+            this.format = format;
+            this.publicKey = publicKey;
+        }
+
+        public String getAlias() {
+            return this.alias;
+        }
+        
+        public String getFormat() {
+            return this.format;
+        }
+
+        public PublicKey getPublicKey() {
+            return this.publicKey;
+        }
+
+    }
+
+    private static final class PublicKeyComparator implements Comparator<PublicKey> {
+
+        public int compare(PublicKey a, PublicKey b) {
+            if (a instanceof DSAPublicKey) {
+                if (b instanceof DSAPublicKey) {
+                    DSAPublicKey da = (DSAPublicKey) a;
+                    DSAPublicKey db = (DSAPublicKey) b;
+                    int r = da.getParams().getG().compareTo(db.getParams().getG());
+                    if (r != 0) {
+                        return r;
+                    }
+                    r = da.getParams().getP().compareTo(db.getParams().getP());
+                    if (r != 0) {
+                        return r;
+                    }
+                    r = da.getParams().getQ().compareTo(db.getParams().getQ());
+                    if (r != 0) {
+                        return r;
+                    }
+                    return da.getY().compareTo(db.getY());
+                } else {
+                    return -1;
+                }
+            } else if (a instanceof RSAPublicKey) {
+                if (b instanceof RSAPublicKey) {
+                    RSAPublicKey da = (RSAPublicKey) a;
+                    RSAPublicKey db = (RSAPublicKey) b;
+                    int r = da.getPublicExponent().compareTo(db.getPublicExponent());
+                    if (r != 0) {
+                        return r;
+                    }
+                    return da.getModulus().compareTo(db.getModulus());
+                } else {
+                    return -1;
+                }
+            } else {
+                throw new IllegalArgumentException("Only RSA and DAS keys are supported.");
+            }
+        }
+    }
+
+    private final class AuthorizedKeysProvider extends TimerTask {
+
+        private Map<PublicKey, AuthorizedKey> keys;
+        private Long lastModificationDate;
+        private Boolean fileAvailable;
+
+        @Override
+        public void run() {
+            try {
+                File af = new File(KarafPublickeyAuthenticator.this.authorizedKeys);
+                if (af.exists()) {
+                    Long newModificationDate = Long.valueOf(af.lastModified());
+                    if ((this.fileAvailable != null && !this.fileAvailable.booleanValue()) || !newModificationDate.equals(this.lastModificationDate)) {
+                        LOGGER.debug("Parsing authorized keys file {}...", KarafPublickeyAuthenticator.this.authorizedKeys);
+                        this.fileAvailable = Boolean.TRUE;
+                        this.lastModificationDate = newModificationDate;
+                        Map<PublicKey, AuthorizedKey> newKeys = KarafPublickeyAuthenticator.parseAuthorizedKeys(new FileInputStream(af));
+                        this.setKeys(newKeys);
+                        LOGGER.debug("Successfully parsed {} keys from file {}", newKeys.size(), KarafPublickeyAuthenticator.this.authorizedKeys);
+                    }
+                } else {
+                    if (this.fileAvailable != null && this.fileAvailable.booleanValue()) {
+                        LOGGER.debug("Authorized keys file {} disappeared, will recheck every minute", KarafPublickeyAuthenticator.this.authorizedKeys);
+                    } else if (this.fileAvailable == null) {
+                        LOGGER.debug("Authorized keys file {} does not exist, will recheck every minute", KarafPublickeyAuthenticator.this.authorizedKeys);
+                    }
+                    this.fileAvailable = Boolean.FALSE;
+                    this.lastModificationDate = null;
+                    this.setKeys(null);
+                }
+            } catch (Throwable e) {
+                LOGGER.error("Error parsing authorized keys file {}", KarafPublickeyAuthenticator.this.authorizedKeys, e);
+                this.fileAvailable = Boolean.FALSE;
+                this.lastModificationDate = null;
+                this.setKeys(null);
+            }
+        }
+
+        private synchronized void setKeys(Map<PublicKey, AuthorizedKey> keys) {
+            this.keys = keys;
+        }
+
+        public synchronized AuthorizedKey getKey(PublicKey publicKey) {
+            if (this.keys == null) {
+                return null;
+            }
+            return this.keys.get(publicKey);
+        }
+
+    }
+
+    private Timer parseAuthorizedKeysTimer;
+    private AuthorizedKeysProvider authorizedKeysProvider;
+
+    private static final int getInt(byte[] b, int pos) {
+        return (((int) b[pos] & 0xff) << 24) +
+                (((int) b[pos+1] & 0xff) << 16) +
+                (((int) b[pos+2] & 0xff) << 8) +
+                ((int) b[pos+3] & 0xff);
+    }
+
+    /**
+     * Parse an <code>authorized_keys</code> file in OpenSSH style.
+     *
+     * @param is the input stream to read.
+     * @return a map of authorized public keys.
+     * @throws IOException
+     * @throws NoSuchAlgorithmException
+     * @throws InvalidKeySpecException
+     */
+    public static final Map<PublicKey, AuthorizedKey> parseAuthorizedKeys(InputStream is) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
+        try {
+            Base64 decoder = new Base64();
+
+            KeyFactory rsaKeyGen = KeyFactory.getInstance("RSA");
+            KeyFactory dsaKeyGen = KeyFactory.getInstance("DSA");
+
+            LineNumberReader reader = new LineNumberReader(new InputStreamReader(is, "UTF-8"));
+            
+            Map<PublicKey, AuthorizedKey> ret = new TreeMap<PublicKey, AuthorizedKey>(new PublicKeyComparator());
+
+            String line;
+
+            while ((line = reader.readLine()) != null) {
+                String[] tokens = line.split("[ \\t]+", 3);
+                if (tokens.length != 3) {
+                    throw new IOException("Authorized keys file line " + reader.getLineNumber() + " does not contain 3 tokens.");
+                }
+                byte[] rawKey = decoder.decode(tokens[1].getBytes("UTF-8"));
+                if (getInt(rawKey, 0) != 7 || !new String(rawKey, 4, 7, "UTF-8").equals(tokens[0])) {
+                    throw new IOException("Authorized keys file line " + reader.getLineNumber() + " contains a key with a format that does not match the first token.");
+                }
+                PublicKey pk;
+                if (tokens[0].equals("ssh-dss")) {
+                    int pos = 11;
+
+                    int n = getInt(rawKey, pos);
+                    pos += 4;
+                    BigInteger p = new BigInteger(1, KarafPublickeyAuthenticator.arraysCopyOfRange(rawKey, pos, pos + n));
+                    pos += n;
+
+                    n = getInt(rawKey, pos);
+                    pos += 4;
+                    BigInteger q = new BigInteger(1, KarafPublickeyAuthenticator.arraysCopyOfRange(rawKey, pos, pos + n));
+                    pos += n;
+
+                    n = getInt(rawKey, pos);
+                    pos += 4;
+                    BigInteger g = new BigInteger(1, KarafPublickeyAuthenticator.arraysCopyOfRange(rawKey, pos, pos + n));
+                    pos += n;
+
+                    n = getInt(rawKey, pos);
+                    pos += 4;
+                    BigInteger y = new BigInteger(1, KarafPublickeyAuthenticator.arraysCopyOfRange(rawKey, pos, pos + n));
+                    pos += n;
+
+                    if (pos != rawKey.length) {
+                        throw new IOException("Authorized keys file line " + reader.getLineNumber() + " contains a DSA key with extra garbage.");
+                    }
+
+                    DSAPublicKeySpec ps = new DSAPublicKeySpec(y, p, q, g);
+                    pk = dsaKeyGen.generatePublic(ps);
+                } else if (tokens[0].equals("ssh-rsa")) {
+                    int pos = 11;
+
+                    int n = getInt(rawKey, pos);
+                    pos += 4;
+                    BigInteger e = new BigInteger(1, KarafPublickeyAuthenticator.arraysCopyOfRange(rawKey, pos, pos + n));
+                    pos += n;
+
+                    n = getInt(rawKey, pos);
+                    pos += 4;
+                    BigInteger modulus = new BigInteger(1, KarafPublickeyAuthenticator.arraysCopyOfRange(rawKey, pos, pos + n));
+                    pos += n;
+
+                    if (pos != rawKey.length) {
+                        throw new IOException("Authorized keys file line " + reader.getLineNumber() + " contains a RSA key with extra garbage.");
+                    }
+
+                    RSAPublicKeySpec ps = new RSAPublicKeySpec(modulus, e);
+                    pk = rsaKeyGen.generatePublic(ps);
+                } else {
+                    throw new IOException("Authorized keys file line " + reader.getLineNumber() + " does not start with ssh-dss or ssh-rsa.");
+                }
+                
+                ret.put(pk, new AuthorizedKey(tokens[2], tokens[0], pk));
+            }
+            return ret;
+        } finally {
+            is.close();
+        }
+    }
+
+    public boolean authenticate(String username, PublicKey publicKey, ServerSession session) {
+        AuthorizedKey ak = this.authorizedKeysProvider.getKey(publicKey);
+        if (ak == null) {
+            LOGGER.error("Failed authenticate of user {} from {} with unknown public key.", username, session.getIoSession().getRemoteAddress());
+            return false;
+        }
+        LOGGER.debug("Successful authentication of user {} from {} with public key {}.", new Object[]{ username, session.getIoSession().getRemoteAddress(), ak.getAlias() });
+        return true;
+    }
+
+    public void setAuthorizedKeys(String path) {
+        this.authorizedKeys = path;
+    }
+
+    public void setActive(boolean active) {
+        this.active = active;
+    }
+
+    public void startTimer() {
+        if (this.active) {
+            this.parseAuthorizedKeysTimer = new Timer();
+            this.authorizedKeysProvider = new AuthorizedKeysProvider();
+            this.parseAuthorizedKeysTimer.schedule(this.authorizedKeysProvider, 10, 60000L);
+        }
+    }
+
+    public void stopTimer() {
+        if (this.parseAuthorizedKeysTimer != null) {
+            this.parseAuthorizedKeysTimer.cancel();
+            this.parseAuthorizedKeysTimer = null;
+        }
+    }
+
+    private static byte[] arraysCopyOfRange(byte[] original, int from, int to) {
+        int newLength = to - from;
+        if (newLength < 0)
+            throw new IllegalArgumentException(from + " > " + to);
+        byte[] copy = new byte[newLength];
+        System.arraycopy(original, from, copy, 0,
+                Math.min(original.length - from, newLength));
+        return copy;
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafSshFile.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafSshFile.java
new file mode 100644
index 0000000..fed7c91
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafSshFile.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.karaf.shell.ssh;
+
+import org.apache.sshd.server.filesystem.NativeSshFile;
+
+import java.io.File;
+
+/**
+ * Karaf ssh file support.
+ */
+public class KarafSshFile extends NativeSshFile {
+
+    /**
+     * Constructor, internal do not use directly.
+     */
+    public KarafSshFile(String fileName, final File file) {
+        super(fileName, file, null);
+    }
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java
new file mode 100644
index 0000000..9b42096
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java
@@ -0,0 +1,125 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import javax.security.auth.Subject;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.sshd.server.Command;
+import org.apache.sshd.server.CommandFactory;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.SessionAware;
+import org.apache.sshd.server.session.ServerSession;
+
+public class ShellCommandFactory implements CommandFactory {
+
+    private CommandProcessor commandProcessor;
+
+    public void setCommandProcessor(CommandProcessor commandProcessor) {
+        this.commandProcessor = commandProcessor;
+    }
+
+    public Command createCommand(String command) {
+        return new ShellCommand(command);
+    }
+
+    public class ShellCommand implements Command, SessionAware {
+
+        private String command;
+        private InputStream in;
+        private OutputStream out;
+        private OutputStream err;
+        private ExitCallback callback;
+        private ServerSession session;
+
+        public ShellCommand(String command) {
+            this.command = command;
+        }
+
+        public void setInputStream(InputStream in) {
+            this.in = in;
+        }
+
+        public void setOutputStream(OutputStream out) {
+            this.out = out;
+        }
+
+        public void setErrorStream(OutputStream err) {
+            this.err = err;
+        }
+
+        public void setExitCallback(ExitCallback callback) {
+            this.callback = callback;
+        }
+
+        public void setSession(ServerSession session) {
+            this.session = session;
+        }
+
+        public void start(final Environment env) throws IOException {
+            try {
+                final CommandSession session = commandProcessor.createSession(in, new PrintStream(out), new PrintStream(err));
+                session.put("SCOPE", "shell:osgi:*");
+                Subject subject = this.session != null ? this.session.getAttribute(KarafJaasPasswordAuthenticator.SUBJECT_ATTRIBUTE_KEY) : null;
+                if (subject != null) {
+                    try {
+                        Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
+                            public Object run() throws Exception {
+                                session.execute(command);
+                                return null;
+                            }
+                        });
+                    } catch (PrivilegedActionException e) {
+                        throw e.getException();
+                    }
+                } else {
+                    session.execute(command);
+                }
+            } catch (Exception e) {
+                throw (IOException) new IOException("Unable to start shell").initCause(e);
+            } finally {
+                close(in, out, err);
+                callback.onExit(0);
+            }
+        }
+
+        public void destroy() {
+		}
+
+    }
+
+    private static void close(Closeable... closeables) {
+        for (Closeable c : closeables) {
+            try {
+                c.close();
+            } catch (IOException e) {
+                // Ignore
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
new file mode 100644
index 0000000..9507f4f
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
@@ -0,0 +1,221 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import java.io.Closeable;
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.security.PrivilegedAction;
+import java.util.List;
+import java.util.Map;
+import javax.security.auth.Subject;
+
+import jline.Terminal;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.felix.service.command.Function;
+import org.apache.karaf.shell.console.jline.Console;
+import org.apache.sshd.common.Factory;
+import org.apache.sshd.server.Command;
+import org.apache.sshd.server.Environment;
+import org.apache.sshd.server.ExitCallback;
+import org.apache.sshd.server.SessionAware;
+import org.apache.sshd.server.session.ServerSession;
+import org.osgi.service.blueprint.container.ReifiedType;
+
+/**
+ * SSHD {@link org.apache.sshd.server.Command} factory which provides access to Shell.
+ *
+ * @version $Rev: 731517 $ $Date: 2009-01-05 11:25:19 +0100 (Mon, 05 Jan 2009) $
+ */
+public class ShellFactoryImpl implements Factory<Command>
+{
+    private CommandProcessor commandProcessor;
+
+    public void setCommandProcessor(CommandProcessor commandProcessor) {
+        this.commandProcessor = commandProcessor;
+    }
+
+    public Command create() {
+        return new ShellImpl();
+    }
+
+    public class ShellImpl implements Command, SessionAware
+    {
+        private InputStream in;
+
+        private OutputStream out;
+
+        private OutputStream err;
+
+        private ExitCallback callback;
+
+        private ServerSession session;
+
+        private boolean closed;
+
+        public void setInputStream(final InputStream in) {
+            this.in = in;
+        }
+
+        public void setOutputStream(final OutputStream out) {
+            this.out = out;
+        }
+
+        public void setErrorStream(final OutputStream err) {
+            this.err = err;
+        }
+
+        public void setExitCallback(ExitCallback callback) {
+            this.callback = callback;
+        }
+
+        public void setSession(ServerSession session) {
+            this.session = session;
+        }
+
+        public void start(final Environment env) throws IOException {
+            try {
+                final Terminal terminal = new SshTerminal(env);
+                Console console = new Console(commandProcessor,
+                                              in,
+                                              new PrintStream(new LfToCrLfFilterOutputStream(out), true),
+                                              new PrintStream(new LfToCrLfFilterOutputStream(err), true),
+                                              terminal,
+                                              new Runnable() {
+                                                  public void run() {
+                                                      destroy();
+                                                  }
+                                              });
+                final CommandSession session = console.getSession();
+                session.put("APPLICATION", System.getProperty("karaf.name", "root"));
+                for (Map.Entry<String,String> e : env.getEnv().entrySet()) {
+                    session.put(e.getKey(), e.getValue());
+                }
+                session.put("#LINES", new Function() {
+                    public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+                        return Integer.toString(terminal.getHeight());
+                    }
+                });
+                session.put("#COLUMNS", new Function() {
+                    public Object execute(CommandSession session, List<Object> arguments) throws Exception {
+                        return Integer.toString(terminal.getWidth());
+                    }
+                });
+                session.put(".jline.terminal", terminal);
+                new Thread(console) {
+                    @Override
+                    public void run() {
+                        Subject subject = ShellImpl.this.session != null ? ShellImpl.this.session.getAttribute(KarafJaasPasswordAuthenticator.SUBJECT_ATTRIBUTE_KEY) : null;
+                        if (subject != null) {
+                            Subject.doAs(subject, new PrivilegedAction<Object>() {
+                                public Object run() {
+                                    doRun();
+                                    return null;
+                                }
+                            });
+                        } else {
+                            doRun();
+                        }
+                    }
+                    protected void doRun() {
+                        super.run();
+                    }
+                }.start();
+            } catch (Exception e) {
+                throw (IOException) new IOException("Unable to start shell").initCause(e);
+            }
+        }
+
+        public void destroy() {
+            if (!closed) {
+                closed = true;
+                ShellFactoryImpl.flush(out, err);
+                ShellFactoryImpl.close(in, out, err);
+                callback.onExit(0);
+            }
+        }
+
+    }
+
+    private static void flush(OutputStream... streams) {
+        for (OutputStream s : streams) {
+            try {
+                s.flush();
+            } catch (IOException e) {
+                // Ignore
+            }
+        }
+    }
+
+    private static void close(Closeable... closeables) {
+        for (Closeable c : closeables) {
+            try {
+                c.close();
+            } catch (IOException e) {
+                // Ignore
+            }
+        }
+    }
+
+    public static Converter getConverter() {
+        return new Converter();
+    }
+
+    public static class Converter implements org.osgi.service.blueprint.container.Converter {
+
+        public boolean canConvert(Object sourceObject, ReifiedType targetType) {
+            return ShellFactoryImpl.class.isAssignableFrom(sourceObject.getClass())
+                    && Factory.class.equals(targetType.getRawClass())
+                    && Command.class.equals(targetType.getActualTypeArgument(0).getRawClass());
+        }
+
+        public Object convert(Object sourceObject, ReifiedType targetType) throws Exception {
+            return sourceObject;
+        }
+    }
+
+    // TODO: remove this class when sshd use lf->crlf conversion by default
+    public class LfToCrLfFilterOutputStream extends FilterOutputStream {
+
+        private boolean lastWasCr;
+
+        public LfToCrLfFilterOutputStream(OutputStream out) {
+            super(out);
+        }
+
+        @Override
+        public void write(int b) throws IOException {
+            if (!lastWasCr && b == '\n') {
+                out.write('\r');
+                out.write('\n');
+            } else {
+                out.write(b);
+            }
+            lastWasCr = b == '\r';
+        }
+
+    }
+
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
new file mode 100644
index 0000000..99502d9
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
@@ -0,0 +1,178 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.BlueprintContainerAware;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.console.jline.Console;
+import org.apache.sshd.ClientChannel;
+import org.apache.sshd.ClientSession;
+import org.apache.sshd.SshClient;
+import org.apache.sshd.client.channel.ChannelShell;
+import org.apache.sshd.client.future.ConnectFuture;
+import org.apache.sshd.common.util.NoCloseInputStream;
+import org.apache.sshd.common.util.NoCloseOutputStream;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Connect to a SSH server.
+ *
+ * @version $Rev: 721244 $ $Date: 2008-11-27 18:19:56 +0100 (Thu, 27 Nov 2008) $
+ */
+@Command(scope = "ssh", name = "ssh", description = "Connects to a remote SSH server")
+public class SshAction
+    extends OsgiCommandSupport implements BlueprintContainerAware
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Option(name="-l", aliases={"--username"}, description = "The user name for remote login", required = false, multiValued = false)
+    private String username;
+
+    @Option(name="-P", aliases={"--password"}, description = "The password for remote login", required = false, multiValued = false)
+    private String password;
+
+    @Option(name="-p", aliases={"--port"}, description = "The port to use for SSH connection", required = false, multiValued = false)
+    private int port = 22;
+
+    @Argument(index = 0, name = "hostname", description = "The host name to connect to via SSH", required = true, multiValued = false)
+    private String hostname;
+
+    @Argument(index = 1, name = "command", description = "Optional command to execute", required = false, multiValued = true)
+    private List<String> command;
+
+    private BlueprintContainer container;
+
+	private ClientSession sshSession;
+    private String sshClientId;
+
+    public void setBlueprintContainer(final BlueprintContainer container) {
+        assert container != null;
+        this.container = container;
+    }
+
+    public void setSshClientId(String sshClientId) {
+        this.sshClientId = sshClientId;
+    }
+
+    @Override
+    protected Object doExecute() throws Exception {
+
+        //
+        // TODO: Parse hostname for <username>@<hostname>
+        //
+
+        System.out.println("Connecting to host " + hostname + " on port " + port);
+
+        // If the username/password was not configured via cli, then prompt the user for the values
+        if (username == null || password == null) {
+            log.debug("Prompting user for credentials");
+            if (username == null) {
+                username = readLine("Login: ");
+            }
+            if (password == null) {
+                password = readLine("Password: ");
+            }
+        }
+
+        // Create the client from prototype
+        SshClient client = (SshClient) container.getComponentInstance(sshClientId);
+        log.debug("Created client: {}", client);
+        client.start();
+
+        try {
+            ConnectFuture future = client.connect(hostname, port);
+            future.await();
+            sshSession = future.getSession();
+
+            Object oldIgnoreInterrupts = this.session.get(Console.IGNORE_INTERRUPTS);
+            this.session.put( Console.IGNORE_INTERRUPTS, Boolean.TRUE );
+
+            try {
+                System.out.println("Connected");
+
+                sshSession.authPassword(username, password);
+                int ret = sshSession.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
+                if ((ret & ClientSession.AUTHED) == 0) {
+                    System.err.println("Authentication failed");
+                    return null;
+                }
+
+                StringBuilder sb = new StringBuilder();
+                if (command != null) {
+                    for (String cmd : command) {
+                        if (sb.length() > 0) {
+                            sb.append(' ');
+                        }
+                        sb.append(cmd);
+                    }
+                }
+
+                ClientChannel channel;
+                if (sb.length() > 0) {
+                    channel = sshSession.createChannel("exec", sb.append("\n").toString());
+                    channel.setIn(new ByteArrayInputStream(new byte[0]));
+                } else {
+                    channel = sshSession.createChannel("shell");
+                    channel.setIn(new NoCloseInputStream(System.in));
+                    ((ChannelShell) channel).setupSensibleDefaultPty();
+                }
+                channel.setOut(new NoCloseOutputStream(System.out));
+                channel.setErr(new NoCloseOutputStream(System.err));
+                channel.open();
+                channel.waitFor(ClientChannel.CLOSED, 0);
+            } finally {
+                session.put( Console.IGNORE_INTERRUPTS, oldIgnoreInterrupts );
+                sshSession.close(false);
+            }
+        } finally {
+            client.stop();
+        }
+
+        return null;
+    }
+
+    public String readLine(String msg) throws IOException {
+        StringBuffer sb = new StringBuffer();
+        System.err.print(msg);
+        System.err.flush();
+        for (;;) {
+            int c = super.session.getKeyboard().read();
+            if (c < 0) {
+                return null;
+            }
+            System.err.print((char) c);
+            if (c == '\r' || c == '\n') {
+                break;
+            }
+            sb.append((char) c);
+        }
+        return sb.toString();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerAction.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerAction.java
new file mode 100644
index 0000000..a6e3b64
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerAction.java
@@ -0,0 +1,83 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import org.apache.sshd.SshServer;
+import org.apache.karaf.shell.console.BlueprintContainerAware;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+
+/**
+ * Start a SSH server.
+ *
+ * @version $Rev: 720411 $ $Date: 2008-11-25 05:32:43 +0100 (Tue, 25 Nov 2008) $
+ */
+@Command(scope = "ssh", name = "sshd", description = "Creates a SSH server")
+public class SshServerAction extends OsgiCommandSupport implements BlueprintContainerAware
+{
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    @Option(name="-p", aliases={ "--port" }, description = "The port to setup the SSH server (Default: 8101)", required = false, multiValued = false)
+    private int port = 8101;
+
+    @Option(name="-b", aliases={ "--background"}, description = "The service will run in the background (Default: true)", required = false, multiValued = false)
+    private boolean background = true;
+
+    private BlueprintContainer container;
+
+    private String sshServerId;
+
+    public void setBlueprintContainer(final BlueprintContainer container) {
+        assert container != null;
+        this.container = container;
+    }
+
+    public void setSshServerId(String sshServerId) {
+        this.sshServerId = sshServerId;
+    }
+
+    protected Object doExecute() throws Exception {
+        SshServer server = (SshServer) container.getComponentInstance(sshServerId);
+
+        log.debug("Created server: {}", server);
+
+        server.setPort(port);
+
+        server.start();
+
+        System.out.println("SSH server listening on port " + port);
+
+        if (!background) {
+            synchronized (this) {
+                log.debug("Waiting for server to shutdown");
+
+                wait();
+            }
+
+            server.stop();
+        }
+
+        return null;
+    }
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerFactory.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerFactory.java
new file mode 100644
index 0000000..5e16bf2
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerFactory.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.karaf.shell.ssh;
+
+import org.apache.sshd.SshServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SshServerFactory {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SshServerFactory.class);
+
+    private boolean start;
+
+    private SshServer server;
+
+    public SshServerFactory(SshServer server) {
+        this.server = server;
+    }
+
+    public boolean isStart() {
+        return start;
+    }
+
+    public void setStart(boolean start) {
+        this.start = start;
+    }
+
+    public void start() {
+        if (start) {
+            try {
+                server.start();
+            } catch (Exception e) {
+                LOGGER.info("Error updating SSH server", e);
+            }
+        }
+    }
+
+    public void stop() {
+        if (start && server != null) {
+            try {
+                server.stop();
+            } catch (Exception e) {
+                LOGGER.info("Error stopping SSH server", e);
+            } finally {
+                server = null;
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshTerminal.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshTerminal.java
new file mode 100644
index 0000000..5a3aad1
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshTerminal.java
@@ -0,0 +1,62 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import jline.TerminalSupport;
+import org.apache.sshd.server.Environment;
+
+public class SshTerminal extends TerminalSupport {
+
+    private Environment environment;
+
+    public SshTerminal(Environment environment) {
+        super(true);
+        setAnsiSupported(true);
+        this.environment = environment;
+    }
+
+    public void init() throws Exception {
+    }
+
+    public void restore() throws Exception {
+    }
+
+    @Override
+    public int getWidth() {
+        int width = 0;
+        try {
+            width = Integer.valueOf(this.environment.getEnv().get(Environment.ENV_COLUMNS));
+        } catch (Throwable t) {
+            // Ignore
+        }
+        return width > 0 ? width : super.getWidth();
+    }
+
+    @Override
+    public int getHeight() {
+        int height = 0;
+        try {
+            height = Integer.valueOf(this.environment.getEnv().get(Environment.ENV_LINES));
+        } catch (Throwable t) {
+            // Ignore
+        }
+        return height > 0 ? height : super.getHeight();
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
new file mode 100644
index 0000000..17fea15
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
@@ -0,0 +1,112 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import org.apache.sshd.common.NamedFactory;
+import org.apache.sshd.server.UserAuth;
+import org.apache.sshd.server.auth.UserAuthPassword;
+import org.apache.sshd.server.auth.UserAuthPublicKey;
+import org.osgi.service.blueprint.container.ComponentDefinitionException;
+import org.osgi.service.blueprint.container.Converter;
+import org.osgi.service.blueprint.container.ReifiedType;
+
+import java.lang.reflect.ParameterizedType;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>A factory for user authentication factories to set on
+ * {@link SshServer#setUserAuthFactories(java.util.List)} based on a
+ * comma-separated list of authentication methods.</p>
+ *
+ * <p>Currently, the following methods are supported:</p>
+ * <ul>
+ *     <li><code>password</code>
+ *          Password authentication against a given JAAS domain.</p></li>
+ *     <li><code>publickey</code>
+ *          Public key authentication against an OpenSSH <code>authorized_keys</code> file.</p></li>
+ * </ul>
+ * </p>
+ */
+public class UserAuthFactoriesFactory {
+
+    public static final String PASSWORD_METHOD = "password";
+    public static final String PUBLICKEY_METHOD = "publickey";
+
+    private Set<String> methodSet;
+    private List<NamedFactory<UserAuth>> factories;
+
+    public static Converter getConverter() {
+        return new Converter();
+    }
+
+    /**
+     * This blueprint type converter silently converts instances of
+     * <code>Class X implements NameFactory</code>
+     * to the reified type <code>cNameFactory</code>
+     * and therefore helps blueprint to set the returned factories on
+     * {@link SshServerAction#setUserAuthFactories(List)} without complaining
+     * about type conversion errors.
+     */
+    public static class Converter implements org.osgi.service.blueprint.container.Converter {
+
+        public boolean canConvert(Object sourceObject, ReifiedType targetType) {
+            return NamedFactory.class.isAssignableFrom(sourceObject.getClass())
+                    && UserAuth.class.equals(((ParameterizedType) sourceObject.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0])
+                    && NamedFactory.class.equals(targetType.getRawClass())
+                    && UserAuth.class.equals(targetType.getActualTypeArgument(0).getRawClass());
+        }
+
+        public Object convert(Object sourceObject, ReifiedType targetType) throws Exception {
+            return sourceObject;
+        }
+
+    }
+
+    public void setAuthMethods(String methods) {
+        this.methodSet = new HashSet<String>();
+        this.factories = new ArrayList<NamedFactory<UserAuth>>();
+        String[] ams = methods.split(",");
+        for (String am : ams) {
+            if (PASSWORD_METHOD.equals(am)) {
+                this.factories.add(new UserAuthPassword.Factory());
+            } else if (PUBLICKEY_METHOD.equals(am)) {
+                this.factories.add(new UserAuthPublicKey.Factory());
+            } else {
+                throw new ComponentDefinitionException("Invalid authentication method " + am + " specified");
+            }
+            this.methodSet.add(am);
+        }
+    }
+
+    public List<NamedFactory<UserAuth>> getFactories() {
+        return factories;
+    }
+
+    public boolean isPublickeyEnabled() {
+        return this.methodSet.contains(PUBLICKEY_METHOD);
+    }
+
+    public boolean isPasswordEnabled() {
+        return this.methodSet.contains(PASSWORD_METHOD);
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
new file mode 100644
index 0000000..51b592b
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
@@ -0,0 +1,127 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <type-converters>
+        <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl" factory-method="getConverter" />
+        <bean class="org.apache.karaf.shell.ssh.UserAuthFactoriesFactory" factory-method="getConverter" />
+    </type-converters>
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]">
+        <ext:default-properties>
+            <ext:property name="startRemoteShell" value="true" />
+            <ext:property name="karaf.admin.role" value="admin" />
+        </ext:default-properties>
+    </ext:property-placeholder>
+
+    <cm:property-placeholder persistent-id="org.apache.karaf.shell" update-strategy="reload">
+        <cm:default-properties>
+            <cm:property name="sshPort" value="8101"/>
+            <cm:property name="sshHost" value="0.0.0.0"/>
+            <cm:property name="sshRealm" value="karaf"/>
+            <cm:property name="sshRole" value="$[karaf.admin.role]"/>
+            <cm:property name="hostKey" value="$[karaf.base]/etc/host.key"/>
+            <cm:property name="authorizedKeys" value="$[karaf.base]/etc/authorized_keys"/>
+            <cm:property name="authMethods" value="password,publickey"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="ssh/ssh">
+            <action class="org.apache.karaf.shell.ssh.SshAction">
+                <property name="sshClientId">
+                    <bp:idref component-id="sshClient"/>
+                </property>
+            </action>
+        </command>
+        <command name="ssh/sshd">
+            <action class="org.apache.karaf.shell.ssh.SshServerAction">
+                <property name="sshServerId">
+                    <bp:idref component-id="sshServer"/>
+                </property>
+            </action>
+        </command>
+    </command-bundle>
+
+    <bean id="sshClient" class="org.apache.sshd.SshClient" factory-method="setUpDefaultClient" scope="prototype">
+    </bean>
+
+    <bean id="userAuthFactoriesFactory" class="org.apache.karaf.shell.ssh.UserAuthFactoriesFactory">
+        <property name="authMethods" value="${authMethods}"/>
+    </bean>
+
+    <bean id="sshServer" class="org.apache.sshd.SshServer" factory-method="setUpDefaultServer" scope="prototype">
+        <property name="port" value="${sshPort}"/>
+        <property name="host" value="${sshHost}"/>
+        <property name="shellFactory">
+            <bean class="org.apache.karaf.shell.ssh.ShellFactoryImpl">
+                <property name="commandProcessor" ref="commandProcessor"/>
+            </bean>
+        </property>
+        <property name="commandFactory">
+            <bean class="org.apache.sshd.server.command.ScpCommandFactory">
+                <argument>
+                    <bean class="org.apache.karaf.shell.ssh.ShellCommandFactory">
+                        <property name="commandProcessor" ref="commandProcessor"/>
+                    </bean>
+                </argument>
+            </bean>
+        </property>
+        <property name="keyPairProvider" ref="keyPairProvider"/>
+        <property name="passwordAuthenticator" ref="passwordAuthenticator"/>
+        <property name="publickeyAuthenticator" ref="publickeyAuthenticator"/>
+        <property name="fileSystemFactory">
+            <bean class="org.apache.karaf.shell.ssh.KarafFileSystemFactory"/>
+        </property>
+        <property name="userAuthFactories">
+            <bean factory-ref="userAuthFactoriesFactory" factory-method="getFactories"/>
+        </property>
+    </bean>
+
+    <bean id="keyPairProvider" class="org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider">
+        <property name="path" value="${hostKey}"/>
+    </bean>
+    <bean id="passwordAuthenticator" class="org.apache.karaf.shell.ssh.KarafJaasPasswordAuthenticator">
+        <property name="realm" value="${sshRealm}"/>
+        <property name="role" value="${sshRole}"/>
+    </bean>
+
+    <bean id="publickeyAuthenticator" class="org.apache.karaf.shell.ssh.KarafPublickeyAuthenticator"
+            init-method="startTimer" destroy-method="stopTimer">
+        <property name="authorizedKeys" value="${authorizedKeys}"/>
+        <property name="active">
+            <bean factory-ref="userAuthFactoriesFactory" factory-method="isPublickeyEnabled"/>
+        </property>
+    </bean>
+
+    <bean id="sshServerFactory" class="org.apache.karaf.shell.ssh.SshServerFactory" init-method="start"
+          destroy-method="stop" activation="eager">
+        <argument ref="sshServer"/>
+        <property name="start" value="$[karaf.startRemoteShell]"/>
+    </bean>
+
+    <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor">
+    </reference>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..964f9b1
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,16 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides SSH support for the Karaf shell console.
+
+    It acts as SSH client and server allowing you to receive SSH connection and be able to
+    connect to a remote SSH server.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mUsing remote instances\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties
new file mode 100644
index 0000000..721764e
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties
@@ -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.
+#
+
+#
+# This file contains localization strings for configuration labels and
+# descriptions as used in the metatype.xml descriptor
+
+shell.name = Apache Karaf Shell
+shell.description = Configuration of Apache Karaf Shell
+
+sshPort.name = SSH Port
+sshPort.description = port of the SSH daemon
+
+sshHost.name = SSH Host
+sshHost.description = name of the host used to bind the SSH daemon
+
+sshRealm.name = SSH Realm
+sshRealm.description = name of the JAAS realm to use for SSH authentication
+
+hostKey.name = Host key
+hostKey.description = location of the host key for SSH
diff --git a/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml
new file mode 100644
index 0000000..3538877
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml
@@ -0,0 +1,30 @@
+<?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.
+
+-->
+<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0" localization="OSGI-INF/metatype/metatype">
+    <OCD id="org.apache.karaf.shell" name="%shell.name" description="%shell.description">
+        <AD id="sshPort" type="Integer" default="8101" name="%sshPort.name" description="%sshPort.description"/>
+        <AD id="sshHost" type="String" default="0.0.0.0" name="%sshHost.name" description="%sshHost.description"/>
+        <AD id="sshRealm" type="String" default="karaf" name="%sshRealm.name" description="%sshRealm.description"/>
+        <AD id="hostKey" type="String" default="${karaf.base}/etc/host.key" name="%hostKey.name" description="%hostKey.description"/>
+    </OCD>
+    <Designate pid="org.apache.karaf.shell">
+        <Object ocdref="org.apache.karaf.shell"/>
+    </Designate>
+</metatype:MetaData>
diff --git a/karaf-2.2.x/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/TestAuthorizedKeysParsing.java b/karaf-2.2.x/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/TestAuthorizedKeysParsing.java
new file mode 100644
index 0000000..6d3c1cf
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/TestAuthorizedKeysParsing.java
@@ -0,0 +1,56 @@
+/*
+ * 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.karaf.shell.ssh;
+
+import junit.framework.TestCase;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Map;
+
+/**
+ * Test parsing an authorized_keys file.
+ */
+public class TestAuthorizedKeysParsing extends TestCase {
+
+    public void testAuthorizedKeysParsing() throws NoSuchAlgorithmException, InvalidKeySpecException, IOException {
+        InputStream is = TestAuthorizedKeysParsing.class.getClassLoader().getResourceAsStream("org/apache/karaf/shell/ssh/authorized_keys");
+        Map<PublicKey, KarafPublickeyAuthenticator.AuthorizedKey> keys = KarafPublickeyAuthenticator.parseAuthorizedKeys(is);
+        assertEquals(2, keys.size());
+        for (Map.Entry<PublicKey, KarafPublickeyAuthenticator.AuthorizedKey> e : keys.entrySet()) {
+            assertSame(e.getKey(), e.getValue().getPublicKey());
+            assertTrue("ssh-dss".equals(e.getValue().getFormat()) || "ssh-rsa".equals(e.getValue().getFormat()));
+
+            if ("ssh-dss".equals(e.getValue().getFormat())) {
+                assertTrue(e.getKey() instanceof DSAPublicKey);
+                assertEquals("dsa-test", e.getValue().getAlias());
+            }
+            if ("ssh-rsa".equals(e.getValue().getFormat())) {
+                assertTrue(e.getKey() instanceof RSAPublicKey);
+                assertEquals("rsa-test", e.getValue().getAlias());
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/shell/ssh/src/test/resources/org/apache/karaf/shell/ssh/authorized_keys b/karaf-2.2.x/shell/ssh/src/test/resources/org/apache/karaf/shell/ssh/authorized_keys
new file mode 100644
index 0000000..fcee2f3
--- /dev/null
+++ b/karaf-2.2.x/shell/ssh/src/test/resources/org/apache/karaf/shell/ssh/authorized_keys
@@ -0,0 +1,2 @@
+ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dsa-test
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRbYYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE= rsa-test
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/web/NOTICE b/karaf-2.2.x/shell/web/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/web/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/web/pom.xml b/karaf-2.2.x/shell/web/pom.xml
new file mode 100644
index 0000000..66496b3
--- /dev/null
+++ b/karaf-2.2.x/shell/web/pom.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.web</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: Web Commands</name>
+    <description>This bundle provides Karaf shell commands to manipulate web application bundles.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.web</groupId>
+            <artifactId>pax-web-spi</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Export-Package>${project.artifactId}*;version=${project.version}</Export-Package>
+                        <Import-Package>
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.felix.utils.version,
+                            org.apache.felix.utils.manifest,
+                            !*
+                        </Private-Package>
+                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebEventHandler.java b/karaf-2.2.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebEventHandler.java
new file mode 100644
index 0000000..ed1332d
--- /dev/null
+++ b/karaf-2.2.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebEventHandler.java
@@ -0,0 +1,41 @@
+/*
+ * 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.karaf.shell.web;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.ops4j.pax.web.service.spi.WebEvent;
+import org.ops4j.pax.web.service.spi.WebListener;
+
+/**
+ * Class implementing {@link WebListener} service to retrieve {@link WebEvent}
+ */
+//public class WebEventHandler implements WebListener {
+public class WebEventHandler implements WebListener {
+	
+	private final Map<Long, WebEvent> bundleEvents = new HashMap<Long, WebEvent>();
+
+	public Map<Long, WebEvent> getBundleEvents() {
+		return bundleEvents;
+	}
+		
+	public void webEvent(WebEvent event) {
+		getBundleEvents().put(event.getBundle().getBundleId(), event);
+	}
+
+}
diff --git a/karaf-2.2.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebListCommand.java b/karaf-2.2.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebListCommand.java
new file mode 100644
index 0000000..4104642
--- /dev/null
+++ b/karaf-2.2.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebListCommand.java
@@ -0,0 +1,188 @@
+/*
+ * 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.karaf.shell.web;
+
+import java.util.Map;
+
+import org.apache.felix.gogo.commands.Command;
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.ops4j.pax.web.service.spi.WebEvent;
+import org.ops4j.pax.web.service.spi.WebEvent.WebTopic;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.service.startlevel.StartLevel;
+
+@Command(scope = "web", name = "list", description = "Lists details for war bundles.")
+public class WebListCommand extends OsgiCommandSupport {
+	
+	private StartLevel startLevelService;
+	
+	private WebEventHandler eventHandler;
+
+	/* (non-Javadoc)
+	 * @see org.apache.karaf.shell.war.WarCommandSupport#doExecute(org.osgi.service.packageadmin.PackageAdmin)
+	 */
+	@Override
+	protected Object doExecute() {
+		Bundle[] bundles = getBundleContext().getBundles();
+		Map<Long, WebEvent> bundleEvents = eventHandler.getBundleEvents();
+		if (bundles != null) {
+			String level = (startLevelService == null) ? "" : "  Level ";
+			String webState = (bundleEvents == null || bundleEvents.isEmpty()) ? "" : "  Web-State     ";
+			String headers = "   ID   State       ";
+			headers += webState + level + " Web-ContextPath           Name";
+            System.out.println(headers);
+            for (int i = 0; i < bundles.length; i++) {
+            	//First check if this bundle contains  a webapp ctxt
+            	String webappctxt = (String) bundles[i].getHeaders().get("Web-ContextPath");
+            	if (webappctxt == null)
+            		webappctxt = (String) bundles[i].getHeaders().get("Webapp-Context");//this one is used by pax-web but is deprecated.
+            	
+            	if (webappctxt == null)
+            		continue; //only list war archives. 
+            	
+            	webappctxt.trim();
+            	
+            	// Get the bundle name or location.
+                String name = (String) bundles[i].getHeaders().get(Constants.BUNDLE_NAME);
+                // If there is no name, then default to symbolic name.
+                name = (name == null) ? bundles[i].getSymbolicName() : name;
+                // If there is no symbolic name, resort to location.
+                name = (name == null) ? bundles[i].getLocation() : name;
+                // Show bundle version if not showing location.
+                String version = (String) bundles[i].getHeaders().get(Constants.BUNDLE_VERSION);
+                name = ((version != null)) ? name + " (" + version + ")" : name;
+                long l = bundles[i].getBundleId();
+                String id = String.valueOf(l);
+                if (startLevelService == null) {
+                    level = "";
+                }
+                else {
+                    level = String.valueOf(startLevelService.getBundleStartLevel(bundles[i]));
+                }
+                while (level.length() < 5) {
+                    level = " " + level;
+                }
+                while (id.length() < 4) {
+                    id = " " + id;
+                }
+                
+                //prepend ctxt with slash (looks better)
+                if (!webappctxt.startsWith("/"))
+                	webappctxt = "/" + webappctxt;
+                
+                while (webappctxt.length() < 24) {
+                	webappctxt += " ";
+                }
+                
+                String line = "[" + id + "] [" + getStateString(bundles[i]) + "]";
+                if (bundleEvents != null && !bundleEvents.isEmpty())
+                	line += " ["+ getWebStateString(bundles[i]) +"] ";
+                line += " [" + level + "] [" + webappctxt + "] " + name;
+                System.out.println(line);
+            }
+		}
+		return null;
+
+	}
+
+    public String getStateString(Bundle bundle)
+    {
+        int state = bundle.getState();
+        if (state == Bundle.ACTIVE) {
+            return "Active     ";
+        } else if (state == Bundle.INSTALLED) {
+            return "Installed  ";
+        } else if (state == Bundle.RESOLVED) {
+            return "Resolved   ";
+        } else if (state == Bundle.STARTING) {
+            return "Starting   ";
+        } else if (state == Bundle.STOPPING) {
+            return "Stopping   ";
+        } else {
+            return "Unknown    ";
+        }
+    }
+    
+    public String getWebStateString(Bundle bundle) {
+    	
+    	long bundleId = bundle.getBundleId();
+    	
+    	Map<Long, WebEvent> bundleEvents = eventHandler.getBundleEvents();
+    	String topic = "Unknown    ";
+    	
+		if (bundleEvents.containsKey(bundleId)) {
+    		WebEvent webEvent = bundleEvents.get(bundleId);
+
+    		switch(webEvent.getType()) {
+    		case WebEvent.DEPLOYING:
+    			topic = "Deploying  ";
+    			break;
+    		case WebEvent.DEPLOYED:
+    			topic = "Deployed   ";
+    			break;
+    		case WebEvent.UNDEPLOYING:
+    			topic = "Undeploying";
+    			break;
+    		case WebEvent.UNDEPLOYED:
+    			topic = "Undeployed ";
+    			break;
+    		case WebEvent.FAILED:
+    			topic = "Unknown    ";
+    			topic = "Failed     ";
+    			break;
+    		default:
+    			topic = "Failed     ";
+    		}
+		}
+		
+		while (topic.length() < 11) {
+        	topic += " ";
+        }
+    	
+    	return topic;
+    }
+
+	/**
+	 * @param startLevelService the startLevelService to set
+	 */
+	public void setStartLevelService(StartLevel startLevelService) {
+		this.startLevelService = startLevelService;
+	}
+
+	/**
+	 * @return the startLevelService
+	 */
+	public StartLevel getStartLevelService() {
+		return startLevelService;
+	}
+
+	/**
+	 * @param eventHandler the eventHandler to set
+	 */
+	public void setEventHandler(WebEventHandler eventHandler) {
+		this.eventHandler = eventHandler;
+	}
+
+	/**
+	 * @return the eventHandler
+	 */
+	public WebEventHandler getEventHandler() {
+		return eventHandler;
+	}
+
+}
diff --git a/karaf-2.2.x/shell/web/src/main/resources/OSGI-INF/blueprint/shell-web.xml b/karaf-2.2.x/shell/web/src/main/resources/OSGI-INF/blueprint/shell-web.xml
new file mode 100644
index 0000000..078fb5a
--- /dev/null
+++ b/karaf-2.2.x/shell/web/src/main/resources/OSGI-INF/blueprint/shell-web.xml
@@ -0,0 +1,38 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+	<reference id="slService" interface="org.osgi.service.startlevel.StartLevel" availability="optional" />
+
+	<bean id="eaHandler" class="org.apache.karaf.shell.web.WebEventHandler" />
+	<service id="webListener"
+		interface="org.ops4j.pax.web.service.spi.WebListener"
+		ref="eaHandler" />
+		
+	<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="web/list">
+            <action class="org.apache.karaf.shell.web.WebListCommand">
+            	<property name="startLevelService" ref="slService" />
+            	<property name="eventHandler" ref="eaHandler" />
+            </action>
+        </command>
+    </command-bundle>
+
+</blueprint>
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/web/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/web/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..8daf53b
--- /dev/null
+++ b/karaf-2.2.x/shell/web/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,16 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Karaf shell commands to manipulate web application (war) bundles.
+
+    The following commands are available:
+    \u001B[36mweb:list\u001B[0m Lists details for war bundles.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mDeployer\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/wrapper/NOTICE b/karaf-2.2.x/shell/wrapper/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/shell/wrapper/pom.xml b/karaf-2.2.x/shell/wrapper/pom.xml
new file mode 100644
index 0000000..e4e0ed4
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/pom.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.shell</groupId>
+        <artifactId>shell</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.shell.wrapper</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Shell :: Service Wrapper</name>
+    <description>This bundle provides support of service wrapper.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.main</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>tanukisoft</groupId>
+            <artifactId>wrapper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/filtered-resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>Main</mainClass>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            !org.apache.karaf.main,
+                            !org.tanukisoftware.wrapper,
+                            org.apache.felix.service.command,
+                            org.apache.felix.gogo.commands,
+                            org.apache.karaf.shell.console,
+                            *
+                        </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.util.process
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
new file mode 100644
index 0000000..3a37eb1
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
@@ -0,0 +1,556 @@
+/*
+ * 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.karaf.shell.wrapper;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
+
+import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.Command;
+import org.fusesource.jansi.Ansi;
+
+/**
+ * Installs this Karaf instance as a service in your operating systems.
+ *
+ * @version $Rev: 603634 $ $Date: 2007-12-12 16:07:16 +0100 (Wed, 12 Dec 2007) $
+ */
+@Command(scope = "wrapper", name = "install", description = "Install the container as a system service in the OS.")
+public class InstallCommand extends OsgiCommandSupport {
+    @Option(name = "-n", aliases = {"--name"}, description = "The service name that will be used when installing the service. (Default: karaf)", required = false, multiValued = false)
+    private String name = "karaf";
+
+    @Option(name = "-d", aliases = {"--display"}, description = "The display name of the service.", required = false, multiValued = false)
+    private String displayName;
+
+    @Option(name = "-D", aliases = {"--description"}, description = "The description of the service.", required = false, multiValued = false)
+    private String description = "";
+
+    @Option(name = "-s", aliases = {"--start-type"}, description = "Mode in which the service is installed. AUTO_START or DEMAND_START (Default: AUTO_START)", required = false, multiValued = false)
+    private String startType = "AUTO_START";
+
+    protected Object doExecute() throws Exception {
+
+        try {
+            String name = getName();
+            File base = new File(System.getProperty("karaf.base"));
+            File bin = new File(base, "bin");
+            File etc = new File(base, "etc");
+            File lib = new File(base, "lib");
+
+            HashMap<String, String> props = new HashMap<String, String>();
+            props.put("${karaf.home}", System.getProperty("karaf.home"));
+            props.put("${karaf.base}", base.getPath());
+            props.put("${karaf.data}", System.getProperty("karaf.data"));
+            props.put("${name}", name);
+            props.put("${displayName}", getDisplayName());
+            props.put("${description}", getDescription());
+            props.put("${startType}", getStartType());
+
+            String os = System.getProperty("os.name", "Unknown");
+            File serviceFile = null;
+            File wrapperConf = null;
+            if (os.startsWith("Win")) {
+                String arch = System.getProperty("os.arch");
+                if (arch.equalsIgnoreCase("amd64") || arch.equalsIgnoreCase("x86_64")) {
+                    mkdir(bin);
+
+                    copyResourceTo(new File(bin, name + "-wrapper.exe"), "windows64/karaf-wrapper.exe", false);
+
+                    serviceFile = new File(bin, name + "-service.bat");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "windows64/karaf-wrapper.conf", props);
+
+                    copyFilteredResourceTo(serviceFile, "windows64/karaf-service.bat", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "wrapper.dll"), "windows64/wrapper.dll", false);
+                } else {
+                    mkdir(bin);
+
+                    copyResourceTo(new File(bin, name + "-wrapper.exe"), "windows/karaf-wrapper.exe", false);
+
+                    serviceFile = new File(bin, name + "-service.bat");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "windows/karaf-wrapper.conf", props);
+
+                    copyFilteredResourceTo(serviceFile, "windows/karaf-service.bat", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "wrapper.dll"), "windows/wrapper.dll", false);
+                }
+            } else if (os.startsWith("Mac OS X")) {
+                mkdir(bin);
+
+                File file = new File(bin, name + "-wrapper");
+                copyResourceTo(file, "macosx/karaf-wrapper", false);
+                chmod(file, "a+x");
+
+                serviceFile = new File(bin, name + "-service");
+                copyFilteredResourceTo(serviceFile, "unix/karaf-service", props);
+                chmod(serviceFile, "a+x");
+
+                wrapperConf = new File(etc, name + "-wrapper.conf");
+                copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                mkdir(lib);
+                copyResourceTo(new File(lib, "libwrapper.jnilib"), "macosx/libwrapper.jnilib", false);
+
+                // TODO: figure out how to hook in the service that it starts up
+                // when the machine boots up.
+            } else if (os.startsWith("Linux")) {
+                String arch = System.getProperty("os.arch");
+                if (arch.equalsIgnoreCase("amd64") || arch.equalsIgnoreCase("x86_64")) {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "linux64/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyFilteredResourceTo(serviceFile, "unix/karaf-service", props);
+                    chmod(serviceFile, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.so"), "linux64/libwrapper.so", false);
+
+                } else {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "linux/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyFilteredResourceTo(serviceFile, "unix/karaf-service", props);
+                    chmod(serviceFile, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.so"), "linux/libwrapper.so", false);
+
+                    // TODO: figure out how to hook in the service that it starts up
+                    // when the machine boots up.
+                }
+            } else if (os.startsWith("AIX")) {
+                String arch = System.getProperty("os.arch");
+                if (arch.equalsIgnoreCase("ppc64")) {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "aix/ppc64/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyResourceTo(file, "unix/karaf-service", false);
+                    chmod(file, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.a"), "aix/ppc64/libwrapper.a", false);
+                } else {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "aix/ppc64/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyResourceTo(file, "unix/karaf-service", false);
+                    chmod(file, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.a"), "aix/ppc64/libwrapper.a", false);
+                }
+            } else if (os.startsWith("Solaris") || os.startsWith("SunOS")) {
+                String arch = System.getProperty("os.arch");
+                if (arch.equalsIgnoreCase("sparc")) {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "solaris/sparc64/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyResourceTo(file, "unix/karaf-service", false);
+                    chmod(file, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.so"), "solaris/sparc64/libwrapper.so", false);
+                } else if (arch.equalsIgnoreCase("x86")) {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "solaris/x86/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyResourceTo(file, "unix/karaf-service", false);
+                    chmod(file, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.so"), "solaris/x86/libwrapper.so", false);
+                } else {
+                    mkdir(bin);
+
+                    File file = new File(bin, name + "-wrapper");
+                    copyResourceTo(file, "solaris/sparc32/karaf-wrapper", false);
+                    chmod(file, "a+x");
+
+                    serviceFile = new File(bin, name + "-service");
+                    copyResourceTo(file, "unix/karaf-service", false);
+                    chmod(file, "a+x");
+
+                    wrapperConf = new File(etc, name + "-wrapper.conf");
+                    copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                    mkdir(lib);
+                    copyResourceTo(new File(lib, "libwrapper.so"), "solaris/sparc32/libwrapper.so", false);
+                }
+            } else if (os.startsWith("HP-UX") || os.startsWith("HPUX")) {
+                mkdir(bin);
+
+                File file = new File(bin, name + "-wrapper");
+                copyResourceTo(file, "hpux/parisc64/karaf-wrapper", false);
+                chmod(file, "a+x");
+
+                serviceFile = new File(bin, name + "-service");
+                copyResourceTo(file, "unix/karaf-service", false);
+                chmod(file, "a+x");
+
+                wrapperConf = new File(etc, name + "-wrapper.conf");
+                copyFilteredResourceTo(wrapperConf, "unix/karaf-wrapper.conf", props);
+
+                mkdir(lib);
+                copyResourceTo(new File(lib, "libwrapper.sl"), "hpux/parisc64/libwrapper.sl", false);
+            } else {
+                System.out.println("Your operating system '" + os + "' is not currently supported.");
+                return 1;
+            }
+
+            // Install the wrapper jar to the lib directory..
+            mkdir(lib);
+            copyResourceTo(new File(lib, "karaf-wrapper.jar"), "all/karaf-wrapper.jar", false);
+            mkdir(etc);
+
+            createJar(new File(lib, "karaf-wrapper-main.jar"), "org/apache/karaf/shell/wrapper/Main.class");
+
+            System.out.println("");
+            System.out.println("Setup complete.  You may wish to tweak the JVM properties in the wrapper configuration file:");
+            System.out.println("\t" + wrapperConf.getPath());
+            System.out.println("before installing and starting the service.");
+            System.out.println("");
+            if (os.startsWith("Win")) {
+                System.out.println("");
+                System.out.println("To install the service, run: ");
+                System.out.println("  C:> " + serviceFile.getPath() + " install");
+                System.out.println("");
+                System.out.println("Once installed, to start the service run: ");
+                System.out.println("  C:> net start \"" + name + "\"");
+                System.out.println("");
+                System.out.println("Once running, to stop the service run: ");
+                System.out.println("  C:> net stop \"" + name + "\"");
+                System.out.println("");
+                System.out.println("Once stopped, to remove the installed the service run: ");
+                System.out.println("  C:> " + serviceFile.getPath() + " remove");
+                System.out.println("");
+            } else if (os.startsWith("Mac OS X")) {
+                System.out.println("");
+                System.out.println("At this time it is not known how to get this service to start when the machine is rebooted.");
+                System.out.println("If you know how to install the following service script so that it gets started");
+                System.out.println("when OS X starts, please email dev@felix.apache.org and let us know how so");
+                System.out.println("we can update this message.");
+                System.out.println(" ");
+                System.out.println("  To start the service:");
+                System.out.println("    $ " + serviceFile.getPath() + " start");
+                System.out.println("");
+                System.out.println("  To stop the service:");
+                System.out.println("    $ " + serviceFile.getPath() + " stop");
+                System.out.println("");
+            } else if (os.startsWith("Linux")) {
+                System.out.println("The way the service is installed depends upon your flavor of Linux.");
+
+                // TODO: figure out if we can detect the Linux flavor
+
+                System.out.println("");
+                System.out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("On Redhat/Fedora/CentOS Systems:").a(Ansi.Attribute.RESET).toString());
+                System.out.println("  To install the service:");
+                System.out.println("    $ ln -s " + serviceFile.getPath() + " /etc/init.d/");
+                System.out.println("    $ chkconfig " + serviceFile.getName() + " --add");
+                System.out.println("");
+                System.out.println("  To start the service when the machine is rebooted:");
+                System.out.println("    $ chkconfig " + serviceFile.getName() + " on");
+                System.out.println("");
+                System.out.println("  To disable starting the service when the machine is rebooted:");
+                System.out.println("    $ chkconfig " + serviceFile.getName() + " off");
+                System.out.println("");
+                System.out.println("  To start the service:");
+                System.out.println("    $ service " + serviceFile.getName() + " start");
+                System.out.println("");
+                System.out.println("  To stop the service:");
+                System.out.println("    $ service " + serviceFile.getName() + " stop");
+                System.out.println("");
+                System.out.println("  To uninstall the service :");
+                System.out.println("    $ chkconfig " + serviceFile.getName() + " --del");
+                System.out.println("    $ rm /etc/init.d/" + serviceFile.getName());
+
+                System.out.println("");
+                System.out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("On Ubuntu/Debian Systems:").a(Ansi.Attribute.RESET).toString());
+                System.out.println("  To install the service:");
+                System.out.println("    $ ln -s " + serviceFile.getPath() + " /etc/init.d/");
+                System.out.println("");
+                System.out.println("  To start the service when the machine is rebooted:");
+                System.out.println("    $ update-rc.d " + serviceFile.getName() + " defaults");
+                System.out.println("");
+                System.out.println("  To disable starting the service when the machine is rebooted:");
+                System.out.println("    $ update-rc.d -f " + serviceFile.getName() + " remove");
+                System.out.println("");
+                System.out.println("  To start the service:");
+                System.out.println("    $ /etc/init.d/" + serviceFile.getName() + " start");
+                System.out.println("");
+                System.out.println("  To stop the service:");
+                System.out.println("    $ /etc/init.d/" + serviceFile.getName() + " stop");
+                System.out.println("");
+                System.out.println("  To uninstall the service :");
+                System.out.println("    $ rm /etc/init.d/" + serviceFile.getName());
+
+            }
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
+
+        return null;
+    }
+
+    private int chmod(File serviceFile, String mode) throws Exception {
+        ProcessBuilder builder = new ProcessBuilder();
+        builder.command("chmod", mode, serviceFile.getCanonicalPath());
+        Process p = builder.start();
+
+        PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err);
+        handler.attach(p);
+        handler.start();
+        int status = p.waitFor();
+        handler.stop();
+        return status;
+    }
+
+    private void createJar(File outFile, String resource) throws Exception {
+        if (!outFile.exists()) {
+            System.out.println(Ansi.ansi().a("Creating file: ")
+                    .a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
+            InputStream is = getClass().getClassLoader().getResourceAsStream(resource);
+            if (is == null) {
+                throw new IllegalStateException("Resource " + resource + " not found!");
+            }
+            try {
+                JarOutputStream jar = new JarOutputStream(new FileOutputStream(outFile));
+                int idx = resource.indexOf('/');
+                while (idx > 0) {
+                    jar.putNextEntry(new ZipEntry(resource.substring(0, idx)));
+                    jar.closeEntry();
+                    idx = resource.indexOf('/', idx + 1);
+                }
+                jar.putNextEntry(new ZipEntry(resource));
+                int c;
+                while ((c = is.read()) >= 0) {
+                    jar.write(c);
+                }
+                jar.closeEntry();
+                jar.close();
+            } finally {
+                safeClose(is);
+            }
+        }
+    }
+
+    private void copyResourceTo(File outFile, String resource, boolean text) throws Exception {
+        if (!outFile.exists()) {
+            System.out.println(Ansi.ansi().a("Creating file: ")
+                    .a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
+            InputStream is = InstallCommand.class.getResourceAsStream(resource);
+            try {
+                if (text) {
+                    // Read it line at a time so that we can use the platform line ending when we write it out.
+                    PrintStream out = new PrintStream(new FileOutputStream(outFile));
+                    try {
+                        Scanner scanner = new Scanner(is);
+                        while (scanner.hasNextLine()) {
+                            String line = scanner.nextLine();
+                            System.out.println("writing: " + line);
+                            out.println(line);
+                        }
+                    } finally {
+                        safeClose(out);
+                    }
+                } else {
+                    // Binary so just write it out the way it came in.
+                    FileOutputStream out = new FileOutputStream(outFile);
+                    try {
+                        int c = 0;
+                        while ((c = is.read()) >= 0) {
+                            out.write(c);
+                        }
+                    } finally {
+                        safeClose(out);
+                    }
+                }
+            } finally {
+                safeClose(is);
+            }
+        } else {
+            System.out.println(Ansi.ansi()
+                    .fg(Ansi.Color.RED).a("File already exists").a(Ansi.Attribute.RESET)
+                    .a(". Move it out of the way if you wish to recreate it: ").a(outFile.getPath()).toString());
+        }
+    }
+
+    private void copyFilteredResourceTo(File outFile, String resource, HashMap<String, String> props) throws Exception {
+        if (!outFile.exists()) {
+            System.out.println(Ansi.ansi().a("Creating file: ")
+                    .a(Ansi.Attribute.INTENSITY_BOLD).a(outFile.getPath()).a(Ansi.Attribute.RESET).toString());
+            InputStream is = InstallCommand.class.getResourceAsStream(resource);
+            try {
+                // Read it line at a time so that we can use the platform line ending when we write it out.
+                PrintStream out = new PrintStream(new FileOutputStream(outFile));
+                try {
+                    Scanner scanner = new Scanner(is);
+                    while (scanner.hasNextLine()) {
+                        String line = scanner.nextLine();
+                        line = filter(line, props);
+                        out.println(line);
+                    }
+                } finally {
+                    safeClose(out);
+                }
+            } finally {
+                safeClose(is);
+            }
+        } else {
+            System.out.println(Ansi.ansi()
+                    .fg(Ansi.Color.RED).a("File already exists").a(Ansi.Attribute.RESET)
+                    .a(". Move it out of the way if you wish to recreate it: ").a(outFile.getPath()).toString());
+        }
+    }
+
+    private void safeClose(InputStream is) throws IOException {
+        if (is == null)
+            return;
+        try {
+            is.close();
+        } catch (Throwable ignore) {
+        }
+    }
+
+    private void safeClose(OutputStream is) throws IOException {
+        if (is == null)
+            return;
+        try {
+            is.close();
+        } catch (Throwable ignore) {
+        }
+    }
+
+    private String filter(String line, HashMap<String, String> props) {
+        for (Map.Entry<String, String> i : props.entrySet()) {
+            int p1 = line.indexOf(i.getKey());
+            if (p1 >= 0) {
+                String l1 = line.substring(0, p1);
+                String l2 = line.substring(p1 + i.getKey().length());
+                line = l1 + i.getValue() + l2;
+            }
+        }
+        return line;
+    }
+
+    private void mkdir(File file) {
+        if (!file.exists()) {
+            System.out.println(Ansi.ansi().a("Creating missing directory: ")
+                    .a(Ansi.Attribute.INTENSITY_BOLD).a(file.getPath()).a(Ansi.Attribute.RESET).toString());
+            file.mkdirs();
+        }
+    }
+
+    public String getName() {
+        if (name == null) {
+            File base = new File(System.getProperty("karaf.base"));
+            name = base.getName();
+        }
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDisplayName() {
+        if (displayName == null) {
+            displayName = getName();
+        }
+        return displayName;
+    }
+
+    public void setDisplayName(String displayName) {
+        this.displayName = displayName;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getStartType() {
+        return startType;
+    }
+
+    public void setStartType(String startType) {
+        this.startType = startType;
+    }
+}
diff --git a/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java
new file mode 100644
index 0000000..82e738c
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java
@@ -0,0 +1,162 @@
+/*
+ * 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.karaf.shell.wrapper;
+
+import org.apache.karaf.main.ShutdownCallback;
+import org.tanukisoftware.wrapper.WrapperListener;
+import org.tanukisoftware.wrapper.WrapperManager;
+
+/**
+ * Java Service Wrapper Main class
+ */
+public class Main extends Thread implements WrapperListener, ShutdownCallback {
+
+   	private org.apache.karaf.main.Main main;
+    private volatile boolean destroying;
+
+    /*---------------------------------------------------------------
+     * Constructors
+     *-------------------------------------------------------------*/
+    private Main()
+    {
+    }
+
+    /*---------------------------------------------------------------
+     * WrapperListener Methods
+     *-------------------------------------------------------------*/
+    /**
+     * The start method is called when the WrapperManager is signaled by the
+     *    native Wrapper code that it can start its application.  This
+     *    method call is expected to return, so a new thread should be launched
+     *    if necessary.
+     *
+     * @param args List of arguments used to initialize the application.
+     *
+     * @return Any error code if the application should exit on completion
+     *         of the start method.  If there were no problems then this
+     *         method should return null.
+     */
+    public Integer start( String[] args )
+    {
+        main = new org.apache.karaf.main.Main( args );
+        try
+        {
+            main.launch();
+            main.setShutdownCallback(this);
+            start();
+            return null;
+        }
+        catch (Throwable ex)
+        {
+            System.err.println("Could not create framework: " + ex);
+            ex.printStackTrace();
+            return -1;
+        }
+    }
+
+    public void run() {
+        try {
+            main.awaitShutdown();
+            if (!destroying) {
+                WrapperManager.stop(main.getExitCode());
+            }
+        } catch (Exception e) {
+            // Ignore
+        }
+    }
+
+    /**
+     * Called when the application is shutting down.  The Wrapper assumes that
+     *  this method will return fairly quickly.  If the shutdown code code
+     *  could potentially take a long time, then WrapperManager.signalStopping()
+     *  should be called to extend the timeout period.  If for some reason,
+     *  the stop method can not return, then it must call
+     *  WrapperManager.stopped() to avoid warning messages from the Wrapper.
+     *
+     * @param exitCode The suggested exit code that will be returned to the OS
+     *                 when the JVM exits.
+     *
+     * @return The exit code to actually return to the OS.  In most cases, this
+     *         should just be the value of exitCode, however the user code has
+     *         the option of changing the exit code if there are any problems
+     *         during shutdown.
+     */
+    public int stop( int exitCode )
+    {
+        try
+        {
+            destroying = true;
+            if (!main.destroy())
+            {
+                System.err.println("Timeout waiting for Karaf to shutdown");
+                return -3;
+            }
+        }
+        catch (Throwable ex)
+        {
+            System.err.println("Error occured shutting down framework: " + ex);
+            ex.printStackTrace();
+            return -2;
+        }
+
+        return main.getExitCode();
+    }
+    
+    /**
+     * Call-back method is called by the @{link org.apache.karaf.main.Main} for Signaling 
+     * that the stopping process is in progress and the wrapper doesn't kill the JVM.  
+     */
+    public void waitingForShutdown(int delay) {
+    	WrapperManager.signalStopping(delay);
+    }
+
+    /**
+     * Called whenever the native Wrapper code traps a system control signal
+     *  against the Java process.  It is up to the callback to take any actions
+     *  necessary.  Possible values are: WrapperManager.WRAPPER_CTRL_C_EVENT,
+     *    WRAPPER_CTRL_CLOSE_EVENT, WRAPPER_CTRL_LOGOFF_EVENT, or
+     *    WRAPPER_CTRL_SHUTDOWN_EVENT
+     *
+     * @param event The system control signal.
+     */
+    public void controlEvent( int event )
+    {
+        if ( ( event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT )
+            && ( WrapperManager.isLaunchedAsService() ) )
+        {
+            // Ignore
+        }
+        else
+        {
+            WrapperManager.stop( 0 );
+            // Will not get here.
+        }
+    }
+
+    /*---------------------------------------------------------------
+     * Main Method
+     *-------------------------------------------------------------*/
+    public static void main( String[] args )
+    {
+        // Start the application.  If the JVM was launched from the native
+        //  Wrapper then the application will wait for the native Wrapper to
+        //  call the application's start method.  Otherwise the start method
+        //  will be called immediately.
+        WrapperManager.start( new Main(), args );
+    }
+
+ }
diff --git a/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
new file mode 100644
index 0000000..1956192
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
@@ -0,0 +1,248 @@
+/*
+ * 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.karaf.shell.wrapper;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+//
+// Based on Apache Ant 1.6.5
+//
+
+/**
+ * Copies standard output and error of children streams to standard output and error of the parent.
+ *
+ * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
+ */
+public class PumpStreamHandler
+{
+    private final InputStream in;
+
+    private final OutputStream out;
+
+    private final OutputStream err;
+
+    private final String name;
+
+    private StreamPumper outputPump;
+
+    private StreamPumper errorPump;
+
+    private StreamPumper inputPump;
+
+    //
+    // NOTE: May want to use a ThreadPool here, 3 threads per/pair seems kinda expensive :-(
+    //
+
+    public PumpStreamHandler(final InputStream in, final OutputStream out, final OutputStream err, String name) {
+        assert in != null;
+        assert out != null;
+        assert err != null;
+        assert name != null;
+
+        this.in = in;
+        this.out = out;
+        this.err = err;
+        this.name = name;
+    }
+
+    public PumpStreamHandler(final InputStream in, final OutputStream out, final OutputStream err) {
+        this(in, out, err, "<unknown>");
+    }
+
+    public PumpStreamHandler(final OutputStream out, final OutputStream err) {
+        this(null, out, err);
+    }
+
+    public PumpStreamHandler(final OutputStream outAndErr) {
+        this(outAndErr, outAndErr);
+    }
+
+    /**
+     * Set the input stream from which to read the standard output of the child.
+     */
+    public void setChildOutputStream(final InputStream in) {
+        assert in != null;
+
+        createChildOutputPump(in, out);
+    }
+
+    /**
+     * Set the input stream from which to read the standard error of the child.
+     */
+    public void setChildErrorStream(final InputStream in) {
+        assert in != null;
+
+        if (err != null) {
+            createChildErrorPump(in, err);
+        }
+    }
+
+    /**
+     * Set the output stream by means of which input can be sent to the child.
+     */
+    public void setChildInputStream(final OutputStream out) {
+        assert out != null;
+
+        if (in != null) {
+            inputPump = createInputPump(in, out, true);
+        }
+        else {
+            try {
+                out.close();
+            } catch (IOException e) { }
+        }
+    }
+
+    /**
+     * Attach to a child streams from the given process.
+     *
+     * @param p     The process to attach to.
+     */
+    public void attach(final Process p) {
+        assert p != null;
+
+        setChildInputStream(p.getOutputStream());
+        setChildOutputStream(p.getInputStream());
+        setChildErrorStream(p.getErrorStream());
+    }
+    /**
+     * Start pumping the streams.
+     */
+    public void start() {
+        if (outputPump != null) {
+            Thread thread = new Thread(outputPump);
+            thread.setDaemon(true);
+            thread.setName("Output pump for " + this.name);
+            thread.start();
+        }
+
+        if (errorPump != null) {
+            Thread thread = new Thread(errorPump);
+            thread.setDaemon(true);
+            thread.setName("Error pump for " + this.name);
+            thread.start();
+        }
+
+        if (inputPump != null) {
+            Thread thread = new Thread(inputPump);
+            thread.setDaemon(true);
+            thread.setName("Input pump for " + this.name);
+            thread.start();
+        }
+    }
+
+    /**
+     * Stop pumping the streams.
+     */
+    public void stop() {
+        if (outputPump != null) {
+            try {
+                outputPump.stop();
+                outputPump.waitFor();
+            }
+            catch (InterruptedException e) {
+                // ignore
+            }
+        }
+
+        if (errorPump != null) {
+            try {
+                errorPump.stop();
+                errorPump.waitFor();
+            }
+            catch (InterruptedException e) {
+                // ignore
+            }
+        }
+
+        if (inputPump != null) {
+            inputPump.stop();
+        }
+
+        try {
+            err.flush();
+        } catch (IOException e) { }
+        try {
+            out.flush();
+        } catch (IOException e) { }
+    }
+
+    /**
+     * Create the pump to handle child output.
+     */
+    protected void createChildOutputPump(final InputStream in, final OutputStream out) {
+        assert in != null;
+        assert out != null;
+
+        outputPump = createPump(in, out);
+    }
+
+    /**
+     * Create the pump to handle error output.
+     */
+    protected void createChildErrorPump(final InputStream in, final OutputStream out) {
+        assert in != null;
+        assert out != null;
+
+        errorPump = createPump(in, out);
+    }
+
+    /**
+     * Creates a stream pumper to copy the given input stream to the given output stream.
+     */
+    protected StreamPumper createPump(final InputStream in, final OutputStream out) {
+        assert in != null;
+        assert out != null;
+
+        return createPump(in, out, false);
+    }
+
+    /**
+     * Creates a stream pumper to copy the given input stream to the
+     * given output stream.
+     *
+     * @param in                    The input stream to copy from.
+     * @param out                   The output stream to copy to.
+     * @param closeWhenExhausted    If true close the inputstream.
+     * @return                      A thread object that does the pumping.
+     */
+    protected StreamPumper createPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
+        assert in != null;
+        assert out != null;
+
+        StreamPumper pumper = new StreamPumper(in, out, closeWhenExhausted);
+        return pumper;
+    }
+
+    /**
+     * Creates a stream pumper to copy the given input stream to the
+     * given output stream. Used for standard input.
+     */
+    protected StreamPumper createInputPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
+        assert in != null;
+        assert out != null;
+
+        StreamPumper pumper = new StreamPumper(in, out, closeWhenExhausted);
+        pumper.setAutoflush(true);
+        return pumper;
+    }
+}
diff --git a/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
new file mode 100644
index 0000000..c76aeb1
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
@@ -0,0 +1,199 @@
+/*
+ * 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.karaf.shell.wrapper;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+//
+// Based on Apache Ant 1.6.5
+//
+
+/**
+ * Copies all data from an input stream to an output stream.
+ *
+ * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
+ */
+public class StreamPumper
+    implements Runnable
+{
+    private InputStream in;
+
+    private OutputStream out;
+
+    private volatile boolean finish;
+
+    private volatile boolean finished;
+
+    private boolean closeWhenExhausted;
+
+    private boolean autoflush;
+
+    private Exception exception;
+
+    private int bufferSize = 128;
+
+    private boolean started;
+
+    /**
+     * Create a new stream pumper.
+     *
+     * @param in                    Input stream to read data from
+     * @param out                   Output stream to write data to.
+     * @param closeWhenExhausted    If true, the output stream will be closed when
+     *                              the input is exhausted.
+     */
+    public StreamPumper(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
+        assert in != null;
+        assert out != null;
+
+        this.in = in;
+        this.out = out;
+        this.closeWhenExhausted = closeWhenExhausted;
+    }
+
+    /**
+     * Create a new stream pumper.
+     *
+     * @param in    Input stream to read data from
+     * @param out   Output stream to write data to.
+     */
+    public StreamPumper(final InputStream in, final OutputStream out) {
+        this(in, out, false);
+    }
+
+    /**
+     * Set whether data should be flushed through to the output stream.
+     *
+     * @param autoflush     If true, push through data; if false, let it be buffered
+     */
+    public void setAutoflush(boolean autoflush) {
+        this.autoflush = autoflush;
+    }
+
+    /**
+     * Copies data from the input stream to the output stream.
+     *
+     * Terminates as soon as the input stream is closed or an error occurs.
+     */
+    public void run() {
+        synchronized (this) {
+            started = true;
+        }
+        finished = false;
+        finish = false;
+
+        final byte[] buf = new byte[bufferSize];
+
+        int length;
+        try {
+            while ((length = in.read(buf)) > 0 && !finish) {
+                out.write(buf, 0, length);
+                if (autoflush) {
+                    out.flush();
+                }
+            }
+            out.flush();
+        }
+        catch (Exception e) {
+            synchronized (this) {
+                exception = e;
+            }
+        }
+        finally {
+            if (closeWhenExhausted) {
+                try {
+                    out.close();
+                } catch (IOException e) { }
+            }
+            finished = true;
+
+            synchronized (this) {
+                notifyAll();
+            }
+        }
+    }
+
+    /**
+     * Tells whether the end of the stream has been reached.
+     *
+     * @return true     If the stream has been exhausted.
+     */
+    public boolean isFinished() {
+        return finished;
+    }
+
+    /**
+     * This method blocks until the stream pumper finishes.
+     *
+     * @see #isFinished()
+     */
+    public synchronized void waitFor() throws InterruptedException {
+        while (!isFinished()) {
+            wait();
+        }
+    }
+
+    /**
+     * Set the size in bytes of the read buffer.
+     *
+     * @param bufferSize the buffer size to use.
+     * @throws IllegalStateException if the StreamPumper is already running.
+     */
+    public synchronized void setBufferSize(final int bufferSize) {
+        if (started) {
+            throw new IllegalStateException("Cannot set buffer size on a running StreamPumper");
+        }
+
+        this.bufferSize = bufferSize;
+    }
+
+    /**
+     * Get the size in bytes of the read buffer.
+     *
+     * @return The size of the read buffer.
+     */
+    public synchronized int getBufferSize() {
+        return bufferSize;
+    }
+
+    /**
+     * Get the exception encountered, if any.
+     *
+     * @return The Exception encountered; or null if there was none.
+     */
+    public synchronized Exception getException() {
+        return exception;
+    }
+
+    /**
+     * Stop the pumper as soon as possible.
+     *
+     * Note that it may continue to block on the input stream
+     * but it will really stop the thread as soon as it gets EOF
+     * or any byte, and it will be marked as finished.
+     */
+    public synchronized void stop() {
+        finish = true;
+
+        notifyAll();
+    }
+}
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml b/karaf-2.2.x/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml
new file mode 100644
index 0000000..d994639
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml
@@ -0,0 +1,28 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
+        <command name="wrapper/install">
+            <action class="org.apache.karaf.shell.wrapper.InstallCommand"/>
+        </command>
+    </command-bundle>
+
+</blueprint>
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/shell/wrapper/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..6d0c282
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides support of the service wrapper.
+
+    The service wrapper allows you to start/stop Karaf as a system service.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mService Wrapper\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/karaf-wrapper
new file mode 100755
index 0000000..5215c2e
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/libwrapper.a b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/libwrapper.a
new file mode 100755
index 0000000..4bcc342
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/libwrapper.a
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/karaf-wrapper
new file mode 100755
index 0000000..6ba0351
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/libwrapper.a b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/libwrapper.a
new file mode 100755
index 0000000..b569e3f
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/libwrapper.a
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/all/karaf-wrapper.jar b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/all/karaf-wrapper.jar
new file mode 100755
index 0000000..4db355b
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/all/karaf-wrapper.jar
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/karaf-wrapper
new file mode 100755
index 0000000..ad883d7
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/libwrapper.sl b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/libwrapper.sl
new file mode 100755
index 0000000..08adc52
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/libwrapper.sl
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/karaf-wrapper
new file mode 100644
index 0000000..7e00645
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/libwrapper.so b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/libwrapper.so
new file mode 100644
index 0000000..2cc4ab3
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/libwrapper.so
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/karaf-wrapper
new file mode 100755
index 0000000..3128b95
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/libwrapper.so b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/libwrapper.so
new file mode 100755
index 0000000..24197bf
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/libwrapper.so
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/karaf-wrapper
new file mode 100644
index 0000000..0165db0
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/libwrapper.jnilib b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/libwrapper.jnilib
new file mode 100644
index 0000000..6356705
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/libwrapper.jnilib
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/karaf-wrapper
new file mode 100755
index 0000000..7cac208
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/libwrapper.so b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/libwrapper.so
new file mode 100755
index 0000000..4093262
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/libwrapper.so
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/karaf-wrapper
new file mode 100755
index 0000000..91257c6
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/libwrapper.so b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/libwrapper.so
new file mode 100755
index 0000000..008bef6
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/libwrapper.so
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/karaf-wrapper b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/karaf-wrapper
new file mode 100755
index 0000000..bdec254
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/karaf-wrapper
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/libwrapper.so b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/libwrapper.so
new file mode 100755
index 0000000..963ff49
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/libwrapper.so
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-service b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-service
new file mode 100755
index 0000000..e549730
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-service
@@ -0,0 +1,546 @@
+#! /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.
+# ------------------------------------------------------------------------
+
+# Application
+APP_NAME="${name}"
+APP_LONG_NAME="${displayName}"
+
+# Wrapper
+WRAPPER_CMD="${karaf.base}/bin/${APP_NAME}-wrapper"
+WRAPPER_CONF="${karaf.base}/etc/${APP_NAME}-wrapper.conf"
+
+# Priority at which to run the wrapper.  See "man nice" for valid priorities.
+#  nice is only used if a priority is specified.
+PRIORITY=
+
+# Location of the data folder.
+DATADIR="${karaf.data}"
+
+# Location of the pid file.
+PIDDIR="${karaf.data}"
+
+# If uncommented, causes the Wrapper to be shutdown using an anchor file.
+#  When launched with the 'start' command, it will also ignore all INT and
+#  TERM signals.
+#IGNORE_SIGNALS=true
+
+# If specified, the Wrapper will be run as the specified user.
+# IMPORTANT - Make sure that the user has the required privileges to write
+#  the PID file and wrapper.log files.  Failure to be able to write the log
+#  file will cause the Wrapper to exit without any way to write out an error
+#  message.
+# NOTE - This will set the user which is used to run the Wrapper as well as
+#  the JVM and is not useful in situations where a privileged resource or
+#  port needs to be allocated prior to the user being changed.
+#RUN_AS_USER=
+
+# The following two lines are used by the chkconfig command. Change as is
+#  appropriate for your application.  They should remain commented.
+# chkconfig: 2345 20 80
+# description: ${displayName}
+
+# Do not modify anything beyond this point
+#-----------------------------------------------------------------------------
+
+# Get the fully qualified path to the script
+case $0 in
+    /*)
+        SCRIPT="$0"
+        ;;
+    *)
+        PWD=`pwd`
+        SCRIPT="$PWD/$0"
+        ;;
+esac
+
+# Resolve the true real path without any sym links.
+CHANGED=true
+while [ "X$CHANGED" != "X" ]
+do
+    # Change spaces to ":" so the tokens can be parsed.
+    SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'`
+    # Get the real path to this script, resolving any symbolic links
+    TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'`
+    REALPATH=
+    for C in $TOKENS; do
+        REALPATH="$REALPATH/$C"
+        while [ -h "$REALPATH" ] ; do
+            LS="`ls -ld "$REALPATH"`"
+            LINK="`expr "$LS" : '.*-> \(.*\)$'`"
+            if expr "$LINK" : '/.*' > /dev/null; then
+                REALPATH="$LINK"
+            else
+                REALPATH="`dirname "$REALPATH"`""/$LINK"
+            fi
+        done
+    done
+    # Change ":" chars back to spaces.
+    REALPATH=`echo $REALPATH | sed -e 's;:; ;g'`
+
+    if [ "$REALPATH" = "$SCRIPT" ]
+    then
+        CHANGED=""
+    else
+        SCRIPT="$REALPATH"
+    fi
+done
+
+# Change the current directory to the location of the script
+cd "`dirname "$REALPATH"`"
+REALDIR=`pwd`
+
+# If the PIDDIR is relative, set its value relative to the full REALPATH to avoid problems if
+#  the working directory is later changed.
+FIRST_CHAR=`echo $PIDDIR | cut -c1,1`
+if [ "$FIRST_CHAR" != "/" ]
+then
+    PIDDIR=$REALDIR/$PIDDIR
+fi
+# Same test for WRAPPER_CMD
+FIRST_CHAR=`echo $WRAPPER_CMD | cut -c1,1`
+if [ "$FIRST_CHAR" != "/" ]
+then
+    WRAPPER_CMD=$REALDIR/$WRAPPER_CMD
+fi
+# Same test for WRAPPER_CONF
+FIRST_CHAR=`echo $WRAPPER_CONF | cut -c1,1`
+if [ "$FIRST_CHAR" != "/" ]
+then
+    WRAPPER_CONF=$REALDIR/$WRAPPER_CONF
+fi
+
+# Process ID
+ANCHORFILE="$PIDDIR/$APP_NAME.anchor"
+PIDFILE="$PIDDIR/$APP_NAME.pid"
+LOCKDIR="/var/lock/subsys"
+LOCKFILE="$LOCKDIR/$APP_NAME"
+pid=""
+
+# Resolve the location of the 'ps' command
+PSEXE="/usr/bin/ps"
+if [ ! -x $PSEXE ]
+then
+    PSEXE="/bin/ps"
+    if [ ! -x $PSEXE ]
+    then
+        echo "Unable to locate 'ps'."
+        echo "Please report this message along with the location of the command on your system."
+        exit 1
+    fi
+fi
+
+# Resolve the os
+DIST_OS=`uname -s | tr [:upper:] [:lower:] | tr -d [:blank:]`
+case "$DIST_OS" in
+    'sunos')
+        DIST_OS="solaris"
+        ;;
+    'hp-ux' | 'hp-ux64')
+        DIST_OS="hpux"
+        ;;
+    'darwin')
+        DIST_OS="macosx"
+        ;;
+    'unix_sv')
+        DIST_OS="unixware"
+        ;;
+esac
+
+# Resolve the architecture
+DIST_ARCH=`uname -p | tr [:upper:] [:lower:] | tr -d [:blank:]`
+if [ "$DIST_ARCH" = "unknown" ]
+then
+    DIST_ARCH=`uname -m | tr [:upper:] [:lower:] | tr -d [:blank:]`
+fi
+case "$DIST_ARCH" in
+    'amd64' | 'ia32' | 'ia64' | 'i386' | 'i486' | 'i586' | 'i686' | 'x86_64')
+        DIST_ARCH="x86"
+        ;;
+    'ip27')
+        DIST_ARCH="mips"
+        ;;
+    'power' | 'powerpc' | 'power_pc' | 'ppc64')
+        DIST_ARCH="ppc"
+        ;;
+    'pa_risc' | 'pa-risc')
+        DIST_ARCH="parisc"
+        ;;
+    'sun4u' | 'sparcv9')
+        DIST_ARCH="sparc"
+        ;;
+    '9000/800')
+        DIST_ARCH="parisc"
+        ;;
+esac
+
+# Decide on the wrapper binary to use.
+# If a 32-bit wrapper binary exists then it will work on 32 or 64 bit
+#  platforms, if the 64-bit binary exists then the distribution most
+#  likely wants to use long names.  Otherwise, look for the default.
+# For macosx, we also want to look for universal binaries.
+WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
+if [ -x $WRAPPER_TEST_CMD ]
+then
+    WRAPPER_CMD="$WRAPPER_TEST_CMD"
+else
+    if [ "$DIST_OS" = "macosx" ]
+    then
+        WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-universal-32"
+        if [ -x $WRAPPER_TEST_CMD ]
+        then
+            WRAPPER_CMD="$WRAPPER_TEST_CMD"
+        else
+            WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
+            if [ -x $WRAPPER_TEST_CMD ]
+            then
+                WRAPPER_CMD="$WRAPPER_TEST_CMD"
+            else
+                WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-universal-64"
+                if [ -x $WRAPPER_TEST_CMD ]
+                then
+                    WRAPPER_CMD="$WRAPPER_TEST_CMD"
+                else
+                    if [ ! -x $WRAPPER_CMD ]
+                    then
+                        echo "Unable to locate any of the following binaries:"
+                        echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
+                        echo "  $WRAPPER_CMD-$DIST_OS-universal-32"
+                        echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
+                        echo "  $WRAPPER_CMD-$DIST_OS-universal-64"
+                        echo "  $WRAPPER_CMD"
+                        exit 1
+                    fi
+                fi
+            fi
+        fi
+    else
+        WRAPPER_TEST_CMD="$WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
+        if [ -x $WRAPPER_TEST_CMD ]
+        then
+            WRAPPER_CMD="$WRAPPER_TEST_CMD"
+        else
+            if [ ! -x $WRAPPER_CMD ]
+            then
+                echo "Unable to locate any of the following binaries:"
+                echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-32"
+                echo "  $WRAPPER_CMD-$DIST_OS-$DIST_ARCH-64"
+                echo "  $WRAPPER_CMD"
+                exit 1
+            fi
+        fi
+    fi
+fi
+
+# Build the nice clause
+if [ "X$PRIORITY" = "X" ]
+then
+    CMDNICE=""
+else
+    CMDNICE="nice -$PRIORITY"
+fi
+
+# Build the anchor file clause.
+if [ "X$IGNORE_SIGNALS" = "X" ]
+then
+   ANCHORPROP=
+   IGNOREPROP=
+else
+   ANCHORPROP=wrapper.anchorfile=$ANCHORFILE
+   IGNOREPROP=wrapper.ignore_signals=TRUE
+fi
+
+# Build the lock file clause.  Only create a lock file if the lock directory exists on this platform.
+if [ -d $LOCKDIR ]
+then
+    LOCKPROP=wrapper.lockfile=$LOCKFILE
+else
+    LOCKPROP=
+fi
+
+checkUser() {
+    # Check the configured user.  If necessary rerun this script as the desired user.
+    if [ "X$RUN_AS_USER" != "X" ]
+    then
+        # Resolve the location of the 'id' command
+        IDEXE="/usr/xpg4/bin/id"
+        if [ ! -x $IDEXE ]
+        then
+            IDEXE="/usr/bin/id"
+            if [ ! -x $IDEXE ]
+            then
+                echo "Unable to locate 'id'."
+                echo "Please report this message along with the location of the command on your system."
+                exit 1
+            fi
+        fi
+
+        if [ "`$IDEXE -u -n`" = "$RUN_AS_USER" ]
+        then
+            # Already running as the configured user.  Avoid password prompts by not calling su.
+            RUN_AS_USER=""
+        fi
+    fi
+    if [ "X$RUN_AS_USER" != "X" ]
+    then
+        # If LOCKPROP and $RUN_AS_USER are defined then the new user will most likely not be
+        # able to create the lock file.  The Wrapper will be able to update this file once it
+        # is created but will not be able to delete it on shutdown.  If $2 is defined then
+        # the lock file should be created for the current command
+        if [ "X$LOCKPROP" != "X" ]
+        then
+            if [ "X$2" != "X" ]
+            then
+                # Resolve the primary group
+                RUN_AS_GROUP=`groups $RUN_AS_USER | awk '{print $3}' | tail -1`
+                if [ "X$RUN_AS_GROUP" = "X" ]
+                then
+                    RUN_AS_GROUP=RUN_AS_USER
+                fi
+                touch $LOCKFILE
+                chown $RUN_AS_USER:$RUN_AS_GROUP $LOCKFILE
+            fi
+        fi
+
+        # Still want to change users, recurse.  This means that the user will only be
+        #  prompted for a password once.
+        su -m $RUN_AS_USER -c "$REALPATH $1"
+
+        # Now that we are the original user again, we may need to clean up the lock file.
+        if [ "X$LOCKPROP" != "X" ]
+        then
+            getpid
+            if [ "X$pid" = "X" ]
+            then
+                # Wrapper is not running so make sure the lock file is deleted.
+                if [ -f $LOCKFILE ]
+                then
+                    rm $LOCKFILE
+                fi
+            fi
+        fi
+
+        exit 0
+    fi
+}
+
+getpid() {
+    if [ -f $PIDFILE ]
+    then
+        if [ -r $PIDFILE ]
+        then
+            pid=`cat $PIDFILE`
+            if [ "X$pid" != "X" ]
+            then
+                # It is possible that 'a' process with the pid exists but that it is not the
+                #  correct process.  This can happen in a number of cases, but the most
+                #  common is during system startup after an unclean shutdown.
+                # The ps statement below looks for the specific wrapper command running as
+                #  the pid.  If it is not found then the pid file is considered to be stale.
+                pidtest=`$PSEXE -p $pid -o command | grep $WRAPPER_CMD | tail -1`
+                if [ "X$pidtest" = "X" ]
+                then
+                    # This is a stale pid file.
+                    rm -f $PIDFILE
+                    echo "Removed stale pid file: $PIDFILE"
+                    pid=""
+                fi
+            fi
+        else
+            echo "Cannot read $PIDFILE."
+            exit 1
+        fi
+    fi
+}
+
+testpid() {
+    pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
+    if [ "X$pid" = "X" ]
+    then
+        # Process is gone so remove the pid file.
+        rm -f $PIDFILE
+        pid=""
+    fi
+}
+
+console() {
+    echo "Running $APP_LONG_NAME..."
+    getpid
+    if [ "X$pid" = "X" ]
+    then
+        COMMAND_LINE="$CMDNICE $WRAPPER_CMD $WRAPPER_CONF wrapper.syslog.ident=$APP_NAME wrapper.pidfile=$PIDFILE $ANCHORPROP $LOCKPROP"
+        exec $COMMAND_LINE
+    else
+        echo "$APP_LONG_NAME is already running."
+        exit 1
+    fi
+}
+
+start() {
+    echo "Starting $APP_LONG_NAME..."
+    getpid
+    if [ "X$pid" = "X" ]
+    then
+        if [ ! -d $DATADIR ]; then
+            mkdir $DATADIR
+        fi
+        if [ ! -d $DATADIR/log ]; then
+            mkdir $DATADIR/log
+        fi
+        COMMAND_LINE="$CMDNICE $WRAPPER_CMD $WRAPPER_CONF wrapper.syslog.ident=$APP_NAME wrapper.pidfile=$PIDFILE wrapper.daemonize=TRUE $ANCHORPROP $IGNOREPROP $LOCKPROP"
+        exec $COMMAND_LINE
+    else
+        echo "$APP_LONG_NAME is already running."
+        exit 1
+    fi
+}
+
+stopit() {
+    echo "Stopping $APP_LONG_NAME..."
+    getpid
+    if [ "X$pid" = "X" ]
+    then
+        echo "$APP_LONG_NAME was not running."
+    else
+        if [ "X$IGNORE_SIGNALS" = "X" ]
+        then
+            # Running so try to stop it.
+            kill $pid
+            if [ $? -ne 0 ]
+            then
+                # An explanation for the failure should have been given
+                echo "Unable to stop $APP_LONG_NAME."
+                exit 1
+            fi
+        else
+            rm -f $ANCHORFILE
+            if [ -f $ANCHORFILE ]
+            then
+                # An explanation for the failure should have been given
+                echo "Unable to stop $APP_LONG_NAME."
+                exit 1
+            fi
+        fi
+
+        # We can not predict how long it will take for the wrapper to
+        #  actually stop as it depends on settings in wrapper.conf.
+        #  Loop until it does.
+        savepid=$pid
+        CNT=0
+        TOTCNT=0
+        while [ "X$pid" != "X" ]
+        do
+            # Show a waiting message every 5 seconds.
+            if [ "$CNT" -lt "5" ]
+            then
+                CNT=`expr $CNT + 1`
+            else
+                echo "Waiting for $APP_LONG_NAME to exit..."
+                CNT=0
+            fi
+            TOTCNT=`expr $TOTCNT + 1`
+
+            sleep 1
+
+            testpid
+        done
+
+        pid=$savepid
+        testpid
+        if [ "X$pid" != "X" ]
+        then
+            echo "Failed to stop $APP_LONG_NAME."
+            exit 1
+        else
+            echo "Stopped $APP_LONG_NAME."
+        fi
+    fi
+}
+
+status() {
+    getpid
+    if [ "X$pid" = "X" ]
+    then
+        echo "$APP_LONG_NAME is not running."
+        exit 1
+    else
+        echo "$APP_LONG_NAME is running ($pid)."
+        exit 0
+    fi
+}
+
+dump() {
+    echo "Dumping $APP_LONG_NAME..."
+    getpid
+    if [ "X$pid" = "X" ]
+    then
+        echo "$APP_LONG_NAME was not running."
+
+    else
+        kill -3 $pid
+
+        if [ $? -ne 0 ]
+        then
+            echo "Failed to dump $APP_LONG_NAME."
+            exit 1
+        else
+            echo "Dumped $APP_LONG_NAME."
+        fi
+    fi
+}
+
+case "$1" in
+
+    'console')
+        checkUser $1 touchlock
+        console
+        ;;
+
+    'start')
+        checkUser $1 touchlock
+        start
+        ;;
+
+    'stop')
+        checkUser $1
+        stopit
+        ;;
+
+    'restart')
+        checkUser $1 touchlock
+        stopit
+        start
+        ;;
+
+    'status')
+        checkUser $1
+        status
+        ;;
+
+    'dump')
+        checkUser $1
+        dump
+        ;;
+
+    *)
+        echo "Usage: $0 { console | start | stop | restart | status | dump }"
+        exit 1
+        ;;
+esac
+
+exit 0
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-wrapper.conf b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-wrapper.conf
new file mode 100644
index 0000000..70b7adb
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-wrapper.conf
@@ -0,0 +1,129 @@
+# ------------------------------------------------------------------------
+# 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.
+# ------------------------------------------------------------------------
+
+#********************************************************************
+# Wrapper Properties
+#********************************************************************
+set.default.KARAF_HOME=${karaf.home}
+set.default.KARAF_BASE=${karaf.base}
+set.default.KARAF_DATA=${karaf.data}
+
+# Java Application
+wrapper.working.dir=%KARAF_BASE%
+wrapper.java.command=java
+wrapper.java.mainclass=org.apache.karaf.shell.wrapper.Main
+wrapper.java.classpath.1=%KARAF_BASE%/lib/karaf-wrapper.jar
+wrapper.java.classpath.2=%KARAF_HOME%/lib/karaf.jar
+wrapper.java.classpath.3=%KARAF_HOME%/lib/karaf-jaas-boot.jar
+wrapper.java.classpath.4=%KARAF_BASE%/lib/karaf-wrapper-main.jar
+wrapper.java.library.path.1=%KARAF_BASE%/lib/
+
+# Application Parameters.  Add parameters as needed starting from 1
+#wrapper.app.parameter.1=
+
+# JVM Parameters            
+# note that n is the parameter number starting from 1.
+wrapper.java.additional.1=-Dkaraf.home=%KARAF_HOME%
+wrapper.java.additional.2=-Dkaraf.base=%KARAF_BASE%
+wrapper.java.additional.3=-Dkaraf.data=%KARAF_DATA%
+wrapper.java.additional.4=-Dcom.sun.management.jmxremote
+wrapper.java.additional.5=-Dkaraf.startLocalConsole=false
+wrapper.java.additional.6=-Dkaraf.startRemoteShell=true
+wrapper.java.additional.7=-Djava.endorsed.dirs=%JAVA_HOME%/jre/lib/endorsed:%JAVA_HOME%/lib/endorsed:%KARAF_HOME%/lib/endorsed
+wrapper.java.additional.8=-Djava.ext.dirs=%JAVA_HOME%/jre/lib/ext:%JAVA_HOME%/lib/ext:%KARAF_HOME%/lib/ext
+
+# Uncomment to enable jmx
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.port=1616
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.authenticate=false
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.ssl=false
+
+# Uncomment to enable YourKit profiling
+#wrapper.java.additional.n=-Xrunyjpagent
+
+# Uncomment to enable remote debugging
+#wrapper.java.additional.n=-Xdebug -Xnoagent -Djava.compiler=NONE
+#wrapper.java.additional.n=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
+
+# Initial Java Heap Size (in MB)
+#wrapper.java.initmemory=3
+
+# Maximum Java Heap Size (in MB)
+wrapper.java.maxmemory=512
+
+
+#********************************************************************
+# Wrapper Logging Properties
+#********************************************************************
+# Format of output for the console.  (See docs for formats)
+wrapper.console.format=PM
+
+# Log Level for console output.  (See docs for log levels)
+wrapper.console.loglevel=INFO
+
+# Log file to use for wrapper output logging.
+wrapper.logfile=%KARAF_DATA%/log/wrapper.log
+
+# Format of output for the log file.  (See docs for formats)
+wrapper.logfile.format=LPTM
+
+# Log Level for log file output.  (See docs for log levels)
+wrapper.logfile.loglevel=INFO
+
+# Maximum size that the log file will be allowed to grow to before
+#  the log is rolled. Size is specified in bytes.  The default value
+#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
+#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
+wrapper.logfile.maxsize=10m
+
+# Maximum number of rolled log files which will be allowed before old
+#  files are deleted.  The default value of 0 implies no limit.
+wrapper.logfile.maxfiles=5
+
+# Log Level for sys/event log output.  (See docs for log levels)
+wrapper.syslog.loglevel=NONE
+
+#********************************************************************
+# Wrapper Windows Properties
+#********************************************************************
+# Title to use when running as a console
+wrapper.console.title=${name}
+
+#********************************************************************
+# Wrapper Windows NT/2000/XP Service Properties
+#********************************************************************
+# WARNING - Do not modify any of these properties when an application
+#  using this configuration file has been installed as a service.
+#  Please uninstall the service before modifying this section.  The
+#  service can then be reinstalled.
+
+# Name of the service
+wrapper.ntservice.name=${name}
+
+# Display name of the service
+wrapper.ntservice.displayname=${displayName}
+
+# Description of the service
+wrapper.ntservice.description=${description}
+
+# Service dependencies.  Add dependencies as needed starting from 1
+wrapper.ntservice.dependency.1=
+
+# Mode in which the service is installed.  AUTO_START or DEMAND_START
+wrapper.ntservice.starttype=${startType}
+
+# Allow the service to interact with the desktop.
+wrapper.ntservice.interactive=false
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-service.bat b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-service.bat
new file mode 100644
index 0000000..f29dccd
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-service.bat
@@ -0,0 +1,50 @@
+@echo off
+
+REM ------------------------------------------------------------------------
+REM Licensed to the Apache Software Foundation (ASF) under one or more
+REM contributor license agreements.  See the NOTICE file distributed with
+REM this work for additional information regarding copyright ownership.
+REM The ASF licenses this file to You under the Apache License, Version 2.0
+REM (the "License"); you may not use this file except in compliance with
+REM 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, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+REM ------------------------------------------------------------------------
+
+setlocal
+
+set APP_NAME=${name}
+set APP_LONG_NAME=${displayName}
+set APP_BASE=${karaf.base}
+
+if ""%1"" == ""run"" goto doRun
+if ""%1"" == ""install"" goto doInstall
+if ""%1"" == ""remove"" goto doRemove
+
+echo Usage:  karaf-service ( commands ... )
+echo commands:
+echo   run               Start %APP_NAME% in the current console
+echo   install           Install %APP_NAME% as a Windows service
+echo   remove            Remove the %APP_NAME% Windows service
+goto end
+
+:doRun
+"%APP_BASE%\bin\%APP_NAME%-wrapper.exe" -c "%APP_BASE%\etc\%APP_NAME%-wrapper.conf"
+goto end
+
+:doInstall
+"%APP_BASE%\bin\%APP_NAME%-wrapper.exe" -i "%APP_BASE%\etc\%APP_NAME%-wrapper.conf"
+goto end
+
+:doRemove
+"%APP_BASE%\bin\%APP_NAME%-wrapper.exe" -r "%APP_BASE%\etc\%APP_NAME%-wrapper.conf"
+goto end
+
+:end
+if not "%PAUSE%" == "" pause
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.conf b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.conf
new file mode 100644
index 0000000..12104c3
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.conf
@@ -0,0 +1,129 @@
+# ------------------------------------------------------------------------
+# 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.
+# ------------------------------------------------------------------------
+
+#********************************************************************
+# Wrapper Properties
+#********************************************************************
+set.default.KARAF_HOME=${karaf.home}
+set.default.KARAF_BASE=${karaf.base}
+set.default.KARAF_DATA=${karaf.data}
+
+# Java Application
+wrapper.working.dir=%KARAF_BASE%
+wrapper.java.command=java
+wrapper.java.mainclass=org.apache.karaf.shell.wrapper.Main
+wrapper.java.classpath.1=%KARAF_BASE%/lib/karaf-wrapper.jar
+wrapper.java.classpath.2=%KARAF_HOME%/lib/karaf.jar
+wrapper.java.classpath.3=%KARAF_HOME%/lib/karaf-jaas-boot.jar
+wrapper.java.classpath.4=%KARAF_BASE%/lib/karaf-wrapper-main.jar
+wrapper.java.library.path.1=%KARAF_BASE%/lib/
+
+# Application Parameters.  Add parameters as needed starting from 1
+#wrapper.app.parameter.1=
+
+# JVM Parameters
+# note that n is the parameter number starting from 1.
+wrapper.java.additional.1=-Dkaraf.home="%KARAF_HOME%"
+wrapper.java.additional.2=-Dkaraf.base="%KARAF_BASE%"
+wrapper.java.additional.3=-Dkaraf.data="%KARAF_DATA%"
+wrapper.java.additional.4=-Dcom.sun.management.jmxremote
+wrapper.java.additional.5=-Dkaraf.startLocalConsole=false
+wrapper.java.additional.6=-Dkaraf.startRemoteShell=true
+wrapper.java.additional.7=-Djava.endorsed.dirs="%JAVA_HOME%/jre/lib/endorsed;%JAVA_HOME%/lib/endorsed;%KARAF_HOME%/lib/endorsed"
+wrapper.java.additional.8=-Djava.ext.dirs="%JAVA_HOME%/jre/lib/ext;%JAVA_HOME%/lib/ext;%KARAF_HOME%/lib/ext"
+
+# Uncomment to enable jmx
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.port=1616
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.authenticate=false
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.ssl=false
+
+# Uncomment to enable YourKit profiling
+#wrapper.java.additional.n=-Xrunyjpagent
+
+# Uncomment to enable remote debugging
+#wrapper.java.additional.n=-Xdebug -Xnoagent -Djava.compiler=NONE
+#wrapper.java.additional.n=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
+
+# Initial Java Heap Size (in MB)
+#wrapper.java.initmemory=3
+
+# Maximum Java Heap Size (in MB)
+wrapper.java.maxmemory=512
+
+
+#********************************************************************
+# Wrapper Logging Properties
+#********************************************************************
+# Format of output for the console.  (See docs for formats)
+wrapper.console.format=PM
+
+# Log Level for console output.  (See docs for log levels)
+wrapper.console.loglevel=INFO
+
+# Log file to use for wrapper output logging.
+wrapper.logfile=%KARAF_DATA%/log/wrapper.log
+
+# Format of output for the log file.  (See docs for formats)
+wrapper.logfile.format=LPTM
+
+# Log Level for log file output.  (See docs for log levels)
+wrapper.logfile.loglevel=INFO
+
+# Maximum size that the log file will be allowed to grow to before
+#  the log is rolled. Size is specified in bytes.  The default value
+#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
+#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
+wrapper.logfile.maxsize=10m
+
+# Maximum number of rolled log files which will be allowed before old
+#  files are deleted.  The default value of 0 implies no limit.
+wrapper.logfile.maxfiles=5
+
+# Log Level for sys/event log output.  (See docs for log levels)
+wrapper.syslog.loglevel=NONE
+
+#********************************************************************
+# Wrapper Windows Properties
+#********************************************************************
+# Title to use when running as a console
+wrapper.console.title=${name}
+
+#********************************************************************
+# Wrapper Windows NT/2000/XP Service Properties
+#********************************************************************
+# WARNING - Do not modify any of these properties when an application
+#  using this configuration file has been installed as a service.
+#  Please uninstall the service before modifying this section.  The
+#  service can then be reinstalled.
+
+# Name of the service
+wrapper.ntservice.name=${name}
+
+# Display name of the service
+wrapper.ntservice.displayname=${displayName}
+
+# Description of the service
+wrapper.ntservice.description=${description}
+
+# Service dependencies.  Add dependencies as needed starting from 1
+wrapper.ntservice.dependency.1=
+
+# Mode in which the service is installed.  AUTO_START or DEMAND_START
+wrapper.ntservice.starttype=${startType}
+
+# Allow the service to interact with the desktop.
+wrapper.ntservice.interactive=false
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.exe b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.exe
new file mode 100644
index 0000000..b4cfc55
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.exe
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/wrapper.dll b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/wrapper.dll
new file mode 100644
index 0000000..cb553c1
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/wrapper.dll
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-service.bat b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-service.bat
new file mode 100644
index 0000000..f29dccd
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-service.bat
@@ -0,0 +1,50 @@
+@echo off
+
+REM ------------------------------------------------------------------------
+REM Licensed to the Apache Software Foundation (ASF) under one or more
+REM contributor license agreements.  See the NOTICE file distributed with
+REM this work for additional information regarding copyright ownership.
+REM The ASF licenses this file to You under the Apache License, Version 2.0
+REM (the "License"); you may not use this file except in compliance with
+REM 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, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+REM ------------------------------------------------------------------------
+
+setlocal
+
+set APP_NAME=${name}
+set APP_LONG_NAME=${displayName}
+set APP_BASE=${karaf.base}
+
+if ""%1"" == ""run"" goto doRun
+if ""%1"" == ""install"" goto doInstall
+if ""%1"" == ""remove"" goto doRemove
+
+echo Usage:  karaf-service ( commands ... )
+echo commands:
+echo   run               Start %APP_NAME% in the current console
+echo   install           Install %APP_NAME% as a Windows service
+echo   remove            Remove the %APP_NAME% Windows service
+goto end
+
+:doRun
+"%APP_BASE%\bin\%APP_NAME%-wrapper.exe" -c "%APP_BASE%\etc\%APP_NAME%-wrapper.conf"
+goto end
+
+:doInstall
+"%APP_BASE%\bin\%APP_NAME%-wrapper.exe" -i "%APP_BASE%\etc\%APP_NAME%-wrapper.conf"
+goto end
+
+:doRemove
+"%APP_BASE%\bin\%APP_NAME%-wrapper.exe" -r "%APP_BASE%\etc\%APP_NAME%-wrapper.conf"
+goto end
+
+:end
+if not "%PAUSE%" == "" pause
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.conf b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.conf
new file mode 100644
index 0000000..12104c3
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.conf
@@ -0,0 +1,129 @@
+# ------------------------------------------------------------------------
+# 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.
+# ------------------------------------------------------------------------
+
+#********************************************************************
+# Wrapper Properties
+#********************************************************************
+set.default.KARAF_HOME=${karaf.home}
+set.default.KARAF_BASE=${karaf.base}
+set.default.KARAF_DATA=${karaf.data}
+
+# Java Application
+wrapper.working.dir=%KARAF_BASE%
+wrapper.java.command=java
+wrapper.java.mainclass=org.apache.karaf.shell.wrapper.Main
+wrapper.java.classpath.1=%KARAF_BASE%/lib/karaf-wrapper.jar
+wrapper.java.classpath.2=%KARAF_HOME%/lib/karaf.jar
+wrapper.java.classpath.3=%KARAF_HOME%/lib/karaf-jaas-boot.jar
+wrapper.java.classpath.4=%KARAF_BASE%/lib/karaf-wrapper-main.jar
+wrapper.java.library.path.1=%KARAF_BASE%/lib/
+
+# Application Parameters.  Add parameters as needed starting from 1
+#wrapper.app.parameter.1=
+
+# JVM Parameters
+# note that n is the parameter number starting from 1.
+wrapper.java.additional.1=-Dkaraf.home="%KARAF_HOME%"
+wrapper.java.additional.2=-Dkaraf.base="%KARAF_BASE%"
+wrapper.java.additional.3=-Dkaraf.data="%KARAF_DATA%"
+wrapper.java.additional.4=-Dcom.sun.management.jmxremote
+wrapper.java.additional.5=-Dkaraf.startLocalConsole=false
+wrapper.java.additional.6=-Dkaraf.startRemoteShell=true
+wrapper.java.additional.7=-Djava.endorsed.dirs="%JAVA_HOME%/jre/lib/endorsed;%JAVA_HOME%/lib/endorsed;%KARAF_HOME%/lib/endorsed"
+wrapper.java.additional.8=-Djava.ext.dirs="%JAVA_HOME%/jre/lib/ext;%JAVA_HOME%/lib/ext;%KARAF_HOME%/lib/ext"
+
+# Uncomment to enable jmx
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.port=1616
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.authenticate=false
+#wrapper.java.additional.n=-Dcom.sun.management.jmxremote.ssl=false
+
+# Uncomment to enable YourKit profiling
+#wrapper.java.additional.n=-Xrunyjpagent
+
+# Uncomment to enable remote debugging
+#wrapper.java.additional.n=-Xdebug -Xnoagent -Djava.compiler=NONE
+#wrapper.java.additional.n=-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
+
+# Initial Java Heap Size (in MB)
+#wrapper.java.initmemory=3
+
+# Maximum Java Heap Size (in MB)
+wrapper.java.maxmemory=512
+
+
+#********************************************************************
+# Wrapper Logging Properties
+#********************************************************************
+# Format of output for the console.  (See docs for formats)
+wrapper.console.format=PM
+
+# Log Level for console output.  (See docs for log levels)
+wrapper.console.loglevel=INFO
+
+# Log file to use for wrapper output logging.
+wrapper.logfile=%KARAF_DATA%/log/wrapper.log
+
+# Format of output for the log file.  (See docs for formats)
+wrapper.logfile.format=LPTM
+
+# Log Level for log file output.  (See docs for log levels)
+wrapper.logfile.loglevel=INFO
+
+# Maximum size that the log file will be allowed to grow to before
+#  the log is rolled. Size is specified in bytes.  The default value
+#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
+#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
+wrapper.logfile.maxsize=10m
+
+# Maximum number of rolled log files which will be allowed before old
+#  files are deleted.  The default value of 0 implies no limit.
+wrapper.logfile.maxfiles=5
+
+# Log Level for sys/event log output.  (See docs for log levels)
+wrapper.syslog.loglevel=NONE
+
+#********************************************************************
+# Wrapper Windows Properties
+#********************************************************************
+# Title to use when running as a console
+wrapper.console.title=${name}
+
+#********************************************************************
+# Wrapper Windows NT/2000/XP Service Properties
+#********************************************************************
+# WARNING - Do not modify any of these properties when an application
+#  using this configuration file has been installed as a service.
+#  Please uninstall the service before modifying this section.  The
+#  service can then be reinstalled.
+
+# Name of the service
+wrapper.ntservice.name=${name}
+
+# Display name of the service
+wrapper.ntservice.displayname=${displayName}
+
+# Description of the service
+wrapper.ntservice.description=${description}
+
+# Service dependencies.  Add dependencies as needed starting from 1
+wrapper.ntservice.dependency.1=
+
+# Mode in which the service is installed.  AUTO_START or DEMAND_START
+wrapper.ntservice.starttype=${startType}
+
+# Allow the service to interact with the desktop.
+wrapper.ntservice.interactive=false
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.exe b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.exe
new file mode 100755
index 0000000..db2ddda
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.exe
Binary files differ
diff --git a/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/wrapper.dll b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/wrapper.dll
new file mode 100644
index 0000000..f07fc9e
--- /dev/null
+++ b/karaf-2.2.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/wrapper.dll
Binary files differ
diff --git a/karaf-2.2.x/tooling/cmdhelp-maven-plugin/NOTICE b/karaf-2.2.x/tooling/cmdhelp-maven-plugin/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/tooling/cmdhelp-maven-plugin/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/tooling/cmdhelp-maven-plugin/pom.xml b/karaf-2.2.x/tooling/cmdhelp-maven-plugin/pom.xml
new file mode 100644
index 0000000..83baf08
--- /dev/null
+++ b/karaf-2.2.x/tooling/cmdhelp-maven-plugin/pom.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>tooling</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>cmdhelp-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>Apache Karaf :: Tooling :: Maven2 Command Help plugin</name>
+    <description>A Maven 2 plugin for extracting Karaf command helps into markup.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>maven-bundle-plugin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xbean</groupId>
+            <artifactId>xbean-finder-shaded</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/karaf-2.2.x/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/karaf/tooling/cmdhelp/CmdHelpMojo.java b/karaf-2.2.x/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/karaf/tooling/cmdhelp/CmdHelpMojo.java
new file mode 100644
index 0000000..624b7a9
--- /dev/null
+++ b/karaf-2.2.x/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/karaf/tooling/cmdhelp/CmdHelpMojo.java
@@ -0,0 +1,495 @@
+/**
+ *
+ * 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.karaf.tooling.cmdhelp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.felix.gogo.commands.Argument;
+import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.gogo.commands.basic.ActionPreparator;
+import org.apache.karaf.shell.console.commands.BlueprintCommand;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.project.MavenProject;
+import org.apache.xbean.finder.ClassFinder;
+import org.apache.felix.service.command.CommandSession;
+import org.fusesource.jansi.Ansi;
+
+/**
+ * Generates help (in scalate or docbook format) for Karaf commands
+ *
+ * @version $Revision$
+ * @goal cmdhelp
+ * @phase generate-resources
+ * @execute phase="generate-resources"
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault false
+ * @description Generates help for Karaf commands
+ */
+public class CmdHelpMojo extends AbstractMojo {
+
+    /**
+     * The maven project.
+     *
+     * @parameter expression="${project}"
+     * @required
+     */
+    protected MavenProject project;
+
+    /**
+     * The output folder
+     *
+     * @parameter default-value="${project.build.directory}/docbkx/sources"
+     */
+    protected File targetFolder;
+
+    /**
+     * The output format
+     *
+     * @parameter default-value="docbx";
+     */
+    protected String format;
+
+    /**
+     * The classloader to use for loading the commands
+     *
+     * @parameter default-value="project"
+     */
+    protected String classLoader;
+
+    /**
+     * Adds the --help option to every commands documentation
+     *
+     * @parameter default-value="true"
+     */
+    protected boolean includeHelpOption;
+
+    private static final String FORMAT_CONF = "conf";
+    private static final String FORMAT_DOCBX = "docbx";
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        try {
+            if (!FORMAT_DOCBX.equals(format) && !FORMAT_CONF.equals(format)) {
+                throw new MojoFailureException("Unsupported format: " + format + ". Supported formats are: docbx or conf.");
+            }
+            if (!targetFolder.exists()) {
+                targetFolder.mkdirs();
+            }
+
+            ClassFinder finder;
+            if ("project".equals(classLoader)) {
+                List<URL> urls = new ArrayList<URL>();
+                for (Object object : project.getCompileClasspathElements()) {
+                    String path = (String) object;
+                    urls.add(new File(path).toURI().toURL());
+                }
+                ClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
+                finder = new ClassFinder(loader, urls);
+            } else if ("plugin".equals(classLoader)) {
+                finder = new ClassFinder(getClass().getClassLoader());
+            } else {
+                throw new MojoFailureException("classLoader attribute must be 'project' or 'plugin'");
+            }
+            List<Class> classes = finder.findAnnotatedClasses(Command.class);
+            if (classes.isEmpty()) {
+                throw new MojoFailureException("No command found");
+            }
+
+            Map<String, Set<String>> commands = new TreeMap<String, Set<String>>();
+
+            for (Class clazz : classes) {
+                try {
+                    String help = new HelpPrinter(clazz).printHelp(format, includeHelpOption);
+                    Command cmd = (Command) clazz.getAnnotation(Command.class);
+                    File output = null;
+
+                    // skip the *-help command
+                    if (cmd.scope().equals("*")) continue;
+
+                    if (FORMAT_DOCBX.equals(format)) {
+                        output = new File(targetFolder, cmd.scope() + "-" + cmd.name() + ".xml");
+                    } else if (FORMAT_CONF.equals(format)) {
+                        output = new File(targetFolder, cmd.scope() + "-" + cmd.name() + ".conf");
+                    }
+                    Writer writer = new OutputStreamWriter(new FileOutputStream(output));
+                    writer.write(help);
+                    writer.close();
+
+                    Set<String> cmds = commands.get(cmd.scope());
+                    if (cmds == null) {
+                        cmds = new TreeSet<String>();
+                        commands.put(cmd.scope(), cmds);
+                    }
+                    cmds.add(cmd.name());
+                    getLog().info("Found command: " + cmd.scope() + ":" + cmd.name());
+                } catch (Exception e) {
+                    getLog().warn("Unable to write help for " + clazz.getName(), e);
+                }
+            }
+
+            if (FORMAT_DOCBX.equals(format)) {
+                PrintStream writer = new PrintStream(new FileOutputStream(new File(targetFolder, "commands.xml")));
+                writer.println("<chapter id='commands' xmlns:xi=\"http://www.w3.org/2001/XInclude\">");
+                writer.println("  <title>Commands</title>");
+                writer.println("  <toc></toc>");
+                for (String key : commands.keySet()) {
+                    writer.println("  <section id='commands-" + key + "'>");
+                    writer.println("    <title>" + key + "</title>");
+                    for (String cmd : commands.get(key)) {
+                        writer.println("    <xi:include href='" + key + "-" + cmd + ".xml' parse='xml'/>");
+                    }
+                    writer.println("  </section>");
+                }
+                writer.println("</chapter>");
+                writer.close();
+            } else if (FORMAT_CONF.equals(format)) {
+                PrintStream writer = new PrintStream(new FileOutputStream(new File(targetFolder, "commands.conf")));
+                writer.println("h1. Commands");
+                writer.println();
+                for (String key : commands.keySet()) {
+                    writer.println("h2. " + key);
+                    writer.println();
+                    for (String cmd : commands.get(key)) {
+                        writer.println("* [" + key + ":" + cmd + "|" + key + "-" + cmd + "]");
+                    }
+                    writer.println();
+                }
+                writer.close();
+            }
+
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error building commands help", e);
+        }
+    }
+
+    public static class HelpPrinter extends BlueprintCommand {
+
+        private final Class<Action> actionClass;
+
+        public HelpPrinter(Class<Action> actionClass) {
+            this.actionClass = actionClass;
+        }
+
+        public String printHelp(String format, boolean includeHelpOption) throws Exception {
+            PrintStream oldout = System.out;
+            try {
+                Action action = actionClass.newInstance();
+                CommandSession session = new DummyCommandSession();
+                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                PrintStream newout = new PrintStream(baos);
+                System.setOut(newout);
+                ActionPreparator preparator;
+                if (FORMAT_DOCBX.equals(format)) {
+                    preparator = new DocbxPreparator(includeHelpOption);
+                } else {
+                    preparator = new ConfPreparator(includeHelpOption);
+                }
+                preparator.prepare(action, session, Collections.<Object>singletonList("--help"));
+                newout.close();
+                baos.close();
+                return baos.toString();
+            } finally {
+                System.setOut(oldout);
+            }
+        }
+
+        protected class DocbxPreparator extends BlueprintActionPreparator {
+
+            boolean includeHelpOption;
+
+            DocbxPreparator(boolean includeHelpOption) {
+                this.includeHelpOption = includeHelpOption;
+            }
+
+            @Override
+            protected void printUsage(CommandSession session, Action action, Map<Option,Field> optionsMap, Map<Argument,Field> argsMap, PrintStream out)
+            {
+                Command command = action.getClass().getAnnotation(Command.class);
+                List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
+                Collections.sort(arguments, new Comparator<Argument>() {
+                    public int compare(Argument o1, Argument o2) {
+                        return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
+                    }
+                });
+                Set<Option> options = new HashSet<Option>(optionsMap.keySet());
+                if (includeHelpOption) options.add(HELP);
+
+                out.println("<section>");
+                out.print("  <title>");
+                out.print(command.scope());
+                out.print(":");
+                out.print(command.name());
+                out.println("</title>");
+                out.println("  <section>");
+                out.println("    <title>Description</title>");
+                out.println("    <para>");
+                out.println(command.description());
+                out.println("    </para>");
+                out.println("  </section>");
+
+                StringBuffer syntax = new StringBuffer();
+                syntax.append(String.format("%s:%s", command.scope(), command.name()));
+                if (options.size() > 0) {
+                    syntax.append(" [options]");
+                }
+                if (arguments.size() > 0) {
+                    syntax.append(' ');
+                    for (Argument argument : arguments) {
+                        syntax.append(String.format(argument.required() ? "%s " : "[%s] ", argument.name()));
+                    }
+                }
+                out.println("  <section>");
+                out.println("    <title>Syntax</title>");
+                out.println("    <para>");
+                out.println(syntax.toString());
+                out.println("    </para>");
+                out.println("  </section>");
+
+                if (arguments.size() > 0)
+                {
+                    out.println("  <section>");
+                    out.println("    <title>Arguments</title>");
+                    out.println("    <informaltable>");
+                    for (Argument argument : arguments)
+                    {
+                        out.println("    <tr>");
+                        out.println("      <td>" + argument.name() + "</td>");
+                        String description = argument.description();
+                        if (!argument.required()) {
+                            try {
+                                argsMap.get(argument).setAccessible(true);
+                                Object o = argsMap.get(argument).get(action);
+                                if (o != null
+                                    && (!(o instanceof Boolean) || ((Boolean) o))
+                                    && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
+                                    description += " (defaults to " + o.toString() + ")";
+                                }
+                            } catch (Exception e) {
+                                // Ignore
+                            }
+                        }
+                        out.println("     <td>" + description + "</td>");
+                        out.println("    </tr>");
+                    }
+
+                    out.println("    </informaltable>");
+                    out.println("  </section>");
+                }
+                if (options.size() > 0)
+                {
+                    out.println("  <section>");
+                    out.println("    <title>Options</title>");
+                    out.println("    <informaltable>");
+
+                    for (Option option : options)
+                    {
+                        String opt = option.name();
+                        String description = option.description();
+                        for (String alias : option.aliases())
+                        {
+                            opt += ", " + alias;
+                        }
+                        try {
+                            optionsMap.get(option).setAccessible(true);
+                            Object o = optionsMap.get(option).get(action);
+                            if (o != null
+                                && (!(o instanceof Boolean) || ((Boolean) o))
+                                && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
+                                description += " (defaults to " + o.toString() + ")";
+                            }
+                        } catch (Exception e) {
+                            // Ignore
+                        }
+                        out.println("    <tr>");
+                        out.println("      <td>" + opt + "</td>");
+                        out.println("      <td>" + description + "</td>");
+                        out.println("    </tr>");
+                    }
+
+                    out.println("    </informaltable>");
+                    out.println("  </section>");
+                }
+
+                if(command.detailedDescription() != null
+                    && command.detailedDescription().trim().length() > 0) {
+                    out.println("<section>");
+                    out.println("    <title>Details</title>");
+                    String description = loadDescription(action.getClass(), command.detailedDescription());
+                    out.println("    <para>");
+                    out.println(description);
+                    out.println("    </para>");
+                    out.println("</section>");
+                }
+                out.println("</section>");
+            }
+
+        }
+
+        protected class ConfPreparator extends BlueprintActionPreparator {
+
+            boolean includeHelpOption;
+
+            ConfPreparator(boolean includeHelpOption) {
+                this.includeHelpOption = includeHelpOption;
+            }
+
+            @Override
+            protected void printUsage(CommandSession session, Action action, Map<Option, Field> optionsMap, Map<Argument,Field> argsMap, PrintStream out)
+            {
+                Command command = action.getClass().getAnnotation(Command.class);
+                List<Argument> arguments = new ArrayList<Argument>(argsMap.keySet());
+                Collections.sort(arguments, new Comparator<Argument>() {
+                    public int compare(Argument o1, Argument o2) {
+                        return Integer.valueOf(o1.index()).compareTo(Integer.valueOf(o2.index()));
+                    }
+                });
+                Set<Option> options = new HashSet<Option>(optionsMap.keySet());
+                if (includeHelpOption) options.add(HELP);
+
+                out.println("h1. " + command.scope() + ":" + command.name());
+                out.println();
+
+                out.println("h2. Description");
+                out.println(command.description());
+                out.println();
+
+                StringBuffer syntax = new StringBuffer();
+                syntax.append(String.format("%s:%s", command.scope(), command.name()));
+                if (options.size() > 0) {
+                    syntax.append(" \\[options\\]");
+                }
+                if (arguments.size() > 0) {
+                    syntax.append(' ');
+                    for (Argument argument : arguments) {
+                        syntax.append(String.format(argument.required() ? "%s " : "\\[%s\\] ", argument.name()));
+                    }
+                }
+                out.println("h2. Syntax");
+                out.println(syntax.toString());
+                out.println();
+
+                if (arguments.size() > 0)
+                {
+                    out.println("h2. Arguments");
+                    out.println("|| Name || Description ||");
+                    for (Argument argument : arguments)
+                    {
+                        String description = argument.description();
+                        if (!argument.required()) {
+                            try {
+                                argsMap.get(argument).setAccessible(true);
+                                Object o = argsMap.get(argument).get(action);
+                                if (o != null
+                                        && (!(o instanceof Boolean) || ((Boolean) o))
+                                        && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
+                                    description += " (defaults to " + o.toString() + ")";
+                                }
+                            } catch (Throwable t) {
+                                // Ignore
+                            }
+                        }
+                        out.println("| " + argument.name() + " | " + description + " |");
+                    }
+                    out.println();
+                }
+                if (options.size() > 0)
+                {
+                    out.println("h2. Options");
+                    out.println("|| Name || Description ||");
+                    for (Option option : options)
+                    {
+                        String opt = option.name();
+                        String desc = option.description();
+                        for (String alias : option.aliases())
+                        {
+                            opt += ", " + alias;
+                        }
+                        try {
+                            optionsMap.get(option).setAccessible(true);
+                            Object o = optionsMap.get(option).get(action);
+                            if (o != null
+                                    && (!(o instanceof Boolean) || ((Boolean) o))
+                                    && (!(o instanceof Number) || ((Number) o).doubleValue() != 0.0)) {
+                                desc += " (defaults to " + o.toString() + ")";
+                            }
+                        } catch (Throwable t) {
+                            // Ignore
+                        }
+                        out.println("| " + opt + " | " + desc + " |");
+                    }
+                    out.println();
+                }
+                if (command.detailedDescription().length() > 0) {
+                    out.println("h2. Details");
+                    String desc = loadDescription(action.getClass(), command.detailedDescription());
+                    out.println(desc);
+                }
+                out.println();
+            }
+
+        }
+
+        protected static class DummyCommandSession implements CommandSession {
+            public Object convert(Class<?> type, Object instance) {
+                return null;
+            }
+            public CharSequence format(Object target, int level) {
+                return null;
+            }
+            public void put(String name, Object value) {
+            }
+            public Object get(String name) {
+                return null;
+            }
+            public PrintStream getConsole() {
+                return null;
+            }
+            public InputStream getKeyboard() {
+                return null;
+            }
+            public void close() {
+            }
+            public Object execute(CharSequence commandline) throws Exception {
+                return null;
+            }
+        }
+
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/NOTICE b/karaf-2.2.x/tooling/features-maven-plugin/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/pom.xml b/karaf-2.2.x/tooling/features-maven-plugin/pom.xml
new file mode 100644
index 0000000..bc14bbd
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/pom.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>tooling</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>features-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>Apache Karaf :: Tooling :: Maven2 Features plugin</name>
+
+    <description>
+        A Maven 2 plugin for working with feature descriptors.
+    </description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>maven-bundle-plugin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>org.apache.karaf.shell.console</artifactId>
+                    <groupId>org.apache.karaf.shell</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-wrap</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-mvn</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.spring</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.blueprint</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.features</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.deployer</groupId>
+            <artifactId>org.apache.karaf.deployer.kar</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.ant</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>plexus-utils</artifactId>
+            <version>${plexus.utils.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!--<plugin>-->
+            <!--<groupId>org.codehaus.mojo</groupId>-->
+            <!--<artifactId>jaxb2-maven-plugin</artifactId>-->
+            <!--<version>1.3</version>-->
+            <!--<executions>-->
+            <!--<execution>-->
+            <!--<goals>-->
+            <!--<goal>xjc</goal>-->
+            <!--</goals>-->
+            <!--</execution>-->
+            <!--</executions>-->
+            <!--<configuration>-->
+            <!--<schemaDirectory>src/main/resources/org/apache/karaf/features</schemaDirectory>-->
+            <!--<packageName>org.apache.karaf.features.internal</packageName>-->
+            <!--<extension>true</extension>-->
+            <!--</configuration>-->
+            <!--</plugin>-->
+
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>java5</id>
+            <activation>
+                <jdk>[1.5,1.6)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.geronimo.specs</groupId>
+                    <artifactId>geronimo-stax-api_1.2_spec</artifactId>
+                    <version>1.0</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.servicemix.specs</groupId>
+                    <artifactId>org.apache.servicemix.specs.activation-api-1.1</artifactId>
+                    <version>1.9.0</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.codehaus.woodstox</groupId>
+                    <artifactId>wstx-asl</artifactId>
+                    <version>3.2.9</version>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.geronimo.specs</groupId>
+                    <artifactId>geronimo-jaxb_2.1_spec</artifactId>
+                    <version>1.0</version>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                    <version>2.1.12</version>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>javax.xml.bind</groupId>
+                            <artifactId>jaxb-api</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-xjc</artifactId>
+                    <version>2.1.12</version>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
new file mode 100644
index 0000000..666b7b0
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
@@ -0,0 +1,517 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * Generates the features XML file
+ *
+ * @version $Revision$
+ * @goal add-features-to-repo
+ * @phase compile
+ * @execute phase="compile"
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault true
+ * @description Add the features to the repository
+ */
+public class AddFeaturesToRepoMojo extends MojoSupport {
+
+    private final static String KARAF_CORE_STANDARD_FEATURE_URL =
+        "mvn:org.apache.karaf.assemblies.features/standard/%s/xml/features";
+    private final static String KARAF_CORE_ENTERPRISE_FEATURE_URL =
+        "mvn:org.apache.karaf.assemblies.features/enterprise/%s/xml/features";
+
+    /**
+     * @parameter
+     */
+    private List<String> descriptors;
+
+    /**
+     * @parameter
+     */
+    private List<String> features;
+
+    /**
+     * @parameter
+     */
+    private File repository;
+
+    /**
+     * the target Karaf version used to resolve Karaf core features descriptors
+     *
+     * @parameter
+     */
+    private String karafVersion;
+
+    /**
+     * @parameter
+     */
+    private boolean includeMvnBasedDescriptors = false;
+
+    /**
+     * @parameter
+     */
+    private List<CopyFileBasedDescriptor> copyFileBasedDescriptors;
+
+    /**
+     * @parameter
+     */
+    private boolean skipNonMavenProtocols = true;
+
+    /**
+     * @parameter
+     */
+    private boolean failOnArtifactResolutionError = true;
+
+    /**
+     * @parameter
+     */
+    private boolean resolveDefinedRepositoriesRecursively = true;
+
+    /**
+     * @parameter
+     */
+    private boolean addTransitiveFeatures = true;
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (karafVersion == null) {
+            Package p = Package.getPackage("org.apache.karaf.tooling.features");
+            karafVersion = p.getImplementationVersion();
+        }
+        String karafCoreStandardFeatureUrl = String.format(KARAF_CORE_STANDARD_FEATURE_URL, karafVersion);
+        Artifact standardFeatureDescriptor = resourceToArtifact(karafCoreStandardFeatureUrl, true);
+        if (standardFeatureDescriptor != null) {
+            try {
+                resolveBundle(standardFeatureDescriptor, remoteRepos);
+                descriptors.add(0, karafCoreStandardFeatureUrl);
+            } catch (Exception e) {
+                getLog().warn("Can't add " + karafCoreStandardFeatureUrl + " in the descriptors set");
+                getLog().debug(e);
+            }
+        }
+        String karafCoreEnterpriseFeatureUrl = String.format(KARAF_CORE_ENTERPRISE_FEATURE_URL, karafVersion);
+        Artifact enterpriseFeatureDescriptor = resourceToArtifact(karafCoreEnterpriseFeatureUrl, true);
+        if (enterpriseFeatureDescriptor != null) {
+            try {
+                resolveBundle(enterpriseFeatureDescriptor, remoteRepos);
+                descriptors.add(0, karafCoreEnterpriseFeatureUrl);
+            } catch (Exception e) {
+                getLog().warn("Can't add " + karafCoreEnterpriseFeatureUrl + " in the descriptors set");
+                getLog().debug(e);
+            }
+        }
+        try {
+            Set<String> bundles = new HashSet<String>();
+            Map<String, Feature> featuresMap = new HashMap<String, Feature>();
+            for (String uri : descriptors) {
+                retrieveDescriptorsRecursively(uri, bundles, featuresMap);
+            }
+
+            // no features specified, handle all of them
+            if (features == null) {
+                features = new ArrayList<String>(featuresMap.keySet());
+            }
+
+            Set<String> featuresBundles = new HashSet<String>();
+            Set<String> transitiveFeatures = new HashSet<String>();
+            addFeatures(features, featuresBundles, transitiveFeatures, featuresMap);
+
+            // add the bundles of the configured features to the bundles list
+            bundles.addAll(featuresBundles);
+
+            // if transitive features are enabled we add the contents of those
+            // features to the bundles list
+            if (addTransitiveFeatures) {
+                for (String feature : transitiveFeatures) {
+                    // transitiveFeatures contains name/version
+                    Feature f = featuresMap.get(feature);
+                    getLog().info("Adding contents of transitive feature: " + feature);
+                    bundles.addAll(f.getBundles());
+                    // Treat the config files as bundles, since it is only copying
+                    bundles.addAll(f.getConfigFiles());
+                }
+            }
+
+            // bundles with explicitely specified remote repos. key -> bundle, value -> remote repo
+            List<Artifact> explicitRepoBundles = new ArrayList<Artifact>();
+
+            getLog().info("Base repo: " + localRepo.getUrl());
+            int currentBundle = 0;
+            for (String bundle : bundles) {
+                Artifact artifact = resourceToArtifact(bundle, skipNonMavenProtocols);
+
+                // Maven ArtifactResolver leaves file handles around so need to clean up
+                // or we will run out of file descriptors
+                if (currentBundle++ % 100 == 0) {
+                    System.gc();
+                    System.runFinalization();
+                }
+
+                if (artifact == null) {
+                    continue;
+                }
+                if (artifact.getRepository() != null) {
+                    explicitRepoBundles.add(artifact);
+                } else {
+                    // bundle URL without repository information are resolved now
+                    resolveBundle(artifact, remoteRepos);
+                }
+            }
+            // resolving all bundles with explicitly specified remote repository
+            for (Artifact explicitBundle : explicitRepoBundles) {
+                resolveBundle(explicitBundle, Collections.singletonList(explicitBundle.getRepository()));
+            }
+            if (copyFileBasedDescriptors != null) {
+                for (CopyFileBasedDescriptor fileBasedDescriptor : copyFileBasedDescriptors) {
+                    copy(new FileInputStream(fileBasedDescriptor.getSourceFile()),
+                        repository,
+                        fileBasedDescriptor.getTargetFileName(),
+                        fileBasedDescriptor.getTargetDirectory(),
+                        new byte[8192]);
+                }
+            }
+        } catch (MojoExecutionException e) {
+            throw e;
+        } catch (MojoFailureException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error populating repository", e);
+        }
+    }
+
+    private void retrieveDescriptorsRecursively(String uri, Set<String> bundles, Map<String, Feature> featuresMap)
+        throws Exception {
+        // let's ensure a mvn: based url is sitting in the local repo before we try reading it
+        Artifact descriptor = resourceToArtifact(uri, true);
+        if (descriptor != null) {
+            resolveBundle(descriptor, remoteRepos);
+        }
+        if (includeMvnBasedDescriptors) {
+            bundles.add(uri);
+        }
+        Repository repo = new Repository(URI.create(translateFromMaven(uri.replaceAll(" ", "%20"))));
+        for (Feature f : repo.getFeatures()) {
+            featuresMap.put(f.getName() + "/" + f.getVersion(), f);
+        }
+        if (resolveDefinedRepositoriesRecursively) {
+            for (String r : repo.getDefinedRepositories()) {
+                retrieveDescriptorsRecursively(r, bundles, featuresMap);
+            }
+        }
+    }
+
+    // resolves the bundle in question
+    // TODO neither remoteRepos nor bundle's Repository are used, only the local repo?????
+    private void resolveBundle(Artifact bundle, List<ArtifactRepository> remoteRepos) throws IOException,
+        MojoFailureException {
+        // TODO consider DefaultRepositoryLayout
+        String dir =
+            bundle.getGroupId().replace('.', '/') + "/" + bundle.getArtifactId() + "/" + bundle.getBaseVersion() + "/";
+        String name =
+            bundle.getArtifactId() + "-" + bundle.getBaseVersion()
+                    + (bundle.getClassifier() != null ? "-" + bundle.getClassifier() : "") + "." + bundle.getType();
+
+        try {
+            getLog().info("Copying bundle: " + bundle);
+            resolver.resolve(bundle, remoteRepos, localRepo);
+            copy(new FileInputStream(bundle.getFile()),
+                repository,
+                name,
+                dir,
+                new byte[8192]);
+        } catch (ArtifactResolutionException e) {
+            if (failOnArtifactResolutionError) {
+                throw new MojoFailureException("Can't resolve bundle " + bundle, e);
+            }
+            getLog().error("Can't resolve bundle " + bundle, e);
+        } catch (ArtifactNotFoundException e) {
+            if (failOnArtifactResolutionError) {
+                throw new MojoFailureException("Can't resolve bundle " + bundle, e);
+            }
+            getLog().error("Can't resolve bundle " + bundle, e);
+        }
+    }
+
+    private void addFeatures(List<String> features, Set<String> featuresBundles, Set<String> transitiveFeatures,
+            Map<String, Feature> featuresMap) {
+        for (String feature : features) {
+            
+            // feature could be only the name or name/version
+            int delimIndex = feature.indexOf('/');
+            String version = null;
+            if (delimIndex > 0) {
+                version = feature.substring(delimIndex + 1);
+                feature = feature.substring(0, delimIndex);
+            }
+ 
+            Feature f = null;
+            if (version != null) {
+                // looking for a specific feature with name and version
+                f = featuresMap.get(feature + "/" + version);
+            } else {
+                // looking for the feature name (with the greatest version)
+                for (String key : featuresMap.keySet()) {
+                    String[] nameVersion = key.split("/");
+                    if (feature.equals(nameVersion[0])) {
+                        if (f == null || f.getVersion().compareTo(featuresMap.get(key).getVersion()) < 0) {
+                            f = featuresMap.get(key);
+                        }
+                    }
+                }
+            }
+            if (f == null) {
+                throw new IllegalArgumentException("Unable to find the feature '" + feature + "'");
+            }
+            // only add the feature to transitives if it is not
+            // listed in the features list defined by the config
+            if (!this.features.contains(f.getName() + "/" + f.getVersion())) {
+                transitiveFeatures.add(f.getName() + "/" + f.getVersion());
+            } else {
+                // add the bundles of the feature to the bundle set
+                getLog().info("Adding contents for feature: " + f.getName() + "/" + f.getVersion());
+                featuresBundles.addAll(f.getBundles());
+                // Treat the config files as bundles, since it is only copying
+                featuresBundles.addAll(f.getConfigFiles());
+            }
+            addFeatures(f.getDependencies(), featuresBundles, transitiveFeatures, featuresMap);
+        }
+    }
+
+    public static void copy(
+            InputStream is, File dir, String destName, String destDir, byte[] buffer)
+        throws IOException {
+        if (destDir == null) {
+            destDir = "";
+        }
+
+        // Make sure the target directory exists and
+        // that is actually a directory.
+        File targetDir = new File(dir, destDir);
+        if (!targetDir.exists()) {
+            if (!targetDir.mkdirs()) {
+                throw new IOException("Unable to create target directory: "
+                        + targetDir);
+            }
+        } else if (!targetDir.isDirectory()) {
+            throw new IOException("Target is not a directory: "
+                    + targetDir);
+        }
+
+        BufferedOutputStream bos = new BufferedOutputStream(
+            new FileOutputStream(new File(targetDir, destName)));
+        int count = 0;
+        while ((count = is.read(buffer)) > 0) {
+            bos.write(buffer, 0, count);
+        }
+        bos.close();
+    }
+
+    public static class Feature {
+
+        private String name;
+        private String version;
+        private List<String> dependencies = new ArrayList<String>();
+        private List<String> bundles = new ArrayList<String>();
+        private Map<String, Map<String, String>> configs = new HashMap<String, Map<String, String>>();
+        private List<String> configFiles = new ArrayList<String>();
+
+        public Feature(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+        
+        public String getVersion() {
+            return version;
+        }
+        
+        public void setVersion(String version) {
+            this.version = version;
+        }
+
+        public List<String> getDependencies() {
+            return dependencies;
+        }
+
+        public List<String> getBundles() {
+            return bundles;
+        }
+
+        public Map<String, Map<String, String>> getConfigurations() {
+            return configs;
+        }
+
+        public List<String> getConfigFiles() {
+            return configFiles;
+        }
+
+        public void addDependency(String dependency) {
+            dependencies.add(dependency);
+        }
+
+        public void addBundle(String bundle) {
+            bundles.add(bundle);
+        }
+
+        public void addConfig(String name, Map<String, String> properties) {
+            configs.put(name, properties);
+        }
+
+        public void addConfigFile(String configFile) {
+            configFiles.add(configFile);
+        }
+    }
+
+    public static class Repository {
+
+        private URI uri;
+        private List<Feature> features;
+        private List<String> repositories;
+
+        public Repository(URI uri) {
+            this.uri = uri;
+        }
+
+        public URI getURI() {
+            return uri;
+        }
+
+        public Feature[] getFeatures() throws Exception {
+            if (features == null) {
+                loadFeatures();
+            }
+            return features.toArray(new Feature[features.size()]);
+        }
+
+        public String[] getDefinedRepositories() throws Exception {
+            if (repositories == null) {
+                loadRepositories();
+            }
+            return repositories.toArray(new String[repositories.size()]);
+        }
+
+        private void loadRepositories() throws IOException {
+            try {
+                repositories = new ArrayList<String>();
+                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                Document doc = factory.newDocumentBuilder().parse(uri.toURL().openStream());
+                NodeList nodes = doc.getDocumentElement().getChildNodes();
+                for (int i = 0; i < nodes.getLength(); i++) {
+                    org.w3c.dom.Node node = nodes.item(i);
+                    if (!(node instanceof Element) || !"repository".equals(node.getNodeName())) {
+                        continue;
+                    }
+                    Element e = (Element) nodes.item(i);
+                    repositories.add(e.getTextContent());
+                }
+            } catch (SAXException e) {
+                throw (IOException) new IOException().initCause(e);
+            } catch (ParserConfigurationException e) {
+                throw (IOException) new IOException().initCause(e);
+            }
+        }
+
+        private void loadFeatures() throws IOException {
+            try {
+                features = new ArrayList<Feature>();
+                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                Document doc = factory.newDocumentBuilder().parse(uri.toURL().openStream());
+                NodeList nodes = doc.getDocumentElement().getChildNodes();
+                for (int i = 0; i < nodes.getLength(); i++) {
+                    org.w3c.dom.Node node = nodes.item(i);
+                    if (!(node instanceof Element) || !"feature".equals(node.getNodeName())) {
+                        continue;
+                    }
+                    Element e = (Element) nodes.item(i);
+                    String name = e.getAttribute("name");
+                    String version = e.getAttribute("version");
+                    Feature f = new Feature(name);
+                    f.setVersion(version);
+                    NodeList featureNodes = e.getElementsByTagName("feature");
+                    for (int j = 0; j < featureNodes.getLength(); j++) {
+                        Element b = (Element) featureNodes.item(j);
+                        f.addDependency(b.getTextContent());
+                    }
+                    NodeList configNodes = e.getElementsByTagName("config");
+                    for (int j = 0; j < configNodes.getLength(); j++) {
+                        Element c = (Element) configNodes.item(j);
+                        String cfgName = c.getAttribute("name");
+                        String data = c.getTextContent();
+                        Properties properties = new Properties();
+                        properties.load(new ByteArrayInputStream(data.getBytes()));
+                        Map<String, String> hashtable = new Hashtable<String, String>();
+                        for (Object key : properties.keySet()) {
+                            String n = key.toString();
+                            hashtable.put(n, properties.getProperty(n));
+                        }
+                        f.addConfig(cfgName, hashtable);
+                    }
+                    NodeList configFileNodes = e.getElementsByTagName("configfile");
+                    for (int j = 0; j < configFileNodes.getLength(); j++) {
+                        Element c = (Element) configFileNodes.item(j);
+                        f.addConfigFile(c.getTextContent());
+                    }
+                    NodeList bundleNodes = e.getElementsByTagName("bundle");
+                    for (int j = 0; j < bundleNodes.getLength(); j++) {
+                        Element b = (Element) bundleNodes.item(j);
+                        f.addBundle(b.getTextContent());
+                    }
+                    features.add(f);
+                }
+            } catch (SAXException e) {
+                throw (IOException) new IOException().initCause(e);
+            } catch (ParserConfigurationException e) {
+                throw (IOException) new IOException().initCause(e);
+            }
+        }
+
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/BlueprintURLHandler.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/BlueprintURLHandler.java
new file mode 100644
index 0000000..aa8ab1b
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/BlueprintURLHandler.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.karaf.tooling.features;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+
+import org.apache.karaf.deployer.blueprint.BlueprintTransformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * As org.apache.karaf.deployer.blueprint.BlueprintURLHandler need run with OSGi container
+ * so create this class only used for features-maven-plugin
+ */
+public class BlueprintURLHandler extends URLStreamHandler {
+
+	private final Logger logger = LoggerFactory.getLogger(BlueprintURLHandler.class);
+
+	private static String SYNTAX = "blueprint: bp-xml-uri";
+
+	private URL blueprintXmlURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+	public URLConnection openConnection(URL url) throws IOException {
+		if (url.getPath() == null || url.getPath().trim().length() == 0) {
+			throw new MalformedURLException ("Path cannot be null or empty. Syntax: " + SYNTAX );
+		}
+		blueprintXmlURL = new URL(url.getPath());
+
+		logger.debug("Blueprint xml URL is: [" + blueprintXmlURL + "]");
+		return new Connection(url);
+	}
+	
+	public URL getBlueprintXmlURL() {
+		return blueprintXmlURL;
+	}
+
+    public class Connection extends URLConnection {
+
+        public Connection(URL url) {
+            super(url);
+        }
+
+        @Override
+        public void connect() throws IOException {
+        }
+
+        @Override
+        public InputStream getInputStream() throws IOException {
+            try {
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                BlueprintTransformer.transform(blueprintXmlURL, os);
+                os.close();
+                return new ByteArrayInputStream(os.toByteArray());
+            } catch (Exception e) {
+                logger.error("Error opening blueprint xml url", e);
+                throw (IOException) new IOException("Error opening blueprint xml url").initCause(e);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CopyFileBasedDescriptor.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CopyFileBasedDescriptor.java
new file mode 100644
index 0000000..857adfd
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CopyFileBasedDescriptor.java
@@ -0,0 +1,52 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.io.File;
+
+public class CopyFileBasedDescriptor {
+
+    private File sourceFile;
+    private String targetDirectory;
+    private String targetFileName;
+
+    public File getSourceFile() {
+        return sourceFile;
+    }
+
+    public void setSourceFile(File sourceFile) {
+        this.sourceFile = sourceFile;
+    }
+
+    public String getTargetDirectory() {
+        return targetDirectory;
+    }
+
+    public void setTargetDirectory(String targetDirectory) {
+        this.targetDirectory = targetDirectory;
+    }
+
+    public String getTargetFileName() {
+        return targetFileName;
+    }
+
+    public void setTargetFileName(String targetFileName) {
+        this.targetFileName = targetFileName;
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CreateKarMojo.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CreateKarMojo.java
new file mode 100644
index 0000000..4a77afd
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CreateKarMojo.java
@@ -0,0 +1,193 @@
+/*
+ * 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.karaf.tooling.features;
+
+import org.apache.karaf.deployer.kar.KarArtifactInstaller;
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.ConfigFileInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.internal.RepositoryImpl;
+import org.apache.maven.archiver.MavenArchiveConfiguration;
+import org.apache.maven.archiver.MavenArchiver;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.codehaus.plexus.archiver.jar.JarArchiver;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Assembles and creates a KAR archive.
+ *
+ * @goal create-kar
+ * @phase package
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault true
+ * @description Assemble and create a KAR archive from a feature.xml file
+ */
+public class CreateKarMojo extends MojoSupport {
+
+    /**
+     * The Maven archive configuration to use.
+     * <p/>
+     * See <a href="http://maven.apache.org/ref/current/maven-archiver/apidocs/org/apache/maven/archiver/MavenArchiveConfiguration.html">the Javadocs for MavenArchiveConfiguration</a>
+     *
+     * @parameter
+     */
+    private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+
+    /**
+     * The Jar archiver.
+     *
+     * @component role="org.codehaus.plexus.archiver.Archiver" roleHint="jar"
+     * @required
+     * @readonly
+     */
+    private JarArchiver jarArchiver = null;
+
+    /**
+     * Directory containing the generated archive.
+     *
+     * @parameter expression="${project.build.directory}"
+     * @required
+     */
+    private File outputDirectory = null;
+
+    /**
+     * Name of the generated archive.
+     *
+     * @parameter expression="${project.build.finalName}"
+     * @required
+     */
+    private String finalName = null;
+
+    /**
+     * Location of resources directory for additional content to include in the KAR.
+     * Note that it includes everything under classes so as to include maven-remote-resources
+     *
+     * @parameter expression="${project.build.directory}/classes"
+     */
+    private File resourcesDir;
+
+    /**
+     * The features file to use as instructions
+     *
+     * @parameter default-value="${project.build.directory}/feature/feature.xml"
+     */
+    private File featuresFile;
+
+    /**
+     * The internal repository in the kar.
+     *
+     * @parameter default-value="${repositoryPath}"
+     */
+    private String repositoryPath = "repository/";
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        List<Artifact> resources = readResources();
+        // build the archive
+        File archive = createArchive(resources);
+
+        // attach the generated archive to install/deploy
+        Artifact artifact = factory.createArtifact(project.getGroupId(), project.getArtifactId(), project.getVersion(), null, "kar");
+        artifact.setFile(archive);
+
+        project.addAttachedArtifact(artifact);
+    }
+
+    /**
+     * Read and load the bundles and configuration files contained in the features file.
+     *
+     * @return a list of resources artifact.
+     * @throws MojoExecutionException
+     */
+    private List<Artifact> readResources() throws MojoExecutionException {
+        List<Artifact> resources = new ArrayList<Artifact>();
+        try {
+            RepositoryImpl featuresRepo = new RepositoryImpl(featuresFile.toURI());
+            Feature[] features = featuresRepo.getFeatures();
+            for (Feature feature : features) {
+                for (BundleInfo bundle : feature.getBundles()) {
+                    if (!bundle.isDependency()) {
+                        resources.add(resourceToArtifact(bundle.getLocation(), false));
+                    }
+                }
+                for (ConfigFileInfo configFile : feature.getConfigurationFiles()) {
+                    resources.add(resourceToArtifact(configFile.getLocation(), false));
+                }
+            }
+            return resources;
+        } catch (MojoExecutionException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new MojoExecutionException("Could not interpret features XML file", e);
+        }
+    }
+
+    private File createArchive(List<Artifact> bundles) throws MojoExecutionException {
+        ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
+        File archiveFile = getArchiveFile(outputDirectory, finalName, null);
+
+        MavenArchiver archiver = new MavenArchiver();
+        MavenArchiveConfiguration configuration = new MavenArchiveConfiguration();
+        archiver.setArchiver(jarArchiver);
+        archiver.setOutputFile(archiveFile);
+
+        try {
+            // include the features XML file
+            Artifact featureArtifact = factory.createArtifactWithClassifier(project.getGroupId(), project.getArtifactId(), project.getVersion(), "xml", KarArtifactInstaller.FEATURES_CLASSIFIER);
+            jarArchiver.addFile(featuresFile, repositoryPath + layout.pathOf(featureArtifact));
+
+            for (Artifact artifact : bundles) {
+                resolver.resolve(artifact, remoteRepos, localRepo);
+                File localFile = artifact.getFile();
+                // TODO this may not be reasonable, but... resolved snapshot artifacts have timestamped versions
+                // which do not work in startup.properties
+                artifact.setVersion(artifact.getBaseVersion());
+                String targetFileName = repositoryPath + layout.pathOf(artifact);
+                jarArchiver.addFile(localFile, targetFileName);
+            }
+
+            if (resourcesDir.isDirectory()) {
+                archiver.getArchiver().addDirectory(resourcesDir);
+            }
+
+            archiver.createArchive(project, configuration);
+
+            return archiveFile;
+        } catch (Exception e) {
+            throw new MojoExecutionException("Failed to create kar archive", e);
+        }
+    }
+
+    protected static File getArchiveFile(final File basedir, final String finalName, String classifier) {
+        if (classifier == null) {
+            classifier = "";
+        } else if (classifier.trim().length() > 0 && !classifier.startsWith("-")) {
+            classifier = "-" + classifier;
+        }
+        return new File(basedir, finalName + classifier + ".kar");
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CustomBundleURLStreamHandlerFactory.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CustomBundleURLStreamHandlerFactory.java
new file mode 100644
index 0000000..b06c08b
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CustomBundleURLStreamHandlerFactory.java
@@ -0,0 +1,50 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.net.URLStreamHandler;
+import java.net.URLStreamHandlerFactory;
+
+public class CustomBundleURLStreamHandlerFactory implements
+		URLStreamHandlerFactory {
+	private static final String MVN_URI_PREFIX = "mvn";
+	private static final String WRAP_URI_PREFIX = "wrap";
+    private static final String FEATURE_URI_PREFIX = "feature";
+    private static final String SPRING_URI_PREFIX = "spring";
+    private static final String BLUEPRINT_URI_PREFIX = "blueprint";
+    private static final String WAR_URI_PREFIX = "war";
+
+    public URLStreamHandler createURLStreamHandler(String protocol) {
+		if (protocol.equals(MVN_URI_PREFIX)) {
+			return new org.ops4j.pax.url.mvn.Handler();
+		} else if (protocol.equals(WRAP_URI_PREFIX)){
+			return new org.ops4j.pax.url.wrap.Handler();
+		} else if (protocol.equals(FEATURE_URI_PREFIX)){
+			return new FeatureURLHandler();
+		} else if (protocol.equals(SPRING_URI_PREFIX)){
+			return new SpringURLHandler();
+		} else if (protocol.equals(BLUEPRINT_URI_PREFIX)){
+			return new BlueprintURLHandler();
+        } else if (protocol.equals(WAR_URI_PREFIX)) {
+            return new WarURLHandler();
+		} else {
+			return null;
+		}
+	}
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/FeatureURLHandler.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/FeatureURLHandler.java
new file mode 100644
index 0000000..33e8d08
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/FeatureURLHandler.java
@@ -0,0 +1,92 @@
+/*
+ * 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.karaf.tooling.features;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+
+import org.apache.karaf.deployer.features.FeatureTransformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * As org.apache.karaf.deployer.features.FeatureURLHandler needs to be run with
+ * OSGi container this class was created  for use by the features-maven-plugin
+ */
+public class FeatureURLHandler extends URLStreamHandler {
+
+    private final Logger logger = LoggerFactory.getLogger(FeatureURLHandler.class);
+
+    private static String SYNTAX = "feature: xml-uri";
+
+    private URL featureXmlURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws java.io.IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+    public URLConnection openConnection(URL url) throws IOException {
+        if (url.getPath() == null || url.getPath().trim().length() == 0) {
+            throw new MalformedURLException("Path can not be null or empty. Syntax: " + SYNTAX);
+        }
+        featureXmlURL = new URL(url.getPath());
+
+        logger.debug("Features xml URL is: [" + featureXmlURL + "]");
+        return new Connection(url);
+    }
+
+    public URL getFeatureXmlURL() {
+        return featureXmlURL;
+    }
+
+    public class Connection extends URLConnection {
+
+        public Connection(URL url) {
+            super(url);
+        }
+
+        @Override
+        public void connect() throws IOException {
+        }
+
+        @Override
+        public InputStream getInputStream() throws IOException {
+            try {
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                FeatureTransformer.transform(featureXmlURL, os);
+                os.close();
+                return new ByteArrayInputStream(os.toByteArray());
+            } catch (Exception e) {
+                logger.error("Error opening features xml url", e);
+                throw (IOException) new IOException("Error opening features xml url").initCause(e);
+            }
+        }
+    }
+
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojo.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojo.java
new file mode 100644
index 0000000..26b21ee
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojo.java
@@ -0,0 +1,479 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.InvalidArtifactRTException;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.metadata.ResolutionGroup;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+
+/**
+ * Generates the features XML file
+ * 
+ * @version $Revision: 1.1 $
+ * @goal generate-features-file
+ * @phase compile
+ * @execute phase="compile"
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault true
+ * @description Generates the features XML file
+ */
+@SuppressWarnings("unchecked")
+public class GenerateFeaturesFileMojo extends MojoSupport {
+    protected static final String SEPARATOR = "/";
+
+    /**
+     * The file to generate
+     * 
+     * @parameter default-value="${project.build.directory}/classes/feature.xml"
+     */
+    private File outputFile;
+
+    /**
+     * The name of the feature, which defaults to the artifact ID if its not
+     * specified
+     * 
+     * @parameter default-value="${project.artifactId}"
+     */
+    private String featureName;
+
+    /**
+     * The artifact type for attaching the generated file to the project
+     * 
+     * @parameter default-value="xml"
+     */
+    private String attachmentArtifactType = "xml";
+
+    /**
+     * The artifact classifier for attaching the generated file to the project
+     * 
+     * @parameter default-value="features"
+     */
+    private String attachmentArtifactClassifier = "features";
+
+    /**
+     * Should we generate a feature for the current project?
+     * 
+     * @parameter default-value="false"
+     */
+    private boolean includeProject = false;
+
+    /**
+     * Should we generate a feature for the current project's dependencies?
+     * 
+     * @parameter default-value="true"
+     */
+    private boolean includeDependencies = true;
+    
+    /**
+     * The kernel version for which to generate the bundle
+     * 
+     * @parameter
+     */
+    private String karafVersion;
+    
+    /**
+     * A properties file containing bundle translations
+     * 
+     * @parameter
+     */
+    private File translation;
+    
+    /*
+     * The translations
+     */
+    private Map<String, Map<VersionRange, String>> translations = new HashMap<String, Map<VersionRange,String>>() {
+    	@Override
+    	public Map<VersionRange, String> get(Object key) {
+    		if (super.get(key) == null) {
+    			super.put(key.toString(), new HashMap<VersionRange, String>());
+    		}
+    		return super.get(key);
+    	}
+    };
+    
+    /*
+     * These bundles are the features that will be built
+     */
+    private Set<Artifact> features = new HashSet<Artifact>();
+
+    /*
+     * These bundles are provided by SMX4 and will be excluded from <feature/>
+     * generation
+     */
+    private Set<Artifact> provided = new HashSet<Artifact>();
+    
+    /*
+     * List of bundles included in the current feature
+     */
+    private Set<Artifact> currentFeature = new HashSet<Artifact>();
+    
+    /*
+     * List of missing bundles
+     */
+    private Set<Artifact> missingBundles = new TreeSet<Artifact>();
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        OutputStream out = null;
+        try {
+        	prepare();
+        	getLog().info(String.format("-- Start generating %s --", outputFile.getAbsolutePath()));
+            outputFile.getParentFile().mkdirs();
+            out = new FileOutputStream(outputFile);
+            
+            PrintStream printer = new PrintStream(out);
+            populateProperties(printer);
+            getLog().info(String.format("-- Done generating %s --", outputFile.getAbsolutePath()));
+
+            // now lets attach it
+            projectHelper.attachArtifact(project, attachmentArtifactType, attachmentArtifactClassifier, outputFile);
+        } catch (Exception e) {
+            throw new MojoExecutionException("Unable to create dependencies file: " + e, e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    getLog().info("Failed to close: " + outputFile + ". Reason: " + e, e);
+                }
+            }
+        }
+    }
+
+    protected void populateProperties(PrintStream out) throws ArtifactResolutionException, ArtifactNotFoundException, IOException {
+        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+        out.println("<features>");
+        if (includeProject) {
+            writeCurrentProjectFeature(out);
+        }
+        if (includeDependencies) {
+            writeProjectDependencyFeatures(out);
+        }
+        out.println("</features>");
+    }
+
+    private void prepare() throws ArtifactResolutionException, ArtifactNotFoundException, IOException, InvalidVersionSpecificationException {
+    	if (translation != null) {
+    		InputStream stream = null;
+    		try {
+    			stream = new BufferedInputStream(new FileInputStream(translation));
+    			Properties file = new Properties();
+    			file.load(stream);
+    			ArrayList<String> stringNames = getStringNames(file);
+    			for (String key : stringNames) {
+    				String[] elements = key.split("/");
+    				translations.get(String.format("%s/%s", elements[0], elements[1]))
+    				            .put(VersionRange.createFromVersionSpec(elements[2]), file.getProperty(key));
+    			}
+    			getLog().info("Loaded " + translations.size() + " bundle name translation rules from " + translation.getAbsolutePath());
+    		} finally {
+    			if (stream != null) {
+    				stream.close();
+    			}
+    		}
+    	}
+    	
+    	Artifact kernel = factory.createArtifact("org.apache.karaf", 
+    			                                 "apache-karaf",
+    			                                 karafVersion, Artifact.SCOPE_PROVIDED, "pom");
+    	resolver.resolve(kernel, remoteRepos, localRepo);
+    	getLog().info("-- List of bundles provided by Karaf " + karafVersion + " --");
+        for (Artifact artifact : getDependencies(kernel)) {
+        	getLog().info(" " + artifact);
+            provided.add(artifact);
+        }
+        getLog().info("-- <end of list>  --");
+    }
+
+    private ArrayList<String> getStringNames(Properties file) {
+    	// this method simulate the Properties.stringPropertyNames() of JDK6 in order to make this class 
+    	// compile with jdk5
+    	ArrayList<String> ret = new ArrayList<String>();
+    	Enumeration<?> name = file.propertyNames();
+    	while (name.hasMoreElements()) {
+    		Object ele = name.nextElement();
+    		if (ele instanceof String && file.get(ele) instanceof String) {
+    			ret.add((String)ele);
+    		}
+    	}
+		return ret;
+	}
+
+	private void writeProjectDependencyFeatures(PrintStream out) {
+        Set<Artifact> dependencies = (Set<Artifact>)project.getDependencyArtifacts();
+        dependencies.removeAll(provided);
+        for (Artifact artifact : dependencies) {
+            getLog().info(" Generating feature " + artifact.getArtifactId() + " from " + artifact);
+            out.println("  <feature name='" + artifact.getArtifactId() + "'>");
+            currentFeature.clear();
+            writeBundle(out, artifact);
+            features.add(artifact);
+            out.println("  </feature>");
+        }
+        if (missingBundles.size() > 0) {
+        	getLog().info("-- Some bundles were missing  --");
+        	for (Artifact artifact : missingBundles) {
+        		getLog().info(String.format(" %s", artifact));
+        	}
+        }
+    }
+
+    private void writeBundle(PrintStream out, Artifact artifact) {
+    	Artifact replacement = getReplacement(artifact);
+    	if (replacement != null) {
+    		writeBundle(out, replacement);
+    		return;
+    	}
+        if (isProvided(artifact)) {
+            getLog().debug(String.format("Skipping '%s' -- bundle will be provided at runtime", artifact));
+            return;
+        }
+        if (features.contains(artifact)) {
+            // if we already created a feature for this one, just add that instead of the bundle
+            out.println(String.format("    <feature>%s</feature>", artifact.getArtifactId()));
+            return;
+        }
+        // first write the dependencies
+        for (Artifact dependency : getDependencies(artifact)) {
+            if (dependency.isOptional() || Artifact.SCOPE_TEST.equals(dependency.getScope())) {
+                // omit optional dependencies
+                getLog().debug(String.format("Omitting optional and/or test scoped dependency '%s' for '%s'", 
+                                             dependency, artifact));
+                continue;
+            }
+            getLog().debug(String.format("Adding '%s' as a dependency for '%s'", dependency, artifact));
+            writeBundle(out, dependency);
+        }
+        // skip the bundle if it was already added to this feature previously
+        if (!currentFeature.add(artifact)) {
+            getLog().debug(String.format("Artifact '%s' was already added to the current feature", artifact));
+            return;
+        }
+        // and then write the bundle itself
+        if (isBundle(artifact)) {
+        	getLog().info(String.format("  adding bundle %s", artifact));
+            writeBundle(out, artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion());
+        } else {
+            Artifact wrapper = findServicemixBundle(artifact);
+            if (wrapper != null) {
+            	getLog().info(String.format("  adding bundle %s (for %s)", wrapper, artifact));
+            	writeBundle(out, wrapper.getGroupId(), wrapper.getArtifactId(), wrapper.getBaseVersion());
+            } else {
+            	getLog().error(String.format(" unable to find suitable bundle for artifact '%s'", artifact));
+            	missingBundles.add(artifact);
+            }
+        }
+    }
+
+	private Artifact getReplacement(Artifact artifact) {
+		String key = String.format("%s/%s", artifact.getGroupId(), artifact.getArtifactId());
+		String bundle = null;
+		for (VersionRange range : translations.get(key).keySet()) {
+			try {
+				if (range.containsVersion(artifact.getSelectedVersion())) {
+					bundle = translations.get(key).get(range);
+					break;
+				}
+			} catch (OverConstrainedVersionException e) {
+				bundle = null;
+			}
+		}
+		if (bundle != null) {
+			String[] split = bundle.split("/");
+			return factory.createArtifact(split[0], split[1], split[2], Artifact.SCOPE_PROVIDED, artifact.getArtifactHandler().getPackaging());
+		} else {
+			return null;
+		}
+	}
+
+	private Artifact findServicemixBundle(Artifact artifact) {
+        Artifact noVersionWrapper = factory.createArtifact("org.apache.servicemix.bundles", 
+                                                  "org.apache.servicemix.bundles." + artifact.getArtifactId(), 
+                                                  "", 
+                                                  artifact.getScope(), artifact.getType());
+        try {
+            List versions = artifactMetadataSource.retrieveAvailableVersions(noVersionWrapper, localRepo, remoteRepos);
+            Artifact wrapper = factory.createArtifact("org.apache.servicemix.bundles", 
+                                                      "org.apache.servicemix.bundles." + artifact.getArtifactId(), 
+                                                      getBestVersionForArtifact(artifact, versions), 
+                                                      artifact.getScope(), artifact.getType());
+            // let's check if the servicemix bundle for this artifact exists
+            resolver.resolve(wrapper, remoteRepos, localRepo);
+            for (Artifact dependency : getDependencies(wrapper)) {
+                //some of these wrapper bundles provide for multiple JAR files, no need to include any of them after adding the wrapper
+                getLog().debug(String.format("'%s' also provides '%s'", wrapper, dependency));
+                currentFeature.add(dependency);
+            }
+            return wrapper;
+        } catch (ArtifactResolutionException e) {
+            getLog().debug("Couldn't find a ServiceMix bundle for " + artifact, e);
+        } catch (ArtifactNotFoundException e) {
+            getLog().debug("Couldn't find a ServiceMix bundle for " + artifact, e);
+        } catch (ArtifactMetadataRetrievalException e) {
+            getLog().debug("Couldn't find a ServiceMix bundle for " + artifact, e);
+        }
+        if (artifact.getArtifactId().contains("-")) {
+            //let's try to see if we can't find a bundle wrapping multiple artifacts (e.g. mina -> mina-core, mina-codec, ...)
+            return findServicemixBundle(factory.createArtifact(artifact.getGroupId(), artifact.getArtifactId().split("-")[0], 
+                                                               artifact.getVersion(), artifact.getScope(), artifact.getType()));
+        } else {
+            return null;
+        }
+    }
+
+    protected String getBestVersionForArtifact(Artifact artifact, List<ArtifactVersion> versions) throws ArtifactMetadataRetrievalException {
+        if (versions.size() == 0) {
+            throw new ArtifactMetadataRetrievalException("No wrapper bundle available for " + artifact);
+        }
+        Collections.sort(versions, Collections.reverseOrder());
+        //check for same version
+        for (ArtifactVersion version : versions) {
+            if (version.toString().startsWith(artifact.getVersion())) {
+                return version.toString();
+            }
+        }
+        //check for same major/minor version
+        for (ArtifactVersion version : versions) {
+            String[] elements = version.toString().split("\\.");
+            if (elements.length >= 2 && artifact.getVersion().startsWith(elements[0] + "." + elements[1])) {
+                return version.toString();
+            }
+        }
+        throw new ArtifactMetadataRetrievalException("No suitable version found for " + artifact + " wrapper bundle");
+    }
+
+    private boolean isProvided(Artifact bundle) {
+        for (Artifact artifact : provided) {
+            if (bundle.getArtifactId().equals(artifact.getArtifactId())
+                && bundle.getGroupId().equals(artifact.getGroupId())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean isBundle(Artifact artifact) {
+        if (artifact.getArtifactHandler().getPackaging().equals("bundle")) {
+            return true;
+        } else {
+            try {
+                resolver.resolve(artifact, remoteRepos, localRepo);
+                ZipFile file = new ZipFile(artifact.getFile());
+                ZipEntry entry = file.getEntry("META-INF/MANIFEST.MF");
+                Manifest manifest = new Manifest(file.getInputStream(entry));
+                if (ManifestUtils.isBundle(manifest)) {
+                    getLog().debug(String.format("MANIFEST.MF for '%s' contains Bundle-Name '%s'",
+                                                 artifact, ManifestUtils.getBsn(manifest)));
+                    return true;
+                }
+            } catch (ZipException e) {
+                getLog().warn("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            } catch (IOException e) {
+                getLog().warn("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            } catch (Exception e) {
+                getLog().warn("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            }
+        }
+        return false;
+    }
+
+    private List<Artifact> getDependencies(Artifact artifact) {
+        List<Artifact> list = new ArrayList<Artifact>();
+        try {
+            ResolutionGroup pom = artifactMetadataSource.retrieve(artifact, localRepo, remoteRepos);
+            if (pom != null) {
+            	list.addAll(pom.getArtifacts());
+            }
+        } catch (ArtifactMetadataRetrievalException e) {
+            getLog().warn("Unable to retrieve metadata for " + artifact + ", not including dependencies for it");
+        } catch (InvalidArtifactRTException e) {
+            getLog().warn("Unable to retrieve metadata for " + artifact + ", not including dependencies for it");
+        }
+        return list;
+    }
+
+
+    private void writeCurrentProjectFeature(PrintStream out) {
+        out.println("  <feature name='" + featureName + "'>");
+
+        writeBundle(out, project.getGroupId(), project.getArtifactId(), project.getVersion());
+        out.println();
+
+        Iterator iterator = project.getDependencies().iterator();
+        while (iterator.hasNext()) {
+            Dependency dependency = (Dependency)iterator.next();
+
+            if (isValidDependency(dependency)) {
+                out.print("  ");
+                writeBundle(out, dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion());
+            }
+        }
+
+        out.println("  </feature>");
+    }
+
+    protected boolean isValidDependency(Dependency dependency) {
+        // TODO filter out only compile time dependencies which are OSGi
+        // bundles?
+        return true;
+    }
+
+    protected void writeBundle(PrintStream out, String groupId, String artifactId, String version) {
+        out.print("    <bundle>mvn:");
+        out.print(groupId);
+        out.print("/");
+        out.print(artifactId);
+        out.print("/");
+        out.print(version);
+        out.print("</bundle>");
+        out.println();
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java
new file mode 100644
index 0000000..466a85f
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java
@@ -0,0 +1,589 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Stack;
+import java.util.jar.Manifest;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.version.VersionRange;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.InvalidArtifactRTException;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.metadata.ResolutionGroup;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+
+
+/**
+ * Generates the features XML file
+ * 
+ * @version $Revision: 1.1 $
+ * @goal generate-features-xml
+ * @phase compile
+ * @execute phase="compile"
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault true
+ * @description Generates the features XML file
+ */
+@SuppressWarnings("unchecked")
+public class GenerateFeaturesXmlMojo extends MojoSupport {
+    protected static final String SEPARATOR = "/";
+    
+    /**
+     * The dependency tree builder to use.
+     * 
+     * @component
+     * @required
+     * @readonly
+     */
+    private DependencyTreeBuilder dependencyTreeBuilder;
+
+    /**
+     * The ArtifactCollector provided by Maven at runtime
+     *
+     * @component
+     * @required
+     * @readonly
+     */
+    private ArtifactCollector collector;
+
+    /**
+     * The file to generate
+     * 
+     * @parameter default-value="${project.build.directory}/classes/feature.xml"
+     */
+    private File outputFile;
+
+    /**
+     * The artifact type for attaching the generated file to the project
+     * 
+     * @parameter default-value="xml"
+     */
+    private String attachmentArtifactType = "xml";
+
+    /**
+     * The artifact classifier for attaching the generated file to the project
+     * 
+     * @parameter default-value="features"
+     */
+    private String attachmentArtifactClassifier = "features";
+
+    /**
+     * The kernel version for which to generate the bundle
+     * 
+     * @parameter
+     */
+    private String kernelVersion;
+    
+    /*
+     * A list of packages exported by the kernel
+     */
+    private Map<String, VersionRange> kernelExports = new HashMap<String, VersionRange>();
+
+    /**
+     * A file containing the list of bundles
+     * 
+     * @parameter
+     */
+    private File bundles;
+
+    /*
+     * A set of known bundles
+     */
+    private Set<String> knownBundles = new HashSet<String>();
+    
+    /*
+     * A list of exports by the bundles
+     */
+    private Map<String, Map<VersionRange, Artifact>> bundleExports = new HashMap<String, Map<VersionRange, Artifact>>();
+
+    /*
+     * The set of system exports
+     */
+    private List<String> systemExports = new LinkedList<String>();
+    
+    /*
+     * These bundles are the features that will be built
+     */
+    private Map<Artifact, Feature> features = new HashMap<Artifact, Feature>();
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        PrintStream out = null;
+        try {
+            File parent = outputFile.getParentFile();
+            if (!parent.exists()) {
+                parent.mkdirs();
+            }
+            out = new PrintStream(new FileOutputStream(outputFile));
+            readSystemPackages();
+            readKernelBundles();
+            readBundles();
+            discoverBundles();
+            writeFeatures(out);
+            // now lets attach it
+            projectHelper.attachArtifact(project, attachmentArtifactType, attachmentArtifactClassifier, outputFile);
+        } catch (Exception e) {
+            getLog().error(e);
+            throw new MojoExecutionException("Unable to create features.xml file: " + e, e);
+        } finally {
+            if (out != null) {
+                out.close();
+            }
+        }
+    }
+    
+	/*
+     * Read all the system provided packages from the <code>config.properties</code> file 
+     */
+    private void readSystemPackages() throws IOException {
+        Properties properties = new Properties();
+        properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
+        readSystemPackages(properties, "jre-1.5");
+        readSystemPackages(properties, "osgi");
+    }
+
+    
+    private void readSystemPackages(Properties properties, String key) {
+        String packages = (String) properties.get(key);
+        for (String pkg : packages.split(";")) {
+            systemExports.add(pkg.trim());
+        }
+    }
+
+    /*
+     * Download a Kernel distro and check the list of bundles provided by the Kernel
+     */
+    private void readKernelBundles() throws ArtifactResolutionException, ArtifactNotFoundException, MojoExecutionException,
+        ZipException, IOException, DependencyTreeBuilderException {
+        final Collection<Artifact> kernelArtifacts;
+        if (kernelVersion == null) {
+           getLog().info("Step 1: Building list of provided bundle exports");
+           kernelArtifacts = new HashSet<Artifact>();
+           DependencyNode tree = dependencyTreeBuilder.buildDependencyTree(project, localRepo, factory, artifactMetadataSource, new ArtifactFilter() {
+
+            public boolean include(Artifact artifact) {
+                return true;
+            }
+               
+           }, collector);
+           tree.accept(new DependencyNodeVisitor() {
+                public boolean endVisit(DependencyNode node) {
+                    // we want the next sibling too
+                    return true;
+                }
+                public boolean visit(DependencyNode node) {
+                    if (node.getState() != DependencyNode.OMITTED_FOR_CONFLICT) {
+                        Artifact artifact = node.getArtifact();
+                        if (Artifact.SCOPE_PROVIDED.equals(artifact.getScope()) && !artifact.getType().equals("pom")) {
+                            kernelArtifacts.add(artifact);
+                        }
+                    }
+                    // we want the children too
+                    return true;
+                }
+            });
+        } else {
+            getLog().info("Step 1 : Building list of kernel exports");
+            getLog().warn("Use of 'kernelVersion' is deprecated -- use a dependency with scope 'provided' instead");
+            Artifact kernel = factory.createArtifact("org.apache.karaf", "apache-karaf", kernelVersion, Artifact.SCOPE_PROVIDED, "pom");
+            resolver.resolve(kernel, remoteRepos, localRepo);
+            kernelArtifacts = getDependencies(kernel);
+        }
+        for (Artifact artifact : kernelArtifacts) {
+            registerKernelBundle(artifact);
+        }
+        getLog().info("...done!");
+    }
+
+    private void registerKernelBundle(Artifact artifact) throws ArtifactResolutionException, ArtifactNotFoundException, ZipException,
+            IOException {
+        Manifest manifest = getManifest(artifact);
+        for (Clause clause : ManifestUtils.getExports(manifest)) {
+        	kernelExports.put(clause.getName(), ManifestUtils.getVersionRange(clause));
+        	getLog().debug(" adding kernel export " + clause.getName() + " (" + ManifestUtils.getVersionRange(clause) + ")");
+        }
+        registerBundle(artifact);
+    }
+
+    /*
+     * Read the list of bundles we can use to satisfy links
+     */
+    private void readBundles() throws IOException, ArtifactResolutionException, ArtifactNotFoundException {        
+        BufferedReader reader = null;
+        try {
+            if (bundles != null) {
+                getLog().info("Step 2 : Building a list of exports for bundles in " + bundles.getAbsolutePath());
+                reader = new BufferedReader(new FileReader(bundles));
+                String line = reader.readLine();
+                while (line != null) {
+                    if (line.contains("/") && !line.startsWith("#")) {
+                        String[] elements = line.split("/");
+                        Artifact artifact = factory.createArtifact(elements[0], elements[1], elements[2], Artifact.SCOPE_PROVIDED,
+                                                                   elements[3]);
+                        registerBundle(artifact);
+                    }
+                    line = reader.readLine();
+                }                
+            } else {
+                getLog().info("Step 2 : No Bundle file supplied for building list of exports");
+            }
+        } finally {
+            if (reader != null) {
+                reader.close();
+            }
+        }
+        getLog().info("...done!");
+    }
+    
+    /*
+     * Auto-discover bundles currently in the dependencies
+     */
+    private void discoverBundles() throws ArtifactResolutionException, ArtifactNotFoundException, ZipException, IOException {
+    	getLog().info("Step 3 : Discovering bundles in Maven dependencies");
+		for (Artifact dependency : (Set<Artifact>) project.getArtifacts()) {
+			// we will generate a feature for this afterwards
+			if (project.getDependencyArtifacts().contains(dependency)) {
+				continue;
+			}
+			// this is a provided bundle, has been handled in step 1
+			if (dependency.getScope().equals(Artifact.SCOPE_PROVIDED)) {
+			    continue;
+			}
+			if (isDiscoverableBundle(dependency)) {
+				getLog().info("  Discovered " + dependency);
+				registerBundle(dependency);
+			}
+		}
+		getLog().info("...done!");
+	}
+
+    /*
+     * Write all project dependencies as feature
+     */
+    private void writeFeatures(PrintStream out) throws ArtifactResolutionException, ArtifactNotFoundException,
+        ZipException, IOException {
+        getLog().info("Step 4 : Generating " + outputFile.getAbsolutePath());
+        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+        out.println("<features>");
+        Set<Artifact> dependencies = (Set<Artifact>)project.getDependencyArtifacts();
+        for (Artifact artifact : dependencies) {
+            if (!artifact.getScope().equals(Artifact.SCOPE_PROVIDED) && !artifact.getType().equals("pom")) {
+                getLog().info(" Generating feature " + artifact.getArtifactId() + " from " + artifact);
+                Feature feature = getFeature(artifact);
+                feature.write(out);
+                registerFeature(artifact, feature);
+            }
+        }
+        out.println("</features>");
+        getLog().info("...done!");
+    }
+
+    /*
+     * Get the feature for an artifact 
+     */
+    private Feature getFeature(Artifact artifact) throws ArtifactResolutionException, ArtifactNotFoundException, ZipException, IOException {
+        Feature feature = new Feature(artifact);
+        addRequirements(artifact, feature);
+        return feature;
+    }
+
+    /*
+     * Only auto-discover an OSGi bundle
+     * - if it is not already known as a feature itself
+     * - if it is not another version of an already known bundle
+     */
+    private boolean isDiscoverableBundle(Artifact artifact) {
+        if (isBundle(artifact) && !isFeature(artifact) && !artifact.getScope().equals(Artifact.SCOPE_PROVIDED)) {
+            for (String known : knownBundles) {
+                String[] elements = known.split("/");
+                if (artifact.getGroupId().equals(elements[0]) &&
+                    artifact.getArtifactId().equals(elements[1])) {
+                    getLog().debug(String.format("  Avoid auto-discovery for %s because of existing bundle %s", 
+                                                 toString(artifact), known));
+                    return false;
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    /*
+     * Check if the given artifact is a bundle
+     */
+    private boolean isBundle(Artifact artifact) {
+        if (knownBundles.contains(toString(artifact)) || artifact.getArtifactHandler().getPackaging().equals("bundle")) {
+            return true;
+        } else {
+            try {
+                Manifest manifest = getManifest(artifact);
+                if (ManifestUtils.getBsn(manifest) != null) {
+                    getLog().debug(String.format("MANIFEST.MF for '%s' contains Bundle-Name '%s'",
+                                                 artifact, ManifestUtils.getBsn(manifest)));
+                    return true;
+                }
+            } catch (ZipException e) {
+                getLog().debug("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            } catch (IOException e) {
+                getLog().debug("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            } catch (Exception e) {
+                getLog().debug("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            }
+        }
+        return false;
+     }
+
+    /*
+     * Add requirements for an artifact to a feature
+     */
+    private void addRequirements(Artifact artifact, Feature feature) throws ArtifactResolutionException, ArtifactNotFoundException, ZipException, IOException {
+        Manifest manifest = getManifest(artifact);
+        Collection<Clause> remaining = getRemainingImports(manifest);
+        Artifact previous = null;
+        for (Clause clause : remaining) {
+            Artifact add = null;
+            Map<VersionRange, Artifact> versions = bundleExports.get(clause.getName());
+            if (versions != null) {
+                for (VersionRange range : versions.keySet()) {
+                    add = versions.get(range);
+                    if (range.intersect(ManifestUtils.getVersionRange(clause)) != null) {
+                        add = versions.get(range);
+                    }
+                }
+            }
+            if (add == null) {
+                if (ManifestUtils.isOptional(clause)) {
+                    // debug logging for optional dependency...
+                    getLog().debug(String.format("  Unable to find suitable bundle for optional dependency %s (%s)", 
+                                                 clause.getName(), ManifestUtils.getVersionRange(clause)));
+                } else {
+                    // ...but a warning for a mandatory dependency
+                    getLog().warn(
+                                  String.format("  Unable to find suitable bundle for dependency %s (%s) (required by %s)", 
+                                                clause.getName(), ManifestUtils.getVersionRange(clause), artifact.getArtifactId()));
+                }
+            } else {
+                if (!add.equals(previous) && feature.push(add) && !isFeature(add)) {
+                    //and get requirements for the bundle we just added
+                    getLog().debug("  Getting requirements for " + add);
+                    addRequirements(add, feature);
+                }
+            }
+            previous = add;
+        }
+    }
+
+    /*
+     * Check if a given bundle is itself being generated as a feature
+     */
+    private boolean isFeature(Artifact artifact) {
+        return features.containsKey(artifact);
+    }
+
+   
+    /*
+     * Register a bundle, enlisting all packages it provides
+     */
+    private void registerBundle(Artifact artifact) throws ArtifactResolutionException, ArtifactNotFoundException, ZipException,
+        IOException {
+        getLog().debug("Registering bundle " + artifact);
+        knownBundles.add(toString(artifact));
+        Manifest manifest = getManifest(artifact);
+        for (Clause clause : getManifestEntries(ManifestUtils.getExports(manifest))) {
+            Map<VersionRange, Artifact> versions = bundleExports.get(clause.getName());
+            if (versions == null) {
+                versions = new HashMap<VersionRange, Artifact>();
+            }
+            versions.put(ManifestUtils.getVersionRange(clause), artifact);
+            getLog().debug(String.format(" %s exported by bundle %s", clause.getName(), artifact));
+            bundleExports.put(clause.getName(), versions);
+        }
+    }
+
+    /*
+     * Register a feature and also register the bundle for the feature
+     */
+    private void registerFeature(Artifact artifact, Feature feature) throws ArtifactResolutionException, ArtifactNotFoundException, ZipException,
+        IOException {
+        features.put(artifact, feature);
+        registerBundle(artifact);
+    }
+
+    /*
+     * Determine the list of imports to be resolved
+     */
+    private Collection<Clause> getRemainingImports(Manifest manifest) {
+        // take all imports
+        Collection<Clause> input = getManifestEntries(ManifestUtils.getImports(manifest));
+        Collection<Clause> output = new LinkedList<Clause>(input);
+        // remove imports satisfied by exports in the same bundle
+        for (Clause clause : input) {
+            for (Clause export : getManifestEntries(ManifestUtils.getExports(manifest))) {
+                if (clause.getName().equals(export.getName())) {
+                    output.remove(clause);
+                }
+            }
+        }
+        // remove imports for packages exported by the kernel
+        for (Clause clause : input) {
+            for (String export : kernelExports.keySet()) {
+                if (clause.getName().equals(export)) {
+                    output.remove(clause);
+                }
+            }
+        }
+        // remove imports for packages exported by the system bundle
+        for (Clause clause : input) {
+            if (systemExports.contains(clause.getName())) {
+                output.remove(clause);
+            }
+        }
+        return output;
+    }
+
+    private Collection<Clause> getManifestEntries(List imports) {
+        if (imports == null) {
+            return new LinkedList<Clause>();
+        } else {
+            return (Collection<Clause>)imports;
+        }
+    }
+
+    private Manifest getManifest(Artifact artifact) throws ArtifactResolutionException, ArtifactNotFoundException, ZipException,
+        IOException {
+        File localFile = new File(localRepo.pathOf(artifact));
+        ZipFile file;
+        if (localFile.exists()) {
+            //avoid going over to the repository if the file is already on the disk
+            file = new ZipFile(localFile);
+        } else {
+            resolver.resolve(artifact, remoteRepos, localRepo);
+            file = new ZipFile(artifact.getFile());
+        }
+        return new Manifest(file.getInputStream(file.getEntry("META-INF/MANIFEST.MF")));
+    }
+
+    private List<Artifact> getDependencies(Artifact artifact) {
+        List<Artifact> list = new ArrayList<Artifact>();
+        try {
+            ResolutionGroup pom = artifactMetadataSource.retrieve(artifact, localRepo, remoteRepos);
+            if (pom != null) {
+                list.addAll(pom.getArtifacts());
+            }
+        } catch (ArtifactMetadataRetrievalException e) {
+            getLog().warn("Unable to retrieve metadata for " + artifact + ", not including dependencies for it");
+        } catch (InvalidArtifactRTException e) {
+            getLog().warn("Unable to retrieve metadata for " + artifact + ", not including dependencies for it");
+        }
+        return list;
+    }
+    
+    public static String toString(Artifact artifact) {
+        if (artifact.getType().equals("jar")) {
+            return String.format("%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion());
+        }
+        return String.format("%s/%s/%s/%s", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getType());
+    }
+
+    private class Feature {
+
+        private Stack<Artifact> artifacts = new Stack<Artifact>();
+        private final Artifact artifact;
+        
+        private Feature(Artifact artifact) {
+            super();
+            this.artifact = artifact;
+            artifacts.push(artifact);
+        }
+
+        public boolean push(Artifact item) {
+            if (artifacts.contains(item)) {
+                artifacts.remove(item);
+                artifacts.push(item);
+                return false;
+            }
+            if (!artifacts.contains(item)) {
+                artifacts.push(item);
+                return true;
+            }
+            return false;
+        }
+
+        public void write(PrintStream out) {
+            out.println("  <feature name='" + artifact.getArtifactId() + "' version='"
+            		+ artifact.getBaseVersion() + "'>");
+            
+            Stack<Artifact> resulting = new Stack<Artifact>();
+            resulting.addAll(artifacts);
+
+            // remove dependencies for included features
+            for (Artifact next : artifacts) {
+                if (isFeature(next)) {
+                    resulting.removeAll(features.get(next).getDependencies());
+                }
+            }
+            
+            while (!resulting.isEmpty()) {
+            	Artifact next = resulting.pop();
+                if (isFeature(next)) {
+                    out.println("    <feature version='"
+            		+ next.getBaseVersion() + "'>" + String.format("%s</feature>", next.getArtifactId()));
+                } else {
+                    if (next.getType().equals("jar")) {
+                        out.println(String.format("    <bundle>mvn:%s/%s/%s</bundle>", next.getGroupId(), next.getArtifactId(), next.getBaseVersion()));
+                    } else {
+                        out.println(String.format("    <bundle>mvn:%s/%s/%s/%s</bundle>", next.getGroupId(), next.getArtifactId(), next.getBaseVersion(), next.getType()));
+                    }
+                }
+            }
+            out.println("  </feature>");
+        }
+        
+        public List<Artifact> getDependencies() {
+            List<Artifact> dependencies = new LinkedList<Artifact>(artifacts);
+            dependencies.remove(artifact);
+            return dependencies;
+        }
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GraphArtifactCollector.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GraphArtifactCollector.java
new file mode 100644
index 0000000..c3bb918
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GraphArtifactCollector.java
@@ -0,0 +1,435 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.metadata.ResolutionGroup;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
+import org.apache.maven.artifact.resolver.CyclicDependencyException;
+import org.apache.maven.artifact.resolver.ResolutionListener;
+import org.apache.maven.artifact.resolver.ResolutionNode;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
+import org.apache.maven.artifact.versioning.VersionRange;
+
+/**
+ * @version $Revision: 1.1 $
+ */
+public class GraphArtifactCollector implements ArtifactCollector {
+    public ArtifactResolutionResult collect(
+            Set artifacts,
+            Artifact originatingArtifact,
+            ArtifactRepository localRepository,
+            List remoteRepositories,
+            ArtifactMetadataSource source,
+            ArtifactFilter filter,
+            List listeners) throws ArtifactResolutionException {
+        return collect(artifacts, originatingArtifact, Collections.EMPTY_MAP,
+                localRepository, remoteRepositories, source, filter, listeners);
+    }
+
+    public ArtifactResolutionResult collect(
+            Set artifacts,
+            Artifact originatingArtifact,
+            Map managedVersions,
+            ArtifactRepository localRepository,
+            List remoteRepositories,
+            ArtifactMetadataSource source,
+            ArtifactFilter filter,
+            List listeners) throws ArtifactResolutionException {
+        Map resolvedArtifacts = new HashMap();
+
+        ResolutionNode root = new ResolutionNode(originatingArtifact, remoteRepositories);
+        root.addDependencies(artifacts, remoteRepositories, filter);
+        recurse(root, resolvedArtifacts, managedVersions, localRepository,
+                remoteRepositories, source, filter, listeners);
+
+        Set set = new HashSet();
+        for (Iterator i = resolvedArtifacts.values().iterator(); i.hasNext();) {
+            List nodes = (List) i.next();
+            for (Iterator j = nodes.iterator(); j.hasNext();) {
+                ResolutionNode node = (ResolutionNode) j.next();
+                Artifact artifact = node.getArtifact();
+                if (!node.equals(root) && node.isActive() && node.filterTrail(filter)
+                        // If it was optional and not a direct dependency,
+                        // we don't add it or its children, just allow the
+                        // update of the version and scope
+                        && (node.isChildOfRootNode() || !artifact.isOptional())) {
+                    artifact.setDependencyTrail(node.getDependencyTrail());
+                    set.add(node);
+                }
+            }
+        }
+
+        ArtifactResolutionResult result = new ArtifactResolutionResult();
+        result.setArtifactResolutionNodes(set);
+        return result;
+    }
+
+    private void recurse(
+            ResolutionNode node,
+            Map resolvedArtifacts,
+            Map managedVersions,
+            ArtifactRepository localRepository,
+            List remoteRepositories,
+            ArtifactMetadataSource source,
+            ArtifactFilter filter,
+            List listeners) throws CyclicDependencyException, ArtifactResolutionException,
+            OverConstrainedVersionException {
+        fireEvent(ResolutionListener.TEST_ARTIFACT, listeners, node);
+
+        // TODO: use as a conflict resolver
+        Object key = node.getKey();
+        if (managedVersions.containsKey(key)) {
+            Artifact artifact = (Artifact) managedVersions.get(key);
+            fireEvent(ResolutionListener.MANAGE_ARTIFACT, listeners, node, artifact);
+            if (artifact.getVersion() != null) {
+                node.getArtifact().setVersion(artifact.getVersion());
+            }
+            if (artifact.getScope() != null) {
+                node.getArtifact().setScope(artifact.getScope());
+            }
+        }
+
+        List previousNodes = (List) resolvedArtifacts.get(key);
+        if (previousNodes != null) {
+            node = checkPreviousNodes(node, listeners, previousNodes);
+        }
+        else {
+            previousNodes = new ArrayList();
+            resolvedArtifacts.put(key, previousNodes);
+        }
+        previousNodes.add(node);
+
+        if (node.isActive()) {
+            fireEvent(ResolutionListener.INCLUDE_ARTIFACT, listeners, node);
+        }
+
+        // don't pull in the transitive deps of a system-scoped dependency.
+        if (node.isActive() && !Artifact.SCOPE_SYSTEM.equals(node.getArtifact().getScope())) {
+            fireEvent(ResolutionListener.PROCESS_CHILDREN, listeners, node);
+            for (Iterator i = node.getChildrenIterator(); i.hasNext();) {
+                ResolutionNode child = (ResolutionNode) i.next();
+                // We leave in optional ones, but don't pick up its dependencies
+                if (!child.isResolved()
+                        && (!child.getArtifact().isOptional() || child.isChildOfRootNode())) {
+                    Artifact artifact = child.getArtifact();
+                    try {
+                        if (artifact.getVersion() == null) {
+                            // set the recommended version
+                            // TODO: maybe its better to just pass the range
+                            // through to retrieval and use a transformation?
+                            ArtifactVersion version;
+                            version = getArtifactVersion(localRepository, remoteRepositories, source, artifact);
+
+                            artifact.selectVersion(version.toString());
+                            fireEvent(ResolutionListener.SELECT_VERSION_FROM_RANGE,
+                                    listeners, child);
+                        }
+
+                        ResolutionGroup rGroup = source.retrieve(artifact,
+                                localRepository, remoteRepositories);
+
+                        // TODO might be better to have source.retreive() throw
+                        // a specific exception for this situation
+                        // and catch here rather than have it return null
+                        if (rGroup == null) {
+                            // relocated dependency artifact is declared
+                            // excluded, no need to add and recurse further
+                            continue;
+                        }
+
+                        child.addDependencies(rGroup.getArtifacts(),
+                                rGroup.getResolutionRepositories(), filter);
+                    }
+                    catch (CyclicDependencyException e) {
+                        // would like to throw this, but we have crappy stuff in
+                        // the repo
+
+                        fireEvent(ResolutionListener.OMIT_FOR_CYCLE, listeners,
+                                new ResolutionNode(e.getArtifact(), remoteRepositories, child));
+                    }
+                    catch (ArtifactMetadataRetrievalException e) {
+                        artifact.setDependencyTrail(node.getDependencyTrail());
+                        throw new ArtifactResolutionException(
+                                "Unable to get dependency information: "
+                                        + e.getMessage(), artifact, e);
+                    }
+
+                    recurse(child, resolvedArtifacts, managedVersions,
+                            localRepository, remoteRepositories, source,
+                            filter, listeners);
+                }
+            }
+            fireEvent(ResolutionListener.FINISH_PROCESSING_CHILDREN, listeners,
+                    node);
+        }
+    }
+
+    private ArtifactVersion getArtifactVersion(
+            ArtifactRepository localRepository,
+            List remoteRepositories,
+            ArtifactMetadataSource source,
+            Artifact artifact) throws OverConstrainedVersionException,
+            ArtifactMetadataRetrievalException {
+        ArtifactVersion version;
+        if (!artifact.isSelectedVersionKnown()) {
+            List versions = artifact.getAvailableVersions();
+            if (versions == null) {
+                versions = source.retrieveAvailableVersions(
+                        artifact, localRepository,
+                        remoteRepositories);
+                artifact.setAvailableVersions(versions);
+            }
+
+            VersionRange versionRange = artifact.getVersionRange();
+
+            version = versionRange.matchVersion(versions);
+
+            if (version == null) {
+                if (versions.isEmpty()) {
+                    throw new OverConstrainedVersionException(
+                            "No versions are present in the repository for the artifact with a range "
+                                    + versionRange, artifact, remoteRepositories);
+                }
+                else {
+                    throw new OverConstrainedVersionException(
+                            "Couldn't find a version in "
+                                    + versions
+                                    + " to match range "
+                                    + versionRange,
+                            artifact, remoteRepositories);
+                }
+            }
+        }
+        else {
+            version = artifact.getSelectedVersion();
+        }
+        return version;
+    }
+
+    private ResolutionNode checkPreviousNodes(
+            ResolutionNode node,
+            List listeners,
+            List previousNodes) throws OverConstrainedVersionException {
+        for (Iterator i = previousNodes.iterator(); i.hasNext();) {
+            ResolutionNode previous = (ResolutionNode) i.next();
+            if (previous.isActive()) {
+                // Version mediation
+                VersionRange previousRange = previous.getArtifact().getVersionRange();
+                VersionRange currentRange = node.getArtifact().getVersionRange();
+                // TODO: why do we force the version on it? what if they
+                // don't match?
+                if (previousRange == null) {
+                    // version was already resolved
+                    node.getArtifact().setVersion(previous.getArtifact().getVersion());
+                }
+                else if (currentRange == null) {
+                    // version was already resolved
+                    previous.getArtifact().setVersion(node.getArtifact().getVersion());
+                }
+                else {
+                    // TODO: shouldn't need to double up on this work, only
+                    // done for simplicity of handling recommended
+                    // version but the restriction is identical
+                    VersionRange newRange = previousRange.restrict(currentRange);
+                    // TODO: ick. this forces the OCE that should have come
+                    // from the previous call. It is still correct
+                    if (newRange.isSelectedVersionKnown(previous.getArtifact())) {
+                        fireEvent(ResolutionListener.RESTRICT_RANGE,
+                                listeners, node, previous.getArtifact(),
+                                newRange);
+                    }
+                    previous.getArtifact().setVersionRange(newRange);
+                    node.getArtifact().setVersionRange(
+                            currentRange.restrict(previousRange));
+
+                    // Select an appropriate available version from the (now
+                    // restricted) range
+                    // Note this version was selected before to get the
+                    // appropriate POM
+                    // But it was reset by the call to setVersionRange on
+                    // restricting the version
+                    ResolutionNode[] resetNodes = {previous, node};
+                    for (int j = 0; j < 2; j++) {
+                        Artifact resetArtifact = resetNodes[j]
+                                .getArtifact();
+                        if (resetArtifact.getVersion() == null
+                                && resetArtifact.getVersionRange() != null
+                                && resetArtifact.getAvailableVersions() != null) {
+
+                            resetArtifact
+                                    .selectVersion(resetArtifact
+                                            .getVersionRange()
+                                            .matchVersion(
+                                                    resetArtifact
+                                                            .getAvailableVersions())
+                                            .toString());
+                            fireEvent(ResolutionListener.SELECT_VERSION_FROM_RANGE,
+                                    listeners, resetNodes[j]);
+                        }
+                    }
+                }
+
+                // Conflict Resolution
+                // TODO: use as conflict resolver(s), chain
+
+                // TODO: should this be part of mediation?
+                // previous one is more dominant
+                if (previous.getDepth() <= node.getDepth()) {
+                    checkScopeUpdate(node, previous, listeners);
+                }
+                else {
+                    checkScopeUpdate(previous, node, listeners);
+                }
+
+                if (previous.getDepth() <= node.getDepth()) {
+                    // previous was nearer
+                    fireEvent(ResolutionListener.OMIT_FOR_NEARER,
+                            listeners, node, previous.getArtifact());
+                    node.disable();
+                    node = previous;
+                }
+                else {
+                    fireEvent(ResolutionListener.OMIT_FOR_NEARER,
+                            listeners, previous, node.getArtifact());
+                    previous.disable();
+                }
+            }
+        }
+        return node;
+    }
+
+    private void checkScopeUpdate(ResolutionNode farthest,
+            ResolutionNode nearest, List listeners) {
+        boolean updateScope = false;
+        Artifact farthestArtifact = farthest.getArtifact();
+        Artifact nearestArtifact = nearest.getArtifact();
+
+        if (Artifact.SCOPE_RUNTIME.equals(farthestArtifact.getScope())
+                && (Artifact.SCOPE_TEST.equals(nearestArtifact.getScope()) || Artifact.SCOPE_PROVIDED
+                .equals(nearestArtifact.getScope()))) {
+            updateScope = true;
+        }
+
+        if (Artifact.SCOPE_COMPILE.equals(farthestArtifact.getScope())
+                && !Artifact.SCOPE_COMPILE.equals(nearestArtifact.getScope())) {
+            updateScope = true;
+        }
+
+        // current POM rules all
+        if (nearest.getDepth() < 2 && updateScope) {
+            updateScope = false;
+
+            fireEvent(ResolutionListener.UPDATE_SCOPE_CURRENT_POM, listeners,
+                    nearest, farthestArtifact);
+        }
+
+        if (updateScope) {
+            fireEvent(ResolutionListener.UPDATE_SCOPE, listeners, nearest,
+                    farthestArtifact);
+
+            // previously we cloned the artifact, but it is more effecient to
+            // just update the scope
+            // if problems are later discovered that the original object needs
+            // its original scope value, cloning may
+            // again be appropriate
+            nearestArtifact.setScope(farthestArtifact.getScope());
+        }
+    }
+
+    private void fireEvent(int event, List listeners, ResolutionNode node) {
+        fireEvent(event, listeners, node, null);
+    }
+
+    private void fireEvent(int event, List listeners, ResolutionNode node,
+            Artifact replacement) {
+        fireEvent(event, listeners, node, replacement, null);
+    }
+
+    private void fireEvent(int event, List listeners, ResolutionNode node,
+            Artifact replacement, VersionRange newRange) {
+        for (Iterator i = listeners.iterator(); i.hasNext();) {
+            ResolutionListener listener = (ResolutionListener) i.next();
+
+            switch (event) {
+                case ResolutionListener.TEST_ARTIFACT:
+                    listener.testArtifact(node.getArtifact());
+                    break;
+                case ResolutionListener.PROCESS_CHILDREN:
+                    listener.startProcessChildren(node.getArtifact());
+                    break;
+                case ResolutionListener.FINISH_PROCESSING_CHILDREN:
+                    listener.endProcessChildren(node.getArtifact());
+                    break;
+                case ResolutionListener.INCLUDE_ARTIFACT:
+                    listener.includeArtifact(node.getArtifact());
+                    break;
+                case ResolutionListener.OMIT_FOR_NEARER:
+                    String version = node.getArtifact().getVersion();
+                    String replacementVersion = replacement.getVersion();
+                    if (version != null ? !version.equals(replacementVersion)
+                            : replacementVersion != null) {
+                        listener.omitForNearer(node.getArtifact(), replacement);
+                    }
+                    break;
+                case ResolutionListener.OMIT_FOR_CYCLE:
+                    listener.omitForCycle(node.getArtifact());
+                    break;
+                case ResolutionListener.UPDATE_SCOPE:
+                    listener
+                            .updateScope(node.getArtifact(), replacement.getScope());
+                    break;
+                case ResolutionListener.UPDATE_SCOPE_CURRENT_POM:
+                    listener.updateScopeCurrentPom(node.getArtifact(), replacement
+                            .getScope());
+                    break;
+                case ResolutionListener.MANAGE_ARTIFACT:
+                    listener.manageArtifact(node.getArtifact(), replacement);
+                    break;
+                case ResolutionListener.SELECT_VERSION_FROM_RANGE:
+                    listener.selectVersionFromRange(node.getArtifact());
+                    break;
+                case ResolutionListener.RESTRICT_RANGE:
+                    if (node.getArtifact().getVersionRange().hasRestrictions()
+                            || replacement.getVersionRange().hasRestrictions()) {
+                        listener.restrictRange(node.getArtifact(), replacement,
+                                newRange);
+                    }
+                    break;
+                default:
+                    throw new IllegalStateException("Unknown event: " + event);
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
new file mode 100644
index 0000000..c02d03f
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
@@ -0,0 +1,180 @@
+/*
+ * 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.karaf.tooling.features;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.net.URI;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.karaf.deployer.kar.KarArtifactInstaller;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+
+/**
+ * Installs kar dependencies into a server-under-construction in target/assembly
+ *
+ * @version $Revision: 1.1 $
+ * @goal install-kars
+ * @phase process-resources
+ * @execute phase="process-resources"
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault true
+ * @description Install kar dependencies
+ */
+public class InstallKarsMojo extends MojoSupport {
+
+    /**
+     * Directory that resources are copied to during the build.
+     *
+     * @parameter expression="${project.build.directory}/assembly"
+     * @required
+     */
+    protected String workDirectory;
+
+    /**
+     * features config file.
+     *
+     * @parameter expression="${project.build.directory}/assembly/etc/org.apache.karaf.features.cfg"
+     * @required
+     */
+    protected File featuresCfgFile;
+
+    /**
+     * Directory that resources are copied to during the build.
+     *
+     * @parameter expression="${project.build.directory}/assembly/local-repo"
+     * @required
+     */
+    protected String localRepoDirectory;
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        KarArtifactInstaller installer = new KarArtifactInstaller();
+        installer.setBasePath(workDirectory);
+        installer.setLocalRepoPath(localRepoDirectory);
+        FeaturesService featuresService = new OfflineFeaturesService();
+        installer.setFeaturesService(featuresService);
+        installer.init();
+        Collection<Artifact> dependencies = project.getDependencyArtifacts();
+        StringBuilder buf = new StringBuilder();
+        for (Artifact artifact: dependencies) {
+            if ("kar".equals(artifact.getType()) && "compile".equals(artifact.getScope())) {
+                File file = artifact.getFile();
+                try {
+                    installer.install(file);
+                } catch (Exception e) {
+                    buf.append("Could not install kar: ").append(artifact.toString()).append("\n");
+                    buf.append(e.getMessage()).append("\n\n");
+                }
+            }
+        }
+        if (buf.length() > 0) {
+            throw new MojoExecutionException("Could not unpack all dependencies:\n" + buf.toString());
+        }
+    }
+
+    private class OfflineFeaturesService implements FeaturesService {
+        private static final String FEATURES_REPOSITORIES = "featuresRepositories";
+
+        public void validateRepository(URI uri) throws Exception {
+        }
+
+        public void addRepository(URI url) throws Exception {
+            if (featuresCfgFile.exists()) {
+                Properties properties = new Properties();
+                FileInputStream in = new FileInputStream(featuresCfgFile);
+                try {
+                    properties.load(in);
+                } finally {
+                    in.close();
+                }
+                String existingFeatureRepos = properties.containsKey(FEATURES_REPOSITORIES)? properties.getProperty(FEATURES_REPOSITORIES) + ",": "";
+                existingFeatureRepos = existingFeatureRepos + url.toString();
+                properties.setProperty(FEATURES_REPOSITORIES, existingFeatureRepos);
+                FileOutputStream out = new FileOutputStream(featuresCfgFile);
+                try {
+                    properties.store(out, "Features Service config");
+                } finally {
+                    out.close();
+                }
+            }
+        }
+
+        public void removeRepository(URI url) {
+        }
+
+        public void restoreRepository(URI url) throws Exception {
+        }
+
+        public Repository[] listRepositories() {
+            return new Repository[0];
+        }
+
+        public void installFeature(String name) throws Exception {
+        }
+
+        public void installFeature(String name, String version) throws Exception {
+        }
+
+        public void installFeature(String name, String version, EnumSet<Option> options) throws Exception {
+        }
+
+        public void installFeature(Feature f, EnumSet<Option> options) throws Exception {
+        }
+
+        public void installFeatures(Set<Feature> features, EnumSet<Option> options) throws Exception {
+        }
+
+        public void uninstallFeature(String name) throws Exception {
+        }
+
+        public void uninstallFeature(String name, String version) throws Exception {
+        }
+
+        public Feature[] listFeatures() throws Exception {
+            return new Feature[0];
+        }
+
+        public Feature[] listInstalledFeatures() {
+            return new Feature[0];
+        }
+
+        public boolean isInstalled(Feature f) {
+            return false;
+        }
+
+        public Feature getFeature(String name, String version) throws Exception {
+            return null;
+        }
+
+        public Feature getFeature(String name) throws Exception {
+            return null;
+        }
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ManifestUtils.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ManifestUtils.java
new file mode 100644
index 0000000..ef265a9
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ManifestUtils.java
@@ -0,0 +1,140 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.jar.Manifest;
+
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Parser;
+import org.apache.felix.utils.version.VersionRange;
+import org.osgi.framework.Constants;
+
+
+/**
+ * A set of utility methods to ease working with {@link org.apache.felix.utils.manifest.Parser} and
+ * {@link org.apache.felix.utils.manifest.Clause}
+ */
+
+public class ManifestUtils {
+
+    private ManifestUtils() {
+        // hide the constructor
+    }
+
+    /**
+     * Get the list of imports from the manifest.  If no imports have been defined, this method returns an empty list.
+     *
+     * @param manifest the manifest
+     * @return the list of imports
+     */
+    public static List<Clause> getImports(Manifest manifest) {
+    	List<Clause> result = new LinkedList<Clause>();
+    	Clause[] clauses = Parser.parseHeader(getHeader(Constants.IMPORT_PACKAGE, manifest));
+    	for (Clause clause : clauses) {
+    		result.add(clause);
+    	}
+    	return result;
+    }
+
+    /**
+     * Get the list of non-optional imports from the manifest.
+     *
+     * @param manifest the manifest
+     * @return the list of non-optional imports
+     */
+    public static List<Clause> getMandatoryImports(Manifest manifest) {
+        List<Clause> result = new LinkedList<Clause>();
+        for (Clause clause : getImports(manifest)) {
+            if (!isOptional(clause)) {
+                result.add(clause);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Get the list of exports from the manifest.  If no exports have been defined, this method returns an empty list.
+     *
+     * @param manifest the manifest
+     * @return the list of exports
+     */
+    public static List<Clause> getExports(Manifest manifest) {
+    	List<Clause> result = new LinkedList<Clause>();
+    	Clause[] clauses = Parser.parseHeader(getHeader(Constants.EXPORT_PACKAGE, manifest));
+    	for (Clause clause : clauses) {
+    		result.add(clause);
+    	}
+    	return result;
+    }
+
+    /**
+     * Check if a given manifest clause represents an optional import
+     *
+     * @param clause the manifest clause
+     * @return <code>true</code> for an optional import, <code>false</code> for mandatory imports
+     */
+    public static boolean isOptional(Clause clause) {
+        return "optional".equals(clause.getDirective("resolution"));
+    }
+
+    /**
+     * Check if the manifest contains the mandatory Bundle-Symbolic-Name
+     *
+     * @param manifest the manifest
+     * @return <code>true</code> if the manifest specifies a Bundle-Symbolic-Name
+     */
+    public static boolean isBundle(Manifest manifest) {
+        return getBsn(manifest) != null;
+    }
+
+    public static boolean matches(Clause requirement, Clause export) {
+        if (requirement.getName().equals(export.getName())) {
+        	VersionRange importVersionRange = getVersionRange(requirement); 
+        	VersionRange exportVersionRange = getVersionRange(export);
+        	VersionRange intersection = importVersionRange.intersect(exportVersionRange);
+        	return intersection != null;
+        }
+        return false;
+    }
+    
+    public static String getHeader(String name, Manifest manifest) {
+    	String value = manifest.getMainAttributes().getValue(name);
+    	return value;    	
+    }
+    
+    public static String getBsn(Manifest manifest) {
+    	String bsn = getHeader(Constants.BUNDLE_SYMBOLICNAME, manifest);
+        return bsn;
+    }
+    
+    public static VersionRange getVersionRange(Clause clause)
+    {
+        String v = clause.getAttribute(Constants.VERSION_ATTRIBUTE);
+        if (v == null)
+        {
+            v = clause.getAttribute(Constants.PACKAGE_SPECIFICATION_VERSION);
+        }
+        if (v == null)
+        {
+            v = clause.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
+        }
+        return VersionRange.parseVersionRange(v);
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MojoSupport.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MojoSupport.java
new file mode 100644
index 0000000..df6e308
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MojoSupport.java
@@ -0,0 +1,451 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.MavenProjectHelper;
+import org.apache.maven.project.ProjectBuildingException;
+
+/**
+ * @version $Revision$
+ */
+public abstract class MojoSupport extends AbstractMojo {
+
+    /**
+     * Maven ProjectHelper
+     *
+     * @component
+     */
+    protected MavenProjectHelper projectHelper;
+
+    /**
+     * The Maven project.
+     *
+     * @parameter expression="${project}"
+     * @required
+     * @readonly
+     */
+    protected MavenProject project;
+
+    /**
+     * Directory that resources are copied to during the build.
+     *
+     * @parameter expression="${project.build.directory}/${project.artifactId}-${project.version}-installer"
+     * @required
+     */
+    protected File workDirectory;
+
+    /**
+     * @component
+     */
+    protected MavenProjectBuilder projectBuilder;
+
+    /**
+     * @parameter default-value="${localRepository}"
+     */
+    protected ArtifactRepository localRepo;
+
+    /**
+     * @parameter default-value="${project.remoteArtifactRepositories}"
+     */
+    protected List<ArtifactRepository> remoteRepos;
+
+    /**
+     * @component
+     */
+    protected ArtifactMetadataSource artifactMetadataSource;
+
+    /**
+     * @component
+     */
+    protected ArtifactResolver resolver;
+
+    protected ArtifactCollector collector = new GraphArtifactCollector();
+
+    /**
+     * @component
+     */
+    protected ArtifactFactory factory;
+    
+    /**
+     * The artifact type of a feature
+     * 
+     * @parameter default-value="xml"
+     */
+    private String featureArtifactType = "xml";
+
+    protected MavenProject getProject() {
+        return project;
+    }
+
+    protected File getWorkDirectory() {
+        return workDirectory;
+    }
+
+    public MavenProjectHelper getProjectHelper() {
+        return projectHelper;
+    }
+
+    protected void removeBranch(ResolutionListenerImpl listener,
+            Artifact artifact) {
+        Node n = listener.getNode(artifact);
+        if (n != null) {
+            for (Iterator it = n.getParents().iterator(); it.hasNext();) {
+                Node parent = (Node) it.next();
+                parent.getChildren().remove(n);
+            }
+        }
+    }
+
+    protected void removeChildren(ResolutionListenerImpl listener,
+            Artifact artifact) {
+        Node n = listener.getNode(artifact);
+        n.getChildren().clear();
+    }
+
+    protected Set getArtifacts(Node n, Set s) {
+        if (!s.contains(n.getArtifact())) {
+            s.add(n.getArtifact());
+            for (Iterator iter = n.getChildren().iterator(); iter.hasNext();) {
+                Node c = (Node) iter.next();
+                getArtifacts(c, s);
+            }
+        }
+        return s;
+    }
+
+    protected void excludeBranch(Node n, Set excludes) {
+        excludes.add(n);
+        for (Iterator iter = n.getChildren().iterator(); iter.hasNext();) {
+            Node c = (Node) iter.next();
+            excludeBranch(c, excludes);
+        }
+    }
+
+    protected void print(Node rootNode) {
+        for (Iterator iter = getArtifacts(rootNode, new HashSet()).iterator(); iter.hasNext();) {
+            Artifact a = (Artifact) iter.next();
+            getLog().info(" " + a);
+        }
+    }
+
+    protected Set retainArtifacts(Set includes, ResolutionListenerImpl listener) {
+        Set finalIncludes = new HashSet();
+        Set filteredArtifacts = getArtifacts(listener.getRootNode(),
+                new HashSet());
+        for (Iterator iter = includes.iterator(); iter.hasNext();) {
+            Artifact artifact = (Artifact) iter.next();
+            for (Iterator iter2 = filteredArtifacts.iterator(); iter2.hasNext();) {
+                Artifact filteredArtifact = (Artifact) iter2.next();
+                if (filteredArtifact.getArtifactId().equals(
+                        artifact.getArtifactId())
+                        && filteredArtifact.getType()
+                                .equals(artifact.getType())
+                        && filteredArtifact.getGroupId().equals(
+                                artifact.getGroupId())) {
+                    if (!filteredArtifact.getVersion().equals(
+                            artifact.getVersion())) {
+                        getLog()
+                                .warn(
+                                        "Resolved artifact "
+                                                + artifact
+                                                + " has a different version from that in dependency management "
+                                                + filteredArtifact
+                                                + ", overriding dependency management");
+                    }
+                    finalIncludes.add(artifact);
+                }
+            }
+
+        }
+
+        return finalIncludes;
+    }
+
+    protected ResolutionListenerImpl resolveProject() {
+        Map managedVersions = null;
+        try {
+            managedVersions = createManagedVersionMap(project.getId(), project
+                    .getDependencyManagement());
+        } catch (ProjectBuildingException e) {
+            getLog().error(
+                    "An error occurred while resolving project dependencies.",
+                    e);
+        }
+        ResolutionListenerImpl listener = new ResolutionListenerImpl();
+        listener.setLog(getLog());
+        try {
+            collector.collect(project.getDependencyArtifacts(), project
+                    .getArtifact(), managedVersions, localRepo, remoteRepos,
+                    artifactMetadataSource, null, Collections
+                            .singletonList(listener));
+        } catch (ArtifactResolutionException e) {
+            getLog().error(
+                    "An error occurred while resolving project dependencies.",
+                    e);
+        }
+        if (getLog().isDebugEnabled()) {
+            getLog().debug("Dependency graph");
+            getLog().debug("================");
+            print(listener.getRootNode());
+            getLog().debug("================");
+        }
+        return listener;
+    }
+
+    protected Map createManagedVersionMap(String projectId,
+            DependencyManagement dependencyManagement) throws ProjectBuildingException {
+        Map map;
+        if (dependencyManagement != null
+                && dependencyManagement.getDependencies() != null) {
+            map = new HashMap();
+            for (Iterator i = dependencyManagement.getDependencies().iterator(); i
+                    .hasNext();) {
+                Dependency d = (Dependency) i.next();
+
+                try {
+                    VersionRange versionRange = VersionRange
+                            .createFromVersionSpec(d.getVersion());
+                    Artifact artifact = factory.createDependencyArtifact(d
+                            .getGroupId(), d.getArtifactId(), versionRange, d
+                            .getType(), d.getClassifier(), d.getScope());
+                    map.put(d.getManagementKey(), artifact);
+                } catch (InvalidVersionSpecificationException e) {
+                    throw new ProjectBuildingException(projectId,
+                            "Unable to parse version '" + d.getVersion()
+                                    + "' for dependency '"
+                                    + d.getManagementKey() + "': "
+                                    + e.getMessage(), e);
+                }
+            }
+        } else {
+            map = Collections.EMPTY_MAP;
+        }
+        return map;
+    }
+
+    /**
+     * Set up a classloader for the execution of the main class.
+     *
+     * @return
+     * @throws MojoExecutionException
+     */
+    protected URLClassLoader getClassLoader() throws MojoExecutionException {
+        try {
+            Set urls = new HashSet();
+
+            URL mainClasses = new File(project.getBuild().getOutputDirectory())
+                    .toURL();
+            getLog().debug("Adding to classpath : " + mainClasses);
+            urls.add(mainClasses);
+
+            URL testClasses = new File(project.getBuild()
+                    .getTestOutputDirectory()).toURL();
+            getLog().debug("Adding to classpath : " + testClasses);
+            urls.add(testClasses);
+
+            Set dependencies = project.getArtifacts();
+            Iterator iter = dependencies.iterator();
+            while (iter.hasNext()) {
+                Artifact classPathElement = (Artifact) iter.next();
+                getLog().debug(
+                        "Adding artifact: " + classPathElement.getFile()
+                                + " to classpath");
+                urls.add(classPathElement.getFile().toURL());
+            }
+            URLClassLoader appClassloader = new URLClassLoader((URL[]) urls
+                    .toArray(new URL[urls.size()]), this.getClass().getClassLoader());
+            return appClassloader;
+        } catch (MalformedURLException e) {
+            throw new MojoExecutionException(
+                    "Error during setting up classpath", e);
+        }
+    }
+    
+    protected String translateFromMaven(String uri) {
+        if (uri.startsWith("mvn:")) {
+            String[] parts = uri.substring("mvn:".length()).split("/");
+            String groupId = parts[0];
+            String artifactId = parts[1];
+            String version = null;
+            String classifier = null;
+            String type = "jar";
+            if (parts.length > 2) {
+                version = parts[2];
+                if (parts.length > 3) {
+                    type = parts[3];
+                    if (parts.length > 4) {
+                        classifier = parts[4];
+                    }
+                }
+            }
+            String dir = groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/";
+            String name = artifactId + "-" + version + (classifier != null ? "-" + classifier : "") + "." + type;
+
+            return getLocalRepoUrl() + "/" + dir + name;
+        }
+        if (System.getProperty("os.name").startsWith("Windows") && uri.startsWith("file:")) {
+                String baseDir = uri.substring(5).replace('\\', '/').replaceAll(" ", "%20");
+                String result = baseDir;
+                if (baseDir.indexOf(":") > 0) {
+                        result = "file:///" + baseDir;
+                }
+                return result;
+        }
+        return uri;
+    }
+
+    protected String getLocalRepoUrl() {
+         if (System.getProperty("os.name").startsWith("Windows")) {
+             String baseDir = localRepo.getBasedir().replace('\\', '/').replaceAll(" ", "%20");
+             return extractProtocolFromLocalMavenRepo()  + ":///" + baseDir;
+         } else {
+             return localRepo.getUrl();
+         }
+    }
+
+    /**
+     * Required because Maven 3 returns null in {@link ArtifactRepository#getProtocol()} (see KARAF-244)
+     */
+    private String extractProtocolFromLocalMavenRepo() {
+        try {
+            return new URL(localRepo.getUrl()).getProtocol();
+        } catch (MalformedURLException e) {
+            // Basically this should not happen; if it does though cancel the process
+            throw new RuntimeException("Repository URL is not valid", e);
+        }
+    }
+    
+    private Dependency findDependency(List<Dependency> dependencies, String artifactId, String groupId) {
+        for(Dependency dep : dependencies) {
+            if (artifactId.equals(dep.getArtifactId()) && groupId.equals(dep.getGroupId()) &&
+                    featureArtifactType.equals(dep.getType())) {
+                if (dep.getVersion() != null) 
+                    return dep;
+            }
+        }
+        return null;
+    }
+
+    protected Artifact resourceToArtifact(String resourceLocation, boolean skipNonMavenProtocols) throws MojoExecutionException {
+        resourceLocation = resourceLocation.replace("\r\n", "").replace("\n", "").replace(" ", "").replace("\t", "");
+        final int index = resourceLocation.indexOf("mvn:");
+        if (index < 0) {
+            if (skipNonMavenProtocols) {
+                return null;
+            }
+            throw new MojoExecutionException("Resource URL is not a maven URL: " + resourceLocation);
+        } else {
+            resourceLocation = resourceLocation.substring(index + "mvn:".length());
+        }
+        // Truncate the URL when a '#', a '?' or a '$' is encountered
+        final int index1 = resourceLocation.indexOf('?');
+        final int index2 = resourceLocation.indexOf('#');
+        int endIndex = -1;
+        if (index1 > 0) {
+            if (index2 > 0) {
+                endIndex = Math.min(index1, index2);
+            } else {
+                endIndex = index1;
+            }
+        } else if (index2 > 0) {
+            endIndex = index2;
+        }
+        if (endIndex >= 0) {
+            resourceLocation = resourceLocation.substring(0, endIndex);
+        }
+        final int index3 = resourceLocation.indexOf('$');
+        if (index3 > 0) {
+            resourceLocation = resourceLocation.substring(0, index3);
+        }
+
+        //check if the resourceLocation descriptor contains also remote repository information.
+        ArtifactRepository repo = null;
+        if (resourceLocation.startsWith("http://")) {
+            final int repoDelimIntex = resourceLocation.indexOf('!');
+            String repoUrl = resourceLocation.substring(0, repoDelimIntex);
+
+            repo = new DefaultArtifactRepository(
+                    repoUrl,
+                    repoUrl,
+                    new DefaultRepositoryLayout());
+            resourceLocation = resourceLocation.substring(repoDelimIntex + 1);
+
+        }
+        String[] parts = resourceLocation.split("/");
+        String groupId = parts[0];
+        String artifactId = parts[1];
+        String version = null;
+        String classifier = null;
+        String type = "jar";
+        if (parts.length > 2) {
+            version = parts[2];
+            if (parts.length > 3) {
+                type = parts[3];
+                if (parts.length > 4) {
+                    classifier = parts[4];
+                }
+            }
+        } else {
+            Dependency dep = findDependency(project.getDependencies(), artifactId, groupId);
+            if (dep == null && project.getDependencyManagement() != null) {
+                dep = findDependency(project.getDependencyManagement().getDependencies(), artifactId, groupId);
+            }
+            if (dep != null) {
+                version = dep.getVersion();
+                classifier = dep.getClassifier();
+                type = dep.getType();
+            }
+        }
+        if (version == null || version.length() == 0) {
+            throw new MojoExecutionException("Cannot find version for: " + resourceLocation);
+        }
+        Artifact artifact = factory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier);
+        artifact.setRepository(repo);
+        return artifact;
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/Node.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/Node.java
new file mode 100644
index 0000000..1e18393
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/Node.java
@@ -0,0 +1,56 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.util.Set;
+import java.util.HashSet;
+
+import org.apache.maven.artifact.Artifact;
+
+/**
+ * @version $Revision: 1.1 $
+*/
+public class Node {
+    private Set children = new HashSet();
+    private Set parents = new HashSet();
+    private Artifact artifact;
+
+    public Set getChildren() {
+        return children;
+    }
+
+    public Artifact getArtifact() {
+        return artifact;
+    }
+
+    public Set getParents() {
+        return parents;
+    }
+
+    public void setChildren(Set children) {
+        this.children = children;
+    }
+
+    public void setParents(Set parents) {
+        this.parents = parents;
+    }
+
+    public void setArtifact(Artifact artifact) {
+        this.artifact = artifact;
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ResolutionListenerImpl.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ResolutionListenerImpl.java
new file mode 100644
index 0000000..3e61254
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ResolutionListenerImpl.java
@@ -0,0 +1,158 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Stack;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.resolver.ResolutionListener;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.plugin.logging.Log;
+
+public class ResolutionListenerImpl implements ResolutionListener {
+
+    private Stack parents = new Stack();
+    private Map artifacts = new HashMap();
+    private Node rootNode;
+    private Log log;
+
+    public void setLog(Log log) {
+        this.log = log;
+    }
+
+    public Log getLog() {
+        return log;
+    }
+
+    public void testArtifact(Artifact artifact) {
+        // getLog().debug("testArtifact: " + artifact);
+        // intentionally blank
+    }
+
+    public void startProcessChildren(Artifact artifact) {
+        // getLog().debug("startProcessChildren: " + artifact);
+        Node node = (Node) artifacts.get(artifact.getDependencyConflictId());
+        if (parents.isEmpty()) {
+            rootNode = node;
+        }
+        parents.push(node);
+    }
+
+    public void endProcessChildren(Artifact artifact) {
+        // getLog().debug("endProcessChildren: " + artifact);
+        Node check = (Node) parents.pop();
+        assert artifact.equals(check.getArtifact());
+    }
+
+    public void omitForNearer(Artifact omitted, Artifact kept) {
+        // getLog().debug("omitForNearer: omitted=" + omitted + ", kept=" +
+        // kept);
+        assert omitted.getDependencyConflictId().equals(
+                kept.getDependencyConflictId());
+        Node node = (Node) artifacts.get(omitted.getDependencyConflictId());
+        assert node != null;
+        node.setArtifact(kept);
+    }
+
+    public void omitForCycle(Artifact artifact) {
+        // getLog().debug("omitForCycle: " + artifact);
+        // intentionally blank
+    }
+
+    public void includeArtifact(Artifact artifact) {
+        // getLog().debug("includeArtifact: " + artifact);
+        Node node = (Node) artifacts.get(artifact.getDependencyConflictId());
+        if (node == null) {
+            node = new Node();
+            artifacts.put(artifact.getDependencyConflictId(), node);
+        }
+        node.setArtifact(artifact);
+        if (!parents.isEmpty()) {
+            Node parent = (Node) parents.peek();
+            parent.getChildren().add(node);
+            node.getParents().add(parent);
+        }
+        if (rootNode != null) {
+            // print(rootNode, "");
+        }
+    }
+
+    protected void print(Node node, String string) {
+        // getLog().debug(string + rootNode.getArtifact());
+        for (Iterator iter = node.getChildren().iterator(); iter.hasNext();) {
+            Node n = (Node) iter.next();
+            print(n, string + "  ");
+        }
+    }
+
+    public void updateScope(Artifact artifact, String scope) {
+        // getLog().debug("updateScope: " + artifact);
+        Node node = (Node) artifacts.get(artifact.getDependencyConflictId());
+
+        node.getArtifact().setScope(scope);
+    }
+
+    public void manageArtifact(Artifact artifact, Artifact replacement) {
+        // getLog().debug("manageArtifact: artifact=" + artifact + ",
+        // replacement=" + replacement);
+        Node node = (Node) artifacts.get(artifact.getDependencyConflictId());
+        if (node != null) {
+            if (replacement.getVersion() != null) {
+                node.getArtifact().setVersion(replacement.getVersion());
+            }
+            if (replacement.getScope() != null) {
+                node.getArtifact().setScope(replacement.getScope());
+            }
+        }
+    }
+
+    public void updateScopeCurrentPom(Artifact artifact, String key) {
+
+        getLog().debug("updateScopeCurrentPom: " + artifact);
+        // intentionally blank
+    }
+
+    public void selectVersionFromRange(Artifact artifact) {
+
+        getLog().debug("selectVersionFromRange: " + artifact);
+        // intentionally blank
+    }
+
+    public void restrictRange(Artifact artifact, Artifact artifact1,
+            VersionRange versionRange) {
+
+        getLog().debug("restrictRange: " + artifact);
+        // intentionally blank
+    }
+
+    public Node getNode(Artifact artifact) {
+        return (Node) artifacts.get(artifact.getDependencyConflictId());
+    }
+
+    public Collection getArtifacts() {
+        return artifacts.values();
+    }
+
+    public Node getRootNode() {
+        return rootNode;
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/SpringURLHandler.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/SpringURLHandler.java
new file mode 100644
index 0000000..1597680
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/SpringURLHandler.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.karaf.tooling.features;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+
+import org.apache.karaf.deployer.spring.SpringTransformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * As org.apache.karaf.deployer.spring.SpringURLHandler need run with OSGi container
+ * so create this class only used for features-maven-plugin
+ */
+public class SpringURLHandler extends URLStreamHandler {
+
+	private final Logger logger = LoggerFactory.getLogger(SpringURLHandler.class);
+
+	private static String SYNTAX = "spring: spring-xml-uri";
+
+	private URL springXmlURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+	public URLConnection openConnection(URL url) throws IOException {
+		if (url.getPath() == null || url.getPath().trim().length() == 0) {
+			throw new MalformedURLException ("Path can not be null or empty. Syntax: " + SYNTAX );
+		}
+		springXmlURL = new URL(url.getPath());
+
+		logger.debug("Spring xml URL is: [" + springXmlURL + "]");
+		return new Connection(url);
+	}
+	
+	public URL getSpringXmlURL() {
+		return springXmlURL;
+	}
+
+    public class Connection extends URLConnection {
+
+        public Connection(URL url) {
+            super(url);
+        }
+
+        @Override
+        public void connect() throws IOException {
+        }
+
+        @Override
+        public InputStream getInputStream() throws IOException {
+            try {
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                SpringTransformer.transform(springXmlURL, os);
+                os.close();
+                return new ByteArrayInputStream(os.toByteArray());
+            } catch (Exception e) {
+                logger.error("Error opening spring xml url", e);
+                throw (IOException) new IOException("Error opening spring xml url").initCause(e);
+            }
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ValidateFeaturesMojo.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ValidateFeaturesMojo.java
new file mode 100644
index 0000000..38191e6
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ValidateFeaturesMojo.java
@@ -0,0 +1,655 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import static org.apache.karaf.tooling.features.ManifestUtils.getExports;
+import static org.apache.karaf.tooling.features.ManifestUtils.getMandatoryImports;
+import static org.apache.karaf.tooling.features.ManifestUtils.matches;
+
+import java.io.*;
+import java.net.URI;
+import java.net.URL;
+import java.util.*;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.Repository;
+import org.apache.karaf.features.internal.FeatureValidationUtil;
+import org.apache.karaf.features.internal.RepositoryImpl;
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+
+/**
+ * Validates a features XML file
+ *
+ * @version $Revision$
+ * @goal validate
+ * @execute phase="process-resources"
+ * @requiresDependencyResolution runtime
+ * @inheritByDefault true
+ * @description Validates the features XML file
+ */
+@SuppressWarnings("unchecked")
+public class ValidateFeaturesMojo extends MojoSupport {
+
+    private static final String MVN_URI_PREFIX = "mvn:";
+    private static final String MVN_REPO_SEPARATOR = "!";
+
+    private static final String KARAF_CORE_STANDARD_FEATURE_URL = "mvn:org.apache.karaf.assemblies.features/standard/%s/xml/features";
+    private static final String KARAF_CORE_ENTERPRISE_FEATURE_URL = "mvn:org.apache.karaf.assemblies.features/enterprise/%s/xml/features";
+
+    /**
+     * The dependency tree builder to use.
+     *
+     * @component
+     * @required
+     * @readonly
+     */
+    private DependencyTreeBuilder dependencyTreeBuilder;
+
+    /**
+     * The ArtifactCollector provided by Maven at runtime
+     *
+     * @component
+     * @required
+     * @readonly
+     */
+    private ArtifactCollector collector;
+
+    /**
+     * The file to generate
+     *
+     * @parameter default-value="${project.build.directory}/classes/features.xml"
+     */
+    private File file;
+
+    /**
+     * Karaf config.properties
+     *
+     * @parameter default-value="config.properties"
+     */
+    private String karafConfig;
+
+    /**
+     * which JRE version to parse from config.properties to get the JRE exported packages
+     *
+     * @parameter default-value="jre-1.5"
+     */
+    private String jreVersion;
+
+    /**
+     * which Karaf version used for Karaf core features resolution
+     *
+     * @parameter
+     */
+    private String karafVersion;
+
+    /**
+     * The repositories which are included from the plugin config
+     *
+     * @parameter
+     */
+    private List<String> repositories;
+
+    /**
+     * skip non maven protocols or not skip
+     *
+     * @parameter default-value="false"
+     */
+    private boolean skipNonMavenProtocols = false;
+
+    /*
+    * A map to cache the mvn: uris and the artifacts that correspond with them if it's mvn protocol
+    * or just uris itself if it's non mvn protocol
+    */
+    private Map<String, Object> bundles = new HashMap<String, Object>();
+
+    /*
+     * A map to cache manifests that have been extracted from the bundles
+     */
+    private Map<Object, Manifest> manifests = new HashMap<Object, Manifest>();
+
+    /*
+     * The list of features, includes both the features to be validated and the features from included <repository>s
+     */
+    private Features features = new Features();
+
+    /*
+     * The packages exported by the features themselves -- useful when features depend on other features
+     */
+    private Map<String, Set<Clause>> featureExports = new HashMap<String, Set<Clause>>();
+
+    /*
+     * The set of packages exported by the system bundle and by Karaf itself
+     */
+    private Set<String> systemExports = new HashSet<String>();
+
+    /**
+     * The Mojo's main method
+     */
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        try {
+            prepare();
+            URI uri = file.toURI();
+            Repository repository = new RepositoryImpl(uri);
+            schemaCheck(repository, uri);
+            analyze(repository);
+            validate(repository);
+        } catch (Exception e) {
+            throw new MojoExecutionException(String.format("Unable to validate %s: %s", file.getAbsolutePath(), e.getMessage()), e);
+        }
+
+    }
+
+    /**
+     * Checks feature repository with XML Schema.
+     *
+     * @param repository Repository object.
+     * @param uri        Display URI.
+     */
+    private void schemaCheck(Repository repository, URI uri) {
+        try {
+            info(" - validation of %s", uri);
+            FeatureValidationUtil.validate(repository.getURI());
+        } catch (Exception e) {
+            error("Failed to validate repository %s. Schema validation fails. Fix errors to continue validation",
+                    e, uri);
+        }
+    }
+
+    /*
+     * Prepare for validation by determing system and Karaf exports
+     */
+    private void prepare() throws Exception {
+        info("== Preparing for validation ==");
+        URL.setURLStreamHandlerFactory(new CustomBundleURLStreamHandlerFactory());
+        info(" - getting list of system bundle exports");
+        readSystemPackages();
+        info(" - getting list of provided bundle exports");
+        readProvidedBundles();
+        info(" - populating repositories with Karaf core features descriptors");
+        appendKarafCoreFeaturesDescriptors();
+    }
+
+    /**
+     * Add Karaf core features descriptors in the default repositories set.
+     */
+    private void appendKarafCoreFeaturesDescriptors() {
+        if (repositories == null) {
+            repositories = new ArrayList<String>();
+        }
+        if (karafVersion == null) {
+            Package p = Package.getPackage("org.apache.karaf.tooling.features");
+            karafVersion = p.getImplementationVersion();
+        }
+        String karafCoreStandardFeaturesUrl = String.format(KARAF_CORE_STANDARD_FEATURE_URL, karafVersion);
+        String karafCoreEnterpriseFeaturesUrl = String.format(KARAF_CORE_ENTERPRISE_FEATURE_URL, karafVersion);
+
+        try {
+            resolve(karafCoreStandardFeaturesUrl);
+            repositories.add(karafCoreStandardFeaturesUrl);
+        } catch (Exception e) {
+            warn("Can't add " + karafCoreStandardFeaturesUrl + " in the default repositories set");
+        }
+
+        try {
+            resolve(karafCoreEnterpriseFeaturesUrl);
+            repositories.add(karafCoreEnterpriseFeaturesUrl);
+        } catch (Exception e) {
+            warn("Can't add " + karafCoreStandardFeaturesUrl + " in the default repositories set");
+        }
+    }
+
+    /*
+     * Analyse the descriptor and any <repository>s that might be part of it
+     */
+    private void analyze(Repository repository) throws Exception {
+        info("== Analyzing feature descriptor ==");
+        info(" - read %s", file.getAbsolutePath());
+
+        features.add(repository.getFeatures());
+
+        // add the repositories from the plugin configuration
+        if (repositories != null) {
+            for (String uri : repositories) {
+                getLog().info(String.format(" - adding repository from %s", uri));
+                Repository dependency = new RepositoryImpl(URI.create(translateFromMaven(uri)));
+                schemaCheck(dependency, URI.create(uri));
+                features.add(dependency.getFeatures());
+                validateBundlesAvailable(dependency);
+                analyzeExports(dependency);
+            }
+        }
+
+        for (URI uri : repository.getRepositories()) {
+            Artifact artifact = (Artifact) resolve(uri.toString());
+            Repository dependency = new RepositoryImpl(new File(localRepo.getBasedir(), localRepo.pathOf(artifact)).toURI());
+
+            schemaCheck(dependency, uri);
+            getLog().info(String.format(" - adding %d known features from %s", dependency.getFeatures().length, uri));
+            features.add(dependency.getFeatures());
+            // we need to do this to get all the information ready for further processing
+            validateBundlesAvailable(dependency);
+            analyzeExports(dependency);
+        }
+
+    }
+
+    /*
+     * Perform the actual validation
+     */
+    private void validate(Repository repository) throws Exception {
+        info("== Validating feature descriptor ==");
+        info(" - validating %d features", repository.getFeatures().length);
+        info(" - step 1: Checking if all artifacts exist");
+        validateBundlesAvailable(repository);
+        info("    OK: all %d OSGi bundles have been found", bundles.size());
+        info(" - step 2: Checking if all imports for bundles can be resolved");
+        validateImportsExports(repository);
+        info("== Done! ==========================");
+    }
+
+
+    /*
+     * Determine list of exports by bundles that have been marked provided in the pom
+     * //TODO: we probably want to figure this out somewhere from the Karaf build itself instead of putting the burden on the user
+     */
+    private void readProvidedBundles() throws Exception {
+        DependencyNode tree = dependencyTreeBuilder.buildDependencyTree(project, localRepo, factory, artifactMetadataSource, new ArtifactFilter() {
+
+                    public boolean include(Artifact artifact) {
+                        return true;
+                    }
+
+                }, collector);
+        tree.accept(new DependencyNodeVisitor() {
+            public boolean endVisit(DependencyNode node) {
+                // we want the next sibling too
+                return true;
+            }
+
+            public boolean visit(DependencyNode node) {
+                if (node.getState() != DependencyNode.OMITTED_FOR_CONFLICT) {
+                    Artifact artifact = node.getArtifact();
+                    info("    scanning %s for exports", artifact);
+                    if (Artifact.SCOPE_PROVIDED.equals(artifact.getScope()) && !artifact.getType().equals("pom")) {
+                        try {
+                            for (Clause clause : ManifestUtils.getExports(getManifest("", artifact))) {
+                                getLog().debug(" adding " + clause.getName() + " to list of available packages");
+                                systemExports.add(clause.getName());
+                            }
+                        } catch (ArtifactResolutionException e) {
+                            error("Unable to find bundle exports for %s: %s", e, artifact, e.getMessage());
+                        } catch (ArtifactNotFoundException e) {
+                            error("Unable to find bundle exports for %s: %s", e, artifact, e.getMessage());
+                        } catch (IOException e) {
+                            error("Unable to find bundle exports for %s: %s", e, artifact, e.getMessage());
+                        }
+                    }
+                }
+                // we want the children too
+                return true;
+            }
+        });
+    }
+
+    /*
+     * Read system packages from a properties file
+     * //TODO: we should probably grab this file from the Karaf distro itself instead of duplicating it in the plugin
+     */
+    private void readSystemPackages() throws IOException {
+        Properties properties = new Properties();
+        if (karafConfig.equals("config.properties")) {
+            properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));
+        } else {
+            properties.load(new FileInputStream(new File(karafConfig)));
+        }
+
+        String packages = (String) properties.get(jreVersion);
+        for (String pkg : packages.split(";")) {
+            systemExports.add(pkg.trim());
+        }
+        for (String pkg : packages.split(",")) {
+            systemExports.add(pkg.trim());
+        }
+    }
+
+    /*
+     * Analyze exports in all features in the repository without validating the features
+     * (e.g. used for <repository> elements found in a descriptor)
+     */
+    private void analyzeExports(Repository repository) throws Exception {
+        for (Feature feature : repository.getFeatures()) {
+            Set<Clause> exports = new HashSet<Clause>();
+            for (String bundle : getBundleLocations(feature)) {
+                exports.addAll(getExports(getManifest(bundle, bundles.get(bundle))));
+            }
+            info("    scanning feature %s for exports", feature.getName());
+            featureExports.put(feature.getName(), exports);
+        }
+    }
+
+    /*
+     * Check if all the bundles can be downloaded and are actually OSGi bundles and not plain JARs
+     */
+    private void validateBundlesAvailable(Repository repository) throws Exception {
+        for (Feature feature : repository.getFeatures()) {
+            for (String bundle : getBundleLocations(feature)) {
+                if (!isMavenProtocol(bundle) && skipNonMavenProtocols) {
+                    continue;
+                }
+                // this will throw an exception if the artifact can not be resolved
+                final Object artifact = resolve(bundle);
+                bundles.put(bundle, artifact);
+                if (isBundle(bundle, artifact)) {
+                    manifests.put(artifact, getManifest(bundle, artifact));
+                } else {
+                    throw new Exception(String.format("%s is not an OSGi bundle", bundle));
+                }
+            }
+        }
+    }
+
+    /*
+     * Get a list of bundle locations in a feature
+     */
+    private List<String> getBundleLocations(Feature feature) {
+        List<String> result = new LinkedList<String>();
+        if (feature != null && feature.getBundles() != null) {
+            for (BundleInfo bundle : feature.getBundles()) {
+                result.add(bundle.getLocation());
+            }
+        }
+        return result;
+    }
+
+    /*
+     * Validate if all features in a repository have bundles which can be resolved
+     */
+    private void validateImportsExports(Repository repository) throws ArtifactResolutionException, ArtifactNotFoundException, Exception {
+        for (Feature feature : repository.getFeatures()) {
+            // make sure the feature hasn't been validated before as a dependency
+            if (!featureExports.containsKey(feature.getName())) {
+                validateImportsExports(feature);
+            }
+        }
+    }
+
+    /*
+     * Validate if all imports for a feature are being matched with exports
+     */
+    private void validateImportsExports(Feature feature) throws Exception {
+        Map<Clause, String> imports = new HashMap<Clause, String>();
+        Set<Clause> exports = new HashSet<Clause>();
+        for (Feature dependency : feature.getDependencies()) {
+            if (featureExports.containsKey(dependency.getName())) {
+                exports.addAll(featureExports.get(dependency.getName()));
+            } else {
+                validateImportsExports(features.get(dependency.getName(), dependency.getVersion()));
+            }
+        }
+        for (String bundle : getBundleLocations(feature)) {
+            Manifest meta = manifests.get(bundles.get(bundle));
+            exports.addAll(getExports(meta));
+            for (Clause clause : getMandatoryImports(meta)) {
+                imports.put(clause, bundle);
+            }
+        }
+
+        // setting up the set of required imports
+        Set<Clause> requirements = new HashSet<Clause>();
+        requirements.addAll(imports.keySet());
+
+        // now, let's remove requirements whenever we find a matching export for them
+        for (Clause element : imports.keySet()) {
+            if (systemExports.contains(element.getName())) {
+                debug("%s is resolved by a system bundle export or provided bundle", element);
+                requirements.remove(element);
+                continue;
+            }
+            for (Clause export : exports) {
+                if (matches(element, export)) {
+                    debug("%s is resolved by export %s", element, export);
+                    requirements.remove(element);
+                    continue;
+                }
+                debug("%s is not resolved by export %s", element, export);
+            }
+        }
+
+        // if there are any more requirements left here, there's a problem with the feature 
+        if (!requirements.isEmpty()) {
+            warn("Failed to validate feature %s", feature.getName());
+            for (Clause entry : requirements) {
+                warn("No export found to match %s (imported by %s)",
+                        entry, imports.get(entry));
+            }
+            throw new Exception(String.format("%d unresolved imports in feature %s",
+                    requirements.size(), feature.getName()));
+        }
+        info("    OK: imports resolved for %s", feature.getName());
+        featureExports.put(feature.getName(), exports);
+    }
+
+    /*
+    * Check if the artifact is an OSGi bundle
+    */
+    private boolean isBundle(String bundle, Object artifact) {
+        if (artifact instanceof Artifact && "bundle".equals(((Artifact) artifact).getArtifactHandler().getPackaging())) {
+            return true;
+        } else {
+            try {
+                return ManifestUtils.isBundle(getManifest(bundle, artifact));
+            } catch (ZipException e) {
+                getLog().debug("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            } catch (IOException e) {
+                getLog().debug("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            } catch (Exception e) {
+                getLog().debug("Unable to determine if " + artifact + " is a bundle; defaulting to false", e);
+            }
+        }
+        return false;
+    }
+
+    /*
+     * Extract the META-INF/MANIFEST.MF file from an artifact
+     */
+    private Manifest getManifest(String bundle, Object artifact) throws ArtifactResolutionException, ArtifactNotFoundException,
+            ZipException, IOException {
+        ZipFile file = null;
+        if (!(artifact instanceof Artifact)) {
+            //not resolved as mvn artifact, so it's non-mvn protocol, just use the CustomBundleURLStreamHandlerFactory
+            // to open stream
+            InputStream is = null;
+            try {
+                is = new BufferedInputStream(new URL(bundle).openStream());
+            } catch (Exception e) {
+                getLog().warn("Error while opening artifact", e);
+            }
+
+            try {
+                is.mark(256 * 1024);
+                JarInputStream jar = new JarInputStream(is);
+                Manifest m = jar.getManifest();
+                if (m == null) {
+                    throw new IOException("Manifest not present in the first entry of the zip");
+                }
+
+                return m;
+            } finally {
+                if (is != null) { // just in case when we did not open bundle
+                    is.close();
+                }
+            }
+        } else {
+            Artifact mvnArtifact = (Artifact) artifact;
+            File localFile = new File(localRepo.pathOf(mvnArtifact));
+            if (localFile.exists()) {
+                // avoid going over to the repository if the file is already on
+                // the disk
+                file = new ZipFile(localFile);
+            } else {
+                resolver.resolve(mvnArtifact, remoteRepos, localRepo);
+                file = new ZipFile(mvnArtifact.getFile());
+            }
+            // let's replace syserr for now to hide warnings being issues by the Manifest reading process
+            PrintStream original = System.err;
+            try {
+                System.setErr(new PrintStream(new ByteArrayOutputStream()));
+                Manifest manifest = new Manifest(file.getInputStream(file.getEntry("META-INF/MANIFEST.MF")));
+                return manifest;
+            } finally {
+                System.setErr(original);
+            }
+        }
+    }
+
+    /*
+     * Resolve an artifact, downloading it from remote repositories when necessary
+     */
+    private Object resolve(String bundle) throws Exception, ArtifactNotFoundException {
+        if (!isMavenProtocol(bundle)) {
+            return bundle;
+        }
+        Artifact artifact = getArtifact(bundle);
+        if (bundle.indexOf(MVN_REPO_SEPARATOR) >= 0) {
+            if (bundle.startsWith(MVN_URI_PREFIX)) {
+                bundle = bundle.substring(MVN_URI_PREFIX.length());
+            }
+            String repo = bundle.substring(0, bundle.indexOf(MVN_REPO_SEPARATOR));
+            ArtifactRepository repository = new DefaultArtifactRepository(artifact.getArtifactId() + "-repo", repo,
+                    new DefaultRepositoryLayout());
+            List<ArtifactRepository> repos = new LinkedList<ArtifactRepository>();
+            repos.add(repository);
+            resolver.resolve(artifact, repos, localRepo);
+        } else {
+            resolver.resolve(artifact, remoteRepos, localRepo);
+        }
+        if (artifact == null) {
+            throw new Exception("Unable to resolve artifact for uri " + bundle);
+        } else {
+            return artifact;
+        }
+    }
+
+    /*
+     * Create an artifact for a given mvn: uri
+     */
+    private Artifact getArtifact(String uri) {
+        // remove the mvn: prefix when necessary
+        if (uri.startsWith(MVN_URI_PREFIX)) {
+            uri = uri.substring(MVN_URI_PREFIX.length());
+        }
+        // remove the repository url when specified
+        if (uri.contains(MVN_REPO_SEPARATOR)) {
+            uri = uri.split(MVN_REPO_SEPARATOR)[1];
+        }
+        String[] elements = uri.split("/");
+
+        switch (elements.length) {
+            case 5:
+                return factory.createArtifactWithClassifier(elements[0], elements[1], elements[2], elements[3], elements[4]);
+            case 3:
+                return factory.createArtifact(elements[0], elements[1], elements[2], Artifact.SCOPE_PROVIDED, "jar");
+            default:
+                return null;
+        }
+
+    }
+
+    /*
+    * see if bundle url is start with mvn protocol
+    */
+    private boolean isMavenProtocol(String bundle) {
+        return bundle.startsWith(MVN_URI_PREFIX);
+    }
+
+    /*
+     * Helper method for debug logging
+     */
+    private void debug(String message, Object... parms) {
+        if (getLog().isDebugEnabled()) {
+            getLog().debug(String.format(message, parms));
+        }
+    }
+
+    /*
+     * Helper method for info logging
+     */
+    private void info(String message, Object... parms) {
+        getLog().info(String.format(message, parms));
+    }
+
+    /*
+     * Helper method for warn logging
+     */
+    private void warn(String message, Object... parms) {
+        getLog().warn(String.format(message, parms));
+    }
+
+    /*
+     * Helper method for error logging
+     */
+    private void error(String message, Exception error, Object... parms) {
+        getLog().error(String.format(message, parms), error);
+    }
+
+    /*
+     * Convenience collection for holding features
+     */
+    private class Features {
+
+        private List<Feature> features = new LinkedList<Feature>();
+
+        public void add(Feature feature) {
+            features.add(feature);
+        }
+
+        public Feature get(String name, String version) throws Exception {
+            for (Feature feature : features) {
+                if (name.equals(feature.getName()) && version.equals(feature.getVersion())) {
+                    return feature;
+                }
+            }
+            throw new Exception(String.format("Unable to find definition for feature %s (version %s)",
+                    name, version));
+        }
+
+        public void add(Feature[] array) {
+            for (Feature feature : array) {
+                add(feature);
+            }
+        }
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/WarURLHandler.java b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/WarURLHandler.java
new file mode 100644
index 0000000..867634c
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/WarURLHandler.java
@@ -0,0 +1,66 @@
+/**
+ *
+ * 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.karaf.tooling.features;
+
+import org.apache.karaf.deployer.blueprint.BlueprintTransformer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+
+/**
+ * Simple workaround for "WAR" prefix.
+ */
+public class WarURLHandler extends URLStreamHandler {
+
+    private final Logger logger = LoggerFactory.getLogger(WarURLHandler.class);
+
+    private static String SYNTAX = "war: war-uri";
+
+    private URL warURL;
+
+    /**
+     * Open the connection for the given URL.
+     *
+     * @param url the url from which to open a connection.
+     * @return a connection on the specified URL.
+     * @throws java.io.IOException if an error occurs or if the URL is malformed.
+     */
+    @Override
+    public URLConnection openConnection(URL url) throws IOException {
+        if (url.getPath() == null || url.getPath().trim().length() == 0) {
+            throw new MalformedURLException("Path can not be null or empty. Syntax: " + SYNTAX);
+        }
+
+        // We don't resolve any specific data here, just forward it to another URL Stream Handler
+        warURL = new URL(url.getPath());
+        return warURL.openConnection();
+    }
+
+    public URL getWarURL() {
+        return warURL;
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/resources/config.properties b/karaf-2.2.x/tooling/features-maven-plugin/src/main/resources/config.properties
new file mode 100644
index 0000000..870e83c
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/resources/config.properties
@@ -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.
+
+jre-1.5= \
+ javax.accessibility; \
+ javax.activity; \
+ javax.crypto; \
+ javax.crypto.interfaces; \
+ javax.crypto.spec; \
+ javax.imageio; \
+ javax.imageio.event; \
+ javax.imageio.metadata; \
+ javax.imageio.plugins.bmp; \
+ javax.imageio.plugins.jpeg; \
+ javax.imageio.spi; \
+ javax.imageio.stream; \
+ javax.management; \
+ javax.management.loading; \
+ javax.management.modelmbean; \
+ javax.management.monitor; \
+ javax.management.openmbean; \
+ javax.management.relation; \
+ javax.management.remote; \
+ javax.management.remote.rmi; \
+ javax.management.timer; \
+ javax.naming; \
+ javax.naming.directory; \
+ javax.naming.event; \
+ javax.naming.ldap; \
+ javax.naming.spi; \
+ javax.net; \
+ javax.net.ssl; \
+ javax.print; \
+ javax.print.attribute; \
+ javax.print.attribute.standard; \
+ javax.print.event; \
+ javax.rmi; \
+ javax.rmi.CORBA; \
+ javax.rmi.ssl; \
+ javax.security.auth; \
+ javax.security.auth.callback; \
+ javax.security.auth.kerberos; \
+ javax.security.auth.login; \
+ javax.security.auth.spi; \
+ javax.security.auth.x500; \
+ javax.security.cert; \
+ javax.security.sasl; \
+ javax.sound.midi; \
+ javax.sound.midi.spi; \
+ javax.sound.sampled; \
+ javax.sound.sampled.spi; \
+ javax.sql; \
+ javax.sql.rowset; \
+ javax.sql.rowset.serial; \
+ javax.sql.rowset.spi; \
+ javax.swing; \
+ javax.swing.border; \
+ javax.swing.colorchooser; \
+ javax.swing.event; \
+ javax.swing.filechooser; \
+ javax.swing.plaf; \
+ javax.swing.plaf.basic; \
+ javax.swing.plaf.metal; \
+ javax.swing.plaf.multi; \
+ javax.swing.plaf.synth; \
+ javax.swing.table; \
+ javax.swing.text; \
+ javax.swing.text.html; \
+ javax.swing.text.html.parser; \
+ javax.swing.text.rtf; \
+ javax.swing.tree; \
+ javax.swing.undo; \
+ javax.xml; \
+ javax.xml.datatype; \
+ javax.xml.namespace; \
+ javax.xml.parsers; \
+ javax.xml.transform; \
+ javax.xml.transform.dom; \
+ javax.xml.transform.sax; \
+ javax.xml.transform.stream; \
+ javax.xml.validation; \
+ javax.xml.xpath; \
+ org.ietf.jgss; \
+ org.omg.CORBA; \
+ org.omg.CORBA_2_3; \
+ org.omg.CORBA_2_3.portable; \
+ org.omg.CORBA.DynAnyPackage; \
+ org.omg.CORBA.ORBPackage; \
+ org.omg.CORBA.portable; \
+ org.omg.CORBA.TypeCodePackage; \
+ org.omg.CosNaming; \
+ org.omg.CosNaming.NamingContextExtPackage; \
+ org.omg.CosNaming.NamingContextPackage; \
+ org.omg.Dynamic; \
+ org.omg.DynamicAny; \
+ org.omg.DynamicAny.DynAnyFactoryPackage; \
+ org.omg.DynamicAny.DynAnyPackage; \
+ org.omg.IOP; \
+ org.omg.IOP.CodecFactoryPackage; \
+ org.omg.IOP.CodecPackage; \
+ org.omg.Messaging; \
+ org.omg.PortableInterceptor; \
+ org.omg.PortableInterceptor.ORBInitInfoPackage; \
+ org.omg.PortableServer; \
+ org.omg.PortableServer.CurrentPackage; \
+ org.omg.PortableServer.POAManagerPackage; \
+ org.omg.PortableServer.POAPackage; \
+ org.omg.PortableServer.portable; \
+ org.omg.PortableServer.ServantLocatorPackage; \
+ org.omg.SendingContext; \
+ org.omg.stub.java.rmi; \
+ org.omg.stub.javax.management.remote.rmi; \
+ org.w3c.dom; \
+ org.w3c.dom.bootstrap; \
+ org.w3c.dom.css; \
+ org.w3c.dom.events; \
+ org.w3c.dom.html; \
+ org.w3c.dom.ls; \
+ org.w3c.dom.ranges; \
+ org.w3c.dom.stylesheets; \
+ org.w3c.dom.traversal; \
+ org.w3c.dom.views; \
+ org.xml.sax; \
+ org.xml.sax.ext; \
+ org.xml.sax.helpers; \
+ sun.misc; \
+ sun.reflect
+ 
+osgi= \
+ org.osgi.framework;
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0-ordered.xsd b/karaf-2.2.x/tooling/features-maven-plugin/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0-ordered.xsd
new file mode 100644
index 0000000..97e8c05
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0-ordered.xsd
@@ -0,0 +1,208 @@
+<?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.
+
+-->
+<xs:schema elementFormDefault="qualified"
+    targetNamespace="http://karaf.apache.org/xmlns/features/v1.0.0"
+    xmlns:tns="http://karaf.apache.org/xmlns/features/v1.0.0"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:annotation>
+        <xs:documentation><![CDATA[
+Karaf features mechanism. For documentation please visit 
+<a href="http://karaf.apache.org/">Karaf website</a>.
+        ]]></xs:documentation>
+    </xs:annotation>
+
+    <xs:complexType name="features">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Root element of Feature definition. It contains optional attribute which allow
+name of repository. This name will be used in shell to display source repository
+of given feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="repository" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Additional repositories where dependencies are stored.
+                    ]]></xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="feature" type="tns:feature" minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Feature definition.
+                    ]]></xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+        <xs:attribute name="name" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="feature">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Definition of the Feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <!-- Tags with info -->
+            <xs:element name="details" type="xs:string" minOccurs="0" maxOccurs="unbounded">
+                <xs:annotation>
+                    <xs:documentation><![CDATA[
+Long info displayed in features:info command result.
+                    ]]>
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="config" type="tns:config"  minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="configfile" type="tns:configFile"  minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="feature" type="tns:dependency"  minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="bundle" type="tns:bundle"  minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="name" type="tns:featureName" use="required" />
+        <xs:attribute name="version" type="xs:string" default="0.0.0" />
+        <xs:attribute name="description" type="xs:string" />
+        <xs:attribute name="resolver" type="tns:resolver">
+            <xs:annotation>
+                <xs:documentation><![CDATA[
+Karaf allow using dynamic resolvers.
+                ]]>
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:complexType>
+
+    <xs:complexType name="bundle">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Deployable element to install.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:anyURI">
+                <xs:attribute name="start-level" type="xs:int">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Bundle start level set to OSGi framework.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="start" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+This switch allow you to leave bundle in resolved state.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="dependency" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Mark bundle as dependency for resolver.
+                        ]]>
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="dependency">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Dependency of feature.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="tns:featureName">
+                <xs:attribute name="version" type="xs:string" default="0.0.0" />
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="config">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Configuration entries which should be created during feature installation. This
+configuration may be used with OSGi Configuration Admin.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="name" type="xs:string" use="required" />
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:complexType name="configFile">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Additional configuration files which should be created during feature installation.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:anyURI">
+                <xs:attribute name="finalname" type="xs:string" use="required">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+Name of file name where given deployable element should be stored.
+                        ]]></xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+                <xs:attribute name="override" type="xs:boolean">
+                    <xs:annotation>
+                        <xs:documentation><![CDATA[
+flag to specify if the finalname file should be overriden
+                        ]]></xs:documentation>
+                    </xs:annotation>
+                </xs:attribute>
+
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+
+    <xs:simpleType name="featureName">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Feature name should be non empty string.
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="resolver">
+        <xs:annotation>
+            <xs:documentation><![CDATA[
+Resolver to use. Karaf will look for OSGi servie which have following properties:
+objectClass: org.apache.karaf.features.Resolver
+name: the value
+            ]]></xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:minLength value="1" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="features" type="tns:features" />
+
+</xs:schema>
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/BundleToArtifactTest.java b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/BundleToArtifactTest.java
new file mode 100644
index 0000000..5b13107
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/BundleToArtifactTest.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.karaf.tooling.features;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.DefaultArtifactFactory;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
+import org.apache.maven.artifact.handler.manager.DefaultArtifactHandlerManager;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.junit.Test;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class BundleToArtifactTest extends MojoSupport {
+
+    public BundleToArtifactTest() throws NoSuchFieldException, IllegalAccessException {
+        factory = new DefaultArtifactFactory();
+        ArtifactHandlerManager artifactHandlerManager = new DefaultArtifactHandlerManager();
+        Field f = factory.getClass().getDeclaredField("artifactHandlerManager");
+        f.setAccessible(true);
+        f.set(factory, artifactHandlerManager);
+        f.setAccessible(false);
+
+        f = artifactHandlerManager.getClass().getDeclaredField("artifactHandlers");
+        f.setAccessible(true);
+        f.set(artifactHandlerManager, new HashMap());
+        f.setAccessible(false);
+    }
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+    }
+    
+    @Test
+    public void testSimpleURL() throws Exception {
+        Artifact artifact = resourceToArtifact("mvn:org.foo/bar/1.0/kar", false);
+        assert artifact.getGroupId().equals("org.foo");
+        assert artifact.getArtifactId().equals("bar");
+        assert artifact.getBaseVersion().equals("1.0");
+        assert artifact.getType().equals("kar");
+        assert artifact.getRepository() == null;
+        assert artifact.getClassifier() == null;
+    }
+
+    @Test
+    public void testURLWithClassifier() throws Exception {
+        Artifact artifact = resourceToArtifact("mvn:org.foo/bar/1.0/kar/type", false);
+        assert artifact.getGroupId().equals("org.foo");
+        assert artifact.getArtifactId().equals("bar");
+        assert artifact.getBaseVersion().equals("1.0");
+        assert artifact.getType().equals("kar");
+        assert artifact.getRepository() == null;
+        assert artifact.getClassifier().equals("type");
+    }
+
+    @Test
+    public void testRemoteRepoURL() throws Exception {
+        Artifact artifact = resourceToArtifact("mvn:http://baz.com!org.foo/bar/1.0/kar", false);
+        assert artifact.getGroupId().equals("org.foo");
+        assert artifact.getArtifactId().equals("bar");
+        assert artifact.getBaseVersion().equals("1.0");
+        assert artifact.getType().equals("kar");
+        assert artifact.getRepository().getUrl().equals("http://baz.com");
+        assert artifact.getClassifier() == null;
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojoTest.java b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojoTest.java
new file mode 100644
index 0000000..bed0b2d
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojoTest.java
@@ -0,0 +1,101 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.tooling.features;
+
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.easymock.EasyMock;
+
+/**
+ * Test cases for {@link GenerateFeaturesFileMojo} 
+ */
+public class GenerateFeaturesFileMojoTest extends TestCase {
+    
+    private GenerateFeaturesFileMojo mojo;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mojo = new GenerateFeaturesFileMojo();
+    }
+    
+    public void testGetBestVersionForArtifactWithOneVersion() throws Exception {       
+        final Artifact artifact = EasyMock.createMock(Artifact.class);
+        expect(artifact.getVersion()).andReturn("2.1.6");
+        replay(artifact);
+
+        assertEquals("2.1.6_1-SNAPSHOT", mojo.getBestVersionForArtifact(artifact, createVersionList("2.1.6_1-SNAPSHOT")));
+    }
+    
+    public void testGetBestVersionForArtifactWithTwoVersions() throws Exception {       
+        final Artifact artifact = EasyMock.createMock(Artifact.class);
+        expect(artifact.getVersion()).andReturn("2.1.6");
+        replay(artifact);
+
+        assertEquals("2.1.6_2-SNAPSHOT", mojo.getBestVersionForArtifact(artifact, createVersionList("2.1.6_1-SNAPSHOT", "2.1.6_2-SNAPSHOT")));
+    }
+    
+    public void testGetBestVersionForArtifactWithSameMajorMinor() throws Exception {       
+        final Artifact artifact = EasyMock.createMock(Artifact.class);
+        expect(artifact.getVersion()).andReturn("3.8.2").anyTimes();
+        replay(artifact);        
+
+        assertEquals("3.8.1_1-SNAPSHOT", mojo.getBestVersionForArtifact(artifact, createVersionList("3.8.1_1-SNAPSHOT")));
+    }
+
+    
+    public void testGetBestVersionForArtifactWithOneNonMatchingVersion() throws Exception {
+        final Artifact artifact = EasyMock.createMock(Artifact.class);
+        expect(artifact.getVersion()).andReturn("9.1.0.1").anyTimes();
+        replay(artifact);        
+        
+        try {
+            mojo.getBestVersionForArtifact(artifact, createVersionList("9.0_1-SNAPSHOT"));
+            fail("ArtifactMetadataRetrievalException should have been thrown if no matching version was found");
+        } catch (ArtifactMetadataRetrievalException e) {
+            // this is expected
+        }
+    }
+    
+    public void testGetBestVersionForArtifactWithNoVersions() throws Exception {
+        try {
+            mojo.getBestVersionForArtifact(EasyMock.createMock(Artifact.class), createVersionList());
+            fail("ArtifactMetadataRetrievalException should have been thrown if no matching version was found");
+        } catch (ArtifactMetadataRetrievalException e) {
+            // this is expected
+        }
+    }
+    
+    private List<ArtifactVersion> createVersionList(String... versions) {
+        List<ArtifactVersion> results = new ArrayList<ArtifactVersion>();
+        for (final String version : versions) {
+            results.add(new DefaultArtifactVersion(version));
+        }
+        return results;
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java
new file mode 100644
index 0000000..bb1f073
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.tooling.features;
+
+import org.apache.maven.artifact.Artifact;
+import org.easymock.EasyMock;
+
+import static org.easymock.EasyMock.*;
+
+import junit.framework.TestCase;
+
+/**
+ * Test cases for {@link GenerateFeaturesXmlMojo}
+ */
+public class GenerateFeaturesXmlMojoTest extends TestCase {
+    
+    public void testToString() throws Exception {
+        Artifact artifact = EasyMock.createMock(Artifact.class);
+
+        expect(artifact.getGroupId()).andReturn("org.apache.karaf.test");
+        expect(artifact.getArtifactId()).andReturn("test-artifact");
+        expect(artifact.getVersion()).andReturn("1.2.3");
+        expect(artifact.getType()).andReturn("jar");
+        
+        replay(artifact);
+        
+        assertEquals("org.apache.karaf.test/test-artifact/1.2.3", GenerateFeaturesXmlMojo.toString(artifact));
+    } 
+
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/ManifestUtilsTest.java b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/ManifestUtilsTest.java
new file mode 100644
index 0000000..f380995
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/ManifestUtilsTest.java
@@ -0,0 +1,81 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.tooling.features;
+
+import static org.apache.karaf.tooling.features.ManifestUtils.matches;
+
+import junit.framework.TestCase;
+
+import java.util.HashMap;
+
+import org.apache.felix.utils.manifest.Attribute;
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Directive;
+import org.osgi.framework.Constants;
+
+/**
+ * Test cased for {@link org.apache.karaf.tooling.features.ManifestUtils} 
+ */
+public class ManifestUtilsTest extends TestCase {
+
+    public void testIsOptional() {
+    	Directive[] directive = new Directive[0];
+    	Attribute[] attribute = new Attribute[0];
+        Clause clause = new Clause("org.apache.karaf.test", directive, attribute);
+        assertFalse(ManifestUtils.isOptional(clause));
+
+        directive = new Directive[1];
+        directive[0] = new Directive("resolution", "mandatory");
+        clause = new Clause("org.apache.karaf.test", directive, attribute);
+        
+        assertFalse(ManifestUtils.isOptional(clause));
+
+        directive[0] = new Directive("resolution", "optional");
+        clause = new Clause("org.apache.karaf.test", directive, attribute);
+        assertTrue(ManifestUtils.isOptional(clause));
+    }
+
+    public void testMatches() {
+        assertFalse(matches(clause("org.apache.karaf.dev"), clause("org.apache.karaf.test")));
+        assertTrue(matches(clause("org.apache.karaf.test"), clause("org.apache.karaf.test")));
+
+        assertFalse(matches(clause("org.apache.karaf.test", "1.2.0"), clause("org.apache.karaf.test", "[1.1.0, 1.1.0]")));
+        assertTrue(matches(clause("org.apache.karaf.test", "1.1.0"), clause("org.apache.karaf.test", "[1.1.0, 1.1.0]")));
+
+        // a single version means >= 1.0.0, so 1.1.O should be a match
+        assertTrue(matches(clause("org.apache.karaf.test", "1.0.0"), clause("org.apache.karaf.test", "1.1.0")));
+        assertTrue(matches(clause("org.apache.karaf.test", "1.0.0"), clause("org.apache.karaf.test")));
+
+        assertFalse(matches(clause("org.apache.karaf.test", "[1.1.0, 1.2.0)"), clause("org.apache.karaf.test", "[1.0.0, 1.0.0]")));
+        assertFalse(matches(clause("org.apache.karaf.test", "[1.1.0, 1.2.0)"), clause("org.apache.karaf.test", "[1.2.0, 1.2.0]")));
+        assertTrue(matches(clause("org.apache.karaf.test", "[1.1.0, 1.2.0)"), clause("org.apache.karaf.test", "[1.1.0, 1.1.0]")));
+        assertTrue(matches(clause("org.apache.karaf.test", "[1.1.0, 1.2.0)"), clause("org.apache.karaf.test", "[1.1.1, 1.1.1]")));
+        assertTrue(matches(clause("org.apache.karaf.test", "[1.1.0, 1.1.0]"), clause("org.apache.karaf.test", "[1.1.0, 1.1.0]")));
+        assertFalse(matches(clause("org.apache.karaf.test", "[1.1.0, 1.1.0]"), clause("org.apache.karaf.test", "1.1.1")));
+        assertTrue(matches(clause("org.apache.karaf.test", "[1.1.0, 1.1.0]"), clause("org.apache.karaf.test", "1.0.0")));
+    }
+
+    private Clause clause(String name) {
+        return new Clause(name, new Directive[0], new Attribute[0]);
+    }
+
+    private Clause clause(String name, String version) {
+    	Attribute[] attribute = {new Attribute(Constants.VERSION_ATTRIBUTE, version)};
+        return new Clause(name, new Directive[0], attribute);
+    }
+}
diff --git a/karaf-2.2.x/tooling/features-maven-plugin/src/test/resources/input-features.xml b/karaf-2.2.x/tooling/features-maven-plugin/src/test/resources/input-features.xml
new file mode 100644
index 0000000..34f5f05
--- /dev/null
+++ b/karaf-2.2.x/tooling/features-maven-plugin/src/test/resources/input-features.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0" name="geronimo-transaction">
+    <repository>http://foo.org</repository>
+
+</features>
diff --git a/karaf-2.2.x/tooling/pom.xml b/karaf-2.2.x/tooling/pom.xml
new file mode 100644
index 0000000..407dab1
--- /dev/null
+++ b/karaf-2.2.x/tooling/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.tooling</groupId>
+    <artifactId>tooling</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Tooling</name>
+
+    <modules>
+        <module>features-maven-plugin</module>
+        <module>cmdhelp-maven-plugin</module>
+        <module>testing</module>
+    </modules>
+
+</project>
diff --git a/karaf-2.2.x/tooling/testing/pom.xml b/karaf-2.2.x/tooling/testing/pom.xml
new file mode 100644
index 0000000..4350e00
--- /dev/null
+++ b/karaf-2.2.x/tooling/testing/pom.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>tooling</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.tooling.testing</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Tooling :: Testing environment</name>
+    <description>A bundle to help using Pax-Exam and Karaf.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <!-- The assembly and all the dependencies -->
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>apache-karaf</artifactId>
+            <type>pom</type>
+        </dependency>
+        <!-- Feature Files -->
+        <dependency>
+            <groupId>org.apache.karaf.assemblies.features</groupId>
+            <artifactId>standard</artifactId>
+            <type>xml</type>
+            <classifier>features</classifier>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.assemblies.features</groupId>
+            <artifactId>enterprise</artifactId>
+            <type>xml</type>
+            <classifier>features</classifier>
+        </dependency>
+        <!-- Pax EXAM -->
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-junit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-container-default</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-junit-extender-impl</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.swissbox</groupId>
+            <artifactId>pax-swissbox-tinybundles</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-filtered</id>
+                        <!-- here the phase you need -->
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/classes/</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>../../assemblies/apache-karaf/src/main/filtered-resources/etc</directory>
+                                    <filtering>true</filtering>
+                                    <includes>
+                                        <include>config.properties</include>
+                                        <include>startup.properties</include>
+                                        <include>jre.properties</include>
+                                        <include>custom.properties</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- generate dependencies versions -->
+            <plugin>
+                <groupId>org.apache.servicemix.tooling</groupId>
+                <artifactId>depends-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-depends-file</id>
+                        <goals>
+                            <goal>generate-depends-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>org.apache.karaf.testing;version=${project.version}</Export-Package>
+                        <Import-Package>
+                            !org.apache.karaf.testing*,
+                            !org.ops4j.pax.exam.junit.options,
+                            org.ops4j.pax.swissbox.tinybundles*;resolution:=optional,
+                            *
+                        </Import-Package>
+                        <Include-Resource>
+                            {maven-resources},
+                            org/apache/karaf/testing/config.properties=target/classes/config.properties,
+                            org/apache/karaf/testing/jre.properties=target/classes/jre.properties,
+                            org/apache/karaf/testing/custom.properties=target/classes/custom.properties,
+                            org/apache/karaf/testing/startup.properties=target/classes/startup.properties
+                        </Include-Resource>
+                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/AbstractIntegrationTest.java b/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/AbstractIntegrationTest.java
new file mode 100644
index 0000000..6b83ea6
--- /dev/null
+++ b/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/AbstractIntegrationTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.karaf.testing;
+
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+import static org.apache.karaf.testing.Helper.mavenBundle;
+
+public abstract class AbstractIntegrationTest {
+
+    public static final long DEFAULT_TIMEOUT = 30000;
+
+    @Inject
+    protected BundleContext bundleContext;
+
+    protected <T> T getOsgiService(Class<T> type, long timeout) {
+        return getOsgiService(type, null, timeout);
+    }
+
+    protected <T> T getOsgiService(Class<T> type) {
+        return getOsgiService(type, null, DEFAULT_TIMEOUT);
+    }
+
+    protected <T> T getOsgiService(Class<T> type, String filter, long timeout) {
+        ServiceTracker tracker = null;
+        try {
+            String flt;
+            if (filter != null) {
+                if (filter.startsWith("(")) {
+                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")" + filter + ")";
+                } else {
+                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")(" + filter + "))";
+                }
+            } else {
+                flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")";
+            }
+            Filter osgiFilter = FrameworkUtil.createFilter(flt);
+            tracker = new ServiceTracker(bundleContext, osgiFilter, null);
+            tracker.open(true);
+            // Note that the tracker is not closed to keep the reference
+            // This is buggy, as the service reference may change i think
+            Object svc = type.cast(tracker.waitForService(timeout));
+            if (svc == null) {
+                Dictionary dic = bundleContext.getBundle().getHeaders();
+                System.err.println("Test bundle headers: " + explode(dic));
+
+                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, null))) {
+                    System.err.println("ServiceReference: " + ref);
+                }
+
+                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, flt))) {
+                    System.err.println("Filtered ServiceReference: " + ref);
+                }
+
+                throw new RuntimeException("Gave up waiting for service " + flt);
+            }
+            return type.cast(svc);
+        } catch (InvalidSyntaxException e) {
+            throw new IllegalArgumentException("Invalid filter", e);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected Bundle installBundle(String groupId, String artifactId) throws Exception {
+        MavenArtifactProvisionOption mvnUrl = mavenBundle(groupId, artifactId);
+        return bundleContext.installBundle(mvnUrl.getURL());
+    }
+
+    protected Bundle getInstalledBundle(String symbolicName) {
+        for (Bundle b : bundleContext.getBundles()) {
+            if (b.getSymbolicName().equals(symbolicName)) {
+                return b;
+            }
+        }
+        return null;
+    }
+
+    /*
+     * Explode the dictionary into a ,-delimited list of key=value pairs
+     */
+    private static String explode(Dictionary dictionary) {
+        Enumeration keys = dictionary.keys();
+        StringBuffer result = new StringBuffer();
+        while (keys.hasMoreElements()) {
+            Object key = keys.nextElement();
+            result.append(String.format("%s=%s", key, dictionary.get(key)));
+            if (keys.hasMoreElements()) {
+                result.append(", ");
+            }
+        }
+        return result.toString();
+    }
+
+    /*
+     * Provides an iterable collection of references, even if the original array is null
+     */
+    private static final Collection<ServiceReference> asCollection(ServiceReference[] references) {
+        List<ServiceReference> result = new LinkedList<ServiceReference>();
+        if (references != null) {
+            for (ServiceReference reference : references) {
+                result.add(reference);
+            }
+        }
+        return result;
+    }
+
+}
diff --git a/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/HeaderParser.java b/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/HeaderParser.java
new file mode 100644
index 0000000..a1b4300
--- /dev/null
+++ b/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/HeaderParser.java
@@ -0,0 +1,219 @@
+/**
+ * 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.karaf.testing;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+
+/**
+ * Utility class to parse a standard OSGi header with paths.
+ *
+ * @author <a href="mailto:dev@geronimo.apache.org">Apache Geronimo Project</a>
+ * @version $Rev: 786132 $, $Date: 2009-06-18 17:47:58 +0200 (Thu, 18 Jun 2009) $
+ */
+public final class HeaderParser  {
+
+    // Private constructor for static final class
+    private HeaderParser() {
+    }
+
+    public static InputStream wireTapManifest( InputStream is, Manifest mf ) throws IOException {
+        BufferedInputStream bis = new BufferedInputStream( is, 64 * 1024 );
+        bis.mark( 64 * 1024 );
+        JarInputStream jis = new JarInputStream( bis );
+        mf.getMainAttributes().putAll( jis.getManifest().getMainAttributes() );
+        mf.getEntries().putAll( jis.getManifest().getEntries() );
+        bis.reset();
+        return bis;
+    }
+
+    /**
+     * Parse a given OSGi header into a list of paths
+     *
+     * @param header the OSGi header to parse
+     * @return the list of paths extracted from this header
+     */
+    public static List<PathElement> parseHeader(String header) {
+        List<PathElement> elements = new ArrayList<PathElement>();
+        if (header == null || header.trim().length() == 0) {
+            return elements;
+        }
+        String[] clauses = parseDelimitedString(header, ",");
+        for (String clause : clauses) {
+            String[] tokens = clause.split(";");
+            if (tokens.length < 1) {
+                throw new IllegalArgumentException("Invalid header clause: " + clause);
+            }
+            PathElement elem = new PathElement(tokens[0].trim());
+            elements.add(elem);
+            for (int i = 1; i < tokens.length; i++) {
+                int pos = tokens[i].indexOf('=');
+                if (pos != -1) {
+                    if (pos > 0 && tokens[i].charAt(pos - 1) == ':') {
+                        String name = tokens[i].substring(0, pos - 1).trim();
+                        String value = tokens[i].substring(pos + 1).trim();
+                        if (value.startsWith("\"") && value.endsWith("\"")) {
+                            value = value.substring(1, value.length() - 1);
+                        }
+                        elem.addDirective(name, value);
+                    } else {
+                        String name = tokens[i].substring(0, pos).trim();
+                        String value = tokens[i].substring(pos + 1).trim();
+                        if (value.startsWith("\"") && value.endsWith("\"")) {
+                            value = value.substring(1, value.length() - 1);
+                        }
+                        elem.addAttribute(name, value);
+                    }
+                } else {
+                    elem = new PathElement(tokens[i].trim());
+                    elements.add(elem);
+                }
+            }
+        }
+        return elements;
+    }
+
+    /**
+     * Parses delimited string and returns an array containing the tokens. This
+     * parser obeys quotes, so the delimiter character will be ignored if it is
+     * inside of a quote. This method assumes that the quote character is not
+     * included in the set of delimiter characters.
+     * @param value the delimited string to parse.
+     * @param delim the characters delimiting the tokens.
+     * @return an array of string tokens or null if there were no tokens.
+    **/
+    public static String[] parseDelimitedString(String value, String delim)
+    {
+        if (value == null)
+        {
+           value = "";
+        }
+
+        List list = new ArrayList();
+
+        int CHAR = 1;
+        int DELIMITER = 2;
+        int STARTQUOTE = 4;
+        int ENDQUOTE = 8;
+
+        StringBuffer sb = new StringBuffer();
+
+        int expecting = (CHAR | DELIMITER | STARTQUOTE);
+
+        for (int i = 0; i < value.length(); i++)
+        {
+            char c = value.charAt(i);
+
+            boolean isDelimiter = (delim.indexOf(c) >= 0);
+            boolean isQuote = (c == '"');
+
+            if (isDelimiter && ((expecting & DELIMITER) > 0))
+            {
+                list.add(sb.toString().trim());
+                sb.delete(0, sb.length());
+                expecting = (CHAR | DELIMITER | STARTQUOTE);
+            }
+            else if (isQuote && ((expecting & STARTQUOTE) > 0))
+            {
+                sb.append(c);
+                expecting = CHAR | ENDQUOTE;
+            }
+            else if (isQuote && ((expecting & ENDQUOTE) > 0))
+            {
+                sb.append(c);
+                expecting = (CHAR | STARTQUOTE | DELIMITER);
+            }
+            else if ((expecting & CHAR) > 0)
+            {
+                sb.append(c);
+            }
+            else
+            {
+                throw new IllegalArgumentException("Invalid delimited string: " + value);
+            }
+        }
+
+        if (sb.length() > 0)
+        {
+            list.add(sb.toString().trim());
+        }
+
+        return (String[]) list.toArray(new String[list.size()]);
+    }
+
+    public static class PathElement {
+
+        private String path;
+        private Map<String, String> attributes;
+        private Map<String, String> directives;
+
+        public PathElement(String path) {
+            this.path = path;
+            this.attributes = new HashMap<String, String>();
+            this.directives = new HashMap<String, String>();
+        }
+
+        public String getName() {
+            return this.path;
+        }
+
+        public Map<String, String> getAttributes() {
+            return attributes;
+        }
+
+        public String getAttribute(String name) {
+            return attributes.get(name);
+        }
+
+        public void addAttribute(String name, String value) {
+            attributes.put(name, value);
+        }
+
+        public Map<String, String> getDirectives() {
+            return directives;
+        }
+
+        public String getDirective(String name) {
+            return directives.get(name);
+        }
+
+        public void addDirective(String name, String value) {
+            directives.put(name, value);
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder(this.path);
+            for (Map.Entry<String,String> directive : this.directives.entrySet()) {
+                sb.append(";").append(directive.getKey()).append(":=").append(directive.getValue());
+            }
+            for (Map.Entry<String,String> attribute : this.attributes.entrySet()) {
+                sb.append(";").append(attribute.getKey()).append("=").append(attribute.getValue());
+            }
+            return sb.toString();
+        }
+
+    }
+}
diff --git a/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/Helper.java b/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/Helper.java
new file mode 100644
index 0000000..94ac756
--- /dev/null
+++ b/karaf-2.2.x/tooling/testing/src/main/java/org/apache/karaf/testing/Helper.java
@@ -0,0 +1,643 @@
+/*
+ * 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.karaf.testing;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.jar.Manifest;
+
+import org.ops4j.pax.exam.CoreOptions;
+import org.ops4j.pax.exam.Customizer;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.options.JUnitBundlesOption;
+import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
+import org.ops4j.pax.exam.container.def.options.FeaturesScannerProvisionOption;
+import org.ops4j.pax.exam.options.SystemPropertyOption;
+import org.osgi.framework.Constants;
+
+import static org.ops4j.pax.exam.CoreOptions.bootClasspathLibrary;
+import static org.ops4j.pax.exam.CoreOptions.bootDelegationPackages;
+import static org.ops4j.pax.exam.CoreOptions.frameworkStartLevel;
+import static org.ops4j.pax.exam.CoreOptions.maven;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
+import static org.ops4j.pax.exam.OptionUtils.combine;
+import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.scanFeatures;
+import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;
+import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.modifyBundle;
+
+/**
+ * Helper class for setting up a pax-exam test environment for karaf.
+ *
+ * A simple configuration for pax-exam can be create using the following
+ * code:
+ * <pre>
+ *   @Configuration
+ *   public static Option[] configuration() throws Exception{
+ *       return combine(
+ *           // Default karaf environment
+ *           Helper.getDefaultOptions(),
+ *           // Test on both equinox and felix
+ *           equinox(), felix()
+ *       );
+ *   }
+ * </pre>
+ *
+ */
+public final class Helper {
+	
+	public static final String INCLUDES_PROPERTY = "${includes}";
+
+    private Helper() {
+    }
+
+    public static Customizer felixProvisionalApis() {
+        return new Customizer() {
+            @Override
+            public InputStream customizeTestProbe(InputStream testProbe) throws Exception {
+                Manifest mf = new Manifest();
+                testProbe = HeaderParser.wireTapManifest( testProbe, mf );
+                List<HeaderParser.PathElement> elems = HeaderParser.parseHeader( mf.getMainAttributes().getValue( Constants.IMPORT_PACKAGE ));
+                StringBuilder sb = new StringBuilder();
+                for (HeaderParser.PathElement elem : elems) {
+                    if (elem.getName().startsWith("org.apache.felix.service.")) {
+                        elem.getAttributes().put("status", "provisional");
+                    }
+                    if (sb.length() > 0) {
+                        sb.append(",");
+                    }
+                    sb.append(elem.toString());
+                }
+
+                System.out.println("==============================");
+                System.out.println("");
+                System.out.println("Old: " + mf.getMainAttributes().getValue( Constants.IMPORT_PACKAGE ));
+                System.out.println("");
+                System.out.println("==============================");
+                System.out.println("");
+                System.out.println("New: " + sb.toString());
+                System.out.println("");
+                System.out.println("==============================");
+
+                return modifyBundle( testProbe )
+                            .set( Constants.IMPORT_PACKAGE, sb.toString() )
+                            .build();
+            }
+        };
+    }
+
+    /**
+     *  Create an provisioning option for the specified maven artifact
+     * (groupId and artifactId), using the version found in the list
+     * of dependencies of this maven project.
+     *
+     * @param groupId the groupId of the maven bundle
+     * @param artifactId the artifactId of the maven bundle
+     * @return the provisioning option for the given bundle
+     */
+    public static MavenArtifactProvisionOption mavenBundle(String groupId, String artifactId) {
+        return mavenBundle(groupId, artifactId, null, null, null);
+    }
+
+    public static MavenArtifactProvisionOption mavenBundle(String groupId, String artifactId, String version, String classifier, String type) {
+        MavenArtifactProvisionOption m = CoreOptions.mavenBundle().groupId(groupId).artifactId(artifactId);
+        if (version != null) {
+            m.version(version);
+        } else {
+            try {
+                m.versionAsInProject();
+            } catch (RuntimeException t) {
+                //in eclipse, the dependencies.properties may not be avail since it's not
+                //generated into a source directory (directly into classes).
+                //thus, try and load it manually
+
+                try {
+                    File file = new File("META-INF/maven/dependencies.properties");
+                    if (!file.exists()) {
+                        file = new File("target/classes/META-INF/maven/dependencies.properties");
+                    }
+                    if (file.exists()) {
+                        Properties dependencies = new Properties();
+                        InputStream is = new FileInputStream(file);
+                        try {
+                            dependencies.load(is);
+                        } finally {
+                            is.close();
+                        }
+                        version = dependencies.getProperty( groupId + "/" + artifactId + "/version" );
+                        m.version(version);
+                    } else {
+                        throw t;
+                    }
+                } catch (Throwable t2) {
+                    throw t;
+                }
+            }
+        }
+        if (classifier != null) {
+            m.classifier(classifier);
+        }
+        if (type != null) {
+            m.type(type);
+        }
+        return m;
+    }
+
+    /**
+     * Return a map of system properties for karaf.
+     * The default karaf home directory is "target/karaf.home".
+     *
+     * @return a list of system properties for karaf
+     */
+    public static Properties getDefaultSystemOptions() {
+        return getDefaultSystemOptions("target/karaf.home");
+    }
+
+    /**
+     * Return a map of system properties for karaf,
+     * using the specified folder for the karaf home directory.
+     *
+     * @param karafHome the karaf home directory
+     * @return a list of system properties for karaf
+     */
+    public static Properties getDefaultSystemOptions(String karafHome) {
+        Properties sysProps = new Properties();
+        sysProps.setProperty("karaf.name", "root");
+        sysProps.setProperty("karaf.home", karafHome);
+        sysProps.setProperty("karaf.base", karafHome);
+        sysProps.setProperty("karaf.startLocalConsole", "false");
+        sysProps.setProperty("karaf.startRemoteShell", "false");
+        sysProps.setProperty("org.osgi.framework.startlevel.beginning", "100");
+        return sysProps;
+    }
+
+    /**
+     * Return an array of pax-exam options to correctly configure the osgi
+     * framework for karaf.
+     *
+     * @param sysOptions test-specific system property options
+     * @return default pax-exam options for karaf osgi framework
+     */
+    public static Option[] getDefaultConfigOptions(SystemPropertyOption... sysOptions) {
+        return getDefaultConfigOptions(getDefaultSystemOptions(),
+                                       getResource("/org/apache/karaf/testing/config.properties"),
+                                       sysOptions);
+    }
+
+    /**
+     * Return an array of pax-exam options to configure the osgi
+     * framework for karaf, given the system properties and the
+     * location of the osgi framework properties file.
+     *
+     * @param sysProps karaf system properties
+     * @param configProperties the URL to load the osgi framework properties from
+     * @param sysOptions test-specific system property options
+     * @return pax-exam options for karaf osgi framework
+     */
+    public static Option[] getDefaultConfigOptions(Properties sysProps, URL configProperties, SystemPropertyOption... sysOptions) {
+        // Load props
+        Properties configProps = loadProperties(configProperties);
+
+        // Set system props
+        for (Enumeration e = sysProps.propertyNames(); e.hasMoreElements();) {
+            String key = (String) e.nextElement();
+            configProps.setProperty(key, sysProps.getProperty(key));
+        }
+        // Perform variable substitution for system properties.
+        for (Enumeration e = configProps.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            configProps.setProperty(name, substVars(configProps.getProperty(name), name, null, configProps));
+        }
+        // Transform system properties to VM options
+        List<Option> options = new ArrayList<Option>();
+        String vmOptions = "";
+        for (Enumeration e = configProps.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            String value = configProps.getProperty(name);
+            value = align(value);
+            if ("org.osgi.framework.system.packages".equals(name)) {
+            	String extra = align(configProps.getProperty("org.osgi.framework.system.packages.extra"));
+            	if (extra != null && extra.length() > 0) {
+                	vmOptions = vmOptions + " -D" + name + "=" + value + "," + extra;
+                } else {
+                	vmOptions = vmOptions + " -D" + name + "=" + value;
+                }
+            } else if ("org.osgi.framework.bootdelegation".equals(name)) {
+                options.add(bootDelegationPackages(value));
+            } else {
+                vmOptions = vmOptions + " -D" + name + "=" + value;
+            }
+        }
+
+        // add test-specific system properties
+        if (sysOptions != null) {
+            for (SystemPropertyOption sysOption : sysOptions) {
+                vmOptions = vmOptions + " -D" + sysOption.getKey() + "=" + sysOption.getValue();
+            }
+        }
+
+        if (configProps.getProperty("org.osgi.framework.startlevel.beginning") != null) {
+            options.add(frameworkStartLevel(Integer.parseInt(configProps.getProperty("org.osgi.framework.startlevel.beginning"))));
+        }
+
+        options.add(vmOption(vmOptions));
+ 
+        return options.toArray(new Option[options.size()]);
+    }
+
+    /**
+     * Return an array of pax-exam options for the provisioning of karaf system bundles.
+     *
+     * @return an array of pax-exam options for provisioning karaf system bundles
+     */
+    public static Option[] getDefaultProvisioningOptions() {
+        return getDefaultProvisioningOptions(getDefaultSystemOptions(),
+                                            getResource("/org/apache/karaf/testing/startup.properties"));
+    }
+
+    /**
+     * Return an array of pax-exam options for the provisioning of karaf system bundles,
+     * given the karaf system properties and the location of the startup bundles config file.
+     *
+     * @param sysProps karaf system properties
+     * @param startupProperties the URL to load the system bundles from
+     * @return an array of pax-exam options for provisioning karaf system bundles
+     */
+    public static Option[] getDefaultProvisioningOptions(Properties sysProps, URL startupProperties) {
+        Properties startupProps = loadProperties(startupProperties);
+        // Perform variable substitution for system properties.
+        for (Enumeration e = startupProps.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            startupProps.setProperty(name, substVars(startupProps.getProperty(name), name, null, sysProps));
+        }
+        // Transform to sys props options
+        List<Option> options = new ArrayList<Option>();
+        options.add(bootClasspathLibrary(mavenBundle("org.apache.karaf.jaas", "org.apache.karaf.jaas.boot")).afterFramework());
+        options.add(bootClasspathLibrary(mavenBundle("org.apache.karaf", "org.apache.karaf.main")).afterFramework());
+        for (Enumeration e = startupProps.propertyNames(); e.hasMoreElements();) {
+            String name = (String) e.nextElement();
+            String value = startupProps.getProperty(name);
+            MavenArtifactProvisionOption opt = convertToMaven(name);
+            if (opt.getURL().contains("org.apache.karaf.features")) {
+                opt.noStart();
+            }
+            opt.startLevel(Integer.parseInt(value));
+            options.add(opt);
+        }
+        options.add(mavenBundle("org.apache.karaf.tooling", "org.apache.karaf.tooling.testing"));
+        options.add(wrappedBundle(mavenBundle("org.ops4j.pax.exam", "pax-exam-container-default")));
+        // We need to add pax-exam-junit here when running with the ibm
+        // jdk to avoid the following exception during the test run:
+        // ClassNotFoundException: org.ops4j.pax.exam.junit.Configuration
+        if ("IBM Corporation".equals(System.getProperty("java.vendor"))) {
+            options.add(wrappedBundle(maven("org.ops4j.pax.exam", "pax-exam-junit")));
+        }
+		// Add ServiceMix junit bundle
+		JUnitBundlesOption jubo = new JUnitBundlesOption();
+		((MavenArtifactProvisionOption) jubo.getDelegate()).groupId("org.apache.servicemix.bundles").artifactId("org.apache.servicemix.bundles.junit").version("4.7_1");
+		options.add(jubo);
+        return options.toArray(new Option[options.size()]);
+    }
+
+    /**
+     * Return an array of options for setting up a pax-exam test environment for karaf.
+     *
+     * @return an array of pax-exam options
+     */
+    public static Option[] getDefaultOptions() {
+        return getDefaultOptions(null);
+    }
+
+    /**
+     * Return an array of options for setting up a pax-exam test environment for karaf.
+     *
+     * @param sysOptions test-specific system property options
+     * @return an array of pax-exam options
+     */
+    public static Option[] getDefaultOptions(SystemPropertyOption... sysOptions) {
+        return combine(getDefaultConfigOptions(sysOptions), getDefaultProvisioningOptions());
+    }
+
+    /**
+     * Configures the required system property to set the log-level in Karaf.
+     *
+     * @param logLevel the log level which should be used for pax-logging. Possible values are TRACE, DEBUG, INFO, WARN,
+     *        ERROR and FATAL
+     * @return a pax-exam option
+     */
+    public static SystemPropertyOption setLogLevel(String logLevel) {
+        return systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level").value(logLevel);
+    }
+
+    /**
+     * Method to directly register Karaf standard features.
+     *
+     * @param features a list of features which should be loaded from the Karaf standard feature file.
+     * @return a pax-exam option
+     */
+    public static FeaturesScannerProvisionOption loadKarafStandardFeatures(String... features) {
+        return scanFeatures(
+            maven().groupId("org.apache.karaf.assemblies.features").artifactId("standard").type("xml")
+                .classifier("features").versionAsInProject(), features);
+    }
+
+    /**
+     * Method to directly register Karaf enterprise features.
+     * 
+     * @param features a list of features which should be loaded from the Karaf enterprise feature file.
+     * @return a pax-exam option
+     */
+    public static FeaturesScannerProvisionOption loadKarafEnterpriseFeatures(String... features) {
+        return scanFeatures(
+            maven().groupId("org.apache.karaf.assemblies.features").artifactId("enterprise").type("xml")
+                .classifier("features").versionAsInProject(), features);
+    }
+
+    /**
+     * Returns the vmOption to configure pax exam with debugging support.
+     *
+     * @param debuggingPort the port where the remote debugger should be allowed to be attached
+     * @return the option to enable debugging
+     */
+    public static Option activateDebugging(String debuggingPort) {
+        return vmOption("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=" + debuggingPort);
+    }
+
+    /**
+     * Retrieve the pax-exam option for provisioning the given maven bundle.
+     *
+     * @param options the list of pax-exam options
+     * @param groupId the maven group id
+     * @param artifactId the maven artifact id
+     * @return the pax-exam provisioning option for the bundle or <code>null</code> if not found
+     */
+    public static MavenArtifactProvisionOption findMaven(Option[] options, String groupId, String artifactId) {
+        for (Option option : options) {
+            if (option instanceof MavenArtifactProvisionOption) {
+                MavenArtifactProvisionOption mvn = (MavenArtifactProvisionOption) option;
+                if (mvn.getURL().startsWith("mvn:" + groupId + "/" + artifactId + "/")) {
+                    return mvn;
+                }
+            }
+        }
+        return null;
+    }
+
+    private static Properties loadProperties(URL location) {
+        try {
+            Properties props = new Properties();
+            InputStream is = location.openStream();
+            try {
+                props.load(is);
+            } finally {
+                is.close();
+            }
+            String includes = props.getProperty(INCLUDES_PROPERTY);
+            if (includes != null) {
+                StringTokenizer st = new StringTokenizer(includes, "\" ", true);
+                if (st.countTokens() > 0) {
+                    String includeUrl;
+                    do {
+                    	includeUrl = nextLocation(st);
+                        if (includeUrl != null) {
+                        	URL url = new URL(location, includeUrl);
+                            Properties properties = loadProperties(url);
+                            props.putAll(properties);
+                        }
+                    }
+                    while (includeUrl != null);
+                }
+                props.remove(INCLUDES_PROPERTY);
+            }
+            return props;
+        } catch (IOException e) {
+            throw new RuntimeException("Unable to load properties from " + location, e);
+        }
+    }
+
+    private static URL getResource(String location) {
+        URL url = null;
+        if (Thread.currentThread().getContextClassLoader() != null) {
+            url = Thread.currentThread().getContextClassLoader().getResource(location);
+        }
+        if (url == null) {
+            url = Helper.class.getResource(location);
+        }
+        if (url == null) {
+            throw new RuntimeException("Unable to find resource " + location);
+        }
+        return url;
+    }
+
+    private static final String DELIM_START = "${";
+    private static final String DELIM_STOP = "}";
+
+    /**
+     * <p>
+     * This method performs property variable substitution on the
+     * specified value. If the specified value contains the syntax
+     * <tt>${&lt;prop-name&gt;}</tt>, where <tt>&lt;prop-name&gt;</tt>
+     * refers to either a configuration property or a system property,
+     * then the corresponding property value is substituted for the variable
+     * placeholder. Multiple variable placeholders may exist in the
+     * specified value as well as nested variable placeholders, which
+     * are substituted from inner most to outer most. Configuration
+     * properties override system properties.
+     * </p>
+     *
+     * @param val         The string on which to perform property substitution.
+     * @param currentKey  The key of the property being evaluated used to
+     *                    detect cycles.
+     * @param cycleMap    Map of variable references used to detect nested cycles.
+     * @param configProps Set of configuration properties.
+     * @return The value of the specified string after system property substitution.
+     * @throws IllegalArgumentException If there was a syntax error in the
+     *                                  property placeholder syntax or a recursive variable reference.
+     */
+    private static String substVars(String val, String currentKey,
+                                    Map<String, String> cycleMap, Properties configProps)
+            throws IllegalArgumentException {
+        // If there is currently no cycle map, then create
+        // one for detecting cycles for this invocation.
+        if (cycleMap == null) {
+            cycleMap = new HashMap<String, String>();
+        }
+
+        // Put the current key in the cycle map.
+        cycleMap.put(currentKey, currentKey);
+
+        // Assume we have a value that is something like:
+        // "leading ${foo.${bar}} middle ${baz} trailing"
+
+        // Find the first ending '}' variable delimiter, which
+        // will correspond to the first deepest nested variable
+        // placeholder.
+        int stopDelim = val.indexOf(DELIM_STOP);
+
+        // Find the matching starting "${" variable delimiter
+        // by looping until we find a start delimiter that is
+        // greater than the stop delimiter we have found.
+        int startDelim = val.indexOf(DELIM_START);
+        while (stopDelim >= 0) {
+            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
+            if ((idx < 0) || (idx > stopDelim)) {
+                break;
+            } else if (idx < stopDelim) {
+                startDelim = idx;
+            }
+        }
+
+        // If we do not have a start or stop delimiter, then just
+        // return the existing value.
+        if ((startDelim < 0) && (stopDelim < 0)) {
+            return val;
+        }
+        // At this point, we found a stop delimiter without a start,
+        // so throw an exception.
+        else if (((startDelim < 0) || (startDelim > stopDelim))
+                && (stopDelim >= 0)) {
+            throw new IllegalArgumentException(
+                    "stop delimiter with no start delimiter: "
+                            + val);
+        }
+
+        // At this point, we have found a variable placeholder so
+        // we must perform a variable substitution on it.
+        // Using the start and stop delimiter indices, extract
+        // the first, deepest nested variable placeholder.
+        String variable =
+                val.substring(startDelim + DELIM_START.length(), stopDelim);
+
+        // Verify that this is not a recursive variable reference.
+        if (cycleMap.get(variable) != null) {
+            throw new IllegalArgumentException(
+                    "recursive variable reference: " + variable);
+        }
+
+        // Get the value of the deepest nested variable placeholder.
+        // Try to configuration properties first.
+        String substValue = (configProps != null)
+                ? configProps.getProperty(variable, null)
+                : null;
+        if (substValue == null) {
+            // Ignore unknown property values.
+            substValue = System.getProperty(variable, "");
+        }
+
+        // Remove the found variable from the cycle map, since
+        // it may appear more than once in the value and we don't
+        // want such situations to appear as a recursive reference.
+        cycleMap.remove(variable);
+
+        // Append the leading characters, the substituted value of
+        // the variable, and the trailing characters to get the new
+        // value.
+        val = val.substring(0, startDelim)
+                + substValue
+                + val.substring(stopDelim + DELIM_STOP.length(), val.length());
+
+        // Now perform substitution again, since there could still
+        // be substitutions to make.
+        val = substVars(val, currentKey, cycleMap, configProps);
+
+        // Return the value.
+        return val;
+    }
+
+    private static MavenArtifactProvisionOption convertToMaven(String location) {
+        String[] p = location.split("/");
+        if (p.length >= 4 && p[p.length-1].startsWith(p[p.length-3] + "-" + p[p.length-2])) {
+            MavenArtifactProvisionOption opt = new MavenArtifactProvisionOption();
+            int artifactIdVersionLength = p[p.length-3].length() + 1 + p[p.length-2].length(); // (artifactId + "-" + version).length
+            if (p[p.length-1].charAt(artifactIdVersionLength) == '-') {
+                opt.classifier((p[p.length-1].substring(artifactIdVersionLength + 1, p[p.length-1].lastIndexOf('.'))));
+            }
+            StringBuffer sb = new StringBuffer();
+            for (int j = 0; j < p.length - 3; j++) {
+                if (j > 0) {
+                    sb.append('.');
+                }
+                sb.append(p[j]);
+            }
+            opt.groupId(sb.toString());
+            opt.artifactId(p[p.length-3]);
+            opt.version(p[p.length-2]);
+            opt.type(p[p.length-1].substring(p[p.length-1].lastIndexOf('.') + 1));
+            return opt;
+        } else {
+            throw new IllegalArgumentException("Unable to extract maven information from " + location);
+        }
+    }
+
+
+    private static String align(String value) {
+        return value != null ? value.replaceAll("\r", "").replaceAll("\n", "").replaceAll(" ", "") : "";
+    }
+
+    private static String nextLocation(StringTokenizer st) {
+        String retVal = null;
+
+        if (st.countTokens() > 0) {
+            String tokenList = "\" ";
+            StringBuffer tokBuf = new StringBuffer(10);
+            String tok = null;
+            boolean inQuote = false;
+            boolean tokStarted = false;
+            boolean exit = false;
+            while ((st.hasMoreTokens()) && (!exit)) {
+                tok = st.nextToken(tokenList);
+                if (tok.equals("\"")) {
+                    inQuote = !inQuote;
+                    if (inQuote) {
+                        tokenList = "\"";
+                    } else {
+                        tokenList = "\" ";
+                    }
+
+                } else if (tok.equals(" ")) {
+                    if (tokStarted) {
+                        retVal = tokBuf.toString();
+                        tokStarted = false;
+                        tokBuf = new StringBuffer(10);
+                        exit = true;
+                    }
+                } else {
+                    tokStarted = true;
+                    tokBuf.append(tok.trim());
+                }
+            }
+
+            // Handle case where end of token stream and
+            // still got data
+            if ((!exit) && (tokStarted)) {
+                retVal = tokBuf.toString();
+            }
+        }
+
+        return retVal;
+    }
+}
diff --git a/karaf-2.2.x/util/NOTICE b/karaf-2.2.x/util/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/util/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/util/pom.xml b/karaf-2.2.x/util/pom.xml
new file mode 100644
index 0000000..67e1558
--- /dev/null
+++ b/karaf-2.2.x/util/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+    
+    <modelVersion>4.0.0</modelVersion>
+    
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    
+    <artifactId>org.apache.karaf.util</artifactId>
+    <packaging>jar</packaging>
+    <name>Apache Karaf :: Util</name>
+    <description>Karaf Util contains utility classes used in different Karaf modules.</description>
+    
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/DeployerUtils.java b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/DeployerUtils.java
new file mode 100644
index 0000000..b0870a0
--- /dev/null
+++ b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/DeployerUtils.java
@@ -0,0 +1,93 @@
+/*
+ * 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.karaf.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Contain various methods that are useful for deploying artifacts
+ */
+public final class DeployerUtils {
+
+    /** Private constructors to avoid instantiation */
+    private DeployerUtils() { }
+
+    private static final String DEFAULT_VERSION = "0.0.0";
+
+    private static final Pattern ARTIFACT_MATCHER = Pattern.compile("(.+)(?:-(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?(?:[^a-zA-Z0-9](.*))?)(?:\\.([^\\.]+))", Pattern.DOTALL);
+    private static final Pattern FUZZY_MODIFIDER = Pattern.compile("(?:\\d+[.-])*(.*)", Pattern.DOTALL);
+
+    /**
+     * Heuristic to compute the name and version of a file given it's name on disk
+     *
+     * @param url the name of the file
+     * @return the name and version of that file
+     */
+    public static String[] extractNameVersionType(String url) {
+        Matcher m = ARTIFACT_MATCHER.matcher(url);
+        if (!m.matches()) {
+            return new String[] { url, DEFAULT_VERSION };
+        }
+        else {
+            StringBuffer v = new StringBuffer();
+            String d1 = m.group(1);
+            String d2 = m.group(2);
+            String d3 = m.group(3);
+            String d4 = m.group(4);
+            String d5 = m.group(5);
+            String d6 = m.group(6);
+            if (d2 != null) {
+                v.append(d2);
+                if (d3 != null) {
+                    v.append('.');
+                    v.append(d3);
+                    if (d4 != null) {
+                        v.append('.');
+                        v.append(d4);
+                        if (d5 != null) {
+                            v.append(".");
+                            cleanupModifier(v, d5);
+                        }
+                    } else if (d5 != null) {
+                        v.append(".0.");
+                        cleanupModifier(v, d5);
+                    }
+                } else if (d5 != null) {
+                    v.append(".0.0.");
+                    cleanupModifier(v, d5);
+                }
+            }
+            return new String[] { d1, v.toString(), d6 };
+        }
+    }
+
+    private static void cleanupModifier(StringBuffer result, String modifier) {
+        Matcher m = FUZZY_MODIFIDER.matcher(modifier);
+        if (m.matches()) {
+            modifier = m.group(1);
+        }
+        for (int i = 0; i < modifier.length(); i++) {
+            char c = modifier.charAt(i);
+            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-') {
+                result.append(c);
+            }
+        }
+    }
+
+
+}
diff --git a/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/Properties.java b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/Properties.java
new file mode 100644
index 0000000..20a0217
--- /dev/null
+++ b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/Properties.java
@@ -0,0 +1,873 @@
+/*
+ * 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.karaf.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URL;
+import java.util.AbstractMap;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Enhancement of the standard <code>Properties</code>
+ * managing the maintain of comments, etc.
+ */
+public class Properties extends AbstractMap<String, String> {
+
+    /** Constant for the supported comment characters.*/
+    private static final String COMMENT_CHARS = "#!";
+
+    /** The list of possible key/value separators */
+    private static final char[] SEPARATORS = new char[] {'=', ':'};
+
+    /** The white space characters used as key/value separators. */
+    private static final char[] WHITE_SPACE = new char[] {' ', '\t', '\f'};
+
+    /**
+     * The default encoding (ISO-8859-1 as specified by
+     * http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html)
+     */
+    private static final String DEFAULT_ENCODING = "ISO-8859-1";
+
+    /** Constant for the platform specific line separator.*/
+    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
+
+    private Map<String,String> storage = new LinkedHashMap<String,String>();
+    private Map<String,Layout> layout = new LinkedHashMap<String,Layout>();
+    private List<String> header;
+    private List<String> footer;
+    private File location;
+
+    public Properties() {
+    }
+
+    public Properties(File location) throws IOException {
+        this.location = location;
+        if(location.exists())
+            load(location);
+    }
+
+    public void load(File location) throws IOException {
+        InputStream is = new FileInputStream(location);
+        try {
+            load(is);
+        } finally {
+            is.close();
+        }
+    }
+
+    public void load(URL location) throws IOException {
+        InputStream is = location.openStream();
+        try {
+            load(is);
+        } finally {
+            is.close();
+        }
+    }
+
+    public void load(InputStream is) throws IOException {
+        load(new InputStreamReader(is, DEFAULT_ENCODING));
+    }
+
+    public void load(Reader reader) throws IOException {
+        loadLayout(reader);
+    }
+
+    public void save() throws IOException {
+        save(this.location);
+    }
+
+    public void save(File location) throws IOException {
+        OutputStream os = new FileOutputStream(location);
+        try {
+            save(os);
+        } finally {
+            os.close();
+        }
+    }
+
+    public void save(OutputStream os) throws IOException {
+        save(new OutputStreamWriter(os, DEFAULT_ENCODING));
+    }
+
+    public void save(Writer writer) throws IOException {
+        saveLayout(writer);
+    }
+
+    @Override
+    public Set<Entry<String, String>> entrySet() {
+        return storage.entrySet();
+    }
+
+    @Override
+    public String put(String key, String value) {
+        String old = storage.put(key, value);
+        if (old == null || !old.equals(value)) {
+            Layout l = layout.get(key);
+            if (l != null) {
+                l.clearValue();
+            }
+        }
+        return old;
+    }
+
+    @Override
+    public String remove(Object key) {
+        Layout l = layout.get(key);
+        if (l != null) {
+            l.clearValue();
+        }
+        return storage.remove(key);
+    }
+
+    @Override
+    public void clear() {
+        for (Layout l : layout.values()) {
+            l.clearValue();
+        }
+        storage.clear();
+    }
+
+    /**
+     * Return the comment header.
+     *
+     * @return the comment header
+     */
+    public List<String> getHeader()
+    {
+        return header;
+    }
+
+    /**
+     * Set the comment header.
+     *
+     * @param header the header to use
+     */
+    public void setHeader(List<String> header)
+    {
+        this.header = header;
+    }
+
+    /**
+     * Return the comment footer.
+     *
+     * @return the comment footer
+     */
+    public List<String> getFooter()
+    {
+        return footer;
+    }
+
+    /**
+     * Set the comment footer.
+     *
+     * @param footer the footer to use
+     */
+    public void setFooter(List<String> footer)
+    {
+        this.footer = footer;
+    }
+
+    /**
+     * Reads a properties file and stores its internal structure. The found
+     * properties will be added to the associated configuration object.
+     *
+     * @param in the reader to the properties file
+     * @throws java.io.IOException if an error occurs
+     */
+    protected void loadLayout(Reader in) throws IOException
+    {
+        PropertiesReader reader = new PropertiesReader(in);
+        while (reader.nextProperty())
+        {
+            storage.put(reader.getPropertyName(), reader.getPropertyValue());
+            int idx = checkHeaderComment(reader.getCommentLines());
+            layout.put(reader.getPropertyName(),
+                    new Layout(idx < reader.getCommentLines().size() ?
+                                    new ArrayList<String>(reader.getCommentLines().subList(idx, reader.getCommentLines().size())) :
+                                    null,
+                               new ArrayList<String>(reader.getValueLines())));
+        }
+        footer = new ArrayList<String>(reader.getCommentLines());
+        performSubstitution(storage);
+    }
+
+    /**
+     * Writes the properties file to the given writer, preserving as much of its
+     * structure as possible.
+     *
+     * @param out the writer
+     * @throws java.io.IOException if an error occurs
+     */
+    protected void saveLayout(Writer out) throws IOException
+    {
+        PropertiesWriter writer = new PropertiesWriter(out);
+        if (header != null)
+        {
+            for (String s : header)
+            {
+                writer.writeln(s);
+            }
+        }
+
+        for (String key : storage.keySet())
+        {
+            Layout l = layout.get(key);
+            if (l != null && l.getCommentLines() != null)
+            {
+                for (String s : l.getCommentLines())
+                {
+                    writer.writeln(s);
+                }
+            }
+            if (l != null && l.getValueLines() != null)
+            {
+                for (String s : l.getValueLines())
+                {
+                    writer.writeln(s);
+                }
+            }
+            else
+            {
+                writer.writeProperty(key, storage.get(key));
+            }
+        }
+        if (footer != null)
+        {
+            for (String s : footer)
+            {
+                writer.writeln(s);
+            }
+        }
+        writer.flush();
+    }
+
+    /**
+     * Checks if parts of the passed in comment can be used as header comment.
+     * This method checks whether a header comment can be defined (i.e. whether
+     * this is the first comment in the loaded file). If this is the case, it is
+     * searched for the lates blank line. This line will mark the end of the
+     * header comment. The return value is the index of the first line in the
+     * passed in list, which does not belong to the header comment.
+     *
+     * @param commentLines the comment lines
+     * @return the index of the next line after the header comment
+     */
+    private int checkHeaderComment(List<String> commentLines)
+    {
+        if (getHeader() == null && layout.isEmpty())
+        {
+            // This is the first comment. Search for blank lines.
+            int index = commentLines.size() - 1;
+            while (index >= 0 && commentLines.get(index).length() > 0)
+            {
+                index--;
+            }
+            setHeader(new ArrayList<String>(commentLines.subList(0, index + 1)));
+            return index + 1;
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    /**
+     * Tests whether a line is a comment, i.e. whether it starts with a comment
+     * character.
+     *
+     * @param line the line
+     * @return a flag if this is a comment line
+     */
+    static boolean isCommentLine(String line) {
+        String s = line.trim();
+        // blank lines are also treated as comment lines
+        return s.length() < 1 || COMMENT_CHARS.indexOf(s.charAt(0)) >= 0;
+    }
+
+    /**
+     * <p>Checks if the value is in the given array.</p>
+     *
+     * <p>The method returns <code>false</code> if a <code>null</code> array is passed in.</p>
+     *
+     * @param array  the array to search through
+     * @param valueToFind  the value to find
+     * @return <code>true</code> if the array contains the object
+     */
+    public static boolean contains(char[] array, char valueToFind) {
+        if (array == null) {
+            return false;
+        }
+        for (int i = 0; i < array.length; i++) {
+            if (valueToFind == array[i]) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static final char   ESCAPE_CHAR = '\\';
+    private static final String DELIM_START = "${";
+    private static final String DELIM_STOP = "}";
+
+    private static final String CHECKSUM_SUFFIX = ".checksum";
+
+    /**
+     * Perform substitution on a property set
+     *
+     * @param properties the property set to perform substitution on
+     */
+    public static void performSubstitution(Map<String,String> properties)
+    {
+        for (String name : properties.keySet())
+        {
+            String value = properties.get(name);
+            properties.put(name, substVars(value, name, null, properties));
+        }
+    }
+
+    /**
+     * <p>
+     * This method performs property variable substitution on the
+     * specified value. If the specified value contains the syntax
+     * <tt>${&lt;prop-name&gt;}</tt>, where <tt>&lt;prop-name&gt;</tt>
+     * refers to either a configuration property or a system property,
+     * then the corresponding property value is substituted for the variable
+     * placeholder. Multiple variable placeholders may exist in the
+     * specified value as well as nested variable placeholders, which
+     * are substituted from inner most to outer most. Configuration
+     * properties override system properties.
+     * </p>
+     * @param val The string on which to perform property substitution.
+     * @param currentKey The key of the property being evaluated used to
+     *        detect cycles.
+     * @param cycleMap Map of variable references used to detect nested cycles.
+     * @param configProps Set of configuration properties.
+     * @return The value of the specified string after system property substitution.
+     * @throws IllegalArgumentException If there was a syntax error in the
+     *         property placeholder syntax or a recursive variable reference.
+     **/
+    public static String substVars(String val, String currentKey, Map<String,String> cycleMap, Map<String,String> configProps)
+        throws IllegalArgumentException
+    {
+        if (cycleMap == null)
+        {
+            cycleMap = new HashMap<String,String>();
+        }
+
+        // Put the current key in the cycle map.
+        cycleMap.put(currentKey, currentKey);
+
+        // Assume we have a value that is something like:
+        // "leading ${foo.${bar}} middle ${baz} trailing"
+
+        // Find the first ending '}' variable delimiter, which
+        // will correspond to the first deepest nested variable
+        // placeholder.
+        int stopDelim = val.indexOf(DELIM_STOP);
+        while (stopDelim > 0 && val.charAt(stopDelim - 1) == ESCAPE_CHAR)
+        {
+            stopDelim = val.indexOf(DELIM_STOP, stopDelim + 1);
+        }
+
+        // Find the matching starting "${" variable delimiter
+        // by looping until we find a start delimiter that is
+        // greater than the stop delimiter we have found.
+        int startDelim = val.indexOf(DELIM_START);
+        while (stopDelim >= 0)
+        {
+            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
+            if ((idx < 0) || (idx > stopDelim))
+            {
+                break;
+            }
+            else if (idx < stopDelim)
+            {
+                startDelim = idx;
+            }
+        }
+
+        // If we do not have a start or stop delimiter, then just
+        // return the existing value.
+        if ((startDelim < 0) || (stopDelim < 0))
+        {
+            return unescape(val);
+        }
+
+        // At this point, we have found a variable placeholder so
+        // we must perform a variable substitution on it.
+        // Using the start and stop delimiter indices, extract
+        // the first, deepest nested variable placeholder.
+        String variable = val.substring(startDelim + DELIM_START.length(), stopDelim);
+
+        // Verify that this is not a recursive variable reference.
+        if (cycleMap.get(variable) != null)
+        {
+            throw new IllegalArgumentException("recursive variable reference: " + variable);
+        }
+
+        // Get the value of the deepest nested variable placeholder.
+        // Try to configuration properties first.
+        String substValue = (String) ((configProps != null) ? configProps.get(variable) : null);
+        if (substValue == null)
+        {
+            // Ignore unknown property values.
+            substValue = variable.length() > 0 ? System.getProperty(variable, "") : "";
+        }
+
+        // Remove the found variable from the cycle map, since
+        // it may appear more than once in the value and we don't
+        // want such situations to appear as a recursive reference.
+        cycleMap.remove(variable);
+
+        // Append the leading characters, the substituted value of
+        // the variable, and the trailing characters to get the new
+        // value.
+        val = val.substring(0, startDelim) + substValue + val.substring(stopDelim + DELIM_STOP.length(), val.length());
+
+        // Now perform substitution again, since there could still
+        // be substitutions to make.
+        val = substVars(val, currentKey, cycleMap, configProps);
+
+        // Remove escape characters preceding {, } and \
+        val = unescape(val);
+
+        // Return the value.
+        return val;
+    }
+
+    private static String unescape(String val) {
+        int escape = val.indexOf(ESCAPE_CHAR);
+        while (escape >= 0 && escape < val.length() - 1)
+        {
+            char c = val.charAt(escape + 1);
+            if (c == '{' || c == '}' || c == ESCAPE_CHAR)
+            {
+                val = val.substring(0, escape) + val.substring(escape + 1);
+            }
+            escape = val.indexOf(ESCAPE_CHAR, escape + 1);
+        }
+        return val;
+    }
+
+    /**
+     * This class is used to read properties lines. These lines do
+     * not terminate with new-line chars but rather when there is no
+     * backslash sign a the end of the line.  This is used to
+     * concatenate multiple lines for readability.
+     */
+    public static class PropertiesReader extends LineNumberReader
+    {
+        /** Stores the comment lines for the currently processed property.*/
+        private List<String> commentLines;
+
+        /** Stores the value lines for the currently processed property.*/
+        private List<String> valueLines;
+
+        /** Stores the name of the last read property.*/
+        private String propertyName;
+
+        /** Stores the value of the last read property.*/
+        private String propertyValue;
+
+        /**
+         * Creates a new instance of <code>PropertiesReader</code> and sets
+         * the underlaying reader and the list delimiter.
+         *
+         * @param reader the reader
+         */
+        public PropertiesReader(Reader reader)
+        {
+            super(reader);
+            commentLines = new ArrayList<String>();
+            valueLines = new ArrayList<String>();
+        }
+
+        /**
+         * Reads a property line. Returns null if Stream is
+         * at EOF. Concatenates lines ending with "\".
+         * Skips lines beginning with "#" or "!" and empty lines.
+         * The return value is a property definition (<code>&lt;name&gt;</code>
+         * = <code>&lt;value&gt;</code>)
+         *
+         * @return A string containing a property value or null
+         *
+         * @throws java.io.IOException in case of an I/O error
+         */
+        public String readProperty() throws IOException
+        {
+            commentLines.clear();
+            valueLines.clear();
+            StringBuffer buffer = new StringBuffer();
+
+            while (true)
+            {
+                String line = readLine();
+                if (line == null)
+                {
+                    // EOF
+                    return null;
+                }
+
+                if (isCommentLine(line))
+                {
+                    commentLines.add(line);
+                    continue;
+                }
+
+                valueLines.add(line);
+                line = line.trim();
+
+                if (checkCombineLines(line))
+                {
+                    line = line.substring(0, line.length() - 1);
+                    buffer.append(line);
+                }
+                else
+                {
+                    buffer.append(line);
+                    break;
+                }
+            }
+            return buffer.toString();
+        }
+
+        /**
+         * Parses the next property from the input stream and stores the found
+         * name and value in internal fields. These fields can be obtained using
+         * the provided getter methods. The return value indicates whether EOF
+         * was reached (<b>false</b>) or whether further properties are
+         * available (<b>true</b>).
+         *
+         * @return a flag if further properties are available
+         * @throws java.io.IOException if an error occurs
+         */
+        public boolean nextProperty() throws IOException
+        {
+            String line = readProperty();
+
+            if (line == null)
+            {
+                return false; // EOF
+            }
+
+            // parse the line
+            String[] property = parseProperty(line);
+            propertyName = StringEscapeUtils.unescapeJava(property[0]);
+            propertyValue = StringEscapeUtils.unescapeJava(property[1]);
+            return true;
+        }
+
+        /**
+         * Returns the comment lines that have been read for the last property.
+         *
+         * @return the comment lines for the last property returned by
+         * <code>readProperty()</code>
+         */
+        public List<String> getCommentLines()
+        {
+            return commentLines;
+        }
+
+        /**
+         * Returns the value lines that have been read for the last property.
+         *
+         * @return the raw value lines for the last property returned by
+         * <code>readProperty()</code>
+         */
+        public List<String> getValueLines()
+        {
+            return valueLines;
+        }
+
+        /**
+         * Returns the name of the last read property. This method can be called
+         * after <code>{@link #nextProperty()}</code> was invoked and its
+         * return value was <b>true</b>.
+         *
+         * @return the name of the last read property
+         */
+        public String getPropertyName()
+        {
+            return propertyName;
+        }
+
+        /**
+         * Returns the value of the last read property. This method can be
+         * called after <code>{@link #nextProperty()}</code> was invoked and
+         * its return value was <b>true</b>.
+         *
+         * @return the value of the last read property
+         */
+        public String getPropertyValue()
+        {
+            return propertyValue;
+        }
+
+        /**
+         * Checks if the passed in line should be combined with the following.
+         * This is true, if the line ends with an odd number of backslashes.
+         *
+         * @param line the line
+         * @return a flag if the lines should be combined
+         */
+        private static boolean checkCombineLines(String line)
+        {
+            int bsCount = 0;
+            for (int idx = line.length() - 1; idx >= 0 && line.charAt(idx) == '\\'; idx--)
+            {
+                bsCount++;
+            }
+
+            return bsCount % 2 != 0;
+        }
+
+        /**
+         * Parse a property line and return the key and the value in an array.
+         *
+         * @param line the line to parse
+         * @return an array with the property's key and value
+         */
+        private static String[] parseProperty(String line)
+        {
+            // sorry for this spaghetti code, please replace it as soon as
+            // possible with a regexp when the Java 1.3 requirement is dropped
+
+            String[] result = new String[2];
+            StringBuffer key = new StringBuffer();
+            StringBuffer value = new StringBuffer();
+
+            // state of the automaton:
+            // 0: key parsing
+            // 1: antislash found while parsing the key
+            // 2: separator crossing
+            // 3: value parsing
+            int state = 0;
+
+            for (int pos = 0; pos < line.length(); pos++)
+            {
+                char c = line.charAt(pos);
+
+                switch (state)
+                {
+                    case 0:
+                        if (c == '\\')
+                        {
+                            state = 1;
+                        }
+                        else if (contains(WHITE_SPACE, c))
+                        {
+                            // switch to the separator crossing state
+                            state = 2;
+                        }
+                        else if (contains(SEPARATORS, c))
+                        {
+                            // switch to the value parsing state
+                            state = 3;
+                        }
+                        else
+                        {
+                            key.append(c);
+                        }
+
+                        break;
+
+                    case 1:
+                        if (contains(SEPARATORS, c) || contains(WHITE_SPACE, c))
+                        {
+                            // this is an escaped separator or white space
+                            key.append(c);
+                        }
+                        else
+                        {
+                            // another escaped character, the '\' is preserved
+                            key.append('\\');
+                            key.append(c);
+                        }
+
+                        // return to the key parsing state
+                        state = 0;
+
+                        break;
+
+                    case 2:
+                        if (contains(WHITE_SPACE, c))
+                        {
+                            // do nothing, eat all white spaces
+                            state = 2;
+                        }
+                        else if (contains(SEPARATORS, c))
+                        {
+                            // switch to the value parsing state
+                            state = 3;
+                        }
+                        else
+                        {
+                            // any other character indicates we encoutered the beginning of the value
+                            value.append(c);
+
+                            // switch to the value parsing state
+                            state = 3;
+                        }
+
+                        break;
+
+                    case 3:
+                        value.append(c);
+                        break;
+                }
+            }
+
+            result[0] = key.toString().trim();
+            result[1] = value.toString().trim();
+
+            return result;
+        }
+    } // class PropertiesReader
+
+    /**
+     * This class is used to write properties lines.
+     */
+    public static class PropertiesWriter extends FilterWriter
+    {
+        /**
+         * Constructor.
+         *
+         * @param writer a Writer object providing the underlying stream
+         */
+        public PropertiesWriter(Writer writer)
+        {
+            super(writer);
+        }
+
+        /**
+         * Writes the given property and its value.
+         *
+         * @param key the property key
+         * @param value the property value
+         * @throws java.io.IOException if an error occurs
+         */
+        public void writeProperty(String key, String value) throws IOException
+        {
+            write(escapeKey(key));
+            write(" = ");
+            write(StringEscapeUtils.escapeJava(value));
+            writeln(null);
+        }
+
+        /**
+         * Escape the separators in the key.
+         *
+         * @param key the key
+         * @return the escaped key
+         */
+        private String escapeKey(String key)
+        {
+            StringBuffer newkey = new StringBuffer();
+
+            for (int i = 0; i < key.length(); i++)
+            {
+                char c = key.charAt(i);
+
+                if (contains(SEPARATORS, c) || contains(WHITE_SPACE, c))
+                {
+                    // escape the separator
+                    newkey.append('\\');
+                    newkey.append(c);
+                }
+                else
+                {
+                    newkey.append(c);
+                }
+            }
+
+            return newkey.toString();
+        }
+
+        /**
+         * Helper method for writing a line with the platform specific line
+         * ending.
+         *
+         * @param s the content of the line (may be <b>null</b>)
+         * @throws java.io.IOException if an error occurs
+         */
+        public void writeln(String s) throws IOException
+        {
+            if (s != null)
+            {
+                write(s);
+            }
+            write(LINE_SEPARATOR);
+        }
+
+    } // class PropertiesWriter
+
+    /**
+     * TODO
+     */
+    protected static class Layout {
+
+        private List<String> commentLines;
+        private List<String> valueLines;
+
+        public Layout() {
+        }
+
+        public Layout(List<String> commentLines, List<String> valueLines) {
+            this.commentLines = commentLines;
+            this.valueLines = valueLines;
+        }
+
+        public List<String> getCommentLines() {
+            return commentLines;
+        }
+
+        public void setCommentLines(List<String> commentLines) {
+            this.commentLines = commentLines;
+        }
+
+        public List<String> getValueLines() {
+            return valueLines;
+        }
+
+        public void setValueLines(List<String> valueLines) {
+            this.valueLines = valueLines;
+        }
+
+        public void clearValue() {
+            this.valueLines = null;
+        }
+
+    } // class Layout
+
+}
\ No newline at end of file
diff --git a/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/StringEscapeUtils.java b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/StringEscapeUtils.java
new file mode 100644
index 0000000..ac0c984
--- /dev/null
+++ b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/StringEscapeUtils.java
@@ -0,0 +1,222 @@
+/*
+ * 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.karaf.util;
+
+import java.util.Locale;
+
+/**
+ * Util class to manipulate String, especially around escape/unescape.
+ */
+public class StringEscapeUtils {
+
+    /** Constant for the radix of hex numbers.*/
+    private static final int HEX_RADIX = 16;
+
+    /** Constant for the length of a unicode literal.*/
+    private static final int UNICODE_LEN = 4;
+
+    /**
+     * <p>Unescapes any Java literals found in the <code>String</code> to a
+     * <code>Writer</code>.</p> This is a slightly modified version of the
+     * StringEscapeUtils.unescapeJava() function in commons-lang that doesn't
+     * drop escaped separators (i.e '\,').
+     *
+     * @param str  the <code>String</code> to unescape, may be null
+     * @return the processed string
+     * @throws IllegalArgumentException if the Writer is <code>null</code>
+     */
+    public static String unescapeJava(String str) {
+        if (str == null) {
+            return null;
+        }
+        int sz = str.length();
+        StringBuffer out = new StringBuffer(sz);
+        StringBuffer unicode = new StringBuffer(UNICODE_LEN);
+        boolean hadSlash = false;
+        boolean inUnicode = false;
+        for (int i = 0; i < sz; i++) {
+            char ch = str.charAt(i);
+            if (inUnicode) {
+                // if in unicode, then we're reading unicode
+                // values in somehow
+                unicode.append(ch);
+                if (unicode.length() == UNICODE_LEN) {
+                    // unicode now contains the four hex digits
+                    // which represents our unicode character
+                    try {
+                        int value = Integer.parseInt(unicode.toString(), HEX_RADIX);
+                        out.append((char) value);
+                        unicode.setLength(0);
+                        inUnicode = false;
+                        hadSlash = false;
+                    } catch (NumberFormatException nfe) {
+                        throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe);
+                    }
+                }
+                continue;
+            }
+
+            if (hadSlash) {
+                // handle an escaped value
+                hadSlash = false;
+                switch (ch) {
+                    case '\\' :
+                        out.append('\\');
+                        break;
+                    case '\'' :
+                        out.append('\'');
+                        break;
+                    case '\"' :
+                        out.append('"');
+                        break;
+                    case 'r' :
+                        out.append('\r');
+                        break;
+                    case 'f' :
+                        out.append('\f');
+                        break;
+                    case 't' :
+                        out.append('\t');
+                        break;
+                    case 'n' :
+                        out.append('\n');
+                        break;
+                    case 'b' :
+                        out.append('\b');
+                        break;
+                    case 'u' :
+                        // uh-oh, we're in unicode country....
+                        inUnicode = true;
+                        break;
+                    default :
+                        out.append(ch);
+                        break;
+                }
+                continue;
+            } else if (ch == '\\') {
+                hadSlash = true;
+                continue;
+            }
+            out.append(ch);
+        }
+
+        if (hadSlash) {
+            // then we're in the weird case of a \ at the end of the
+            // string, let's output it anyway.
+            out.append('\\');
+        }
+
+        return out.toString();
+    }
+
+    /**
+     * <p>Escapes the characters in a <code>String</code> using Java String rules.</p>
+     *
+     * <p>Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) </p>
+     *
+     * <p>So a tab becomes the characters <code>'\\'</code> and
+     * <code>'t'</code>.</p>
+     *
+     * <p>The only difference between Java strings and JavaScript strings
+     * is that in JavaScript, a single quote must be escaped.</p>
+     *
+     * <p>Example:
+     * <pre>
+     * input string: He didn't say, "Stop!"
+     * output string: He didn't say, \"Stop!\"
+     * </pre>
+     * </p>
+     *
+     * @param str  String to escape values in, may be null
+     * @return String with escaped values, <code>null</code> if null string input
+     */
+    public static String escapeJava(String str) {
+        if (str == null) {
+            return null;
+        }
+        int sz = str.length();
+        StringBuffer out = new StringBuffer(sz * 2);
+        for (int i = 0; i < sz; i++) {
+            char ch = str.charAt(i);
+            // handle unicode
+            if (ch > 0xfff) {
+                out.append("\\u").append(hex(ch));
+            } else if (ch > 0xff) {
+                out.append("\\u0").append(hex(ch));
+            } else if (ch > 0x7f) {
+                out.append("\\u00").append(hex(ch));
+            } else if (ch < 32) {
+                switch (ch) {
+                    case '\b' :
+                        out.append('\\');
+                        out.append('b');
+                        break;
+                    case '\n' :
+                        out.append('\\');
+                        out.append('n');
+                        break;
+                    case '\t' :
+                        out.append('\\');
+                        out.append('t');
+                        break;
+                    case '\f' :
+                        out.append('\\');
+                        out.append('f');
+                        break;
+                    case '\r' :
+                        out.append('\\');
+                        out.append('r');
+                        break;
+                    default :
+                        if (ch > 0xf) {
+                            out.append("\\u00").append(hex(ch));
+                        } else {
+                            out.append("\\u000").append(hex(ch));
+                        }
+                        break;
+                }
+            } else {
+                switch (ch) {
+                    case '"' :
+                        out.append('\\');
+                        out.append('"');
+                        break;
+                    case '\\' :
+                        out.append('\\');
+                        out.append('\\');
+                        break;
+                    default :
+                        out.append(ch);
+                        break;
+                }
+            }
+        }
+        return out.toString();
+    }
+
+    /**
+     * <p>Returns an upper case hexadecimal <code>String</code> for the given
+     * character.</p>
+     *
+     * @param ch The character to convert.
+     * @return An upper case hexadecimal <code>String</code>
+     */
+    public static String hex(char ch) {
+        return Integer.toHexString(ch).toUpperCase(Locale.ENGLISH);
+    }
+
+}
diff --git a/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/process/PumpStreamHandler.java b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/process/PumpStreamHandler.java
new file mode 100644
index 0000000..df54ddc
--- /dev/null
+++ b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/process/PumpStreamHandler.java
@@ -0,0 +1,248 @@
+/*
+ * 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.karaf.util.process;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+//
+// Based on Apache Ant 1.6.5
+//
+
+/**
+ * Copies standard output and error of children streams to standard output and error of the parent.
+ *
+ * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
+ */
+public class PumpStreamHandler
+{
+    private final InputStream in;
+
+    private final OutputStream out;
+
+    private final OutputStream err;
+
+    private final String name;
+
+    private StreamPumper outputPump;
+
+    private StreamPumper errorPump;
+
+    private StreamPumper inputPump;
+
+    //
+    // NOTE: May want to use a ThreadPool here, 3 threads per/pair seems kinda expensive :-(
+    //
+
+    public PumpStreamHandler(final InputStream in, final OutputStream out, final OutputStream err, String name) {
+        assert in != null;
+        assert out != null;
+        assert err != null;
+        assert name != null;
+
+        this.in = in;
+        this.out = out;
+        this.err = err;
+        this.name = name;
+    }
+
+    public PumpStreamHandler(final InputStream in, final OutputStream out, final OutputStream err) {
+        this(in, out, err, "<unknown>");
+    }
+
+    public PumpStreamHandler(final OutputStream out, final OutputStream err) {
+        this(null, out, err);
+    }
+
+    public PumpStreamHandler(final OutputStream outAndErr) {
+        this(outAndErr, outAndErr);
+    }
+
+    /**
+     * Set the input stream from which to read the standard output of the child.
+     */
+    public void setChildOutputStream(final InputStream in) {
+        assert in != null;
+
+        createChildOutputPump(in, out);
+    }
+
+    /**
+     * Set the input stream from which to read the standard error of the child.
+     */
+    public void setChildErrorStream(final InputStream in) {
+        assert in != null;
+
+        if (err != null) {
+            createChildErrorPump(in, err);
+        }
+    }
+
+    /**
+     * Set the output stream by means of which input can be sent to the child.
+     */
+    public void setChildInputStream(final OutputStream out) {
+        assert out != null;
+
+        if (in != null) {
+            inputPump = createInputPump(in, out, true);
+        }
+        else {
+            try {
+                out.close();
+            } catch (IOException e) { }
+        }
+    }
+
+    /**
+     * Attach to a child streams from the given process.
+     *
+     * @param p     The process to attach to.
+     */
+    public void attach(final Process p) {
+        assert p != null;
+
+        setChildInputStream(p.getOutputStream());
+        setChildOutputStream(p.getInputStream());
+        setChildErrorStream(p.getErrorStream());
+    }
+    /**
+     * Start pumping the streams.
+     */
+    public void start() {
+        if (outputPump != null) {
+            Thread thread = new Thread(outputPump);
+            thread.setDaemon(true);
+            thread.setName("Output pump for " + this.name);
+            thread.start();
+        }
+
+        if (errorPump != null) {
+            Thread thread = new Thread(errorPump);
+            thread.setDaemon(true);
+            thread.setName("Error pump for " + this.name);
+            thread.start();
+        }
+
+        if (inputPump != null) {
+            Thread thread = new Thread(inputPump);
+            thread.setDaemon(true);
+            thread.setName("Input pump for " + this.name);
+            thread.start();
+        }
+    }
+
+    /**
+     * Stop pumping the streams.
+     */
+    public void stop() {
+        if (outputPump != null) {
+            try {
+                outputPump.stop();
+                outputPump.waitFor();
+            }
+            catch (InterruptedException e) {
+                // ignore
+            }
+        }
+
+        if (errorPump != null) {
+            try {
+                errorPump.stop();
+                errorPump.waitFor();
+            }
+            catch (InterruptedException e) {
+                // ignore
+            }
+        }
+
+        if (inputPump != null) {
+            inputPump.stop();
+        }
+
+        try {
+            err.flush();
+        } catch (IOException e) { }
+        try {
+            out.flush();
+        } catch (IOException e) { }
+    }
+
+    /**
+     * Create the pump to handle child output.
+     */
+    protected void createChildOutputPump(final InputStream in, final OutputStream out) {
+        assert in != null;
+        assert out != null;
+
+        outputPump = createPump(in, out);
+    }
+
+    /**
+     * Create the pump to handle error output.
+     */
+    protected void createChildErrorPump(final InputStream in, final OutputStream out) {
+        assert in != null;
+        assert out != null;
+
+        errorPump = createPump(in, out);
+    }
+
+    /**
+     * Creates a stream pumper to copy the given input stream to the given output stream.
+     */
+    protected StreamPumper createPump(final InputStream in, final OutputStream out) {
+        assert in != null;
+        assert out != null;
+
+        return createPump(in, out, false);
+    }
+
+    /**
+     * Creates a stream pumper to copy the given input stream to the
+     * given output stream.
+     *
+     * @param in                    The input stream to copy from.
+     * @param out                   The output stream to copy to.
+     * @param closeWhenExhausted    If true close the inputstream.
+     * @return                      A thread object that does the pumping.
+     */
+    protected StreamPumper createPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
+        assert in != null;
+        assert out != null;
+
+        StreamPumper pumper = new StreamPumper(in, out, closeWhenExhausted);
+        return pumper;
+    }
+
+    /**
+     * Creates a stream pumper to copy the given input stream to the
+     * given output stream. Used for standard input.
+     */
+    protected StreamPumper createInputPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
+        assert in != null;
+        assert out != null;
+
+        StreamPumper pumper = new StreamPumper(in, out, closeWhenExhausted);
+        pumper.setAutoflush(true);
+        return pumper;
+    }
+}
diff --git a/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/process/StreamPumper.java b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/process/StreamPumper.java
new file mode 100644
index 0000000..b0b35a5
--- /dev/null
+++ b/karaf-2.2.x/util/src/main/java/org/apache/karaf/util/process/StreamPumper.java
@@ -0,0 +1,206 @@
+/*
+ * 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.karaf.util.process;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+//
+// Based on Apache Ant 1.6.5
+//
+
+/**
+ * Copies all data from an input stream to an output stream.
+ *
+ * @version $Rev: 705608 $ $Date: 2008-10-17 15:28:45 +0200 (Fri, 17 Oct 2008) $
+ */
+public class StreamPumper
+    implements Runnable
+{
+    private InputStream in;
+
+    private OutputStream out;
+
+    private volatile boolean finish;
+
+    private volatile boolean finished;
+
+    private boolean closeWhenExhausted;
+
+    private boolean autoflush;
+
+    private Throwable exception;
+
+    private int bufferSize = 128;
+
+    private boolean started;
+
+    /**
+     * Create a new stream pumper.
+     *
+     * @param in                    Input stream to read data from
+     * @param out                   Output stream to write data to.
+     * @param closeWhenExhausted    If true, the output stream will be closed when
+     *                              the input is exhausted.
+     */
+    public StreamPumper(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
+        assert in != null;
+        assert out != null;
+
+        this.in = in;
+        this.out = out;
+        this.closeWhenExhausted = closeWhenExhausted;
+    }
+
+    /**
+     * Create a new stream pumper.
+     *
+     * @param in    Input stream to read data from
+     * @param out   Output stream to write data to.
+     */
+    public StreamPumper(final InputStream in, final OutputStream out) {
+        this(in, out, false);
+    }
+
+    /**
+     * Set whether data should be flushed through to the output stream.
+     *
+     * @param autoflush     If true, push through data; if false, let it be buffered
+     */
+    public void setAutoflush(boolean autoflush) {
+        this.autoflush = autoflush;
+    }
+
+    /**
+     * Copies data from the input stream to the output stream.
+     *
+     * Terminates as soon as the input stream is closed or an error occurs.
+     */
+    public void run() {
+        synchronized (this) {
+            started = true;
+        }
+        finished = false;
+        finish = false;
+
+        final byte[] buf = new byte[bufferSize];
+
+        int length;
+        try {
+            do {
+                while (in.available() > 0) {
+                    length = in.read(buf);
+                    if (length < 1 ) {
+                        break;
+                    }
+                    out.write(buf, 0, length);
+                    if (autoflush) {
+                        out.flush();
+                    }
+                }
+                out.flush();
+                Thread.sleep(200);  // Pause to avoid tight loop if external proc is slow
+            } while (!finish);
+        }
+        catch (Throwable t) {
+            synchronized (this) {
+                exception = t;
+            }
+        }
+        finally {
+            if (closeWhenExhausted) {
+                try {
+                    out.close();
+                } catch (IOException e) { }
+            }
+            finished = true;
+
+            synchronized (this) {
+                notifyAll();
+            }
+        }
+    }
+
+    /**
+     * Tells whether the end of the stream has been reached.
+     *
+     * @return true     If the stream has been exhausted.
+     */
+    public boolean isFinished() {
+        return finished;
+    }
+
+    /**
+     * This method blocks until the stream pumper finishes.
+     *
+     * @see #isFinished()
+     */
+    public synchronized void waitFor() throws InterruptedException {
+        while (!isFinished()) {
+            wait();
+        }
+    }
+
+    /**
+     * Set the size in bytes of the read buffer.
+     *
+     * @param bufferSize the buffer size to use.
+     * @throws IllegalStateException if the StreamPumper is already running.
+     */
+    public synchronized void setBufferSize(final int bufferSize) {
+        if (started) {
+            throw new IllegalStateException("Cannot set buffer size on a running StreamPumper");
+        }
+
+        this.bufferSize = bufferSize;
+    }
+
+    /**
+     * Get the size in bytes of the read buffer.
+     *
+     * @return The size of the read buffer.
+     */
+    public synchronized int getBufferSize() {
+        return bufferSize;
+    }
+
+    /**
+     * Get the exception encountered, if any.
+     *
+     * @return The Exception encountered; or null if there was none.
+     */
+    public synchronized Throwable getException() {
+        return exception;
+    }
+
+    /**
+     * Stop the pumper as soon as possible.
+     *
+     * Note that it may continue to block on the input stream
+     * but it will really stop the thread as soon as it gets EOF
+     * or any byte, and it will be marked as finished.
+     */
+    public synchronized void stop() {
+        finish = true;
+
+        notifyAll();
+    }
+}
diff --git a/karaf-2.2.x/util/src/test/java/org/apache/karaf/util/DeployerUtilsTest.java b/karaf-2.2.x/util/src/test/java/org/apache/karaf/util/DeployerUtilsTest.java
new file mode 100644
index 0000000..6783790
--- /dev/null
+++ b/karaf-2.2.x/util/src/test/java/org/apache/karaf/util/DeployerUtilsTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.util;
+
+import junit.framework.TestCase;
+
+public class DeployerUtilsTest extends TestCase {
+
+    public void testVersions() {
+        assertVersion("org.apache.servicemix.bundles.ant-1.7.0-1.0-m3-SNAPSHOT.jar",
+                      "org.apache.servicemix.bundles.ant-1.7.0", "1.0.0.m3-SNAPSHOT", "jar");
+        assertVersion("org.apache.activemq.core-1.0-SNAPSHOT.xml",
+                      "org.apache.activemq.core", "1.0.0.SNAPSHOT", "xml");
+        assertVersion("org.apache.activemq.core-1.0.0-SNAPSHOT.xml",
+                      "org.apache.activemq.core", "1.0.0.SNAPSHOT", "xml");
+        assertVersion("org.apache.activemq.core-1.0.0.xml",
+                      "org.apache.activemq.core", "1.0.0", "xml");
+        assertVersion("geronimo-servlet_2.5_spec-1.1.2.jar",
+                      "geronimo-servlet_2.5_spec", "1.1.2", "jar");
+        assertVersion("spring-aop-2.5.1.jar",
+                      "spring-aop", "2.5.1", "jar");
+    }
+
+    private void assertVersion(String s, String... expectedParts) {
+        String[] parts = DeployerUtils.extractNameVersionType(s);
+        assertEquals(expectedParts.length, parts.length);
+        for (int i = 0; i < expectedParts.length; i++) {
+            assertEquals(expectedParts[i], parts[i]);
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/util/src/test/java/org/apache/karaf/util/PropertiesTest.java b/karaf-2.2.x/util/src/test/java/org/apache/karaf/util/PropertiesTest.java
new file mode 100644
index 0000000..677005c
--- /dev/null
+++ b/karaf-2.2.x/util/src/test/java/org/apache/karaf/util/PropertiesTest.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.karaf.util;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import junit.framework.TestCase;
+
+/**
+ * <p>
+ * Unit tests on <code>Properties</code>.
+ * </p>
+ * 
+ * @author jbonofre
+ */
+public class PropertiesTest extends TestCase {
+
+    private final static String TEST_PROPERTIES_FILE = "test.properties";
+    
+    private Properties properties;
+    
+    /*
+     * (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    public void setUp() throws Exception {
+        properties = new Properties();
+        properties.load(this.getClass().getClassLoader().getResourceAsStream(TEST_PROPERTIES_FILE));
+    }
+    
+    /**
+     * <p>
+     * Test getting property.
+     * </p>
+     * 
+     * @throws Exception
+     */
+    public void testGettingProperty() throws Exception {
+        assertEquals("test", properties.get("test"));
+    }
+    
+    public void testLoadSave() throws IOException {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        pw.println("# ");
+        pw.println("# The Main  ");
+        pw.println("# ");
+        pw.println("# Comment ");
+        pw.println("# ");
+        pw.println("");
+        pw.println("# Another comment");
+        pw.println("");
+        pw.println("# A value comment");
+        pw.println("key1 = val1");
+        pw.println("");
+        pw.println("# Another value comment");
+        pw.println("key2 = ${key1}/foo");
+        pw.println("");
+        pw.println("# A third comment");
+        pw.println("key3 = val3");
+        pw.println("");
+
+
+        Properties props = new Properties();
+        props.load(new StringReader(sw.toString()));
+        props.save(System.err);
+        System.err.println("=====");
+
+        props.put("key2", props.get("key2"));
+        props.put("key3", "foo");
+        props.save(System.err);
+        System.err.println("=====");
+    }
+}
diff --git a/karaf-2.2.x/util/src/test/resources/test.properties b/karaf-2.2.x/util/src/test/resources/test.properties
new file mode 100644
index 0000000..2856e72
--- /dev/null
+++ b/karaf-2.2.x/util/src/test/resources/test.properties
@@ -0,0 +1,21 @@
+##---------------------------------------------------------------------------
+##  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.
+##---------------------------------------------------------------------------
+#
+# test.properties
+# Used in the PropertiesTest
+#
+test=test
\ No newline at end of file
diff --git a/karaf-2.2.x/webconsole/admin/NOTICE b/karaf-2.2.x/webconsole/admin/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/webconsole/admin/pom.xml b/karaf-2.2.x/webconsole/admin/pom.xml
new file mode 100644
index 0000000..71d7842
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/pom.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.webconsole</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.webconsole.admin</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Web Console :: Admin Plugin</name>
+    <description>This bundle provides Karaf admin support in the Web Console.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.admin</groupId>
+            <artifactId>org.apache.karaf.admin.core</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20070829</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- Only needed while running the unit tests -->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>${commons-fileupload.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>*</Import-Package>
+                        <Embed-Dependency>
+                            <!-- Required for JSON data transfer -->
+                            <!-- TODO: this needs to be put in a common place for reuse. -->
+                            json
+                        </Embed-Dependency>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/webconsole/admin/src/main/java/org/apache/karaf/webconsole/admin/AdminPlugin.java b/karaf-2.2.x/webconsole/admin/src/main/java/org/apache/karaf/webconsole/admin/AdminPlugin.java
new file mode 100644
index 0000000..dd4b140
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/src/main/java/org/apache/karaf/webconsole/admin/AdminPlugin.java
@@ -0,0 +1,380 @@
+/*
+ *  Copyright 2009 Marcin.
+ * 
+ *  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.
+ *  under the License.
+ */
+package org.apache.karaf.webconsole.admin;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.InstanceSettings;
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.json.JSONException;
+import org.json.JSONWriter;
+import org.osgi.framework.BundleContext;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Felix Web Console plugin for interacting with the {@link AdminService}
+ */
+public class AdminPlugin extends AbstractWebConsolePlugin {
+
+    private final org.slf4j.Logger logger = LoggerFactory.getLogger(AdminPlugin.class);
+
+    public static final String NAME = "admin";
+    public static final String LABEL = "Admin";
+    private String adminJs = "/admin/res/ui/admin.js";
+    private BundleContext bundleContext;
+    private AdminService adminService;
+    private ClassLoader classLoader;
+
+    /**
+     * Blueprint lifecycle callback methods
+     */
+    public void start() {
+        super.activate(bundleContext);
+        this.classLoader = this.getClass().getClassLoader();
+        this.logger.info(LABEL + " plugin activated");
+    }
+
+    public void stop() {
+        this.logger.info(LABEL + " plugin deactivated");
+        super.deactivate();
+    }
+
+    @Override
+    public String getTitle() {
+        return LABEL;
+    }
+
+    @Override
+    public String getLabel() {
+        return NAME;
+    }
+
+    @Override
+    protected void renderContent(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
+        final PrintWriter pw = res.getWriter();
+
+        String appRoot = (String) req.getAttribute("org.apache.felix.webconsole.internal.servlet.OsgiManager.appRoot");
+        final String adminScriptTag = "<script src='" + appRoot + this.adminJs + "' language='JavaScript'></script>";
+        pw.println(adminScriptTag);
+
+        pw.println("<script type='text/javascript'>");
+        pw.println("// <![CDATA[");
+        pw.println("var imgRoot = '" + appRoot + "/res/imgs';");
+        pw.println("// ]]>");
+        pw.println("</script>");
+
+        pw.println("<div id='plugin_content'/>");
+
+        pw.println("<script type='text/javascript'>");
+        pw.println("// <![CDATA[");
+        pw.print("renderAdmin( ");
+        writeJSON(pw);
+        pw.println(" )");
+        pw.println("// ]]>");
+        pw.println("</script>");
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
+        boolean success = false;
+
+        String action = req.getParameter("action");
+        String name = req.getParameter("name");
+
+        if (action == null) {
+            success = true;
+        } else if ("create".equals(action)) {
+            int sshPort = parsePortNumber(req.getParameter("sshPort"));
+            int rmiRegistryPort = parsePortNumber(req.getParameter("rmiRegistryPort"));
+            int rmiServerPort = parsePortNumber(req.getParameter("rmiServerPort"));
+            String location = parseString(req.getParameter("location"));
+            String javaOpts = parseString(req.getParameter("javaOpts"));
+            List<String> featureURLs = parseStringList(req.getParameter("featureURLs"));
+            List<String> features = parseStringList(req.getParameter("features"));
+            InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, featureURLs, features);
+            success = createInstance(name, settings);
+        } else if ("destroy".equals(action)) {
+            success = destroyInstance(name);
+        } else if ("start".equals(action)) {
+            String javaOpts = req.getParameter("javaOpts");
+            success = startInstance(name, javaOpts);
+        } else if ("stop".equals(action)) {
+            success = stopInstance(name);
+        }
+
+        if (success) {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+            }
+            this.renderJSON(res, null);
+        } else {
+            super.doPost(req, res);
+        }
+    }
+
+    /*
+     * Parse the String value, returning <code>null</code> if the String is empty 
+     */
+    private String parseString(String value) {
+        if (value != null && value.trim().length() == 0) {
+            value = null;
+        }
+        return value;
+    }
+    
+    private List<String> parseStringList(String value) {
+        List<String> list = new ArrayList<String>();
+        if (value != null) {
+            for (String el : value.split(",")) {
+                String trimmed = el.trim();
+                if (trimmed.length() == 0) {
+                    continue;
+                }
+                list.add(trimmed);
+            }            
+        }
+        return list;
+    }
+
+    /*
+     * Parse the port number for the String given, returning 0 if the String does not represent an integer 
+     */
+    private int parsePortNumber(String port) {
+        try {
+            return Integer.parseInt(port);
+        } catch (NumberFormatException e) {
+            return 0;
+        }
+    }
+
+    protected URL getResource(String path) {
+        path = path.substring(NAME.length() + 1);
+        URL url = this.classLoader.getResource(path);
+        if (url != null) {
+            InputStream ins = null;
+            try {
+                ins = url.openStream();
+                if (ins == null) {
+                    this.logger.error("failed to open " + url);
+                    url = null;
+                }
+            } catch (IOException e) {
+                this.logger.error(e.getMessage(), e);
+                url = null;
+            } finally {
+                if (ins != null) {
+                    try {
+                        ins.close();
+                    } catch (IOException e) {
+                        this.logger.error(e.getMessage(), e);
+                    }
+                }
+            }
+        } 
+        return url;
+    }
+
+    private void renderJSON(final HttpServletResponse response, final String feature) throws IOException {
+        response.setContentType("application/json");
+        response.setCharacterEncoding("UTF-8");
+
+        final PrintWriter pw = response.getWriter();
+        writeJSON(pw);
+    }
+
+    private void writeJSON(final PrintWriter pw) {
+        final JSONWriter jw = new JSONWriter(pw);
+        final Instance[] instances = adminService.getInstances();
+        try {
+            jw.object();
+            jw.key("status");
+            jw.value(getStatusLine());
+            jw.key("instances");
+            jw.array();
+            for (Instance i : instances) {
+//                if (!i.isRoot()) {
+                    instanceInfo(jw, i);
+//                }
+            }
+            jw.endArray();
+            jw.endObject();
+        } catch (JSONException ex) {
+            Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+        } catch (Exception ex) {
+            Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+        }
+    }
+
+    private void instanceInfo(JSONWriter jw, Instance instance) throws JSONException, Exception {
+        jw.object();
+        jw.key("pid");
+        jw.value(instance.getPid());
+        jw.key("name");
+        jw.value(instance.getName());
+        jw.key("sshPort");
+        jw.value(instance.getSshPort());
+        jw.key("rmiRegistryPort");
+        jw.value(instance.getRmiRegistryPort());
+        jw.key("rmiServerPort");
+        jw.value(instance.getRmiServerPort());
+        jw.key("state");
+        jw.value(instance.getState());
+        jw.key("location");
+        jw.value(instance.getJavaOpts() != null ? instance.getJavaOpts() : "");
+        jw.key("javaopts");
+        jw.value(instance.getLocation());
+        jw.key("actions");
+        jw.array();
+        action(jw, "destroy", "Destroy", "delete");
+        if (instance.getState().equals(Instance.STARTED)) {
+            action(jw, "stop", "Stop", "stop");
+        } else if (instance.getState().equals(Instance.STARTING)) {
+            action(jw, "stop", "Stop", "stop");
+        } else if (instance.getState().equals(Instance.STOPPED)) {
+            action(jw, "start", "Start", "start");
+        }
+        jw.endArray();
+        jw.endObject();
+    }
+
+    private void action(JSONWriter jw, String op, String title, String image) throws JSONException {
+        jw.object();
+        jw.key("op").value(op);
+        jw.key("title").value(title);
+        jw.key("image").value(image);
+        jw.endObject();
+    }
+
+    private String getStatusLine() {
+        final Instance[] instances = adminService.getInstances();
+        int started = 0, starting = 0, stopped = 0;
+        for (Instance instance : instances) {
+            try {
+                if (instance.getState().equals(Instance.STARTED)) {
+                    started++;
+                } else if (instance.getState().equals(Instance.STARTING)) {
+                    starting++;
+                } else if (instance.getState().equals(Instance.STOPPED)) {
+                    stopped++;
+                }
+            } catch (Exception ex) {
+                Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        }
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append("Instance information: ");
+        buffer.append(instances.length);
+        buffer.append(" instance");
+        if (instances.length != 1) {
+            buffer.append('s');
+        }
+        buffer.append(" in total");
+        if (started == instances.length) {
+            buffer.append(" - all started");
+        } else {
+            if (started != 0) {
+                buffer.append(", ");
+                buffer.append(started);
+                buffer.append(" started");
+            }
+            if (starting != 0) {
+                buffer.append(", ");
+                buffer.append(starting);
+                buffer.append(" starting");
+            }
+            buffer.append('.');
+        }
+        return buffer.toString();
+    }
+
+    private boolean createInstance(String name, InstanceSettings settings) {
+        try {
+            adminService.createInstance(name, settings);
+            return true;
+        } catch (Exception ex) {
+            Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return false;
+    }
+
+    private boolean destroyInstance(String name) {
+        try {
+            Instance instance = adminService.getInstance(name);
+            if (instance != null) {
+                instance.destroy();
+                return true;
+            }
+        } catch (Exception ex) {
+            Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return false;
+    }
+
+    private boolean startInstance(String name, String javaOpts) {
+        try {
+            Instance instance = adminService.getInstance(name);
+            if (instance != null) {
+                instance.start(javaOpts);
+                return true;
+            }
+        } catch (Exception ex) {
+            Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return false;
+    }
+
+    private boolean stopInstance(String name) {
+        try {
+            Instance instance = adminService.getInstance(name);
+            if (instance != null) {
+                instance.stop();
+                return true;
+            }
+        } catch (Exception ex) {
+            Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);
+        }
+        return false;
+    }
+
+    /**
+     * @param adminService the adminService to set
+     */
+    public void setAdminService(AdminService adminService) {
+        this.adminService = adminService;
+    }
+
+    /**
+     * @param bundleContext the bundleContext to set
+     */
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+}
diff --git a/karaf-2.2.x/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml b/karaf-2.2.x/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
new file mode 100644
index 0000000..dec11cd
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
@@ -0,0 +1,35 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <reference id="adminService" interface="org.apache.karaf.admin.AdminService" />
+
+    <bean id="adminPlugin" class="org.apache.karaf.webconsole.admin.AdminPlugin" init-method="start" destroy-method="stop">
+        <property name="adminService" ref="adminService" />
+        <property name="bundleContext" ref="blueprintBundleContext" />
+    </bean>
+
+    <service ref="adminPlugin" interface="javax.servlet.Servlet" >
+        <service-properties>
+            <entry key="felix.webconsole.label" value="admin"/>
+        </service-properties>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/webconsole/admin/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/webconsole/admin/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..158ad6d
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,14 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides usage of admin commands (to manipulate Karaf instances) in the
+    Karaf Web Console.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mWeb console\u001B[0m section in the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/webconsole/admin/src/main/resources/res/ui/admin.js b/karaf-2.2.x/webconsole/admin/src/main/resources/res/ui/admin.js
new file mode 100644
index 0000000..7489865
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/src/main/resources/res/ui/admin.js
@@ -0,0 +1,160 @@
+/*
+ * 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.
+ */
+
+function renderAdmin( data ) {
+    $(document).ready( function() {
+        renderView();
+        renderData( data );
+    } );
+}
+
+function renderView() {
+    renderStatusLine();
+    var txt = "<form method='post'><div class='ui-widget-header ui-corner-top buttonGroup'><table id='create_instance_table' class='nicetable ui-widget'><thead>" +
+    "<tr><input type='hidden' name='action' value='create'/>" +
+    "<th>Name: <input id='name' type='text' name='name' style='width:70%' colspan='2'/></th>" +
+    "<th>SSH Port: <input id='sshPort' type='text' name='sshPort' style='width:70%' colspan='2'/></th>" +
+    "<th>RMI Registry Port: <input id='rmiRegistryPort' type='text' name='rmiRegistryPort' style='width:70%' colspan='2'/></th>" +
+    "<th>RMI Server Port: <input id='rmiServerPort' type='text' name='rmiServerPort' style='width:70%' colspan='2'/></th>" +
+    "<th>Location: <input id='location' type='text' name='location' style='width:70%' colspan='2'/></th>" +
+    "<th>JavaOpts: <input id='javaOpts' type='text' name='javaOpts' style='width:70%' colspan='2'/></th>" +
+    "<th />" +
+    "</tr><tr><th>Features: <input id='features' type='text' name='features' style='width:70%' colspan='2'" + 
+    " title='Specify initial features separated by commas.'/></th>" + 
+    "<th colspan='2'>Feature URLs: <input id='featureURLs' type='text' name='featureURLs' style='width:80%' colspan='2'" + 
+    " title='Specify additional feature URLs separate by commas.'/></th>" +
+    "<th class='col_Actions'><input type='button' value='Create' onclick='createInstance()'/></th>" +
+    "</tr></thead></table></div></form>";
+    $("#plugin_content").append( txt );
+    renderTable( "Karaf Instances", "instances_table", ["Pid", "Name", "SSH Port", "RMI Registry Port", "RMI Server Port", "State", "JavaOpts", "Location", "Actions"] );
+    renderStatusLine();
+}
+
+function createInstance() {
+    var name = document.getElementById( "name" ).value;
+    var sshPort = document.getElementById( "sshPort" ).value;
+    var rmiRegistryPort = document.getElementById("rmiRegistryPort").value;
+    var rmiServerPort = document.getElementById("rmiServerPort").value;
+    var location = document.getElementById( "location" ).value;
+    var javaOpts = document.getElementById( "javaOpts" ).value;
+    var features = document.getElementById( "features" ).value;
+    var featureURLs = document.getElementById( "featureURLs" ).value;
+    postCreateInstance( name, sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, features, featureURLs );
+}
+
+function postCreateInstance( /* String */ name, /* String */ sshPort, /* String */ rmiRegistryPort, /* String */ rmiServerPort,  /* String */ location,
+		/* String */ javaOpts, /* String */ features, /* String */ featureURLs ) {
+    $.post( pluginRoot, {"action": "create", "name": name, "sshPort": sshPort, "rmiRegistryPort": rmiRegistryPort, "rmiServerPort": rmiServerPort, "location": location,
+                             "javaOpts": javaOpts, "features": features, "featureURLs": featureURLs }, function( data ) {
+        renderData( data );
+    }, "json" );
+}
+
+function renderStatusLine() {
+    $("#plugin_content").append( "<div class='fullwidth'><div class='statusline'/></div>" );
+}
+
+function renderTable( /* String */ title, /* String */ id, /* array of Strings */ columns ) {
+    var txt = "<table class='ui-widget-header nicetable noauto ui-widget'><thead><tr>" +
+    "<th>" +
+    title + "</th></tr></thead></table>" +
+    "<table id='" + id + "' class='tablesorter nicetable noauto ui-widget'><thead><tr>";
+    for ( var name in columns ) {
+        txt = txt + "<th class='col_" + columns[name] + " ui-widget-header header' >" + columns[name] + "</th>";
+    }
+    txt = txt + "</tr></thead><tbody></tbody></table>";
+    $("#plugin_content").append( txt );
+}
+
+function renderData( /* Object */ data ) {
+    renderStatusData( data.status );
+    renderInstancesTableData( data.instances );
+    $("#instances_table").tablesorter( {
+        headers: {
+            5: { 
+                sorter: false
+            }
+        },
+        sortList: [[0,0]],
+    } );
+}
+
+function renderStatusData( /* String */ status )  {
+    $(".statusline").empty().append( status );
+}
+
+function renderInstancesTableData( /* array of Objects */ instances ) {
+    $("#instances_table > tbody > tr").remove();
+    for ( var idx in instances ) {
+        var trElement = tr( null, { 
+            id: instances[idx].pid
+        } );
+        renderInstanceData( trElement, instances[idx] );
+        $("#instances_table > tbody").append( trElement );
+    }
+    $("#instances_table").trigger( "update" );
+}
+
+function renderInstanceData( /* Element */ parent, /* Object */ instance ) {
+    parent.appendChild( td( null, null, [ text( instance.pid ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.name ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.sshPort ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.rmiRegistryPort ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.rmiServerPort ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.state ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.location ) ] ) );
+    parent.appendChild( td( null, null, [ text( instance.javaOpts ) ] ) );
+    var actionsTd = td( null, null );
+    var div = createElement( "div", null, {
+        style: { 
+            "text-align": "left"
+        }
+    } );
+    actionsTd.appendChild( div );
+
+    for ( var a in instance.actions ) {
+        instanceButton( div, instance.name, instance.actions[a] );
+    }
+    parent.appendChild( actionsTd );
+}
+
+function instanceButton( /* Element */ parent, /* String */ name, /* Obj */ action ) {
+    var input = createElement( "input", null, {
+        type: 'image',
+        style: {
+            "margin-left": "10px"
+        },
+        title: action.title,
+        alt: action.title,
+        src: imgRoot + '/bundle_' + action.image + '.png'
+    } );
+    $(input).click( function() {
+        changeInstanceState( action.op, name )
+    } );
+    parent.appendChild( input );
+}
+
+function changeInstanceState( /* String */ action, /* String */ name) {
+    $.post( pluginRoot, {
+        "action": action,
+        "name": name
+    }, function( data ) {
+        renderData( data );
+    }, "json" );
+}
+
+
diff --git a/karaf-2.2.x/webconsole/admin/src/test/java/org/apache/karaf/webconsole/admin/AdminPluginTest.java b/karaf-2.2.x/webconsole/admin/src/test/java/org/apache/karaf/webconsole/admin/AdminPluginTest.java
new file mode 100644
index 0000000..7b777de
--- /dev/null
+++ b/karaf-2.2.x/webconsole/admin/src/test/java/org/apache/karaf/webconsole/admin/AdminPluginTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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.karaf.webconsole.admin;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.TestCase;
+
+import org.apache.karaf.admin.AdminService;
+import org.apache.karaf.admin.Instance;
+import org.apache.karaf.admin.InstanceSettings;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+
+public class AdminPluginTest extends TestCase {
+    public void testParseStringList() throws Exception {
+        assertEquals(Arrays.asList("a", "b"), testParseStringList(" a ,b"));
+        assertEquals(Collections.emptyList(), testParseStringList(null));
+        assertEquals(Arrays.asList("hello"), testParseStringList("hello"));
+        assertEquals(Arrays.asList("b"), testParseStringList(",b,"));
+    }
+    
+    @SuppressWarnings("unchecked")
+    private List<String> testParseStringList(String s) throws Exception {
+        AdminPlugin ap = new AdminPlugin();
+        Method m = ap.getClass().getDeclaredMethod("parseStringList", new Class [] {String.class});
+        m.setAccessible(true);
+        return (List<String>) m.invoke(ap, s);
+    }
+    
+    public void testDoPostCreate() throws Exception {
+        InstanceSettings is = 
+            new InstanceSettings(123, 456, 789,  null, null, Collections.singletonList("http://someURL"), Arrays.asList("abc", "def"));
+        AdminService adminService = EasyMock.createMock(AdminService.class);
+        EasyMock.expect(adminService.createInstance("instance1", is)).andReturn(null);
+        EasyMock.expect(adminService.getInstances()).andReturn(new Instance[] {}).anyTimes();
+        EasyMock.replay(adminService);
+        
+        AdminPlugin ap = new AdminPlugin();
+        ap.setAdminService(adminService);
+
+        final Map<String, String> params = new HashMap<String, String>();
+        params.put("action", "create");
+        params.put("name", "instance1");
+        params.put("sshPort", "123");
+        params.put("rmiRegistryPort", "456");
+        params.put("rmiServerPort", "789");
+        params.put("featureURLs", "http://someURL");
+        params.put("features", "abc,def");
+        HttpServletRequest req = EasyMock.createMock(HttpServletRequest.class);
+        EasyMock.expect(req.getParameter((String) EasyMock.anyObject())).andAnswer(new IAnswer<String>() {
+            public String answer() throws Throwable {
+                return params.get(EasyMock.getCurrentArguments()[0]);
+            }
+        }).anyTimes();
+        
+        HttpServletResponse res = EasyMock.createNiceMock(HttpServletResponse.class);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintWriter pw = new PrintWriter(baos);
+        EasyMock.expect(res.getWriter()).andReturn(pw);
+        
+        EasyMock.replay(req);
+        EasyMock.replay(res);
+        ap.doPost(req, res);        
+        EasyMock.verify(adminService);
+        
+        // Check that the operation has succeeded. This will cause some information to be written to 
+        // the outputstream...
+        pw.flush();
+        String s = new String(baos.toByteArray());
+        assertTrue(s.contains("instance"));
+    }
+}
diff --git a/karaf-2.2.x/webconsole/branding/NOTICE b/karaf-2.2.x/webconsole/branding/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/webconsole/branding/pom.xml b/karaf-2.2.x/webconsole/branding/pom.xml
new file mode 100644
index 0000000..fe15efa
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/pom.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+  
+    <parent>
+        <groupId>org.apache.karaf.webconsole</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.webconsole.branding</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Web Console :: Branding</name>
+    <description>This bundle provides Karaf branding for the Felix web console.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+          <groupId>org.apache.karaf.webconsole</groupId>
+          <artifactId>org.apache.karaf.webconsole.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>${felix.plugin.version}</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-DocURL>http://felix.apache.org/site/apache-karaf.html</Bundle-DocURL>
+                        <Fragment-Host>org.apache.karaf.webconsole.console;bundle-version="[2,3)"</Fragment-Host>
+                        <Export-Package>!*</Export-Package>
+                        <Import-Package>
+                            javax.servlet;version=2.4,
+                            javax.servlet.http;version=2.4,
+                            !org.apache.felix.webconsole*,*
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/webconsole/branding/src/main/java/org/apache/karaf/webconsole/JaasSecurityProvider.java b/karaf-2.2.x/webconsole/branding/src/main/java/org/apache/karaf/webconsole/JaasSecurityProvider.java
new file mode 100644
index 0000000..53e5774
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/java/org/apache/karaf/webconsole/JaasSecurityProvider.java
@@ -0,0 +1,213 @@
+/*
+ * 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.karaf.webconsole;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.GeneralSecurityException;
+import java.security.Principal;
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.AccountException;
+import javax.security.auth.login.FailedLoginException;
+import javax.security.auth.login.LoginContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.webconsole.WebConsoleSecurityProvider2;
+import org.apache.felix.webconsole.internal.KarafOsgiManager;
+import org.apache.felix.webconsole.internal.servlet.Base64;
+import org.osgi.service.http.HttpContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JaasSecurityProvider implements WebConsoleSecurityProvider2 {
+
+	private static final Logger LOG = LoggerFactory.getLogger(JaasSecurityProvider.class);
+
+    private static final String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
+
+    private static final String HEADER_AUTHORIZATION = "Authorization";
+
+    private static final String AUTHENTICATION_SCHEME_BASIC = "Basic";
+
+    private String realm;
+    private String role;
+
+    public String getRealm() {
+        return realm;
+    }
+
+    public void setRealm(String realm) {
+        this.realm = realm;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+    public Object authenticate(final String username, final String password) {
+        return doAuthenticate( username, password );
+    }
+
+    public Subject doAuthenticate(final String username, final String password) {
+        try {
+            Subject subject = new Subject();
+            LoginContext loginContext = new LoginContext(realm, subject, new CallbackHandler() {
+                public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+                    for (int i = 0; i < callbacks.length; i++) {
+                        if (callbacks[i] instanceof NameCallback) {
+                            ((NameCallback) callbacks[i]).setName(username);
+                        } else if (callbacks[i] instanceof PasswordCallback) {
+                            ((PasswordCallback) callbacks[i]).setPassword(password.toCharArray());
+                        } else {
+                            throw new UnsupportedCallbackException(callbacks[i]);
+                        }
+                    }
+                }
+            });
+            loginContext.login();
+            if (role != null && role.length() > 0) {
+                String clazz = "org.apache.karaf.jaas.modules.RolePrincipal";
+                String name = role;
+                int idx = role.indexOf(':');
+                if (idx > 0) {
+                    clazz = role.substring(0, idx);
+                    name = role.substring(idx + 1);
+                }
+                boolean found = false;
+                for (Principal p : subject.getPrincipals()) {
+                    if (p.getClass().getName().equals(clazz)
+                            && p.getName().equals(name)) {
+                        found = true;
+                        break;
+                    }
+                }
+                if (!found) {
+                    throw new FailedLoginException("User does not have the required role " + role);
+                }
+            }
+            return subject;
+        } catch (FailedLoginException e) {
+            LOG.debug("Login failed", e);
+            return null;
+        } catch (AccountException e) {
+            LOG.warn("Account failure", e);
+            return null;
+        } catch (GeneralSecurityException e) {
+            LOG.error("General Security Exception", e);
+            return null;
+        }
+    }
+
+    public boolean authorize(Object o, String s) {
+        return true;
+    }
+
+    public boolean authenticate( HttpServletRequest request, HttpServletResponse response )
+    {
+        // Return immediately if the header is missing
+        String authHeader = request.getHeader( HEADER_AUTHORIZATION );
+        if ( authHeader != null && authHeader.length() > 0 )
+        {
+
+            // Get the authType (Basic, Digest) and authInfo (user/password)
+            // from the header
+            authHeader = authHeader.trim();
+            int blank = authHeader.indexOf( ' ' );
+            if ( blank > 0 )
+            {
+                String authType = authHeader.substring( 0, blank );
+                String authInfo = authHeader.substring( blank ).trim();
+
+                // Check whether authorization type matches
+                if ( authType.equalsIgnoreCase( AUTHENTICATION_SCHEME_BASIC ) )
+                {
+                    try
+                    {
+                        String srcString = base64Decode( authInfo );
+                        int i = srcString.indexOf( ':' );
+                        String username = srcString.substring( 0, i );
+                        String password = srcString.substring( i + 1 );
+
+                        // authenticate
+                        Subject subject = doAuthenticate( username, password );
+                        if ( subject != null )
+                        {
+                            // as per the spec, set attributes
+                            request.setAttribute( HttpContext.AUTHENTICATION_TYPE, HttpServletRequest.BASIC_AUTH );
+                            request.setAttribute( HttpContext.REMOTE_USER, username );
+
+                            // set web console user attribute
+                            request.setAttribute( WebConsoleSecurityProvider2.USER_ATTRIBUTE, username );
+
+                            // set the JAAS subject
+                            request.setAttribute( KarafOsgiManager.SUBJECT_RUN_AS, subject );
+
+                            // succeed
+                            return true;
+                        }
+                    }
+                    catch ( Exception e )
+                    {
+                        // Ignore
+                    }
+                }
+            }
+        }
+
+        // request authentication
+        try
+        {
+            response.setHeader( HEADER_WWW_AUTHENTICATE, AUTHENTICATION_SCHEME_BASIC + " realm=\"" + this.realm + "\"" );
+            response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
+            response.setContentLength( 0 );
+            response.flushBuffer();
+        }
+        catch ( IOException ioe )
+        {
+            // failed sending the response ... cannot do anything about it
+        }
+
+        // inform HttpService that authentication failed
+        return false;
+    }
+
+
+    private static String base64Decode( String srcString )
+    {
+        byte[] transformed = Base64.decodeBase64(srcString);
+        try
+        {
+            return new String( transformed, "ISO-8859-1" );
+        }
+        catch ( UnsupportedEncodingException uee )
+        {
+            return new String( transformed );
+        }
+    }
+
+
+}
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/META-INF/webconsole.properties b/karaf-2.2.x/webconsole/branding/src/main/resources/META-INF/webconsole.properties
new file mode 100644
index 0000000..afdb30e
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/META-INF/webconsole.properties
@@ -0,0 +1,38 @@
+#
+#  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.
+#
+
+
+#
+# This file contains branding properties to overwrite the default
+# branding of the Apache Felix Web Console when deployed in an
+# Apache Karaf application.
+
+
+webconsole.brand.name = Apache Karaf Web Console
+
+webconsole.product.name = Apache Karaf
+webconsole.product.url = http://karaf.apache.org/
+webconsole.product.image = /res/karaf/imgs/logo.png
+
+webconsole.vendor.name = The Apache Software Foundation
+webconsole.vendor.url = http://www.apache.org
+webconsole.vendor.image = /res/karaf/imgs/logo.png
+
+webconsole.favicon = /res/karaf/imgs/favicon.ico
+webconsole.stylesheet = /res/karaf/ui/webconsole.css
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml
new file mode 100644
index 0000000..cf5abad
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml
@@ -0,0 +1,46 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
+           xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
+           default-activation="lazy">
+
+    <ext:property-placeholder placeholder-prefix="$[" placeholder-suffix="]">
+        <ext:default-properties>
+            <ext:property name="karaf.admin.role" value="admin" />
+        </ext:default-properties>
+    </ext:property-placeholder>
+
+
+    <cm:property-placeholder persistent-id="org.apache.karaf.webconsole">
+        <cm:default-properties>
+            <cm:property name="realm" value="karaf"/>
+            <cm:property name="role" value="$[karaf.admin.role]"/>
+        </cm:default-properties>
+    </cm:property-placeholder>
+
+    <bean id="securityProvider" class="org.apache.karaf.webconsole.JaasSecurityProvider">
+        <property name="realm" value="${realm}"/>
+        <property name="role" value="${role}"/>
+    </bean>
+
+    <service auto-export="interfaces" ref="securityProvider" />
+
+</blueprint>
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..ee2c5bd
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,15 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    Apache Karaf branding for the Apache Felix Web Console. This fragment attaches to the
+    org.apache.felix.webconsole bundle to provide branding through the
+    /META-INF/webconsole.properties.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mWeb console\u001B[0m section in the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties
new file mode 100644
index 0000000..f2fddfb
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.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.
+#
+
+#
+# This file contains localization strings for configuration labels and
+# descriptions as used in the metatype.xml descriptor
+
+webconsole.name = Apache Karaf WebConsole
+webconsole.description = Configuration of Apache Karaf WebConsole
+
+realm.name = Realm
+realm.description = The JAAS realm name to use for authentication
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml
new file mode 100644
index 0000000..f6abcfd
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml
@@ -0,0 +1,27 @@
+<?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.
+
+-->
+<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.0.0" localization="OSGI-INF/metatype/metatype">
+    <OCD id="org.apache.karaf.webconsole" name="%webconsole.name" description="%webconsole.description">
+        <AD id="realm" type="String" default="karaf" name="%realm.name" description="%realm.description"/>
+    </OCD>
+    <Designate pid="org.apache.karaf.webconsole">
+        <Object ocdref="org.apache.karaf.webconsole"/>
+    </Designate>
+</metatype:MetaData>
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico b/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico
new file mode 100644
index 0000000..cb02612
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico
Binary files differ
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png b/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png
new file mode 100644
index 0000000..066ab86
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png
Binary files differ
diff --git a/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css b/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css
new file mode 100644
index 0000000..a31e6bc
--- /dev/null
+++ b/karaf-2.2.x/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css
@@ -0,0 +1,175 @@
+/*
+ * 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 webconsole.css is the main CSS which sets up the following parts
+ *
+ *   div main -> outermost div just inside body
+ *   div lead -> the page lead with title and logo
+ *   div technav -> the top navigation
+ *   div content -> the div surrounding the content being rendered by
+ *      the plugin in the renderContent (or service) method
+ *
+ * See also http://felix.apache.org/site/branding-the-web-console.html
+ */
+#main {
+	width: 90% !important;
+	margin-left: 5%;
+}
+#main img { border: none }
+
+
+/* LOGO & BRANDING */
+#lead {
+	padding-top: 10px;
+	margin: 0;
+	height: 73px; /* must be the same as logo (#lead p) height */
+}
+#lead h1 { /* This contains the page title */
+	font-size: 26px;
+	font-weight: bold;
+	float: left;
+}
+#lead p { /* This contains the logo */
+	float: right;
+	height: 73px; /* must be the same as #lead height */
+}
+#lead p img { /* This is the logo */
+	height: 63px; /* must be #lead.height - #lead.padding-top */
+}
+
+
+/* TOP NAVIGATION */
+#technav {
+	font-size: 10px;
+	line-height: 21px;
+	padding: 0;
+	margin: 0;
+}
+#technav div {
+	display: inline;
+	padding: .2em 1em;
+	white-space: nowrap;
+}
+
+/* CENTRAL CONTENT AREA STYLING */
+#content, .ui-widget, .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-size: 8pt }
+
+
+/* used in some plugins - showing ID (long) element in tables */
+.col_Id {
+	width: 5em;
+}
+
+/* styling button groups like in the bundles & log plugins */
+.buttonGroup {
+	text-align: right;
+	padding: .5em 1em .5em 0;
+	vertical-align: middle;
+}
+.buttonGroup select {
+	display: inline;
+	float: none;
+	margin: 0;
+}
+
+/* The following styles are not complete. They usually apply only padding,
+ * margin... mostly *WHERE* the elements are visualised. Visual styling like
+ * colors and fonts are applied automatically by a JavaScript that borrows
+ * the visual element styles from the JQuery UI theme
+ */
+
+/* input box, checkbox & buttons styling */
+.inputText, input.text, input.password, input.file, textarea, select {
+	color: #184054;
+	background-color: #f0f0f0;
+}
+.inputText, input.text, input.password, textarea {
+	border: 1px solid #999999;
+	border-bottom: 1px solid #cccccc;
+	border-right: 1px solid #cccccc;
+}
+
+/* tables styling - must be in synch with tablesorter CSS */
+td, th { vertical-align: top }
+table.nicetable {
+	width: 100%;
+	text-align: left;
+}
+table.nicetable th, table.nicetable td {
+	border-bottom: 1px solid #cccccc;
+	text-align: left;
+	padding: .2em;
+	padding-left: .8em;
+}
+
+/* tablesorter styling */
+tr .header {
+	background-image: url(../lib/bg.gif);
+	background-repeat: no-repeat;
+	background-position: center right;
+	cursor: pointer;
+}
+tr .headerSortUp {
+	background-image: url(../lib/asc.gif);
+}
+tr .headerSortDown {
+	background-image: url(../lib/desc.gif);
+}
+
+/* status line */
+.statline {
+	margin-top: .5em !important;
+	margin-bottom: .5em !important;
+	padding: .2em;
+}
+
+/* zebra tables */
+.even {
+	/* default background unmodified from JQuery UI Theme */
+}
+
+.odd {
+	/* overwrite background from JQuery UI Theme */
+	background: none !important;
+}
+
+/*
+ * Common UI style to define button icons like in bundles plugin. The HTML markup is:
+ * <ul class="icons ui-widget">
+ *   <li class="dynhover" title="tooltip comes here"><span class="ui-icon ui-icon-refresh">&nbsp;</span></li>
+ * </ul>
+ */
+ul.icons {
+	margin: 0;
+	padding: 0
+}
+ul.icons span.ui-icon {
+	float: left;
+	margin: 0 1px
+}
+ul.icons li {
+	margin: 1px;
+	position: relative;
+	padding: 1px 0;
+	cursor: pointer;
+	float: left;
+	list-style: none
+}
+/* language selection element */
+#langSelect { position: absolute;	top: 5px; right: 5px }
+#langSelect img   { display: block; padding: 2px 0 }
diff --git a/karaf-2.2.x/webconsole/console/NOTICE b/karaf-2.2.x/webconsole/console/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/webconsole/console/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/webconsole/console/pom.xml b/karaf-2.2.x/webconsole/console/pom.xml
new file mode 100644
index 0000000..82a52bd
--- /dev/null
+++ b/karaf-2.2.x/webconsole/console/pom.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+  
+    <parent>
+        <groupId>org.apache.karaf.webconsole</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.webconsole.console</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Web Console :: Console</name>
+    <description>This bundle is a repackaging of the Felix Web console with small security related changed.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-servlet_2.5_spec</artifactId>
+        </dependency>
+        <dependency>
+          <groupId>org.osgi</groupId>
+          <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+          <groupId>org.osgi</groupId>
+          <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.1.1</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.4</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20070829</version>
+            <scope>provided</scope>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>${felix.plugin.version}</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>
+                            ${project.artifactId}
+                        </Bundle-SymbolicName>
+                        <Bundle-Vendor>
+                            The Apache Software Foundation
+                        </Bundle-Vendor>
+                        <Bundle-DocURL>
+                            http://felix.apache.org/site/apache-felix-web-console.html
+                        </Bundle-DocURL>
+                        <Bundle-Activator>
+                            org.apache.felix.webconsole.internal.KarafOsgiManagerActivator
+                        </Bundle-Activator>
+                        <Export-Package>
+                            org.apache.felix.webconsole;version=${felix.webconsole.version}
+                        </Export-Package>
+                        <Private-Package>
+                            !org.apache.felix.webconsole,
+                            org.apache.felix.webconsole.*;-split-package:=merge-first,
+                        </Private-Package>
+                        <Import-Package>
+                            org.apache.felix.scr;version=1.0;resolution:=optional,
+                            org.osgi.service.http,
+                            org.apache.felix.shell;
+                            org.osgi.service.*;resolution:=optional,
+                            javax.portlet;resolution:=optional,
+                            javax.servlet.*;version=2.4,
+                            *
+                        </Import-Package>
+                        <DynamicImport-Package>
+                            org.apache.felix.bundlerepository,
+                            org.osgi.service.obr
+                        </DynamicImport-Package>
+                        <Embed-Dependency>
+                            <!-- Webconsole -->
+                            org.apache.felix.webconsole;inline=**,
+
+                            <!-- Import/Export-Package parsing -->
+                            org.apache.felix.utils;inline=org/apache/felix/utils/manifest/**,
+                            org.apache.felix.framework;inline=org/apache/felix/framework/util/VersionRange**,
+
+                            <!-- ServiceTracker -->
+                            org.osgi.compendium;
+                                inline=org/osgi/util/tracker/*,
+
+                            <!-- Required for JSON data transfer -->
+                            json,
+
+                            <!-- File Upload functionality -->
+                            commons-fileupload,
+
+                            <!-- Required by FileUpload and Util -->
+                            commons-io
+                        </Embed-Dependency>
+
+                        <_removeheaders>
+                            Embed-Dependency,Private-Package,Include-Resource
+                        </_removeheaders>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManager.java b/karaf-2.2.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManager.java
new file mode 100644
index 0000000..5b40d56
--- /dev/null
+++ b/karaf-2.2.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManager.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.felix.webconsole.internal;
+
+import java.io.IOException;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import javax.security.auth.Subject;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.felix.webconsole.internal.servlet.OsgiManager;
+import org.osgi.framework.BundleContext;
+
+public class KarafOsgiManager extends OsgiManager {
+
+    public static final String SUBJECT_RUN_AS = "karaf.subject.runas";
+
+    public KarafOsgiManager(BundleContext bundleContext) {
+        super(bundleContext);
+    }
+
+    @Override
+    public void service(final ServletRequest req, final ServletResponse res) throws ServletException, IOException {
+        Object obj = req.getAttribute(SUBJECT_RUN_AS);
+        if (obj instanceof Subject) {
+            try {
+                Subject.doAs((Subject) obj, new PrivilegedExceptionAction<Object>() {
+                    public Object run() throws Exception {
+                        doService(req, res);
+                        return null;
+                    }
+                });
+            } catch (PrivilegedActionException e) {
+                Exception cause = e.getException();
+                if (cause instanceof ServletException) {
+                    throw (ServletException) cause;
+                }
+                if (cause instanceof IOException) {
+                    throw (IOException) cause;
+                }
+                throw new ServletException(cause);
+            }
+        } else {
+            super.service(req, res);
+        }
+    }
+
+    protected void doService(final ServletRequest req, final ServletResponse res) throws ServletException, IOException {
+        super.service(req, res);
+    }
+}
diff --git a/karaf-2.2.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManagerActivator.java b/karaf-2.2.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManagerActivator.java
new file mode 100644
index 0000000..2d4b49e
--- /dev/null
+++ b/karaf-2.2.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManagerActivator.java
@@ -0,0 +1,56 @@
+/*
+ * 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.felix.webconsole.internal;
+
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+
+/**
+ * This is the main, starting class of the Bundle. It initializes and disposes
+ * the Apache Web Console upon bundle lifecycle requests.
+ */
+public class KarafOsgiManagerActivator implements BundleActivator
+{
+
+    private KarafOsgiManager osgiManager;
+
+
+    /**
+     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+     */
+    public void start( BundleContext bundleContext )
+    {
+        osgiManager = new KarafOsgiManager( bundleContext );
+    }
+
+
+    /**
+     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+     */
+    public void stop( BundleContext arg0 )
+    {
+        if ( osgiManager != null )
+        {
+            osgiManager.dispose();
+        }
+    }
+
+}
diff --git a/karaf-2.2.x/webconsole/console/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/webconsole/console/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..48a3e63
--- /dev/null
+++ b/karaf-2.2.x/webconsole/console/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,14 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides a rebundled Apache Felix Web Console with some changes around
+    security.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mWeb console\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/webconsole/features/NOTICE b/karaf-2.2.x/webconsole/features/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/webconsole/features/pom.xml b/karaf-2.2.x/webconsole/features/pom.xml
new file mode 100644
index 0000000..ffab392
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/pom.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.webconsole</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.webconsole.features</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Web Console :: Features Plugin</name>
+    <description>This bundle provides Karaf features plugin for the Web Console.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.features</groupId>
+            <artifactId>org.apache.karaf.features.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20070829</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>*</Import-Package>
+                        <Embed-Dependency>
+                            <!-- Required for JSON data transfer -->
+                            <!-- TODO: this needs to be put in a common place for reuse. -->
+                            json
+                        </Embed-Dependency>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java b/karaf-2.2.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
new file mode 100644
index 0000000..8cac6f9
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
@@ -0,0 +1,137 @@
+/*
+ * 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.karaf.webconsole.features;
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.karaf.features.BundleInfo;
+import org.apache.karaf.features.ConfigFileInfo;
+import org.apache.karaf.features.Feature;
+
+
+/**
+ * 
+ */
+public class ExtendedFeature implements Feature
+{
+
+    public enum State
+    {
+        INSTALLED, UNINSTALLED;
+
+        @Override
+        public String toString()
+        {
+            //only capitalize the first letter
+            String s = super.toString();
+            return s.substring( 0, 1 ) + s.substring( 1 ).toLowerCase();
+        }
+    };
+
+    protected State state;
+    protected String repository;
+    protected Feature feature;
+
+
+    //
+    // Constructors
+    //
+
+    public ExtendedFeature( State state, String repository, Feature feature )
+    {
+        this.state = state;
+        this.repository = repository;
+        this.feature = feature;
+    }
+
+
+    //
+    // Feature interface
+    //
+
+
+    public List<BundleInfo> getBundles()
+    {
+        return this.feature.getBundles();
+    }
+
+
+    public Map<String, Map<String, String>> getConfigurations()
+    {
+        return this.feature.getConfigurations();
+    }
+
+    public List<ConfigFileInfo> getConfigurationFiles() {
+		return this.feature.getConfigurationFiles();
+	}
+    
+    public List<Feature> getDependencies()
+    {
+        return this.feature.getDependencies();
+    }
+
+
+    public String getId()
+    {
+        return this.feature.getId();
+    }
+
+
+    public String getName()
+    {
+        return this.feature.getName();
+    }
+
+
+    public String getVersion()
+    {
+        return this.feature.getVersion();
+    }
+
+    public String getResolver()
+    {
+        return this.feature.getResolver();
+    }
+
+    public String getDescription() {
+        return this.feature.getDescription();
+    }
+
+    public String getDetails() {
+        return this.feature.getDetails();
+    }
+
+
+    //
+    // Additional methods
+    //
+
+
+    public String getRepository() {
+        return this.repository;
+    }
+
+    public String getInstall() {
+        return feature.getInstall();
+    }
+
+    public State getState() {
+        return this.state;
+    }
+}
diff --git a/karaf-2.2.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/FeaturesPlugin.java b/karaf-2.2.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/FeaturesPlugin.java
new file mode 100644
index 0000000..640d0fa
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/FeaturesPlugin.java
@@ -0,0 +1,553 @@
+/*
+ * 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.karaf.webconsole.features;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeaturesService;
+import org.apache.karaf.features.Repository;
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.json.JSONException;
+import org.json.JSONWriter;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * The <code>FeaturesPlugin</code>
+ */
+public class FeaturesPlugin extends AbstractWebConsolePlugin
+{
+
+    /** Pseudo class version ID to keep the IDE quite. */
+    private static final long serialVersionUID = 1L;
+
+    private final Logger log = LoggerFactory.getLogger(FeaturesPlugin.class);
+
+    public static final String NAME = "features";
+
+    public static final String LABEL = "Features";
+
+    private ClassLoader classLoader;
+
+    private String featuresJs = "/features/res/ui/features.js";
+
+    private FeaturesService featuresService;
+    
+    private BundleContext bundleContext;
+
+
+    //
+    // Blueprint lifecycle callback methods
+    //
+    
+    public void start()
+    {
+        super.activate( bundleContext );
+
+        this.classLoader = this.getClass().getClassLoader();
+
+        this.log.info( LABEL + " plugin activated" );
+    }
+
+
+    public void stop()
+    {
+        this.log.info( LABEL + " plugin deactivated" );
+        super.deactivate();
+    }
+
+
+    //
+    // AbstractWebConsolePlugin interface
+    //
+
+    public String getLabel()
+    {
+        return NAME;
+    }
+
+
+    public String getTitle()
+    {
+        return LABEL;
+    }
+
+
+    protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException
+    {
+        boolean success = false;
+
+        final String action = req.getParameter( "action" );
+        final String feature = req.getParameter( "feature" );
+        final String version = req.getParameter( "version" );
+        final String url = req.getParameter( "url" );
+
+        if ( action == null )
+        {
+            success = true;
+        }
+        else if ( "installFeature".equals( action ) )
+        {
+            success = this.installFeature(feature, version);
+        }
+        else if ( "uninstallFeature".equals( action ) )
+        {
+            success = this.uninstallFeature( feature, version );
+        }
+        else if ( "refreshRepository".equals( action ) )
+        {
+            success = this.refreshRepository( url );
+        }
+        else if ( "removeRepository".equals( action ) )
+        {
+            success = this.removeRepository( url );
+        }
+        else if ( "addRepository".equals( action ) )
+        {
+            success = this.addRepository( url );
+        }
+
+        if ( success )
+        {
+            // let's wait a little bit to give the framework time
+            // to process our request
+            try
+            {
+                Thread.sleep( 800 );
+            }
+            catch ( InterruptedException e )
+            {
+                // we ignore this
+            }
+            this.renderJSON( resp, null );
+        }
+        else
+        {
+            super.doPost( req, resp );
+        }
+    }
+
+
+    protected void renderContent( HttpServletRequest request, HttpServletResponse response ) throws IOException
+    {
+
+        // get request info from request attribute
+        final PrintWriter pw = response.getWriter();
+
+        String appRoot = ( String ) request
+            .getAttribute( "org.apache.felix.webconsole.internal.servlet.OsgiManager.appRoot" );
+        final String featuresScriptTag = "<script src='" + appRoot + this.featuresJs
+            + "' language='JavaScript'></script>";
+        pw.println( featuresScriptTag );
+
+        pw.println( "<script type='text/javascript'>" );
+        pw.println( "// <![CDATA[" );
+        pw.println( "var imgRoot = '" + appRoot + "/res/imgs';" );
+        pw.println( "// ]]>" );
+        pw.println( "</script>" );
+
+        pw.println( "<div id='plugin_content'/>" );
+
+        pw.println( "<script type='text/javascript'>" );
+        pw.println( "// <![CDATA[" );
+        pw.print( "renderFeatures( " );
+        writeJSON( pw );
+        pw.println( " )" );
+        pw.println( "// ]]>" );
+        pw.println( "</script>" );
+    }
+
+
+    //
+    // Additional methods
+    //
+
+    protected URL getResource( String path )
+    {
+        path = path.substring( NAME.length() + 1 );
+        URL url = this.classLoader.getResource( path );
+        if (url != null) {
+            InputStream ins = null;
+            try {
+                ins = url.openStream();
+                if (ins == null) {
+                    this.log.error("failed to open " + url);
+                    url = null;
+                }
+            } catch (IOException e) {
+                this.log.error(e.getMessage(), e);
+                url = null;
+            } finally {
+                if (ins != null) {
+                    try {
+                        ins.close();
+                    } catch (IOException e) {
+                        this.log.error(e.getMessage(), e);
+                    }
+                }
+            }
+        }
+
+        return url;
+    }
+
+
+    private boolean installFeature(String feature, String version) {
+        boolean success = false;
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+        }
+        try
+        {
+            featuresService.installFeature( feature, version );
+            success = true;
+        }
+        catch ( Exception e )
+        {
+            this.log.error( "failed to install feature: ", e );
+        }
+        return success;
+    }
+
+
+    private boolean uninstallFeature(String feature, String version) {
+        boolean success = false;
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+        }
+        try
+        {
+            featuresService.uninstallFeature( feature, version );
+            success = true;
+        }
+        catch ( Exception e )
+        {
+            this.log.error( "failed to install feature: ", e );
+        }
+        return success;
+    }
+
+
+    private boolean removeRepository(String url) {
+        boolean success = false;
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+        }
+        try
+        {
+            featuresService.removeRepository( new URI( url ) );
+            success = true;
+        }
+        catch ( Exception e )
+        {
+            this.log.error( "failed to install feature: ", e );
+        }
+        return success;
+    }
+
+
+    private boolean refreshRepository(String url) {
+        boolean success = false;
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+        }
+        try
+        {
+            featuresService.removeRepository( new URI( url ) );
+            featuresService.addRepository( new URI( url ) );
+            success = true;
+        }
+        catch ( Exception e )
+        {
+            this.log.error( "failed to install feature: ", e );
+        }
+        return success;
+    }
+
+
+    private boolean addRepository(String url) {
+        boolean success = false;
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+        }
+        try
+        {
+            featuresService.addRepository( new URI( url ) );
+            success = true;
+        }
+        catch ( Exception e )
+        {
+            this.log.error( "failed to install feature: ", e );
+        }
+        return success;
+    }
+
+
+    private void renderJSON( final HttpServletResponse response, final String feature ) throws IOException
+    {
+        response.setContentType( "application/json" );
+        response.setCharacterEncoding( "UTF-8" );
+
+        final PrintWriter pw = response.getWriter();
+        writeJSON( pw );
+    }
+
+
+    private void writeJSON( final PrintWriter pw ) throws IOException
+    {
+        final List<Repository> repositories = this.getRepositories();
+        final List<ExtendedFeature> features = this.getFeatures( repositories );
+        final String statusLine = this.getStatusLine( features );
+
+        final JSONWriter jw = new JSONWriter( pw );
+
+        try
+        {
+            jw.object();
+
+            jw.key( "status" );
+            jw.value( statusLine );
+
+            jw.key( "repositories" );
+            jw.array();
+            for ( Repository r : repositories )
+            {
+                jw.object();
+                jw.key( "name" );
+                jw.value( r.getName() );
+                jw.key( "url" );
+                String uri = r.getURI().toString();
+                jw.value( uri );
+                jw.key( "actions" );
+                jw.array();
+                boolean enable = true;
+                if ( uri.startsWith( "bundle" ) ) {
+                    enable = false;
+                }
+                action( jw, enable, "refreshRepository", "Refresh", "refresh" );
+                action( jw, enable, "removeRepository", "Remove", "delete" );
+                jw.endArray();
+                jw.endObject();
+            }
+            jw.endArray();
+
+            jw.key( "features" );
+            jw.array();
+            for ( ExtendedFeature f : features )
+            {
+                featureInfo( jw, f );
+            }
+            jw.endArray();
+
+            jw.endObject();
+
+        }
+        catch ( JSONException je )
+        {
+            throw new IOException( je.toString() );
+        }
+
+    }
+
+
+    private List<Repository> getRepositories()
+    {
+        List<Repository> repositories = new ArrayList<Repository>();
+
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+            return repositories;
+        }
+
+        try
+        {
+            for ( Repository r : featuresService.listRepositories() ) {
+                repositories.add( r );
+            }
+        }
+        catch ( Exception e )
+        {
+            this.log.error( e.getMessage() );
+        }
+
+        return repositories;
+    }
+
+
+    private List<ExtendedFeature> getFeatures( List<Repository> repositories )
+    {
+        List<ExtendedFeature> features = new ArrayList<ExtendedFeature>();
+
+        if ( featuresService == null )
+        {
+            this.log.error( "Shell Features service is unavailable." );
+            return features;
+        }
+
+        try
+        {
+            for ( Repository r : repositories )
+            {
+                for ( Feature f : r.getFeatures() )
+                {
+                    ExtendedFeature.State state =
+                        featuresService.isInstalled(f) ? ExtendedFeature.State.INSTALLED : ExtendedFeature.State.UNINSTALLED;
+                    features.add( new ExtendedFeature(  state, r.getName(), f ) );
+                }
+            }
+        }
+        catch ( Exception e )
+        {
+            this.log.error( e.getMessage() );
+        }
+
+        Collections.sort( features, new ExtendedFeatureComparator() );
+        return features;
+    }
+
+
+    class ExtendedFeatureComparator implements Comparator<ExtendedFeature>
+    {
+        public int compare( ExtendedFeature o1, ExtendedFeature o2 )
+        {
+            return o1.getName().toLowerCase().compareTo( o2.getName().toLowerCase() );
+        }
+    }
+
+
+    private String getStatusLine( final List<ExtendedFeature> features )
+    {
+        int installed = 0;
+        for ( ExtendedFeature f : features )
+        {
+            if ( f.getState() == ExtendedFeature.State.INSTALLED )
+            {
+                installed++;
+            }
+        }
+        final StringBuffer buffer = new StringBuffer();
+        buffer.append( "Feature information: " );
+        appendFeatureInfoCount( buffer, "in total", features.size() );
+        if ( installed == features.size() )
+        {
+            buffer.append( " - all " );
+            appendFeatureInfoCount( buffer, "active.", features.size() );
+        }
+        else
+        {
+            if ( installed != 0 )
+            {
+                buffer.append( ", " );
+                appendFeatureInfoCount( buffer, "installed", installed );
+            }
+            buffer.append( '.' );
+        }
+        return buffer.toString();
+    }
+
+
+    private void appendFeatureInfoCount( final StringBuffer buf, String msg, int count )
+    {
+        buf.append( count );
+        buf.append( " feature" );
+        if ( count != 1 )
+            buf.append( 's' );
+        buf.append( ' ' );
+        buf.append( msg );
+    }
+
+
+    private void featureInfo( JSONWriter jw, ExtendedFeature feature ) throws JSONException
+    {
+        jw.object();
+        jw.key( "id" );
+        jw.value( feature.getId() );
+        jw.key( "name" );
+        jw.value( feature.getName() );
+        jw.key( "version" );
+        jw.value( feature.getVersion() );
+        jw.key( "repository" );
+        jw.value( feature.getRepository() );
+        jw.key( "state" );
+        ExtendedFeature.State state = feature.getState();
+        jw.value( state.toString() );
+
+        jw.key( "actions" );
+        jw.array();
+
+        if ( state == ExtendedFeature.State.INSTALLED )
+        {
+            action( jw, true, "uninstallFeature", "Uninstall", "delete" );
+        }
+        else if ( state == ExtendedFeature.State.UNINSTALLED )
+        {
+            action( jw, true, "installFeature", "Install", "start" );
+        }
+        jw.endArray();
+
+        jw.endObject();
+    }
+
+
+    private void action( JSONWriter jw, boolean enabled, String op, String title, String image ) throws JSONException
+    {
+        jw.object();
+        jw.key( "enabled" ).value( enabled );
+        jw.key( "op" ).value( op );
+        jw.key( "title" ).value( title );
+        jw.key( "image" ).value( image );
+        jw.endObject();
+    }
+
+
+    //
+    // Dependency Injection setters
+    //
+
+    public void setFeaturesService(FeaturesService featuresService) 
+    {
+        this.featuresService = featuresService;
+    }
+
+
+    public void setBundleContext(BundleContext bundleContext) 
+    {
+        this.bundleContext = bundleContext;
+    }
+}
diff --git a/karaf-2.2.x/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml b/karaf-2.2.x/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml
new file mode 100644
index 0000000..7589531
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml
@@ -0,0 +1,36 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
+
+    <reference id="featuresService" interface="org.apache.karaf.features.FeaturesService" />
+
+    <bean id="featuresPlugin" class="org.apache.karaf.webconsole.features.FeaturesPlugin" init-method="start" destroy-method="stop">
+        <property name="featuresService" ref="featuresService" />
+        <property name="bundleContext" ref="blueprintBundleContext" />
+    </bean>
+
+    <service ref="featuresPlugin" interface="javax.servlet.Servlet" >
+        <service-properties>
+            <entry key="felix.webconsole.label" value="features"/>
+        </service-properties>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/webconsole/features/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/webconsole/features/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..e8bbb2e
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,13 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides the Karaf features plugin for the Felix Web Console.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mWeb console\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/webconsole/features/src/main/resources/res/ui/features.js b/karaf-2.2.x/webconsole/features/src/main/resources/res/ui/features.js
new file mode 100644
index 0000000..c9af6ec
--- /dev/null
+++ b/karaf-2.2.x/webconsole/features/src/main/resources/res/ui/features.js
@@ -0,0 +1,198 @@
+/*
+ * 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.
+ */
+
+function renderFeatures( data ) {
+    $(document).ready( function() {
+        renderView();
+        renderData( data );
+    } );
+}
+
+function renderView() {
+    renderStatusLine();
+    renderTable( "Feature Repositories", "repository_table", ["Name", "URL", "Actions"] );
+    var txt = "<form method='post'><table id='repository_table_footer' class='ui-widget-header nicetable noauto ui-widget'><tbody>" +
+        "<tr><input type='hidden' name='action' value='addRepository'/>" +
+        "<td><input id='url' type='text' name='url' style='width:100%' colspan='2'/></td>" +
+        "<td class='col_Actions'><input type='button' value='Add URL' onclick='addRepositoryUrl()'/></td>" +
+        "</tr></tbody></table></form><br/>";
+    $("#plugin_content").append( txt );
+    renderTable( "Features", "feature_table", ["Name", "Version", "Repository", "Status", "Actions"] );
+    renderStatusLine();
+}
+
+function addRepositoryUrl() {
+    var url = document.getElementById( "url" ).value;
+    changeRepositoryState( "addRepository", url );
+}
+
+function renderStatusLine() {
+    $("#plugin_content").append( "<div class='fullwidth'><div class='statusline'/></div>" );
+}
+
+function renderTable( /* String */ title, /* String */ id, /* array of Strings */ columns ) {
+    var txt = "<div class='ui-widget-header ui-corner-top buttonGroup'><table class='nicetable ui-widget'><thead><tr>" +
+        "<th>" +
+        title + "</th></tr></thead></table></div>" +
+        "<table id='" + id + "' class='nicetable ui-widget'><thead><tr>";
+    for ( var name in columns ) {
+      txt = txt + "<th class='col_" + columns[name] + " ui-widget-header header' >" + columns[name] + "</th>";
+    }
+    txt = txt + "</tr></thead><tbody></tbody></table>";
+    $("#plugin_content").append( txt );
+}
+
+function renderData( /* Object */ data ) {
+    renderStatusData( data.status );
+    renderRepositoryTableData( data.repositories );
+    renderFeatureTableData( data.features );
+    $("#repository_table").tablesorter( {
+        headers: {
+            2: { sorter: false }
+        },
+        sortList: [[0,0]],
+    } );
+    $("#feature_table").tablesorter( {
+        headers: {
+           4: { sorter: false }
+        },
+        sortList: [[0,0]],
+    } );
+}
+
+function renderStatusData( /* String */ status )  {
+    $(".statusline").empty().append( status );
+}
+
+function renderRepositoryTableData( /* array of Objects */ repositories ) {
+    var trElement;
+    var input;
+    var needsLegend = false;
+    $("#repository_table > tbody > tr").remove();
+    for ( var idx in repositories ) {
+        var name = repositories[idx].name;
+        trElement = tr( null, { id: "repository-" + name } );
+        renderRepositoryData( trElement, repositories[idx] );
+        $("#repository_table > tbody").append( trElement );
+        if ( name[ name.length - 1 ] == "*" ) {
+            needsLegend = true;
+        }
+    }
+    $("#repository_table").trigger( "update" );
+    if ( needsLegend ) {
+        trElement = tr( null, null ) ;
+        trElement.appendChild( td( null, { colspan: 3 },
+                                   [ text( "* Installed via deploy directory" ) ] ) );
+        $("#repository_table_footer > tbody").prepend( trElement );
+    }
+    $("#repository_table_footer").trigger( "update" );
+}
+
+function renderRepositoryData( /* Element */ parent, /* Object */ repository ) {
+    parent.appendChild( td( null, null, [ text( repository.name ) ] ) );
+    parent.appendChild( td( null, null, [ text( repository.url ) ] ) );
+
+    var actionsTd = td( null, null );
+    var div = createElement( "div", null, {
+      style: { "text-align": "left"}
+    } );
+    actionsTd.appendChild( div );
+    
+    for ( var a in repository.actions ) {
+      repositoryButton( div, repository.url, repository.actions[a] );
+    }
+    parent.appendChild( actionsTd );
+}
+
+function repositoryButton( /* Element */ parent, /* String */ url, /* Obj */ action ) {
+    if ( !action.enabled ) {
+        return;
+    }
+  
+    var input = createElement( "input", null, {
+        type: 'image',
+        style: {"margin-left": "10px"},
+        title: action.title,
+        alt: action.title,
+        src: imgRoot + '/bundle_' + action.image + '.png'
+    } );
+    $(input).click( function() {changeRepositoryState( action.op, url )} );
+
+    if ( !action.enabled ) {
+        $(input).attr( "disabled", true );
+    }
+    parent.appendChild( input );
+}
+
+function changeRepositoryState( /* String */ action, /* String */ url ) {
+    $.post( pluginRoot, {"action": action, "url": url}, function( data ) {
+        renderData( data );
+    }, "json" ); 
+}
+
+function renderFeatureTableData( /* array of Objects */ features ) {
+    $("#feature_table > tbody > tr").remove();
+    for ( var idx in features ) {
+        var trElement = tr( null, { id: "feature-" + features[idx].id } );
+        renderFeatureData( trElement, features[idx] );
+        $("#feature_table > tbody").append( trElement ); 
+    }
+    $("#feature_table").trigger( "update" );
+}
+
+function renderFeatureData( /* Element */ parent, /* Object */ feature ) {
+    parent.appendChild( td( null, null, [ text( feature.name ) ] ) );
+    parent.appendChild( td( null, null, [ text( feature.version ) ] ) );
+    parent.appendChild( td( null, null, [ text( feature.repository ) ] ) );
+    parent.appendChild( td( null, null, [ text( feature.state ) ] ) );
+    var actionsTd = td( null, null );
+    var div = createElement( "div", null, {
+        style: { "text-align": "left"}
+    } );
+    actionsTd.appendChild( div );
+    
+    for ( var a in feature.actions ) {
+        featureButton( div, feature.name, feature.version, feature.actions[a] );
+    }
+    parent.appendChild( actionsTd );
+}
+
+function featureButton( /* Element */ parent, /* String */ name, /* String */ version, /* Obj */ action ) {
+    if ( !action.enabled ) {
+        return;
+    }
+  
+    var input = createElement( "input", null, {
+        type: 'image',
+        style: {"margin-left": "10px"},
+        title: action.title,
+        alt: action.title,
+        src: imgRoot + '/bundle_' + action.image + '.png'
+    } );
+    $(input).click( function() {changeFeatureState( action.op, name, version )} );
+
+    if ( !action.enabled ) {
+        $(input).attr( "disabled", true );
+    }
+    parent.appendChild( input );
+}
+
+function changeFeatureState( /* String */ action, /* String */ feature, /* String */ version ) {
+    $.post( pluginRoot, {"action": action, "feature": feature, "version": version}, function( data ) {
+        renderData( data );
+    }, "json" ); 
+}
diff --git a/karaf-2.2.x/webconsole/gogo/NOTICE b/karaf-2.2.x/webconsole/gogo/NOTICE
new file mode 100644
index 0000000..d08156c
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/NOTICE
@@ -0,0 +1,48 @@
+Apache Karaf
+Copyright 2010-2012 The Apache Software Foundation
+
+
+I. Included Software
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+Licensed under the Apache License 2.0.
+
+This product includes software written by
+Antony Lesuisse.
+Licensed under Public Domain.
+
+
+II. Used Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2010).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+OPS4J (http://www.ops4j.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+FUSE Source (http://www.fusesource.org/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+Tanuki Software (http://www.tanukisoftware.com/).
+Licensed under the Apache License 2.0.
+
+This product uses software developed at
+JLine (http://jline.sourceforge.net).
+Licensed under the BSD License.
+
+This product uses software developed at
+SLF4J (http://www.slf4j.org/).
+Licensed under the MIT License.
+
+This product includes software from http://www.json.org.
+Copyright (c) 2002 JSON.org
+
+
+III. License Summary
+- Apache License 2.0
diff --git a/karaf-2.2.x/webconsole/gogo/pom.xml b/karaf-2.2.x/webconsole/gogo/pom.xml
new file mode 100644
index 0000000..a21e46d
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/pom.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf.webconsole</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>org.apache.karaf.webconsole.gogo</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Web Console :: Gogo Plugin</name>
+    <description>This bundle provides Gogo plugin for the Karaf Web console.</description>
+
+    <properties>
+        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.webconsole</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20070829</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <resources>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <includes>
+                    <include>**/*</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>${project.basedir}/src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.info</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Import-Package>
+                            jline;version="[${jline.version}, ${jline.version}]",
+                            *
+                        </Import-Package>
+                        <Embed-Dependency>
+                            <!-- Required for JSON data transfer -->
+                            <!-- TODO: this needs to be put in a common place for reuse. -->
+                            json
+                        </Embed-Dependency>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java b/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
new file mode 100644
index 0000000..df9e478
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
@@ -0,0 +1,279 @@
+/*
+ * 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.
+ */
+
+/**
+ * Based on http://antony.lesuisse.org/software/ajaxterm/
+ *  Public Domain License
+ */
+
+package org.apache.karaf.webconsole.gogo;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.util.zip.GZIPOutputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.CommandSession;
+import org.apache.karaf.shell.console.jline.Console;
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The <code>GogoPlugin</code>
+ */
+public class GogoPlugin extends AbstractWebConsolePlugin {
+
+    /** Pseudo class version ID to keep the IDE quite. */
+    private static final long serialVersionUID = 1L;
+
+    private final Logger logger = LoggerFactory.getLogger(GogoPlugin.class);
+
+    public static final String NAME = "gogo";
+
+    public static final String LABEL = "Gogo";
+
+    public static final int TERM_WIDTH = 120;
+    public static final int TERM_HEIGHT = 39;
+
+
+
+    private BundleContext bundleContext;
+
+    private CommandProcessor commandProcessor;
+
+    public void setBundleContext(BundleContext bundleContext)
+    {
+        this.bundleContext = bundleContext;
+    }
+
+    public void setCommandProcessor(CommandProcessor commandProcessor)
+    {
+        this.commandProcessor = commandProcessor;
+    }
+
+    /*
+    * Blueprint lifecycle callback methods
+    */
+
+    public void start()
+    {
+        super.activate( bundleContext );
+        this.logger.info( LABEL + " plugin activated" );
+    }
+
+    public void stop()
+    {
+        this.logger.info( LABEL + " plugin deactivated" );
+        super.deactivate();
+    }
+
+    //
+    // AbstractWebConsolePlugin interface
+    //
+    public String getLabel()
+    {
+        return NAME;
+    }
+
+
+    public String getTitle()
+    {
+        return LABEL;
+    }
+
+
+    protected void renderContent( HttpServletRequest request, HttpServletResponse response ) throws IOException
+    {
+        PrintWriter pw = response.getWriter();
+
+        String appRoot = request.getContextPath() + request.getServletPath();
+        pw.println( "<link href=\"" + appRoot + "/gogo/res/ui/gogo.css\" rel=\"stylesheet\" type=\"text/css\" />" );
+        pw.println( "<script src=\"" + appRoot + "/gogo/res/ui/gogo.js\" type=\"text/javascript\"></script>" );
+        pw.println( "<div id='console'><div id='term'></div></div>" );
+        pw.println( "<script type=\"text/javascript\"><!--" );
+        pw.println( "window.onload = function() { gogo.Terminal(document.getElementById(\"term\"), " + TERM_WIDTH + ", " + TERM_HEIGHT + "); }" );
+        pw.println( "--></script>" );
+    }
+
+    protected URL getResource( String path )
+    {
+        path = path.substring( NAME.length() + 1 );
+        URL url = this.getClass().getClassLoader().getResource( path );
+        if (url != null) {
+            InputStream ins = null;
+            try {
+                ins = url.openStream();
+                if (ins == null) {
+                    this.logger.error("failed to open " + url);
+                    url = null;
+                }
+            } catch (IOException e) {
+                this.logger.error(e.getMessage(), e);
+                url = null;
+            } finally {
+                if (ins != null) {
+                    try {
+                        ins.close();
+                    } catch (IOException e) {
+                        this.logger.error(e.getMessage(), e);
+                    }
+                }
+            }
+        }
+        return url;
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+        String encoding = request.getHeader("Accept-Encoding");
+        boolean supportsGzip = (encoding != null && encoding.toLowerCase().indexOf("gzip") > -1);
+        SessionTerminal st = (SessionTerminal) request.getSession(true).getAttribute("terminal");
+        if (st == null || st.isClosed()) {
+            st = new SessionTerminal();
+            request.getSession().setAttribute("terminal", st);
+        }
+        String str = request.getParameter("k");
+        String f = request.getParameter("f");
+        String dump = st.handle(str, f != null && f.length() > 0);
+        if (dump != null) {
+            if (supportsGzip) {
+                response.setHeader("Content-Encoding", "gzip");
+                response.setHeader("Content-Type", "text/html");
+                try {
+                    GZIPOutputStream gzos =  new GZIPOutputStream(response.getOutputStream());
+                    gzos.write(dump.getBytes());
+                    gzos.close();
+                } catch (IOException ie) {
+                    // handle the error here
+                    ie.printStackTrace();
+                }
+            } else {
+                response.getOutputStream().write(dump.getBytes());
+            }
+        }
+    }
+
+
+    public class SessionTerminal implements Runnable {
+
+        private Terminal terminal;
+        private Console console;
+        private PipedOutputStream in;
+        private PipedInputStream out;
+        private boolean closed;
+
+        public SessionTerminal() throws IOException {
+            try {
+                this.terminal = new Terminal(TERM_WIDTH, TERM_HEIGHT);
+                terminal.write("\u001b\u005B20\u0068"); // set newline mode on
+
+                in = new PipedOutputStream();
+                out = new PipedInputStream();
+                PrintStream pipedOut = new PrintStream(new PipedOutputStream(out), true);
+
+                console = new Console(commandProcessor,
+                                      new PipedInputStream(in),
+                                      pipedOut,
+                                      pipedOut,
+                                      new WebTerminal(TERM_WIDTH, TERM_HEIGHT),
+                                      null);
+                CommandSession session = console.getSession();
+                session.put("APPLICATION", System.getProperty("karaf.name", "root"));
+                session.put("USER", "karaf");
+                session.put("COLUMNS", Integer.toString(TERM_WIDTH));
+                session.put("LINES", Integer.toString(TERM_HEIGHT));
+            } catch (IOException e) {
+                e.printStackTrace();
+                throw e;
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw (IOException) new IOException().initCause(e);
+            }
+            new Thread(console).start();
+            new Thread(this).start();
+        }
+
+        public boolean isClosed() {
+            return closed;
+        }
+
+        public String handle(String str, boolean forceDump) throws IOException {
+            try {
+                if (str != null && str.length() > 0) {
+                    String d = terminal.pipe(str);
+                    for (byte b : d.getBytes()) {
+                        in.write(b);
+                    }
+                    in.flush();
+                }
+            } catch (IOException e) {
+                closed = true;
+                throw e;
+            }
+            try {
+                return terminal.dump(10, forceDump);
+            } catch (InterruptedException e) {
+                throw new InterruptedIOException(e.toString());
+            }
+        }
+
+        public void run() {
+            try {
+                for (;;) {
+                    byte[] buf = new byte[8192];
+                    int l = out.read(buf);
+                    InputStreamReader r = new InputStreamReader(new ByteArrayInputStream(buf, 0, l));
+                    StringBuilder sb = new StringBuilder();
+                    for (;;) {
+                        int c = r.read();
+                        if (c == -1) {
+                            break;
+                        }
+                        sb.append((char) c);
+                    }
+                    if (sb.length() > 0) {
+                        terminal.write(sb.toString());
+                    }
+                    String s = terminal.read();
+                    if (s != null && s.length() > 0) {
+                        for (byte b : s.getBytes()) {
+                            in.write(b);
+                        }
+                    }
+                }
+            } catch (IOException e) {
+                closed = true;
+                e.printStackTrace();
+            }
+        }
+
+    }
+}
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/Terminal.java b/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/Terminal.java
new file mode 100644
index 0000000..3318482
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/Terminal.java
@@ -0,0 +1,1502 @@
+/*
+ * 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.
+ */
+
+/**
+ * Based on http://antony.lesuisse.org/software/ajaxterm/
+ *  Public Domain License
+ */
+
+/**
+ * See http://www.ecma-international.org/publications/standards/Ecma-048.htm
+ *       and http://vt100.net/docs/vt510-rm/
+ */
+
+package org.apache.karaf.webconsole.gogo;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class Terminal {
+
+    enum State {
+        None,
+        Esc,
+        Str,
+        Csi,
+    }
+
+    private int width;
+    private int height;
+    private int attr;
+    private boolean eol;
+    private int cx;
+    private int cy;
+    private int[] screen;
+    private int[] screen2;
+    private State vt100_parse_state = State.None;
+    private int vt100_parse_len;
+    private int vt100_lastchar;
+    private int vt100_parse_func;
+    private String vt100_parse_param;
+    private boolean vt100_mode_autowrap;
+    private boolean vt100_mode_insert;
+    private boolean vt100_charset_is_single_shift;
+    private boolean vt100_charset_is_graphical;
+    private boolean vt100_mode_lfnewline;
+    private boolean vt100_mode_origin;
+    private boolean vt100_mode_inverse;
+    private boolean vt100_mode_cursorkey;
+    private boolean vt100_mode_cursor;
+    private boolean vt100_mode_alt_screen;
+    private boolean vt100_mode_backspace;
+    private boolean vt100_mode_column_switch;
+    private boolean vt100_keyfilter_escape;
+    private int[] vt100_charset_graph = new int[] {
+            0x25ca, 0x2026, 0x2022, 0x3f,
+            0xb6, 0x3f, 0xb0, 0xb1,
+            0x3f, 0x3f, 0x2b, 0x2b,
+            0x2b, 0x2b, 0x2b, 0xaf,
+            0x2014, 0x2014, 0x2014, 0x5f,
+            0x2b, 0x2b, 0x2b, 0x2b,
+            0x7c, 0x2264, 0x2265, 0xb6,
+            0x2260, 0xa3, 0xb7, 0x7f
+    };
+    private int vt100_charset_g_sel;
+    private int[] vt100_charset_g = { 0, 0 };
+    private Map<String, Object> vt100_saved;
+    private Map<String, Object> vt100_saved2;
+    private int vt100_saved_cx;
+    private int vt100_saved_cy;
+    private String vt100_out;
+
+    private int scroll_area_y0;
+    private int scroll_area_y1;
+
+    private List<Integer> tab_stops;
+
+    private int utf8_char;
+    private int utf8_units_count;
+    private int utf8_units_received;
+
+    private AtomicBoolean dirty = new AtomicBoolean(true);
+
+    public Terminal() {
+        this(80, 24);
+    }
+
+    public Terminal(int width, int height) {
+        this.width = width;
+        this.height = height;
+        reset_hard();
+    }
+
+    private void reset_hard() {
+		// Attribute mask: 0x0XFB0000
+		//	X:	Bit 0 - Underlined
+		//		Bit 1 - Negative
+		//		Bit 2 - Concealed
+		//	F:	Foreground
+		//	B:	Background
+		attr = 0x00fe0000;
+		// UTF-8 decoder
+		utf8_units_count = 0;
+		utf8_units_received = 0;
+		utf8_char = 0;
+		// Key filter
+		vt100_keyfilter_escape = false;
+		// Last char
+		vt100_lastchar = 0;
+		// Control sequences
+		vt100_parse_len = 0;
+		vt100_parse_state = State.None;
+		vt100_parse_func = 0;
+		vt100_parse_param = "";
+		// Buffers
+		vt100_out = "";
+		// Invoke other resets
+        reset_screen();
+        reset_soft();
+    }
+
+    private void reset_soft() {
+        // Attribute mask: 0x0XFB0000
+        //	X:	Bit 0 - Underlined
+        //		Bit 1 - Negative
+        //		Bit 2 - Concealed
+        //	F:	Foreground
+        //	B:	Background
+        attr = 0x00fe0000;
+        // Scroll parameters
+        scroll_area_y0 = 0;
+        scroll_area_y1 = height;
+        // Character sets
+        vt100_charset_is_single_shift = false;
+        vt100_charset_is_graphical = false;
+        vt100_charset_g_sel = 0;
+        vt100_charset_g = new int[] { 0, 0 };
+		// Modes
+		vt100_mode_insert = false;
+		vt100_mode_lfnewline = false;
+		vt100_mode_cursorkey = false;
+		vt100_mode_column_switch = false;
+		vt100_mode_inverse = false;
+		vt100_mode_origin = false;
+		vt100_mode_autowrap = true;
+		vt100_mode_cursor = true;
+		vt100_mode_alt_screen = false;
+		vt100_mode_backspace = false;
+		// Init DECSC state
+		esc_DECSC();
+		vt100_saved2 = vt100_saved;
+		esc_DECSC();
+    }
+
+    private void reset_screen() {
+        // Screen
+        screen = new int[width * height];
+        Arrays.fill(screen, attr | 0x0020);
+        screen2 = new int[width * height];
+        Arrays.fill(screen2, attr | 0x0020);
+        // Scroll parameters
+        scroll_area_y0 = 0;
+        scroll_area_y1 = height;
+        // Cursor position
+        cx = 0;
+        cy = 0;
+        // Tab stops
+        tab_stops = new ArrayList<Integer>();
+        for (int i = 7; i < width; i += 8) {
+            tab_stops.add(i);
+        }
+    }
+
+    //
+    // UTF-8 functions
+    //
+
+    private String utf8_decode(String d) {
+        StringBuilder o = new StringBuilder();
+        for (char c : d.toCharArray()) {
+            if (utf8_units_count != utf8_units_received) {
+                utf8_units_received++;
+                if ((c & 0xc0) == 0x80) {
+                    utf8_char = (utf8_char << 6) | (c & 0x3f);
+                    if (utf8_units_count == utf8_units_received) {
+                        if (utf8_char < 0x10000) {
+                            o.append((char) utf8_char);
+                        }
+                        utf8_units_count = utf8_units_received = 0;
+                    }
+                } else {
+                    o.append('?');
+                    while (utf8_units_received-- > 0) {
+                        o.append('?');
+                    }
+                    utf8_units_count = 0;
+                }
+            } else {
+                if ((c & 0x80) == 0x00) {
+                    o.append(c);
+                } else if ((c & 0xe0) == 0xc0) {
+                    utf8_units_count = 1;
+                    utf8_char = c & 0x1f;
+                } else if ((c & 0xf0) == 0xe0) {
+                    utf8_units_count = 2;
+                    utf8_char = c & 0x0f;
+                } else if ((c & 0xf8) == 0xf0) {
+                    utf8_units_count = 3;
+                    utf8_char = c & 0x07;
+                } else {
+                    o.append('?');
+                }
+
+            }
+        }
+        return o.toString();
+    }
+
+    private int utf8_charwidth(int c) {
+        if (c >= 0x2e80) {
+            return 2;
+        } else {
+            return 1;
+        }
+    }
+
+    //
+    // Low-level terminal functions
+    //
+
+    private int[] peek(int y0, int x0, int y1, int x1) {
+        int from = width * y0 + x0;
+        int to = width * (y1 - 1) + x1; 
+        int newLength = to - from;
+        if (newLength < 0)
+            throw new IllegalArgumentException(from + " > " + to);
+        int[] copy = new int[newLength];
+        System.arraycopy(screen, from, copy, 0,
+                         Math.min(screen.length - from, newLength));
+        return copy;
+    }
+
+    private void poke(int y, int x, int[] s) {
+        System.arraycopy(s, 0, screen, width * y + x, s.length);
+        setDirty();
+    }
+
+    private void fill(int y0, int x0, int y1, int x1, int c) {
+        int d0 = width * y0 + x0;
+        int d1 = width * (y1 - 1) + x1;
+        if (d0 <= d1) {
+            Arrays.fill(screen, width * y0 + x0,  width * (y1 - 1) + x1, c);
+            setDirty();
+        }
+    }
+
+    private void clear(int y0, int x0, int y1, int x1) {
+        fill(y0, x0, y1, x1, attr | 0x20);
+    }
+
+    //
+    // Scrolling functions
+    //
+
+    private void scroll_area_up(int y0, int y1) {
+        scroll_area_up(y0, y1, 1);
+    }
+
+    private void scroll_area_up(int y0, int y1, int n) {
+        n = Math.min(y1 - y0, n);
+        poke(y0, 0, peek(y0 + n, 0, y1, width));
+        clear(y1-n, 0, y1, width);
+    }
+
+    private void scroll_area_down(int y0, int y1) {
+        scroll_area_down(y0, y1, 1);
+    }
+
+    private void scroll_area_down(int y0, int y1, int n) {
+        n = Math.min(y1 - y0, n);
+        poke(y0 + n, 0, peek(y0, 0, y1-n, width));
+        clear(y0, 0, y0 + n, width);
+    }
+
+    private void scroll_area_set(int y0, int y1) {
+        y0 = Math.max(0, Math.min(height - 1, y0));
+        y1 = Math.max(1, Math.min(height, y1));
+        if (y1 > y0) {
+            scroll_area_y0 = y0;
+            scroll_area_y1 = y1;
+        }
+    }
+
+    private void scroll_line_right(int y, int x) {
+        scroll_line_right(y, x, 1);
+    }
+
+    private void scroll_line_right(int y, int x, int n) {
+        if (x < width) {
+            n = Math.min(width - cx, n);
+            poke(y, x + n, peek(y, x, y + 1, width - n));
+            clear(y, x, y + 1, x + n);
+        }
+    }
+
+    private void scroll_line_left(int y, int x) {
+        scroll_line_left(y, x, 1);
+    }
+
+    private void scroll_line_left(int y, int x, int n) {
+        if (x < width) {
+            n = Math.min(width - cx, n);
+            poke(y, x, peek(y, x + n, y + 1, width));
+            clear(y, width - n, y + 1, width);
+        }
+    }
+
+    //
+	// Cursor functions
+    //
+
+    private int[] cursor_line_width(int next_char) {
+        int wx = utf8_charwidth(next_char);
+        int lx = 0;
+        for (int x = 0; x < Math.min(cx, width); x++) {
+            int c = peek(cy, x, cy + 1, x + 1)[0] & 0xffff;
+            wx += utf8_charwidth(c);
+            lx += 1;
+        }
+        return new int[] { wx, lx };
+    }
+
+    private void cursor_up() {
+        cursor_up(1);
+    }
+
+    private void cursor_up(int n) {
+        cy = Math.max(scroll_area_y0, cy - n);
+        setDirty();
+    }
+
+    private void cursor_down() {
+        cursor_down(1);
+    }
+
+    private void cursor_down(int n) {
+        cy = Math.min(scroll_area_y1 - 1, cy + n);
+        setDirty();
+    }
+
+    private void cursor_left() {
+        cursor_left(1);
+    }
+
+    private void cursor_left(int n) {
+        eol = false;
+        cx = Math.max(0, cx - n);
+        setDirty();
+    }
+
+    private void cursor_right() {
+        cursor_right(1);
+    }
+
+    private void cursor_right(int n) {
+        eol = cx + n >= width;
+        cx = Math.min(width - 1, cx + n);
+        setDirty();
+    }
+
+    private void cursor_set_x(int x) {
+        eol = false;
+        cx = Math.max(0, x);
+        setDirty();
+    }
+
+    private void cursor_set_y(int y) {
+        cy = Math.max(0, Math.min(height - 1, y));
+        setDirty();
+    }
+
+    private void cursor_set(int y, int x) {
+        cursor_set_x(x);
+        cursor_set_y(y);
+    }
+
+    //
+    // Dumb terminal
+    //
+
+    private void ctrl_BS() {
+        int dy = (cx - 1) / width;
+        cursor_set(Math.max(scroll_area_y0, cy + dy), (cx - 1) % width);
+    }
+
+    private void ctrl_HT() {
+        ctrl_HT(1);
+    }
+
+    private void ctrl_HT(int n) {
+        if (n > 0 && cx >= width) {
+            return;
+        }
+        if (n <= 0 && cx == 0) {
+            return;
+        }
+        int ts = -1;
+        for (int i = 0; i < tab_stops.size(); i++) {
+            if (cx >= tab_stops.get(i)) {
+                ts = i;
+            }
+        }
+        ts += n;
+        if (ts < tab_stops.size() && ts >= 0) {
+            cursor_set_x(tab_stops.get(ts));
+        } else {
+            cursor_set_x(width - 1);
+        }
+    }
+
+    private void ctrl_LF() {
+        if (vt100_mode_lfnewline) {
+            ctrl_CR();
+        }
+        if (cy == scroll_area_y1 - 1) {
+            scroll_area_up(scroll_area_y0, scroll_area_y1);
+        } else {
+            cursor_down();
+        }
+    }
+
+    private void ctrl_CR() {
+        cursor_set_x(0);
+    }
+
+    private boolean dumb_write(int c) {
+        if (c < 32) {
+            if (c == 8) {
+                ctrl_BS();
+            } else if (c == 9) {
+                ctrl_HT();
+            } else if (c >= 10 && c <= 12) {
+                ctrl_LF();
+            } else if (c == 13) {
+                ctrl_CR();
+            }
+            return true;
+        }
+        return false;
+    }
+
+    private void dumb_echo(int c) {
+        if (eol) {
+            if (vt100_mode_autowrap) {
+                ctrl_CR();
+                ctrl_LF();
+            } else {
+                cx = cursor_line_width(c)[1] - 1;
+            }
+        }
+        if (vt100_mode_insert) {
+            scroll_line_right(cy, cx);
+        }
+        if (vt100_charset_is_single_shift) {
+            vt100_charset_is_single_shift = false;
+        } else if (vt100_charset_is_graphical && ((c & 0xffe0) == 0x0060)) {
+            c = vt100_charset_graph[c - 0x60];
+        }
+        poke(cy, cx, new int[] { attr | c });
+        cursor_right();
+    }
+
+    //
+    // VT100
+    //
+
+    private void vt100_charset_update() {
+        vt100_charset_is_graphical = (vt100_charset_g[vt100_charset_g_sel] == 2);
+    }
+
+    private void vt100_charset_set(int g) {
+        // Invoke active character set
+        vt100_charset_g_sel = g;
+        vt100_charset_update();
+    }
+
+    private void vt100_charset_select(int g, int charset) {
+        // Select charset
+        vt100_charset_g[g] = charset;
+        vt100_charset_update();
+    }
+
+    private void vt100_setmode(String p, boolean state) {
+        // Set VT100 mode
+        String[] ps = vt100_parse_params(p, new String[0]);
+        for (String m : ps) {
+            // 1 : GATM: Guarded area transfer
+            // 2 : KAM: Keyboard action
+            // 3 : CRM: Control representation
+            if ("4".equals(m)) {
+                // Insertion replacement mode
+                vt100_mode_insert = state;
+            // 5 : SRTM: Status reporting transfer
+            // 7 : VEM: Vertical editing
+            // 10 : HEM: Horizontal editing
+            // 11 : PUM: Positioning nit
+            // 12 : SRM: Send/receive
+            // 13 : FEAM: Format effector action
+            // 14 : FETM: Format effector transfer
+            // 15 : MATM: Multiple area transfer
+            // 16 : TTM: Transfer termination
+            // 17 : SATM: Selected area transfer
+            // 18 : TSM: Tabulation stop
+            // 19 : EBM: Editing boundary
+            } else if ("20".equals(m)) {
+                // LNM: Line feed/new line
+                vt100_mode_lfnewline = state;
+            } else if ("?1".equals(m)) {
+                // DECCKM: Cursor keys
+                vt100_mode_cursorkey = state;
+            // ?2 : DECANM: ANSI
+            } else if ("?3".equals(m)) {
+                // DECCOLM: Column
+                if (vt100_mode_column_switch) {
+                    if (state) {
+                        width = 132;
+                    } else {
+                        width = 80;
+                    }
+                    reset_screen();
+                }
+            // ?4 : DECSCLM: Scrolling
+            } else if ("?5".equals(m)) {
+                // DECSCNM: Screen
+                vt100_mode_inverse = state;
+            } else if ("?6".equals(m)) {
+                // DECOM: Origin
+                vt100_mode_origin = state;
+                if (state) {
+                    cursor_set(scroll_area_y0, 0);
+                } else {
+                    cursor_set(0, 0);
+                }
+            } else if ("?7".equals(m)) {
+                // DECAWM: Autowrap
+                vt100_mode_autowrap = state;
+            // ?8 : DECARM: Autorepeat
+            // ?9 : Interlacing
+            // ?18 : DECPFF: Print form feed
+            // ?19 : DECPEX: Printer extent
+            } else if ("?25".equals(m)) {
+                // DECTCEM: Text cursor enable
+                vt100_mode_cursor = state;
+            // ?34 : DECRLM: Cursor direction, right to left
+            // ?35 : DECHEBM: Hebrew keyboard mapping
+            // ?36 : DECHEM: Hebrew encoding mode
+            } else if ("?40".equals(m)) {
+                // Column switch control
+                vt100_mode_column_switch = state;
+            // ?42 : DECNRCM: National replacement character set
+            } else if ("?47".equals(m)) {
+                // Alternate screen mode
+                if ((state && !vt100_mode_alt_screen) || (!state && vt100_mode_alt_screen)) {
+                    int[] s = screen; screen = screen2; screen2 = s;
+                    Map<String, Object> map = vt100_saved; vt100_saved = vt100_saved2; vt100_saved2 = map;
+                }
+                vt100_mode_alt_screen = state;
+            // ?57 : DECNAKB: Greek keyboard mapping
+            } else if ("?67".equals(m)) {
+                // DECBKM: Backarrow key
+                vt100_mode_backspace = state;
+            }
+            // ?98 : DECARSM: auto-resize
+            // ?101 : DECCANSM: Conceal answerback message
+            // ?109 : DECCAPSLK: caps lock
+        }
+    }
+
+    private void ctrl_SO() {
+        vt100_charset_set(1);
+    }
+
+    private void ctrl_SI() {
+        vt100_charset_set(0);
+    }
+
+    private void esc_CSI() {
+        vt100_parse_reset(State.Csi);
+    }
+
+    private void esc_DECALN() {
+        fill(0, 0, height, width, 0x00fe0045);
+    }
+
+    private void esc_G0_0() {
+        vt100_charset_select(0, 0);
+    }
+    private void esc_G0_1() {
+        vt100_charset_select(0, 1);
+    }
+    private void esc_G0_2() {
+        vt100_charset_select(0, 2);
+    }
+    private void esc_G0_3() {
+        vt100_charset_select(0, 3);
+    }
+    private void esc_G0_4() {
+        vt100_charset_select(0, 4);
+    }
+
+    private void esc_G1_0() {
+        vt100_charset_select(1, 0);
+    }
+    private void esc_G1_1() {
+        vt100_charset_select(1, 1);
+    }
+    private void esc_G1_2() {
+        vt100_charset_select(1, 2);
+    }
+    private void esc_G1_3() {
+        vt100_charset_select(1, 3);
+    }
+    private void esc_G1_4() {
+        vt100_charset_select(1, 4);
+    }
+
+    private void esc_DECSC() {
+        vt100_saved = new HashMap<String, Object>();
+        vt100_saved.put("cx", cx);
+        vt100_saved.put("cy", cy);
+        vt100_saved.put("attr", attr);
+        vt100_saved.put("vt100_charset_g_sel", vt100_charset_g_sel);
+        vt100_saved.put("vt100_charset_g", vt100_charset_g);
+        vt100_saved.put("vt100_mode_autowrap", vt100_mode_autowrap);
+        vt100_saved.put("vt100_mode_origin", vt100_mode_origin);
+    }
+
+    private void esc_DECRC() {
+        cx = (Integer) vt100_saved.get("cx");
+        cy = (Integer) vt100_saved.get("cy");
+        attr = (Integer) vt100_saved.get("attr");
+        vt100_charset_g_sel = (Integer) vt100_saved.get("vt100_charset_g_sel");
+        vt100_charset_g = (int[]) vt100_saved.get("vt100_charset_g");
+        vt100_charset_update();
+        vt100_mode_autowrap = (Boolean) vt100_saved.get("vt100_mode_autowrap");
+        vt100_mode_origin = (Boolean) vt100_saved.get("vt100_mode_origin");
+    }
+
+    private void esc_IND() {
+        ctrl_LF();
+    }
+
+    private void esc_NEL() {
+        ctrl_CR();
+        ctrl_LF();
+    }
+
+    private void esc_HTS() {
+        csi_CTC("0");
+    }
+
+    private void esc_RI() {
+        if (cy == scroll_area_y0) {
+            scroll_area_down(scroll_area_y0, scroll_area_y1);
+        } else {
+            cursor_up();
+        }
+    }
+
+    private void esc_SS2() {
+        vt100_charset_is_single_shift = true;
+    }
+
+    private void esc_SS3() {
+        vt100_charset_is_single_shift = true;
+    }
+
+    private void esc_DCS() {
+        vt100_parse_reset(State.Str);
+    }
+
+    private void esc_SOS() {
+        vt100_parse_reset(State.Str);
+    }
+
+    private void esc_DECID() {
+        csi_DA("0");
+    }
+
+    private void esc_ST() {
+    }
+
+    private void esc_OSC() {
+        vt100_parse_reset(State.Str);
+    }
+
+    private void esc_PM() {
+        vt100_parse_reset(State.Str);
+    }
+
+    private void esc_APC() {
+        vt100_parse_reset(State.Str);
+    }
+
+    private void esc_RIS() {
+        reset_hard();
+    }
+
+    private void csi_ICH(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        scroll_line_right(cy, cx, ps[0]);
+    }
+
+    private void csi_CUU(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_up(Math.max(1, ps[0]));
+    }
+
+    private void csi_CUD(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_down(Math.max(1, ps[0]));
+    }
+
+    private void csi_CUF(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_right(Math.max(1, ps[0]));
+    }
+
+    private void csi_CUB(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_left(Math.max(1, ps[0]));
+    }
+
+    private void csi_CNL(String p) {
+        csi_CUD(p);
+        ctrl_CR();
+    }
+
+    private void csi_CPL(String p) {
+        csi_CUU(p);
+        ctrl_CR();
+    }
+
+    private void csi_CHA(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_set_x(ps[0] - 1);
+    }
+
+    private void csi_CUP(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1, 1 });
+        if (vt100_mode_origin) {
+            cursor_set(scroll_area_y0 + ps[0] - 1, ps[1] - 1);
+        } else {
+            cursor_set(ps[0] - 1, ps[1] - 1);
+        }
+    }
+
+    private void csi_CHT(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        ctrl_HT(Math.max(1, ps[0]));
+    }
+
+    private void csi_ED(String p) {
+        String[] ps = vt100_parse_params(p, new String[] { "0" });
+        if ("0".equals(ps[0])) {
+            clear(cy, cx, height, width);
+        } else if ("1".equals(ps[0])) {
+            clear(0, 0, cy + 1, cx + 1);
+        } else if ("2".equals(ps[0])) {
+            clear(0, 0, height, width);
+        }
+    }
+
+    private void csi_EL(String p) {
+        String[] ps = vt100_parse_params(p, new String[] { "0" });
+        if ("0".equals(ps[0])) {
+            clear(cy, cx, cy + 1, width);
+        } else if ("1".equals(ps[0])) {
+            clear(cy, 0, cy + 1, cx + 1);
+        } else if ("2".equals(ps[0])) {
+            clear(cy, 0, cy + 1, width);
+        }
+    }
+
+    private void csi_IL(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        if (cy >= scroll_area_y0 && cy < scroll_area_y1) {
+            scroll_area_down(cy, scroll_area_y1, Math.max(1, ps[0]));
+        }
+    }
+
+    private void csi_DL(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        if (cy >= scroll_area_y0 && cy < scroll_area_y1) {
+            scroll_area_up(cy, scroll_area_y1, Math.max(1, ps[0]));
+        }
+    }
+
+    private void csi_DCH(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        scroll_line_left(cy, cx, Math.max(1, ps[0]));
+    }
+
+    private void csi_SU(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        scroll_area_up(scroll_area_y0, scroll_area_y1, Math.max(1, ps[0]));
+    }
+
+    private void csi_SD(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        scroll_area_down(scroll_area_y0, scroll_area_y1, Math.max(1, ps[0]));
+    }
+
+    private void csi_CTC(String p) {
+        String[] ps = vt100_parse_params(p, new String[] { "0" });
+        for (String m : ps) {
+            if ("0".equals(m)) {
+                if (tab_stops.indexOf(cx) < 0) {
+                    tab_stops.add(cx);
+                    Collections.sort(tab_stops);
+                }
+            } else if ("2".equals(m)) {
+                tab_stops.remove(Integer.valueOf(cx));
+            } else if ("5".equals(m)) {
+                tab_stops = new ArrayList<Integer>();
+            }
+        }
+    }
+
+    private void csi_ECH(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        int n = Math.min(width - cx, Math.max(1, ps[0]));
+        clear(cy, cx, cy + 1, cx + n);
+    }
+
+    private void csi_CBT(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        ctrl_HT(1 - Math.max(1, ps[0]));
+    }
+
+    private void csi_HPA(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_set_x(ps[0] - 1);
+    }
+
+    private void csi_HPR(String p) {
+        csi_CUF(p);
+    }
+
+    private void csi_REP(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        if (vt100_lastchar < 32) {
+            return;
+        }
+        int n = Math.min(2000, Math.max(1, ps[0]));
+        while (n-- > 0) {
+            dumb_echo(vt100_lastchar);
+        }
+        vt100_lastchar = 0;
+    }
+
+    private void csi_DA(String p) {
+        String[] ps = vt100_parse_params(p, new String[] { "0" });
+        if ("0".equals(ps[0])) {
+            vt100_out = "\u001b[?1;2c";
+        } else if (">0".equals(ps[0]) || ">".equals(ps[0])) {
+            vt100_out = "\u001b[>0;184;0c";
+        }
+    }
+
+    private void csi_VPA(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1 });
+        cursor_set_y(ps[0] - 1);
+    }
+
+    private void csi_VPR(String p) {
+        csi_CUD(p);
+    }
+
+    private void csi_HVP(String p) {
+        csi_CUP(p);
+    }
+
+    private void csi_TBC(String p) {
+        String[] ps = vt100_parse_params(p, new String[] { "0" });
+        if ("0".equals(ps[0])) {
+            csi_CTC("2");
+        } else if ("3".equals(ps[0])) {
+            csi_CTC("5");
+        }
+    }
+
+    private void csi_SM(String p) {
+        vt100_setmode(p, true);
+    }
+
+    private void csi_RM(String p) {
+        vt100_setmode(p, false);
+    }
+
+    private void csi_SGR(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 0 });
+        for (int m : ps) {
+            if (m == 0) {
+                attr = 0x00fe0000;
+            } else if (m == 1) {
+                attr |= 0x08000000;
+            } else if (m == 4) {
+                attr |= 0x01000000;
+            } else if (m == 7) {
+                attr |= 0x02000000;
+            } else if (m == 8) {
+                attr |= 0x04000000;
+            } else if (m == 24) {
+                attr &= 0x7eff0000;
+            } else if (m == 27) {
+                attr &= 0x7dff0000;
+            } else if (m == 28) {
+                attr &= 0x7bff0000;
+            } else if (m >= 30 && m <= 37) {
+                attr = (attr & 0x7f0f0000) | ((m - 30) << 20);
+            } else if (m == 39) {
+                attr = (attr & 0x7f0f0000) | 0x00f00000;
+            } else if (m >= 40 && m <= 47) {
+                attr = (attr & 0x7ff00000) | ((m - 40) << 16);
+            } else if (m == 49) {
+                attr = (attr & 0x7ff00000) | 0x000e0000;
+            }
+        }
+    }
+
+    private void csi_DSR(String p) {
+        String[] ps = vt100_parse_params(p, new String[] { "0" });
+        if ("5".equals(ps[0])) {
+            vt100_out = "\u001b[0n";
+        } else if ("6".equals(ps[0])) {
+            vt100_out = "\u001b[" + (cy + 1) + ";" + (cx + 1) + "R";
+        } else if ("7".equals(ps[0])) {
+            vt100_out = "gogo-term";
+        } else if ("8".equals(ps[0])) {
+            vt100_out = "1.0-SNAPSHOT";
+        } else if ("?6".equals(ps[0])) {
+            vt100_out = "\u001b[" + (cy + 1) + ";" + (cx + 1) + ";0R";
+        } else if ("?15".equals(ps[0])) {
+            vt100_out = "\u001b[?13n";
+        } else if ("?25".equals(ps[0])) {
+            vt100_out = "\u001b[?20n";
+        } else if ("?26".equals(ps[0])) {
+            vt100_out = "\u001b[?27;1n";
+        } else if ("?53".equals(ps[0])) {
+            vt100_out = "\u001b[?53n";
+        }
+        // ?75 : Data Integrity report
+        // ?62 : Macro Space report
+        // ?63 : Memory Checksum report
+    }
+
+    private void csi_DECSTBM(String p) {
+        int[] ps = vt100_parse_params(p, new int[] { 1, height });
+        scroll_area_set(ps[0] - 1, ps[1]);
+        if (vt100_mode_origin) {
+            cursor_set(scroll_area_y0, 0);
+        } else {
+            cursor_set(0, 0);
+        }
+    }
+
+    private void csi_SCP(String p) {
+        vt100_saved_cx = cx;
+        vt100_saved_cy = cy;
+    }
+
+    private void csi_RCP(String p) {
+        cx = vt100_saved_cx;
+        cy = vt100_saved_cy;
+    }
+
+    private void csi_DECREQTPARM(String p) {
+        String[] ps = vt100_parse_params(p, new String[0]);
+        if ("0".equals(ps[0])) {
+            vt100_out = "\u001b[2;1;1;112;112;1;0x";
+        } else if ("1".equals(ps[0])) {
+            vt100_out = "\u001b[3;1;1;112;112;1;0x";
+        }
+    }
+
+    private void csi_DECSTR(String p) {
+        reset_soft();
+    }
+
+    //
+    // VT100 parser
+    //
+
+    private String[] vt100_parse_params(String p, String[] defaults) {
+        String prefix = "";
+        if (p.length() > 0) {
+            if (p.charAt(0) >= '<' && p.charAt(0) <= '?') {
+                prefix = "" + p.charAt(0);
+                p = p.substring(1);
+            }
+        }
+        String[] ps = p.split(";");
+        int n = Math.max(ps.length, defaults.length);
+        String[] values = new String[n];
+        for (int i = 0; i < n; i++) {
+            String value = null;
+            if (i < ps.length && ps[i].length() > 0) {
+                value = prefix + ps[i];
+            }
+            if (value == null && i < defaults.length) {
+                value = defaults[i];
+            }
+            if (value == null) {
+                value = "";
+            }
+            values[i] = value;
+        }
+        return values;
+    }
+
+    private int[] vt100_parse_params(String p, int[] defaults) {
+        String prefix = "";
+        p = p == null ? "" : p;
+        if (p.length() > 0) {
+            if (p.charAt(0) >= '<' && p.charAt(0) <= '?') {
+                prefix = p.substring(0, 1);
+                p = p.substring(1);
+            }
+        }
+        String[] ps = p.split(";");
+        int n = Math.max(ps.length, defaults.length);
+        int[] values = new int[n];
+        for (int i = 0; i < n; i++) {
+            Integer value = null;
+            if (i < ps.length) {
+                String v = prefix + ps[i];
+                try {
+                    value = Integer.parseInt(v);
+                } catch (NumberFormatException e) {
+                }
+            }
+            if (value == null && i < defaults.length) {
+                value = defaults[i];
+            }
+            if (value == null) {
+                value = 0;
+            }
+            values[i] = value;
+        }
+        return values;
+    }
+
+    private void vt100_parse_reset() {
+        vt100_parse_reset(State.None);
+    }
+
+    private void vt100_parse_reset(State state) {
+        vt100_parse_state = state;
+        vt100_parse_len = 0;
+        vt100_parse_func = 0;
+        vt100_parse_param = "";
+    }
+
+    private void vt100_parse_process() {
+        if (vt100_parse_state == State.Esc) {
+            switch (vt100_parse_func) {
+                case 0x0036: /* DECBI */ break;
+                case 0x0037: esc_DECSC(); break;
+                case 0x0038: esc_DECRC(); break;
+                case 0x0042: /* BPH */ break;
+                case 0x0043: /* NBH */ break;
+                case 0x0044: esc_IND(); break;
+                case 0x0045: esc_NEL(); break;
+                case 0x0046: /* SSA */ esc_NEL(); break;
+                case 0x0048: esc_HTS(); break;
+                case 0x0049: /* HTJ */ break;
+                case 0x004A: /* VTS */ break;
+                case 0x004B: /* PLD */ break;
+                case 0x004C: /* PLU */ break;
+                case 0x004D: esc_RI(); break;
+                case 0x004E: esc_SS2(); break;
+                case 0x004F: esc_SS3(); break;
+                case 0x0050: esc_DCS(); break;
+                case 0x0051: /* PU1 */ break;
+                case 0x0052: /* PU2 */ break;
+                case 0x0053: /* STS */ break;
+                case 0x0054: /* CCH */ break;
+                case 0x0055: /* MW */ break;
+                case 0x0056: /* SPA */ break;
+                case 0x0057: /* ESA */ break;
+                case 0x0058: esc_SOS(); break;
+                case 0x005A: /* SCI */ break;
+                case 0x005B: esc_CSI(); break;
+                case 0x005C: esc_ST(); break;
+                case 0x005D: esc_OSC(); break;
+                case 0x005E: esc_PM(); break;
+                case 0x005F: esc_APC(); break;
+                case 0x0060: /* DMI */ break;
+                case 0x0061: /* INT */ break;
+                case 0x0062: /* EMI */ break;
+                case 0x0063: esc_RIS(); break;
+                case 0x0064: /* CMD */ break;
+                case 0x006C: /* RM */ break;
+                case 0x006E: /* LS2 */ break;
+                case 0x006F: /* LS3 */ break;
+                case 0x007C: /* LS3R */ break;
+                case 0x007D: /* LS2R */ break;
+                case 0x007E: /* LS1R */ break;
+                case 0x2338: esc_DECALN(); break;
+                case 0x2841: esc_G0_0(); break;
+                case 0x2842: esc_G0_1(); break;
+                case 0x2830: esc_G0_2(); break;
+                case 0x2831: esc_G0_3(); break;
+                case 0x2832: esc_G0_4(); break;
+                case 0x2930: esc_G1_2(); break;
+                case 0x2931: esc_G1_3(); break;
+                case 0x2932: esc_G1_4(); break;
+                case 0x2941: esc_G1_0(); break;
+                case 0x2942: esc_G1_1(); break;
+            }
+            if (vt100_parse_state == State.Esc) {
+                vt100_parse_reset();
+            }
+        } else {
+            switch (vt100_parse_func) {
+                case 0x0040: csi_ICH(vt100_parse_param); break;
+                case 0x0041: csi_CUU(vt100_parse_param); break;
+                case 0x0042: csi_CUD(vt100_parse_param); break;
+                case 0x0043: csi_CUF(vt100_parse_param); break;
+                case 0x0044: csi_CUB(vt100_parse_param); break;
+                case 0x0045: csi_CNL(vt100_parse_param); break;
+                case 0x0046: csi_CPL(vt100_parse_param); break;
+                case 0x0047: csi_CHA(vt100_parse_param); break;
+                case 0x0048: csi_CUP(vt100_parse_param); break;
+                case 0x0049: csi_CHT(vt100_parse_param); break;
+                case 0x004A: csi_ED(vt100_parse_param); break;
+                case 0x004B: csi_EL(vt100_parse_param); break;
+                case 0x004C: csi_IL(vt100_parse_param); break;
+                case 0x004D: csi_DL(vt100_parse_param); break;
+                case 0x004E: /* EF */ break;
+                case 0x004F: /* EA */ break;
+                case 0x0050: csi_DCH(vt100_parse_param); break;
+                case 0x0051: /* SEE */ break;
+                case 0x0052: /* CPR */ break;
+                case 0x0053: csi_SU(vt100_parse_param); break;
+                case 0x0054: csi_SD(vt100_parse_param); break;
+                case 0x0055: /* NP */ break;
+                case 0x0056: /* PP */ break;
+                case 0x0057: csi_CTC(vt100_parse_param); break;
+                case 0x0058: csi_ECH(vt100_parse_param); break;
+                case 0x0059: /* CVT */ break;
+                case 0x005A: csi_CBT(vt100_parse_param); break;
+                case 0x005B: /* SRS */ break;
+                case 0x005C: /* PTX */ break;
+                case 0x005D: /* SDS */ break;
+                case 0x005E: /* SIMD */ break;
+                case 0x0060: csi_HPA(vt100_parse_param); break;
+                case 0x0061: csi_HPR(vt100_parse_param); break;
+                case 0x0062: csi_REP(vt100_parse_param); break;
+                case 0x0063: csi_DA(vt100_parse_param); break;
+                case 0x0064: csi_VPA(vt100_parse_param); break;
+                case 0x0065: csi_VPR(vt100_parse_param); break;
+                case 0x0066: csi_HVP(vt100_parse_param); break;
+                case 0x0067: csi_TBC(vt100_parse_param); break;
+                case 0x0068: csi_SM(vt100_parse_param); break;
+                case 0x0069: /* MC */ break;
+                case 0x006A: /* HPB */ break;
+                case 0x006B: /* VPB */ break;
+                case 0x006C: csi_RM(vt100_parse_param); break;
+                case 0x006D: csi_SGR(vt100_parse_param); break;
+                case 0x006E: csi_DSR(vt100_parse_param); break;
+                case 0x006F: /* DAQ */ break;
+                case 0x0072: csi_DECSTBM(vt100_parse_param); break;
+                case 0x0073: csi_SCP(vt100_parse_param); break;
+                case 0x0075: csi_RCP(vt100_parse_param); break;
+                case 0x0078: csi_DECREQTPARM(vt100_parse_param); break;
+                case 0x2040: /* SL */ break;
+                case 0x2041: /* SR */ break;
+                case 0x2042: /* GSM */ break;
+                case 0x2043: /* GSS */ break;
+                case 0x2044: /* FNT */ break;
+                case 0x2045: /* TSS */ break;
+                case 0x2046: /* JFY */ break;
+                case 0x2047: /* SPI */ break;
+                case 0x2048: /* QUAD */ break;
+                case 0x2049: /* SSU */ break;
+                case 0x204A: /* PFS */ break;
+                case 0x204B: /* SHS */ break;
+                case 0x204C: /* SVS */ break;
+                case 0x204D: /* IGS */ break;
+                case 0x204E: /* deprecated: HTSA */ break;
+                case 0x204F: /* IDCS */ break;
+                case 0x2050: /* PPA */ break;
+                case 0x2051: /* PPR */ break;
+                case 0x2052: /* PPB */ break;
+                case 0x2053: /* SPD */ break;
+                case 0x2054: /* DTA */ break;
+                case 0x2055: /* SLH */ break;
+                case 0x2056: /* SLL */ break;
+                case 0x2057: /* FNK */ break;
+                case 0x2058: /* SPQR */ break;
+                case 0x2059: /* SEF */ break;
+                case 0x205A: /* PEC */ break;
+                case 0x205B: /* SSW */ break;
+                case 0x205C: /* SACS */ break;
+                case 0x205D: /* SAPV */ break;
+                case 0x205E: /* STAB */ break;
+                case 0x205F: /* GCC */ break;
+                case 0x2060: /* TAPE */ break;
+                case 0x2061: /* TALE */ break;
+                case 0x2062: /* TAC */ break;
+                case 0x2063: /* TCC */ break;
+                case 0x2064: /* TSR */ break;
+                case 0x2065: /* SCO */ break;
+                case 0x2066: /* SRCS */ break;
+                case 0x2067: /* SCS */ break;
+                case 0x2068: /* SLS */ break;
+                case 0x2069: /* SPH */ break;
+                case 0x206A: /* SPL */ break;
+                case 0x206B: /* SCP */ break;
+                case 0x2170: csi_DECSTR(vt100_parse_param); break;
+                case 0x2472: /* DECCARA */ break;
+                case 0x2477: /* DECRQPSR */ break;
+            }
+            if (vt100_parse_state == State.Csi) {
+                vt100_parse_reset();
+            }
+        }
+    }
+
+    private boolean vt100_write(int c) {
+        if (c < 32) {
+            if (c == 27) {
+                vt100_parse_reset(State.Esc);
+                return true;
+            } else if (c == 14) {
+                ctrl_SO();
+            } else if (c == 15) {
+                ctrl_SI();
+            }
+        } else if ((c & 0xffe0) == 0x0080) {
+            vt100_parse_reset(State.Esc);
+            vt100_parse_func = (char)(c - 0x0040);
+            vt100_parse_process();
+            return true;
+        }
+        if (vt100_parse_state != State.None) {
+            if (vt100_parse_state == State.Str) {
+                if (c >= 32) {
+                    return true;
+                }
+                vt100_parse_reset();
+            } else {
+                if (c < 32) {
+                    if (c == 24 || c == 26) {
+                        vt100_parse_reset();
+                        return true;
+                    }
+                } else {
+                    vt100_parse_len += 1;
+                    if (vt100_parse_len > 32) {
+                        vt100_parse_reset();
+                    } else {
+                        int msb = c & 0xf0;
+                        if (msb == 0x20) {
+                            vt100_parse_func <<= 8;
+                            vt100_parse_func += (char) c;
+                        } else if (msb == 0x30 && vt100_parse_state == State.Csi) {
+                            vt100_parse_param += new String(new char[] { (char) c } );
+                        } else {
+                            vt100_parse_func <<= 8;
+                            vt100_parse_func += (char) c;
+                            vt100_parse_process();
+                        }
+                        return true;
+                    }
+                }
+            }
+        }
+        vt100_lastchar = c;
+        return false;
+    }
+
+    //
+    // Dirty
+    //
+
+    private synchronized void setDirty() {
+        dirty.set(true);
+        notifyAll();
+    }
+
+    //
+    // External interface
+    //
+
+    public synchronized boolean setSize(int w, int h) {
+        if (w < 2 || w > 256 || h < 2 || h > 256) {
+            return false;
+        }
+        this.width = w;
+        this.height = h;
+        reset_screen();
+        return true;
+    }
+
+    public synchronized String read() {
+        String d = vt100_out;
+        vt100_out = "";
+        return d;
+    }
+
+    public synchronized String pipe(String d) {
+        String o = "";
+        for (char c : d.toCharArray()) {
+            if (vt100_keyfilter_escape) {
+                vt100_keyfilter_escape = false;
+                if (vt100_mode_cursorkey) {
+                    switch (c) {
+                        case '~': o += "~"; break;
+                        case 'A': o += "\u001bOA"; break;
+                        case 'B': o += "\u001bOB"; break;
+                        case 'C': o += "\u001bOC"; break;
+                        case 'D': o += "\u001bOD"; break;
+                        case 'F': o += "\u001bOF"; break;
+                        case 'H': o += "\u001bOH"; break;
+                        case '1': o += "\u001b[5~"; break;
+                        case '2': o += "\u001b[6~"; break;
+                        case '3': o += "\u001b[2~"; break;
+                        case '4': o += "\u001b[3~"; break;
+                        case 'a': o += "\u001bOP"; break;
+                        case 'b': o += "\u001bOQ"; break;
+                        case 'c': o += "\u001bOR"; break;
+                        case 'd': o += "\u001bOS"; break;
+                        case 'e': o += "\u001b[15~"; break;
+                        case 'f': o += "\u001b[17~"; break;
+                        case 'g': o += "\u001b[18~"; break;
+                        case 'h': o += "\u001b[19~"; break;
+                        case 'i': o += "\u001b[20~"; break;
+                        case 'j': o += "\u001b[21~"; break;
+                        case 'k': o += "\u001b[23~"; break;
+                        case 'l': o += "\u001b[24~"; break;
+                    }
+                } else {
+                    switch (c) {
+                        case '~': o += "~"; break;
+                        case 'A': o += "\u001b[A"; break;
+                        case 'B': o += "\u001b[B"; break;
+                        case 'C': o += "\u001b[C"; break;
+                        case 'D': o += "\u001b[D"; break;
+                        case 'F': o += "\u001b[F"; break;
+                        case 'H': o += "\u001b[H"; break;
+                        case '1': o += "\u001b[5~"; break;
+                        case '2': o += "\u001b[6~"; break;
+                        case '3': o += "\u001b[2~"; break;
+                        case '4': o += "\u001b[3~"; break;
+                        case 'a': o += "\u001bOP"; break;
+                        case 'b': o += "\u001bOQ"; break;
+                        case 'c': o += "\u001bOR"; break;
+                        case 'd': o += "\u001bOS"; break;
+                        case 'e': o += "\u001b[15~"; break;
+                        case 'f': o += "\u001b[17~"; break;
+                        case 'g': o += "\u001b[18~"; break;
+                        case 'h': o += "\u001b[19~"; break;
+                        case 'i': o += "\u001b[20~"; break;
+                        case 'j': o += "\u001b[21~"; break;
+                        case 'k': o += "\u001b[23~"; break;
+                        case 'l': o += "\u001b[24~"; break;
+                    }
+                }
+            } else if (c == '~') {
+                vt100_keyfilter_escape = true;
+            } else if (c == 127) {
+                if (vt100_mode_backspace) {
+                    o += (char) 8;
+                } else {
+                    o += (char) 127;
+                }
+            } else {
+                o += c;
+                if (vt100_mode_lfnewline && c == 13) {
+                    o += (char) 10;
+                }
+            }
+        }
+        return o;
+    }
+
+    public synchronized boolean write(String d) {
+        d = utf8_decode(d);
+        for (int c : d.toCharArray()) {
+            if (vt100_write(c)) {
+                continue;
+            }
+            if (dumb_write(c)) {
+                continue;
+            }
+            if (c <= 0xffff) {
+                dumb_echo(c);
+            }
+        }
+        return true;
+    }
+
+    public synchronized String dump(long timeout, boolean forceDump) throws InterruptedException {
+        if (!dirty.get() && timeout > 0) {
+            wait(timeout);
+        }
+        if (dirty.compareAndSet(true, false) || forceDump) {
+            StringBuilder sb = new StringBuilder();
+            int prev_attr = -1;
+            int cx = Math.min(this.cx, width - 1);
+            int cy = this.cy;
+            sb.append("<div><pre class='term'>");
+            for (int y = 0; y < height; y++) {
+                int wx = 0;
+                for (int x = 0; x < width; x++) {
+                    int d = screen[y * width + x];
+                    int c = d & 0xffff;
+                    int a = d >> 16;
+                    if (cy == y && cx == x && vt100_mode_cursor) {
+                        a = a & 0xfff0 | 0x000c;
+                    }
+                    if (a != prev_attr) {
+                        if (prev_attr != -1) {
+                            sb.append("</span>");
+                        }
+                        int bg = a & 0x000f;
+                        int fg = (a & 0x00f0) >> 4;
+                        boolean inv = (a & 0x0200) != 0;
+                        boolean inv2 = vt100_mode_inverse;
+                        if (inv && !inv2 || inv2 && !inv) {
+                            int i = fg; fg = bg; bg = i;
+                        }
+                        if ((a & 0x0400) != 0) {
+                            fg = 0x0c;
+                        }
+                        String ul;
+                        if ((a & 0x0100) != 0) {
+                            ul = " ul";
+                        } else {
+                            ul = "";
+                        }
+                        String b;
+                        if ((a & 0x0800) != 0) {
+                            b = " b";
+                        } else {
+                            b = "";
+                        }
+                        sb.append("<span class='f").append(fg).append(" b").append(bg).append(ul).append(b).append("'>");
+                        prev_attr = a;
+                    }
+                    switch (c) {
+                        case '&': sb.append("&amp;"); break;
+                        case '<': sb.append("&lt;"); break;
+                        case '>': sb.append("&gt;"); break;
+                        default:
+                            wx += utf8_charwidth(c);
+                            if (wx <= width) {
+                                sb.append((char) c);
+                            }
+                            break;
+                    }
+                }
+                sb.append("\n");
+            }
+            sb.append("</span></pre></div>");
+            return sb.toString();
+        }
+        return null;
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (int y = 0; y < height; y++) {
+            for (int x = 0; x < width; x++) {
+                sb.append((char) (screen[y * width + x] & 0xffff));
+            }
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+}
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/WebTerminal.java b/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/WebTerminal.java
new file mode 100644
index 0000000..325664d
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/WebTerminal.java
@@ -0,0 +1,46 @@
+/*
+ * 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.karaf.webconsole.gogo;
+
+import jline.TerminalSupport;
+
+public class WebTerminal extends TerminalSupport {
+
+    private int width;
+    private int height;
+
+    public WebTerminal(int width, int height) {
+        super(true);
+        this.width = width;
+        this.height = height;
+    }
+
+    public void init() throws Exception {
+    }
+
+    public void restore() throws Exception {
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+}
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml b/karaf-2.2.x/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
new file mode 100644
index 0000000..e66919e
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
@@ -0,0 +1,35 @@
+<?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.
+
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" default-activation="lazy">
+
+    <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor" />
+
+    <bean id="gogoPlugin" class="org.apache.karaf.webconsole.gogo.GogoPlugin" init-method="start" destroy-method="stop">
+        <property name="commandProcessor" ref="commandProcessor" />
+        <property name="bundleContext" ref="blueprintBundleContext" />
+    </bean>
+
+    <service ref="gogoPlugin" interface="javax.servlet.Servlet" >
+        <service-properties>
+            <entry key="felix.webconsole.label" value="gogo"/>
+        </service-properties>
+    </service>
+
+</blueprint>
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/resources/OSGI-INF/bundle.info b/karaf-2.2.x/webconsole/gogo/src/main/resources/OSGI-INF/bundle.info
new file mode 100644
index 0000000..f87818a
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/resources/OSGI-INF/bundle.info
@@ -0,0 +1,13 @@
+\u001B[1mSYNOPSIS\u001B[0m
+    ${project.name}
+
+    ${project.description}
+
+    Maven URL:
+        \u001B[33mmvn:${project.groupId}/${project.artifactId}/${project.version}\u001B[0m
+
+\u001B[1mDESCRIPTION\u001B[0m
+    This bundle provides Gogo plugin for the Apache Felix Web console.
+
+\u001B[1mSEE ALSO\u001B[0m
+    \u001B[36mWeb console\u001B[0m section of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/resources/res/ui/gogo.css b/karaf-2.2.x/webconsole/gogo/src/main/resources/res/ui/gogo.css
new file mode 100644
index 0000000..b15ece8
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/resources/res/ui/gogo.css
@@ -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.
+ */
+
+/**
+ * Based on http://antony.lesuisse.org/software/ajaxterm/
+ *  Public Domain License
+ */
+
+div#console {
+    font-size: 12px;
+    margin: 12px;
+}
+
+div#term {
+    display: inline-block;
+}
+
+pre.stat {
+	margin: 0px;
+	padding: 4px;
+	display: block;
+	font-family: monospace;
+	white-space: pre;
+	background-color: black;
+	border-top: 1px solid black;
+	color: white;
+}
+pre.stat span {
+	padding: 0px;
+}
+pre.stat .on {
+	background-color: #080;
+	font-weight: bold;
+	color: white;
+	cursor: pointer;
+}
+pre.stat .off {
+	background-color: #888;
+	font-weight: bold;
+	color: white;
+	cursor: pointer;
+}
+pre.term {
+	margin: 0px;
+	padding: 4px;
+	display: block;
+	font-family: monospace;
+	white-space: pre;
+    background:#000;
+	border-top: 1px solid white;
+	color: #eee;
+}
+pre.term span.f0  { color: #000000; }
+pre.term span.f1  { color: #c00006; }
+pre.term span.f2  { color: #1bc806; }
+pre.term span.f3  { color: #c3c609; }
+pre.term span.f4  { color: #0000c2; }
+pre.term span.f5  { color: #bf00c2; }
+pre.term span.f6  { color: #19c4c2; }
+pre.term span.f7  { color: #f2f2f2; }
+pre.term span.f12 { color: transparent; }
+pre.term span.f14 { color: #000000; }
+pre.term span.f15 { color: #bbbbbb; }
+pre.term span.b0  { background-color: #000000; }
+pre.term span.b1  { background-color: #cc2300; }
+pre.term span.b2  { background-color: #00cc00; }
+pre.term span.b3  { background-color: #cccc00; }
+pre.term span.b4  { background-color: #0e2acc; }
+pre.term span.b5  { background-color: #cc34cc; }
+pre.term span.b6  { background-color: #00cccc; }
+pre.term span.b7  { background-color: #f5f5f5; }
+pre.term span.b12 { background-color: #555555; }
+pre.term span.b14 { background-color: transparent; }
+pre.term span.b15 { background-color: #ffffff; }
+pre.term span.ul  { text-decoration: underline; }
+pre.term span.b   { font-weight:900; }
+
diff --git a/karaf-2.2.x/webconsole/gogo/src/main/resources/res/ui/gogo.js b/karaf-2.2.x/webconsole/gogo/src/main/resources/res/ui/gogo.js
new file mode 100644
index 0000000..b951a6f
--- /dev/null
+++ b/karaf-2.2.x/webconsole/gogo/src/main/resources/res/ui/gogo.js
@@ -0,0 +1,245 @@
+//
+// 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.
+//
+
+//
+// Based on http://antony.lesuisse.org/software/ajaxterm/
+//  Public Domain License
+//
+
+gogo = { };
+
+gogo.Terminal_ctor = function(div, width, height) {
+
+   var query0 = "w=" + width + "&h=" + height;
+   var query1 = query0 + "&k=";
+   var buf = "";
+   var timeout;
+   var error_timeout;
+   var keybuf = [];
+   var sending = 0;
+   var rmax = 1;
+   var force = 1;
+
+   var dstat = document.createElement('pre');
+   var sled = document.createElement('span');
+   var sdebug = document.createElement('span');
+   var dterm = document.createElement('div');
+
+   function debug(s) {
+       sdebug.innerHTML = s;
+   }
+
+   function error() {
+       sled.className = 'off';
+       debug("Connection lost timeout ts:" + ((new Date).getTime()));
+   }
+
+   function update() {
+       if (sending == 0) {
+           sending = 1;
+           sled.className = 'on';
+           var r = new XMLHttpRequest();
+           var send = "";
+           while (keybuf.length > 0) {
+               send += keybuf.pop();
+           }
+           var query = query1 + send;
+           if (force) {
+               query = query + "&f=1";
+               force = 0;
+           }
+           r.open("POST", "gogo", true);
+           r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+           r.onreadystatechange = function () {
+               if (r.readyState == 4) {
+                   if (r.status == 200) {
+                       window.clearTimeout(error_timeout);
+                       if (r.responseText.length > 0) {
+                           dterm.innerHTML = r.responseText;
+                           rmax = 100;
+                       } else {
+                           rmax *= 2;
+                           if (rmax > 2000)
+                               rmax = 2000;
+                       }
+                       sending=0;
+                       sled.className = 'off';
+                       timeout = window.setTimeout(update, rmax);
+                   } else {
+                       debug("Connection error status:" + r.status);
+                   }
+               }
+           }
+           error_timeout = window.setTimeout(error, 5000);
+           r.send(query);
+       }
+   }
+
+   function queue(s) {
+       keybuf.unshift(s);
+       if (sending == 0) {
+           window.clearTimeout(timeout);
+           timeout = window.setTimeout(update, 1);
+       }
+   }
+
+   function keypress(ev, fromkeydown) {
+        // Translate to standard keycodes
+        if (!ev)
+            ev = window.event;
+        var kc;
+        if (ev.keyCode)
+            kc = ev.keyCode;
+        if (!fromkeydown && ev.which)
+            kc = ev.which;
+        if (ev.ctrlKey) {
+            if (kc >= 0 && kc <= 32)
+                kc = kc;
+            else if (kc >= 65 && kc <= 90)
+                kc -= 64;
+            else if (kc >= 97 && kc <= 122)
+                kc -= 96;
+            else {
+                switch (kc) {
+                    case 54:  kc=30; break;	// Ctrl-^
+                    case 109: kc=31; break;	// Ctrl-_
+                    case 219: kc=27; break;	// Ctrl-[
+                    case 220: kc=28; break;	// Ctrl-\
+                    case 221: kc=29; break;	// Ctrl-]
+                    default: return true;
+                }
+            }
+        } else if (fromkeydown) {
+            switch(kc) {
+                case 8: break;			     // Backspace
+                case 9: break;               // Tab
+                case 27: break;			     // ESC
+                case 33:  kc = 63276; break; // PgUp
+                case 34:  kc = 63277; break; // PgDn
+                case 35:  kc = 63275; break; // End
+                case 36:  kc = 63273; break; // Home
+                case 37:  kc = 63234; break; // Left
+                case 38:  kc = 63232; break; // Up
+                case 39:  kc = 63235; break; // Right
+                case 40:  kc = 63233; break; // Down
+                case 45:  kc = 63302; break; // Ins
+                case 46:  kc = 63272; break; // Del
+                case 112: kc = 63236; break; // F1
+                case 113: kc = 63237; break; // F2
+                case 114: kc = 63238; break; // F3
+                case 115: kc = 63239; break; // F4
+                case 116: kc = 63240; break; // F5
+                case 117: kc = 63241; break; // F6
+                case 118: kc = 63242; break; // F7
+                case 119: kc = 63243; break; // F8
+                case 120: kc = 63244; break; // F9
+                case 121: kc = 63245; break; // F10
+                case 122: kc = 63246; break; // F11
+                case 123: kc = 63247; break; // F12
+                default: return true;
+            }
+        }
+
+        var k = "";
+        // Build character
+        switch (kc) {
+            case 126:   k = "~~"; break;
+            case 63232: k = "~A"; break; // Up
+            case 63233: k = "~B"; break; // Down
+            case 63234: k = "~D"; break; // Left
+            case 63235: k = "~C"; break; // Right
+            case 63276: k = "~1"; break; // PgUp
+            case 63277: k = "~2"; break; // PgDn
+            case 63273: k = "~H"; break; // Home
+            case 63275: k = "~F"; break; // End
+            case 63302: k = "~3"; break; // Ins
+            case 63272: k = "~4"; break; // Del
+            case 63236: k = "~a"; break; // F1
+            case 63237: k = "~b"; break; // F2
+            case 63238: k = "~c"; break; // F3
+            case 63239: k = "~d"; break; // F4
+            case 63240: k = "~e"; break; // F5
+            case 63241: k = "~f"; break; // F6
+            case 63242: k = "~g"; break; // F7
+            case 63243: k = "~h"; break; // F8
+            case 63244: k = "~i"; break; // F9
+            case 63245: k = "~j"; break; // F10
+            case 63246: k = "~k"; break; // F11
+            case 63247: k = "~l"; break; // F12
+            default:    k = String.fromCharCode(kc); break;
+        }
+
+//        debug("fromkeydown=" + fromkeydown + ", ev.keyCode=" + ev.keyCode + ", " +
+//              "ev.which=" + ev.which + ", ev.ctrlKey=" + ev.ctrlKey + ", " +
+//              "kc=" + kc + ", k=" + k);
+
+        queue(encodeURIComponent(k));
+
+        ev.cancelBubble = true;
+        if (ev.stopPropagation) ev.stopPropagation();
+        if (ev.preventDefault) ev.preventDefault();
+
+        return true;
+   }
+
+   function keydown(ev) {
+       if (!ev)
+          ev = window.event;
+           o = { 9:1, 8:1, 27:1, 33:1, 34:1, 35:1, 36:1, 37:1, 38:1, 39:1, 40:1, 45:1, 46:1, 112:1,
+                 113:1, 114:1, 115:1, 116:1, 117:1, 118:1, 119:1, 120:1, 121:1, 122:1, 123:1 };
+           if (o[ev.keyCode] || ev.ctrlKey || ev.altKey) {
+               keypress(ev, true);
+           }
+   }
+
+   function init() {
+       if (typeof(XMLHttpRequest) == "undefined") {
+         XMLHttpRequest = function() {
+           try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
+             catch(e) {}
+           try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
+             catch(e) {}
+           try { return new ActiveXObject("Msxml2.XMLHTTP"); }
+             catch(e) {}
+           try { return new ActiveXObject("Microsoft.XMLHTTP"); }
+             catch(e) {}
+           throw new Error("This browser does not support XMLHttpRequest.");
+         };
+       }
+       sled.appendChild(document.createTextNode('\xb7'));
+       sled.className = 'off';
+       dstat.appendChild(sled);
+       dstat.appendChild(document.createTextNode(' '));
+       dstat.appendChild(sdebug);
+       dstat.className = 'stat';
+       div.appendChild(dstat);
+       var d = document.createElement('div');
+       d.appendChild(dterm);
+       div.appendChild(d);
+       document.onkeypress = keypress;
+       document.onkeydown = keydown;
+       timeout = window.setTimeout(update, 100);
+   }
+
+   init();
+
+}
+
+gogo.Terminal = function(div, width, height) {
+   return new this.Terminal_ctor(div, width, height);
+}
+
diff --git a/karaf-2.2.x/webconsole/pom.xml b/karaf-2.2.x/webconsole/pom.xml
new file mode 100644
index 0000000..f1371c9
--- /dev/null
+++ b/karaf-2.2.x/webconsole/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+
+    <!--
+
+        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.
+    -->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>karaf</artifactId>
+        <version>2.2.7</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.apache.karaf.webconsole</groupId>
+    <artifactId>webconsole</artifactId>
+    <packaging>pom</packaging>
+    <name>Apache Karaf :: Web Console</name>
+
+    <modules>
+        <module>console</module>
+        <module>branding</module>
+        <module>features</module>
+        <module>gogo</module>
+        <module>admin</module>
+    </modules>
+
+</project>
