diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index d3ea777..a21b5e4 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -73,6 +73,7 @@
     * [KARAF-2192] - Karaf obr:listURl and obr:list tests fail on faster boxes
     * [KARAF-2206] - The container fails to start correctly with IBM Java 6
     * [KARAF-2209] - Allow overriding system properties
+    * [KARAF-2213] - Missing org.apache.karaf.jaas.authz-2.3.1.jar from the system repo prevents minimal distro startup
 
 ** Dependency upgrade
     * [KARAF-1801] - slf4j 1.7.0
diff --git a/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties b/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
index e0b9d62..6a69fc1 100644
--- a/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
+++ b/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
@@ -51,7 +51,6 @@
 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/jaas/org.apache.karaf.jaas.authz/${project.version}/org.apache.karaf.jaas.authz-${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
diff --git a/karaf-2.3.x/.gitignore b/karaf-2.3.x/.gitignore
deleted file mode 100644
index 27bf151..0000000
--- a/karaf-2.3.x/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-*.i??
-.idea
-.project
-.classpath
-.settings
-target
-eclipse-classes
-bin
diff --git a/karaf-2.3.x/BUILDING b/karaf-2.3.x/BUILDING
deleted file mode 100644
index 474fa48..0000000
--- a/karaf-2.3.x/BUILDING
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/LICENSE b/karaf-2.3.x/LICENSE
deleted file mode 100644
index b36a53d..0000000
--- a/karaf-2.3.x/LICENSE
+++ /dev/null
@@ -1,475 +0,0 @@
-
-                                 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.
-
-For asm:
-Copyright (c) 2000-2011 INRIA, France Telecom
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holders nor the names of its
-   contributors may be used to endorse or promote products derived from
-   this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
-
-For equinox:
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT").
-ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-
-b) in the case of each subsequent Contributor:
-
-i) changes to the Program, and
-
-ii) additions to the Program;
-
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.
-A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone
-acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate
-modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not
-derivative works of the Program.
-
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale
-of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide,
-royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform,
-distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code
-and object code form.
-
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide,
-royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer
-the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to
-the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such
-addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall
-not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no
-assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity
-based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses
-granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights
-needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program,
-it is Recipient's responsibility to acquire that license before distributing the Program.
-
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any,
-to grant the copyright license set forth in this Agreement.
-
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-
-b) its license agreement:
-
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including
-warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and
-fitness for a particular purpose;
-
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special,
-incidental and consequential damages, such as lost profits;
-
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any
-other party; and
-
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain
-it in a reasonable manner on or through a medium customarily used for software exchange.
-
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-
-b) a copy of this Agreement must be included with each copy of the Program.
-
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably
-allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who
-includes the Program in a commercial product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering,
-such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor
-("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims,
-lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused
-by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a
-commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any
-actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly
-notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and
-cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The
-Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is
-then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties
-related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.
-Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to
-those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result,
-the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for
-determining the appropriateness of using and distributing the Program and assumes all risks associated with its
-exercise of rights under this Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption
-of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
-PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
-GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity
-or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto,
-such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes
-such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of
-such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement
-and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the
-Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right
-to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement
-Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse
-Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new
-version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may
-always be distributed subject to the version of the Agreement under which it was received. In addition, after a new
-version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions)
-under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
-licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication,
-estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States
-of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the
-cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
-
-For Java Service Wrapper:
-Copyright (c) 1999, 2006 Tanuki Software, Inc.
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of the Java Service Wrapper 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, sub-license,
-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
-NON-INFRINGEMENT. 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.
-
-
-Portions of the Software have been derived from source code
-developed by Silver Egg Technology under the following license:
-
-BEGIN Silver Egg Techology License -----------------------------------
-
-    Copyright (c) 2001 Silver Egg Technology
-
-    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, sub-license, 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
-    NON-INFRINGEMENT. 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.
-
-END Silver Egg Techology License -------------------------------------
-
-For slf4j
-Copyright (c) 2004-2011 QOS.ch
-All rights reserved.
-
-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.
\ No newline at end of file
diff --git a/karaf-2.3.x/NOTICE b/karaf-2.3.x/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/README b/karaf-2.3.x/README
deleted file mode 100644
index fc19797..0000000
--- a/karaf-2.3.x/README
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/RELEASE-NOTES b/karaf-2.3.x/RELEASE-NOTES
deleted file mode 100644
index a21b5e4..0000000
--- a/karaf-2.3.x/RELEASE-NOTES
+++ /dev/null
@@ -1,1831 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-                    Apache Karaf 2.3.1
-                    ==================
-
-  Overview
-  --------
-
-  In this patch update to the 2.3.x line contains multiple bug fixes, improvements, and dependency updates including; an upgrade to OSGi spec 4.3.1, Spring 3.1.4.RELEASE, Pax Exam 2.6.0, Pax Web 1.1.12, Jetty 7.6.8.v20121106, Aries Blueprint Core 1.1.0, and fixes to the LDAP login module, improved failover lock logic, removes a console shutdown -f hang, and adds a jre-1.8 to jre.properties.
-  For more detail please see the change log below.
-
-  Changelog
-  ---------
-
-** Bug
-    * [KARAF-1278] - Comands: History does not work, can not edit current comand
-    * [KARAF-1327] - Client: can't execute alias command
-    * [KARAF-1386] - feature install war fails if http-whiteboard is already installed
-    * [KARAF-1715] - Occasional freeze on feature:install webconsole
-    * [KARAF-1748] - Karaf startup fails with NullPointerException when logfile can't be written
-    * [KARAF-1770] - Unable to feature:install webconsole under apache-karaf minimal package
-    * [KARAF-1914] - SSH client authentication randomly fails
-    * [KARAF-1921] - Upgrade to Spring 3.1.x for Karaf 2.3.x
-    * [KARAF-1936] - LDAPLoginModule not working in 2.3.0 due to missing import of javax.net.SocketFactory
-    * [KARAF-1938] - Lock logic should wait for start level change to occur
-    * [KARAF-1949] - console shutdown -f hang
-    * [KARAF-1963] - incorrect statement in developers-guide/branding-console.html
-    * [KARAF-1968] - Uninstalling jndi feature leads to hanging Karaf
-    * [KARAF-1978] - if use script to start a child instance then using karaf console admin:list can't get the instance correct status
-    * [KARAF-1986] - instance.properties file doesn't get updated if karaf.name is changed
-    * [KARAF-1992] - PropertiesLoginModule handles usernames with backslash not correct
-    * [KARAF-2007] - features without start-level in features.xml are always started first
-    * [KARAF-2009] - Error on visualize Licences page
-    * [KARAF-2013] - Bug in Karaf 2.3.0 Maven2 Features Plugin Documentation
-    * [KARAF-2026] - Two broken links on remote console manual page
-    * [KARAF-2027] - invalid password option for admin:connect command in documenation
-    * [KARAF-2029] - delete.user option missing from JDBCLoginModule
-    * [KARAF-2035] - Not able to clone the root instance
-    * [KARAF-2047] - config:edit -f command doesn't work on Windows platform
-    * [KARAF-2052] - Progress bar doesn't display properly on 80 char consoles
-    * [KARAF-2057] - NOTICE and LICENSE files are not correct
-    * [KARAF-2058] - ensure find the root instance entry when update root karaf instance name in instances.properties
-    * [KARAF-2071] - Minimal distribution doesn't start
-    * [KARAF-2073] - Progress bar sometimes goes backwards
-    * [KARAF-2074] - ensure admin service always load storage file instance.properties before each operation
-    * [KARAF-2096] - Upgrade to Pax Exam 2.6.0
-    * [KARAF-2114] - Update org.ops4j.pax.url.mvn.cfg file in child instance to include the system folder
-    * [KARAF-2115] - Sync weaving behavior between root and child instances
-    * [KARAF-2117] - LDAP login module is broken
-    * [KARAF-2133] - Generated title contain unresolved placeholder
-    * [KARAF-2134] - Features deployer does not support mvn urls
-    * [KARAF-2136] - ServiceMix Spec property mispelled in etc/system.properties
-    * [KARAF-2137] - Unable to prevent remote JMX access 
-    * [KARAF-2143] - Remove Jetty JUL logger configuration
-    * [KARAF-2154] - Entering an empty command removes previous command in history
-    * [KARAF-2171] - Start Karaf as service shows 'Activator' error in wrapper.log
-    * [KARAF-2190] - Karaf itest fails on fast machine
-    * [KARAF-2192] - Karaf obr:listURl and obr:list tests fail on faster boxes
-    * [KARAF-2206] - The container fails to start correctly with IBM Java 6
-    * [KARAF-2209] - Allow overriding system properties
-    * [KARAF-2213] - Missing org.apache.karaf.jaas.authz-2.3.1.jar from the system repo prevents minimal distro startup
-
-** Dependency upgrade
-    * [KARAF-1801] - slf4j 1.7.0
-    * [KARAF-1884] - Upgrade exam to Pax Exam 2.6.0
-    * [KARAF-1930] - Upgrade to Pax Web 1.1.5
-    * [KARAF-1948] - Upgrade to Apache POM 11
-    * [KARAF-1955] - Upgrade to ServiceMix Specs 2.2.0
-    * [KARAF-1977] - Upgrade to OSGi 4.3.1
-    * [KARAF-1981] - Upgrade to Felix ConfigAdmin 1.6.0
-    * [KARAF-2002] - Upgrade to Pax Web 1.1.6
-    * [KARAF-2015] - Upgrade to Pax Web 1.1.7
-    * [KARAF-2036] - Upgrade to Pax Web 1.1.9
-    * [KARAF-2055] - Upgrade to Apache POM 12
-    * [KARAF-2061] - Upgrade to commons-codec 1.7
-    * [KARAF-2063] - Upgrade to Felix EventAdmin 1.3.2
-    * [KARAF-2064] - Upgrade to Felix Metatype 1.0.6
-    * [KARAF-2065] - Upgrade to Felix SCR 1.6.2
-    * [KARAF-2068] - Upgrade to ASM 4.1
-    * [KARAF-2079] - upgrade to pax web 1.1.10
-    * [KARAF-2080] - Upgrade to slf4j 1.7.2
-    * [KARAF-2088] - Upgrade to Jetty 7.6.8.v20121106
-    * [KARAF-2147] - Upgrade to Aries JMX 1.1.1
-    * [KARAF-2148] - Upgrade to Aries Proxy 1.0.1
-    * [KARAF-2149] - Upgrade to Aries Blueprint Core 1.1.0
-    * [KARAF-2150] - Upgrade to Aries Blueprint CM 1.0.1
-    * [KARAF-2157] - Upgrade to Aries Util 1.1.0
-    * [KARAF-2162] - Upgrade to Pax Web 1.1.12
-    * [KARAF-2184] - Upgrade to Spring 3.1.4.RELEASE
-    * [KARAF-2208] - Upgrade to Aries JPA Blueprint 1.0.1
-
-** Improvement
-    * [KARAF-1129] - Allow configuring rmi Registry host as well as port
-    * [KARAF-1924] - Fix the WARN logs from starting a vanilla Karaf 2.3.0
-    * [KARAF-1933] - Add id for Maven repository
-    * [KARAF-1935] - Paxexam-Karaf manual needs to be backported from 3.9
-    * [KARAF-1951] - Remove workaround for KARAF-1117
-    * [KARAF-1990] - Add Cellar feature URI in org.apache.karaf.features.repos.cfg
-    * [KARAF-2017] - Service wrapper should use and populate JAVA_HOME in conf file
-    * [KARAF-2024] - add @id for org.ops4j.pax.url.mvn.repositories urls
-    * [KARAF-2043] - Document caveats of Pax Url Wrap when used in Karaf Shell
-    * [KARAF-2049] - Instructions in welcome screen is a bit misleading with hit
-    * [KARAF-2072] - Spelling correction
-    * [KARAF-2094] - Include howto add additional jvm configurations (if using the wrapper) to the documentation
-    * [KARAF-2097] - endorse stax-api spec jar
-    * [KARAF-2105] - Karaf features for Spring should all be same name and use version ranges
-    * [KARAF-2108] - a feature depend itself will cause stackoverflow error
-    * [KARAF-2119] - upgrade pax.base to 1.4.0
-    * [KARAF-2163] - Add a jre-1.8 to jre.properties
-    * [KARAF-2175] - Add the sonatype standard snapshot repository to the karaf repositories
-
-** New Feature
-    * [KARAF-581] - Also make rmiRegistryHost configurable
-    * [KARAF-2050] - Ability to configure ssh session idle timeout - currently hardcode as 5 minutes
-    * [KARAF-2078] - Create the shell:date command
-
-** Task
-    * [KARAF-2083] - Remove icu4j dependency
-    * [KARAF-2129] - more svn:ignores setttings
-    * [KARAF-2156] - Upgrade aries utils
-    * [KARAF-2161] - Incorrect LGPL license info in Notices file
-
-** Test
-    * [KARAF-2082] - Jasypt unit tests fail
-    * [KARAF-2087] - add a testcase to cover the scenario that the AdminService can always load latest instance status which changed by external process
-
-
-
-                    Apache Karaf 2.3.0
-                    ==================
-
-  Overview
-  --------
-
-  This release of Apache Karaf sets the stage for the 3.0.x line, introducing OSGi rev 4.3 
-support, new commands, features, improvements, and a mulititude of dependency updates. At 
-Karaf's core you'll find Equinox 3.8.0.v20120529-1548 and Apache Felix framework 4.0.3. New 
-additions such as Karaf-pax-exam, commands back ported from Karaf 3.x, and command aliases 
-to help make migrating betwen 2.3.x and 3.x easier.
-  For more detail please see the change log below.
-
-  Changelog
-  ---------
-
-** Bug
-    * [KARAF-536] - Backspace no longer works in Putty after using 'connect' command to connect to other instance, and commands are printed in only 2 columns.
-    * [KARAF-643] - KarArtifactInstaller::init has incorrect warning logic
-    * [KARAF-1040] - Commands should not catch exceptions but should rethrow them
-    * [KARAF-1050] - "osgi:start xxx" doesn't print anything
-    * [KARAF-1066] - make features xml parser more forgiving
-    * [KARAF-1162] - A command that can not be loaded breaks the whole completion
-    * [KARAF-1202] - log:tail spins with debug on
-    * [KARAF-1226] - Karaf Client cannot run a script
-    * [KARAF-1293] - feature level start-level not completely finished....
-    * [KARAF-1305] - Error with Basic HTTP Authentication when using karaf realm
-    * [KARAF-1343] - Features repo points to the old pax-wicket app
-    * [KARAF-1354] - SSH Log-In failes with "Authentication failed" with valid credentials
-    * [KARAF-1360] - Configration update doesn't work
-    * [KARAF-1363] - Upgrade Jetty when bugfix for the Loggging to stderr bug is available
-    * [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
-    * [KARAF-1392] - Removing a KAR should uninstall the shipped features
-    * [KARAF-1394] - Custom login modules not seen with Equinox
-    * [KARAF-1416] - Blueprint archetype instructions is missing
-    * [KARAF-1430] - Default child instance config is not the same as the root instance
-    * [KARAF-1491] - Admin service not able to start child instances when the JDK path contains a space on OS X
-    * [KARAF-1496] - Bad login when using sufficient modules but when the first fail
-    * [KARAF-1513] - SSH keystore incompatible if generated with IBM JDK
-    * [KARAF-1529] - command-watch messes the output when used with commands that take longer than the interval
-    * [KARAF-1538] - Exceptions when unregistering jmx means during a restart
-    * [KARAF-1541] - jaas:realm-manage raises a NullPointerException
-    * [KARAF-1547] - NullpointerException when running commands on jdk 6 update 33 or jdk 7 update 5
-    * [KARAF-1554] - Integration test failure on FeatureTest around osgi compareTo method
-    * [KARAF-1564] - karaf feature validate plugin should support to load the exports packages from dependency features
-    * [KARAF-1566] - instance:clone set the source instance in error
-    * [KARAF-1569] - aries.util.version is defined twice in pom.xml
-    * [KARAF-1573] - Potential ZipFile leak at KarArtifactInstaller.install()
-    * [KARAF-1585] - Installing using wrap protocol fails when specifying bundle version
-    * [KARAF-1587] - When executing a command through the client, no error is printed in the console in case of errors
-    * [KARAF-1591] - Upgrade to XBean 3.11.1
-    * [KARAF-1609] - command-watch info does not work
-    * [KARAF-1614] - upgrade to aries.proxy 0.3.1
-    * [KARAF-1617] - Blueprint deployer in combination with maven URL deployer creates wrong OSGi/blueprint/ file
-    * [KARAF-1624] - Rat checks fail
-    * [KARAF-1666] - Default configuration for jetty.xml could create problems
-    * [KARAF-1675] - Wrapper service requires a shell
-    * [KARAF-1680] - org.apache.karaf:apache-karaf:2.2.8:xml:features artifact is not available, for building custom Karaf
-    * [KARAF-1683] - "no matching cipher found" error connecting via SSH to wrapper Karaf service - on Ubuntu
-    * [KARAF-1695] - startup fails on Windows with only JRE installed
-    * [KARAF-1697] - Jenkins build fail
-    * [KARAF-1699] - MBeans should support the same flags as the commands
-    * [KARAF-1702] - Stopping the console bundle should not shutdown the osgi framework
-    * [KARAF-1706] - Features bundle versions are not consistent
-    * [KARAF-1736] - Feature spring-struts can't be installed
-    * [KARAF-1746] - karaf github contributions rules
-    * [KARAF-1751] - Spring feature dependencies specified too tightly
-    * [KARAF-1754] - updating features.xml in auto deploy folder results in duplication
-    * [KARAF-1756] - No SSH connection possible on Debian 6.0.5
-    * [KARAF-1759] - No Way To Start obr Dependencies By Default
-    * [KARAF-1763] - shutdown command doesn't work correctly
-    * [KARAF-1765] - The obr Shell Deploy And Start Commands Always Deploy Optional Dependencies
-    * [KARAF-1766] - Web Console Missing Metatype Import
-    * [KARAF-1791] - Add minimal distribution
-    * [KARAF-1796] - Feature Install Sequence Should Be Install/Install/Install...Start/Start/Start
-    * [KARAF-1797] - NPE thrown from OsgiConfiguration.unregister
-    * [KARAF-1809] - Feature spring-web-portlet can't be installed
-    * [KARAF-1814] - Cursor keys do not work when using bin/client on windows
-    * [KARAF-1815] - When ssh'ing from a windows box into a unix box, arrow keys are not correctly interpreted
-    * [KARAF-1821] - Some etc files are executable whereas it should not be
-    * [KARAF-1822] - BundlesMBean should use bundles attribute instead of list() operation
-    * [KARAF-1824] - tooling-exam contains reference to wrong commons-io artifact
-    * [KARAF-1825] - SystemMBean should provide startLevel attribute
-    * [KARAF-1826] - ConfigMBean should use configs attribute instead of list() operation
-    * [KARAF-1827] - Build the manual within specific profiles
-    * [KARAF-1830] - ObrMBean should use attribute for bundles and URLs instead of list operations
-    * [KARAF-1831] - PackagesMBean should use attributes for imported/exported packages instead of operations
-    * [KARAF-1832] - ServicesMBean should use attribute instead of list() operation
-    * [KARAF-1839] - system bundle also should export javax.xml.ws.spi.http package
-    * [KARAF-1840] - should also endorse saaj-api
-    * [KARAF-1845] - Minimal distribution doesn't start
-    * [KARAF-1852] - Osgi packages are exported with wrong versions
-    * [KARAF-1853] - Attached kar deploys to a different snapshot build number than the main artifact
-    * [KARAF-1858] - itests look stuck (use 100% CPU)
-    * [KARAF-1882] - Provide Level attribute in the LogMBean
-    * [KARAF-1888] - Remove aliases by default
-    * [KARAF-1905] - ASM4 causes the Proxy/Weaving of Xerces, but that then causes validation factories to fail.   
-    * [KARAF-1906] - Compile error using IBM JDK on JAAS module.
-    * [KARAF-1907] - Compile error: type ServiceReference does not take parameters on OSGi Shell ListBundleServices using JDK 7
-    * [KARAF-1909] - Compile error using IBM JDK on management mbeans SystemMBeanImpl
-    * [KARAF-1911] - Wrong version of camel-example-osgi in Getting Started/Quickstart Guide - 2.7.0 doesn't work
-
-** Dependency upgrade
-    * [KARAF-681] - Upgrade to Pax URL 1.3.4 (noted here for historical purposes)
-    * [KARAF-770] - Upgrade to Eclipse Equinox 3.7.1 (noted here for historical purposes)
-    * [KARAF-854] - Upgrade to Felix Framework 4.0.1 (noted here for historical purposes)
-    * [KARAF-855] - Add support for OSGi R4.3
-    * [KARAF-903] - Upgrade to Pax Web 1.1.2 (noted here for historical purposes)
-    * [KARAF-961] - Update Mina SSHD to version 0.6.0 (noted here for historical purposes)
-    * [KARAF-966] - Update xbean to 3.8
-    * [KARAF-1346] - Upgrade to Mina 2.0.4 (noted here for historical purposes)
-    * [KARAF-1378] - Upgrade to fileinstall 3.2.2
-    * [KARAF-1425] - Upgrade to pax-web 1.1.3
-    * [KARAF-1431] - Upgrade to Pax URL 1.3.5
-    * [KARAF-1458] - Upgrade to ServiceMix Specs 2.0
-    * [KARAF-1490] - upgrade to pax-logging 1.6.7 (noted here for historical purposes)
-    * [KARAF-1498] - Upgrade blueprint, jmx and util bundles to next minor release
-    * [KARAF-1517] - Upgrade to OSGi Compendium 4.3.0
-    * [KARAF-1520] - Upgrade to Jansi 1.9
-    * [KARAF-1531] - Upgrade to Felix ConfigAdmin 1.4.0
-    * [KARAF-1534] - Upgrade to JLine 2.7
-    * [KARAF-1535] - Upgrade to Felix Utils 1.2.0
-    * [KARAF-1536] - Upgrade to Felix FileInstall 3.2.4
-    * [KARAF-1568] - Upgrade to sshd 0.7.0 (noted here for historical purposes)
-    * [KARAF-1577] - Upgrade to slf4j 1.6.6
-    * [KARAF-1578] - Upgrade to pax-logging 1.6.9 (noted here for historical purposes)
-    * [KARAF-1579] - Upgrade to commons-compress 1.4.1
-    * [KARAF-1582] - Upgrade to Felix BundleRepository 1.6.6
-    * [KARAF-1601] - Upgrade to maven-antrun-plugin 1.7
-    * [KARAF-1603] - Upgrade to maven-surefire-plugin 2.12
-    * [KARAF-1604] - Upgrade to maven-assembly-plugin 2.3
-    * [KARAF-1606] - Upgrade to maven-compiler-plugin 2.5.1
-    * [KARAF-1608] - Upgrade to maven-dependency-plugin 2.4
-    * [KARAF-1610] - Upgrade to maven-eclipse-plugin 2.9
-    * [KARAF-1611] - Upgrade to maven-enforcer-plugin 1.1
-    * [KARAF-1612] - Upgrade to maven-enforcer-plugin 1.1
-    * [KARAF-1613] - Upgrade to maven-jar-plugin 2.4
-    * [KARAF-1615] - Upgrade to maven-javadoc-plugin 2.8.1
-    * [KARAF-1616] - Upgrade to maven-release-plugin 2.3.2
-    * [KARAF-1619] - Upgrade to maven-remote-resources-plugin 1.3
-    * [KARAF-1620] - Upgrade to maven-shade-plugin 1.7
-    * [KARAF-1621] - Upgrade to maven-site-plugin 3.1
-    * [KARAF-1622] - Upgrade to maven-war-plugin 2.2
-    * [KARAF-1623] - Upgrade to apache-rat-plugin 0.8
-    * [KARAF-1634] - Upgrade to Felix Framework 4.0.3
-    * [KARAF-1636] - Upgrade to Equinox 3.8
-    * [KARAF-1642] - Upgrade to exec-maven-plugin 1.2.1
-    * [KARAF-1670] - Uprade Aries Application Management to 1.0.0
-    * [KARAF-1672] - Upgrade Aries Application Deployment 1.0.0
-    * [KARAF-1703] - Upgrade to aries 1.0.x
-    * [KARAF-1719] - Upgrade to javax.mail 1.4.5
-    * [KARAF-1732] - Upgrade to ServiceMix Ant bundle 1.8.4_1
-    * [KARAF-1733] - Upgrade to ServiceMix aopalliance bundle  1.0_6
-    * [KARAF-1737] - Upgrade to ServiceMix cglib bundle 2.2.2_1
-    * [KARAF-1740] - Upgrade to Jetty 7.6.5.v20120716 (noted here for historical purposes)
-    * [KARAF-1745] - Upgrade to Felix WebConsole 4.0.0
-    * [KARAF-1747] - Update to jline 2.8 (noted here for historical purposes)
-    * [KARAF-1769] - Upgrade to pax-logging 1.6.10 (noted here for historical purposes)
-    * [KARAF-1773] - Upgrade to pax-logging 1.6.10 (duplicate) 
-    * [KARAF-1781] - Upgrade to Mina 2.0.5 (noted here for historical purposes)
-    * [KARAF-1787] - Upgrade to commons-fileupload 1.2.2
-    * [KARAF-1788] - Upgrade to commons-io 2.4
-    * [KARAF-1816] - Upgrade to jline 2.9
-    * [KARAF-1817] - Upgrade to sshd 0.8.0
-    * [KARAF-1819] - Upgrade to Mina 2.0.5 (duplicate) (noted here for historical purposes)
-    * [KARAF-1859] - Upgrade to ServiceMix Specs 2.1
-    * [KARAF-1862] - Upgrade to Felix FileInstall 3.2.6
-    * [KARAF-1863] - Upgrade to sshd 0.8.0 (duplicate)
-    * [KARAF-1865] - Upgrade to paxlogging 1.7.0
-    * [KARAF-1866] - Upgrade to felix config admin 1.4.0
-    * [KARAF-1867] - Upgrade to felix event admin 1.3.0
-    * [KARAF-1868] - Upgrade aries bundles to 1.0.1 (blueprint-core, jmx-core, transaction-manager, jpa-container-context)
-    * [KARAF-1883] - Upgrade to ASM 4.0
-    * [KARAF-1890] - Upgrade to Jetty 7.6.7.v20120910
-    * [KARAF-1904] - Upgrade to Mina 2.0.7
-    * [KARAF-1908] - Upgrade to XBean 3.12
-
-
-** Improvement
-    * [KARAF-447] - Add JDBC lock implementation for PostgreSQL
-    * [KARAF-1023] - Add karaf activators for jars in the lib folder
-    * [KARAF-1045] - Improved help system
-    * [KARAF-1048] - make pom.xml eclipse 3.7 m2e friendly
-    * [KARAF-1118] - Enable install of CXF into karaf with a simple command
-    * [KARAF-1181] - Add tab completer to the help command
-    * [KARAF-1368] - Make it easy to enable Karaf PropertiesLoginModule via an optional feature
-    * [KARAF-1383] - Fix warning messages during bundle build
-    * [KARAF-1396] - config:list command description should be enhanced
-    * [KARAF-1410] - Error in stop script if KARAF_DEBUG is enabled
-    * [KARAF-1499] - InfoAction shell command should sort the properties from InfoProvider instances
-    * [KARAF-1500] - Forgot a space between hours and minutes in InfoAction.java
-    * [KARAF-1521] - add-features-to-repo goal should define a correct default value for repository
-    * [KARAF-1558] - Instance clone should be able to clone the root instance
-    * [KARAF-1562] - Improve message displayed when the JAAS login module doesn't have a backing engine
-    * [KARAF-1574] - When two karaf containers are started locally, an exception is displayed at startup.  A nicer message would be better.
-    * [KARAF-1575] - Features provided by karaf do not have any description
-    * [KARAF-1586] - wrapper:install command should be usable outside OSGi too
-    * [KARAF-1600] - Avoid duplicate feature and bundle resolution when installing cascading features
-    * [KARAF-1640] - Make sure the local console is fully working before the user can type commands
-    * [KARAF-1657] - org.ops4j.pax.url.mvn.proxySupport=false
-    * [KARAF-1676] - OBR URL's in Karaf have no simple identifier
-    * [KARAF-1693] - Rename command-watch to watch
-    * [KARAF-1700] - update manual to reflect JDBC Lock updates
-    * [KARAF-1710] - Remove @version headers from source
-    * [KARAF-1749] - The command packages:imports should work on unresolved bundles
-    * [KARAF-1752] - hard coded features uri in features deployer feature discovery
-    * [KARAF-1753] - Port SCR Components Karaf 2.3
-    * [KARAF-1757] - Welcome message incorrect during ssh session or using bin/client.
-    * [KARAF-1798] - Use exam framework for our itests and increase tests coverage
-    * [KARAF-1810] - Provide alias for feature:repo-add in Karaf 2.x
-    * [KARAF-1811] - Remove section about console colors from manual
-    * [KARAF-1812] - Use Felix properties and remove org.apache.karaf.util.Properties
-    * [KARAF-1813] - Add osgi:name and name attribute in SystemMBean
-    * [KARAF-1828] - Build src distributions within specific profiles
-    * [KARAF-1829] - Upgrade to Spring 2.5.6.SEC03
-    * [KARAF-1833] - Reintroduce the -p option in the client
-    * [KARAF-1834] - Make KarafTestSupport available externally
-    * [KARAF-1844] - Add command aliases for migration purpose between 2.3.x and 3.x
-    * [KARAF-1850] - feature:list should use alphabetical order
-    * [KARAF-1878] - Feature bundle start up order by startLvl
-
-** New Feature
-    * [KARAF-866] - New dev:wait-for-service command to wait for a given osgi service
-    * [KARAF-908] - Provide a way to access system properties easily in the shell
-    * [KARAF-1334] - Use the new servicemix spec to allow the use of both the JRE implementations and implementations from bundles
-    * [KARAF-1475] - Support SSH agent forwarding and use the agent authentication when connecting to other instances
-    * [KARAF-1546] - Add -i/--install-all option to feature:add-url
-    * [KARAF-1557] - Merge instance clone command on 2.3.x branch
-    * [KARAF-1777] - backport the new command bundle:classes
-    * [KARAF-1778] - backport new command bundle:find-class
-    * [KARAF-1792] - Add karaf-pax-exam
-    * [KARAF-1806] - Add version attribute in the SystemMBean
-    * [KARAF-1856] - Merge bundle:diag command
-    * [KARAF-1857] - Merge bundle:services command
-    * [KARAF-1910] - Provide Spring 3.1.2.RELEASE features
-
-** Task
-    * [KARAF-1415] - Support Jetty 7.6
-    * [KARAF-1445] - more svn:ignore are needed
-
-** Test
-     * [KARAF-1876] - Improve StandardFeaturesTest, EnterpriseFeaturesTest and SpringFeaturesTest using feature service
-     * [KARAF-1912] - Test failures in itest.OsgiTest as aries proxy api is not bundle id 10 anymore
-
-
-                    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.
-
-  Changlog
-  --------
-
-** 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.3.x/admin/command/NOTICE b/karaf-2.3.x/admin/command/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/admin/command/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/admin/command/pom.xml b/karaf-2.3.x/admin/command/pom.xml
deleted file mode 100644
index a2c3785..0000000
--- a/karaf-2.3.x/admin/command/pom.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
deleted file mode 100644
index e830076..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/AdminCommandSupport.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeOptsCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeOptsCommand.java
deleted file mode 100644
index d5ebb1a..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeOptsCommand.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiRegistryPortCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiRegistryPortCommand.java
deleted file mode 100644
index 46d3d21..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiRegistryPortCommand.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiServerPortCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiServerPortCommand.java
deleted file mode 100644
index d0cbcaa..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeRmiServerPortCommand.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeSshPortCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeSshPortCommand.java
deleted file mode 100644
index a437765..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ChangeSshPortCommand.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
deleted file mode 100644
index 2ee26f8..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/CloneCommand.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.InstanceSettings;
-
-/**
- * Clone an existing instance.
- */
-@Command(scope = "instance", name = "clone", description = "Clones an existing container instance.")
-public class CloneCommand 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 cloned 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 cloned instance", required = false, multiValued = false)
-    String javaOpts;
-
-    @Option(name = "-v", aliases = {"--verbose"}, description = "Display actions performed by the command (disabled by default)", required = false, multiValued = false)
-    boolean verbose = false;
-
-    @Argument(index = 0, name = "name", description = "The name of the source container instance", required = true, multiValued = false)
-    String name;
-
-    @Argument(index = 1, name = "cloneName", description = "The name of the cloned container instance", required = true, multiValued = false)
-    String cloneName;
-
-
-    protected Object doExecute() throws Exception {
-        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, null, null);
-        getAdminService().cloneInstance(name, cloneName, settings);
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ConnectCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ConnectCommand.java
deleted file mode 100644
index 1ffb0cc..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ConnectCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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", required = false, multiValued = false)
-    private String username;
-
-    @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();
-        if (username != null) {
-            session.execute("ssh -l " + username + " -p " + port + " localhost " + cmdStr);
-        } else {
-            session.execute("ssh -p " + port + " localhost " + cmdStr);
-        }
-        return null;
-    }
-}
diff --git a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
deleted file mode 100644
index 8c34554..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/CreateCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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
- */
-@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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/DestroyCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/DestroyCommand.java
deleted file mode 100644
index 3192be30..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/DestroyCommand.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.admin.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-
-/**
- * Destroy an existing Karaf instance
- */
-@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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ListCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ListCommand.java
deleted file mode 100644
index 7d26c38..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/ListCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 {
-        getAdminService().refreshInstance();
-        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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/RenameCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/RenameCommand.java
deleted file mode 100644
index 3f9757a..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/RenameCommand.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/StartCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/StartCommand.java
deleted file mode 100644
index 1494466..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/StartCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/StopCommand.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/StopCommand.java
deleted file mode 100644
index 73fe6b3..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/StopCommand.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/completers/InstanceCompleter.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/completers/InstanceCompleter.java
deleted file mode 100644
index c894da9..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/command/completers/InstanceCompleter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/java/org/apache/karaf/admin/main/Execute.java b/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/main/Execute.java
deleted file mode 100644
index 1e52d06..0000000
--- a/karaf-2.3.x/admin/command/src/main/java/org/apache/karaf/admin/main/Execute.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml b/karaf-2.3.x/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
deleted file mode 100644
index d4f4966..0000000
--- a/karaf-2.3.x/admin/command/src/main/resources/OSGI-INF/blueprint/admin-command.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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/clone">
-            <action class="org.apache.karaf.admin.command.CloneCommand">
-                <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.3.x/admin/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/admin/command/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index bedc2e0..0000000
--- a/karaf-2.3.x/admin/command/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,26 +0,0 @@
-\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.3.x/admin/command/src/test/java/org/apache/karaf/admin/command/CreateCommandTest.java b/karaf-2.3.x/admin/command/src/test/java/org/apache/karaf/admin/command/CreateCommandTest.java
deleted file mode 100644
index 23fa60a..0000000
--- a/karaf-2.3.x/admin/command/src/test/java/org/apache/karaf/admin/command/CreateCommandTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/command/src/test/java/org/apache/karaf/admin/main/ExecuteTest.java b/karaf-2.3.x/admin/command/src/test/java/org/apache/karaf/admin/main/ExecuteTest.java
deleted file mode 100644
index 92cf9aa..0000000
--- a/karaf-2.3.x/admin/command/src/test/java/org/apache/karaf/admin/main/ExecuteTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/NOTICE b/karaf-2.3.x/admin/core/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/admin/core/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/admin/core/pom.xml b/karaf-2.3.x/admin/core/pom.xml
deleted file mode 100644
index 5b42f6a..0000000
--- a/karaf-2.3.x/admin/core/pom.xml
+++ /dev/null
@@ -1,200 +0,0 @@
-<?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.3.1</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>
-                                        <include>authorized_keys</include>
-                                    </includes>
-                                    <excludes>
-                                        <exclude>org.apache.karaf.shell.cfg</exclude>
-                                        <exclude>org.apache.karaf.management.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,
-                            org.apache.karaf.admin.etc,
-                            org.apache.karaf.admin.internal,
-                            org.apache.karaf.jpm.impl,
-                        </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.3.x/admin/core/src/main/java/org/apache/karaf/admin/AdminService.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/AdminService.java
deleted file mode 100644
index 6c756fa..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/AdminService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.admin;
-
-public interface AdminService {
-
-    Instance createInstance(String name, InstanceSettings settings) throws Exception;
-
-    void renameInstance(String name, String newName) throws Exception;
-    
-    void refreshInstance() throws Exception;
-
-    Instance cloneInstance(String name, String cloneName, InstanceSettings settings) throws Exception;
-
-    Instance[] getInstances();
-
-    Instance getInstance(String name);    
-}
diff --git a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/Instance.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/Instance.java
deleted file mode 100644
index ed2c00a..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/Instance.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-    
-    boolean isAttached();
-
-}
diff --git a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
deleted file mode 100644
index 9b068cf..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/InstanceSettings.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
deleted file mode 100644
index e4e10db..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/internal/AdminServiceImpl.java
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 void refreshInstance() throws Exception {
-        try {
-            init();
-            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"));
-            for (int i = 0; i < count; i++) {
-                String name = storage.getProperty("item." + i + ".name", null);
-                int pid = Integer.parseInt(storage.getProperty("item." + i + ".pid", "0"));
-                if (name != null) {
-                    InstanceImpl instance = (InstanceImpl)instances.get(name);
-                    if (pid > 0 && instance != null && !instance.isAttached()) {
-                        try {
-                            instance.attach(pid);
-                        } catch (IOException e) {
-                            // Ignore
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            LOGGER.warn("Unable to reload Karaf instance list", e);
-        }
-    }
-
-    public synchronized Instance createInstance(String name, InstanceSettings settings) throws Exception {
-        try {
-            init();
-        } catch (Exception e) {
-            LOGGER.warn("Unable to reload Karaf instance list", e);
-        }
-        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);
-        copyResourceToDir(karafBase, "etc/keys.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) {
-        try {
-            init();
-        } catch (Exception e) {
-            LOGGER.warn("Unable to reload Karaf instance list", e);
-        }
-        return instances.get(name);
-    }
-
-    synchronized void forget(String name) {
-        instances.remove(name);
-    }
-
-    public synchronized void renameInstance(String oldName, String newName) throws Exception {
-        try {
-            init();
-        } catch (Exception e) {
-            LOGGER.warn("Unable to reload Karaf instance list", e);
-        }
-        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();
-    }
-
-    public synchronized Instance cloneInstance(String name, String cloneName, InstanceSettings settings) throws Exception {
-        try {
-            init();
-        } catch (Exception e) {
-            LOGGER.warn("Unable to reload Karaf instance list", e);
-        }
-        if (instances.get(cloneName) != null) {
-            throw new IllegalArgumentException("Instance " + cloneName + " already exists");
-        }
-        Instance instance = instances.get(name);
-        if (instance == null) {
-            throw new IllegalArgumentException("Instance " + name + " not found");
-        }
-
-        // define the clone instance location
-        String cloneLocationPath = settings.getLocation() != null ? settings.getLocation() : cloneName;
-        File cloneLocation = new File(cloneLocationPath);
-        if (!cloneLocation.isAbsolute()) {
-            cloneLocation = new File(storageLocation, cloneLocationPath);
-        }
-        // copy instance directory
-        String locationPath = instance.getLocation();
-        File location = new File(locationPath);
-        copy(location, cloneLocation);
-        // create the properties map including the instance name, location, ssh and rmi port numbers
-        HashMap<String, String> props = new HashMap<String, String>();
-        props.put(name, cloneName);
-        props.put(locationPath, cloneLocationPath);
-        if (settings.getSshPort() > 0)
-            props.put(new Integer(instance.getSshPort()).toString(), new Integer(settings.getSshPort()).toString());
-        if (settings.getRmiRegistryPort() > 0)
-            props.put(new Integer(instance.getRmiRegistryPort()).toString(), new Integer(settings.getRmiRegistryPort()).toString());
-        if (settings.getRmiServerPort() > 0)
-            props.put(new Integer(instance.getRmiServerPort()).toString(), new Integer(settings.getRmiServerPort()).toString());
-        // filtering clone files
-        filterResource(cloneLocation, "etc/custom.properties", props);
-        filterResource(cloneLocation, "etc/org.apache.karaf.management.cfg", props);
-        filterResource(cloneLocation, "etc/org.apache.karaf.shell.cfg", props);
-        filterResource(cloneLocation, "etc/org.ops4j.pax.logging.cfg", props);
-        filterResource(cloneLocation, "etc/system.properties", props);
-        filterResource(cloneLocation, "bin/karaf", props);
-        filterResource(cloneLocation, "bin/start", props);
-        filterResource(cloneLocation, "bin/stop", props);
-        filterResource(cloneLocation, "bin/karaf.bat", props);
-        filterResource(cloneLocation, "bin/start.bat", props);
-        filterResource(cloneLocation, "bin/stop.bat", props);
-        // create and add the clone instance in the registry
-        String javaOpts = settings.getJavaOpts();
-        if (javaOpts == null || javaOpts.length() == 0) {
-            javaOpts = "-server -Xmx512M -Dcom.sun.management.jmxremote";
-        }
-        Instance cloneInstance = new InstanceImpl(this, cloneName, cloneLocation.toString(), settings.getJavaOpts());
-        instances.put(cloneName, cloneInstance);
-        saveState();
-        return cloneInstance;
-    }
-
-    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;
-    }
-
-    private void copy(File source, File destination) throws Exception {
-        if (source.getName().equals("cache.lock")) {
-            // ignore cache.lock file
-            return;
-        }
-        if (source.getName().equals("lock")) {
-            // ignore lock file
-            return;
-        }
-        if (source.isDirectory()) {
-            if (!destination.exists()) {
-                destination.mkdirs();
-            }
-            String[] children = source.list();
-            for (String child : children) {
-                if (!child.contains("instances") && !child.contains("lib"))
-                    copy(new File(source, child), new File(destination, child));
-            }
-        } else {
-            InputStream in = new FileInputStream(source);
-            OutputStream out = new FileOutputStream(destination);
-            byte[] buffer = new byte[1024];
-            int length;
-            while ((length = in.read(buffer)) > 0) {
-                out.write(buffer, 0, length);
-            }
-            in.close();
-            out.close();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/internal/InstanceImpl.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/internal/InstanceImpl.java
deleted file mode 100644
index a8579a5..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/admin/internal/InstanceImpl.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.admin.internal;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-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.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.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;
-    }
-
-    public boolean isAttached() {
-        checkProcess();
-        return (process != null);
-    }
-
-}
diff --git a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/Process.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/Process.java
deleted file mode 100644
index 2bd3b36..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/Process.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilder.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilder.java
deleted file mode 100644
index afc4ff8..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilder.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilderFactory.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilderFactory.java
deleted file mode 100644
index bf8b26f..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/ProcessBuilderFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderFactoryImpl.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
deleted file mode 100644
index 041bd02..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderFactoryImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderImpl.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderImpl.java
deleted file mode 100644
index 08f4407..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessBuilderImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessImpl.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessImpl.java
deleted file mode 100644
index 6102f27..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ProcessImpl.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ScriptUtils.java b/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ScriptUtils.java
deleted file mode 100644
index a99261b..0000000
--- a/karaf-2.3.x/admin/core/src/main/java/org/apache/karaf/jpm/impl/ScriptUtils.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml b/karaf-2.3.x/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
deleted file mode 100644
index 1fb869e..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/OSGI-INF/blueprint/admin-core.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/admin/core/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/admin/core/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index fd820e8..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,17 +0,0 @@
-\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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf
deleted file mode 100644
index 8967cea..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf.bat b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf.bat
deleted file mode 100644
index 312b66c..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/karaf.bat
+++ /dev/null
@@ -1,25 +0,0 @@
-@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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start
deleted file mode 100644
index 333cba1..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start.bat b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start.bat
deleted file mode 100644
index 822ed42..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/start.bat
+++ /dev/null
@@ -1,24 +0,0 @@
-@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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop
deleted file mode 100644
index 459a488..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop.bat b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop.bat
deleted file mode 100644
index 31d92cb..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/bin/stop.bat
+++ /dev/null
@@ -1,24 +0,0 @@
-@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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.management.cfg b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.management.cfg
deleted file mode 100644
index 57b2957..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.management.cfg
+++ /dev/null
@@ -1,63 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# The properties in this file define the configuration of Apache Karaf's JMX Management
-#
-
-#
-# Port number for RMI registry connection
-#
-rmiRegistryPort = ${SUBST-RMI-REGISTRY-PORT}
-
-#
-# Port number for RMI server connection
-#
-rmiServerPort = ${SUBST-RMI-SERVER-PORT}
-
-#
-# 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.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.shell.cfg b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.shell.cfg
deleted file mode 100644
index d94bbfd..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/org.apache.karaf.shell.cfg
+++ /dev/null
@@ -1,56 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# These properties are used to configure Karaf's ssh shell.
-#
-
-#
-# Via sshPort and sshHost you define the address you can login into Karaf.
-#
-sshPort=${SUBST-SSH-PORT}
-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
-
-#
-# Self defined key size in 1024, 2048, 3072, or 4096
-# If not set, this defaults to 1024.
-#
-# keySize=1024
-
-#
-# Specify host key algorithm, defaults to DSA
-#
-# algorithm=DSA
diff --git a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/system.properties b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/system.properties
deleted file mode 100644
index b4c4893..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/admin/etc/system.properties
+++ /dev/null
@@ -1,90 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# The 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
-
-#
-# 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
-
-#
-# ServiceMix specs options
-#
-org.apache.servicemix.specs.debug=false
-org.apache.servicemix.specs.timeout=0
-
-#
-# Settings for the OSGi 4.3 Weaving
-# By default, we will not weave any classes. Change this setting to include classes
-# that you application needs to have woven.
-#
-org.apache.aries.proxy.weaving.enabled=none
-# Classes not to weave - Aries default + Xerces which is known to have issues.
-org.apache.aries.proxy.weaving.disabled=org.objectweb.asm.*,org.slf4j.*,org.apache.log4j.*,javax.*,org.apache.xerces.*
diff --git a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/unix/start.sh b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/unix/start.sh
deleted file mode 100644
index 1d1d720..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/unix/start.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/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.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/destroy.vbs b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/destroy.vbs
deleted file mode 100644
index abd60eb..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/destroy.vbs
+++ /dev/null
@@ -1,27 +0,0 @@
-'===============================================================================
-'
-'    Licensed to the Apache Software Foundation (ASF) under one or more
-'    contributor license agreements.  See the NOTICE file distributed with
-'    this work for additional information regarding copyright ownership.
-'    The ASF licenses this file to You under the Apache License, Version 2.0
-'    (the "License"); you may not use this file except in compliance with
-'    the License.  You may obtain a copy of the License at
-'
-'       http://www.apache.org/licenses/LICENSE-2.0
-'
-'    Unless required by applicable law or agreed to in writing, software
-'    distributed under the License is distributed on an "AS IS" BASIS,
-'    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-'    See the License for the specific language governing permissions and
-'    limitations under the License.
-'
-'===============================================================================
-
-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.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/running.vbs b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/running.vbs
deleted file mode 100644
index 32c65c5..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/running.vbs
+++ /dev/null
@@ -1,26 +0,0 @@
-'===============================================================================
-'
-'    Licensed to the Apache Software Foundation (ASF) under one or more
-'    contributor license agreements.  See the NOTICE file distributed with
-'    this work for additional information regarding copyright ownership.
-'    The ASF licenses this file to You under the Apache License, Version 2.0
-'    (the "License"); you may not use this file except in compliance with
-'    the License.  You may obtain a copy of the License at
-'
-'       http://www.apache.org/licenses/LICENSE-2.0
-'
-'    Unless required by applicable law or agreed to in writing, software
-'    distributed under the License is distributed on an "AS IS" BASIS,
-'    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-'    See the License for the specific language governing permissions and
-'    limitations under the License.
-'
-'===============================================================================
-
-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.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/start.vbs b/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/start.vbs
deleted file mode 100644
index 6004c86..0000000
--- a/karaf-2.3.x/admin/core/src/main/resources/org/apache/karaf/jpm/impl/windows/start.vbs
+++ /dev/null
@@ -1,34 +0,0 @@
-'===============================================================================
-'
-'    Licensed to the Apache Software Foundation (ASF) under one or more
-'    contributor license agreements.  See the NOTICE file distributed with
-'    this work for additional information regarding copyright ownership.
-'    The ASF licenses this file to You under the Apache License, Version 2.0
-'    (the "License"); you may not use this file except in compliance with
-'    the License.  You may obtain a copy of the License at
-'
-'       http://www.apache.org/licenses/LICENSE-2.0
-'
-'    Unless required by applicable law or agreed to in writing, software
-'    distributed under the License is distributed on an "AS IS" BASIS,
-'    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-'    See the License for the specific language governing permissions and
-'    limitations under the License.
-'
-'===============================================================================
-
-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.3.x/admin/core/src/test/java/org/apache/karaf/admin/InstanceSettingsTest.java b/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/admin/InstanceSettingsTest.java
deleted file mode 100644
index a36a6dc..0000000
--- a/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/admin/InstanceSettingsTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java b/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
deleted file mode 100644
index cb917d6..0000000
--- a/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/admin/internal/AdminServiceImplTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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"));
-    }
-    
-    /**
-     * <p>
-     * Test the renaming of an existing instance.
-     * </p>
-     */
-    public void testToSimulateRenameInstanceByExternalProcess() throws Exception {
-        AdminServiceImpl service = new AdminServiceImpl();
-        File storageLocation = new File("target/instances/" + System.currentTimeMillis());
-        service.setStorageLocation(storageLocation);
-
-        InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null);
-        service.createInstance(getName(), settings);
-        
-        //to simulate the scenario that the instance name get changed by 
-        //external process, likely the admin command CLI tool, which cause
-        //the instance storage file get updated, the AdminService should be 
-        //able to reload the storage file before check any status for the 
-        //instance
-        
-        File storageFile = new File(storageLocation, AdminServiceImpl.STORAGE_FILE);
-        assertTrue(storageFile.isFile());
-        Properties storage = loadStorage(storageFile);
-        storage.setProperty("item.0.name", getName() + "b");
-        saveStorage(storage, storageFile, "testToSimulateRenameInstanceByExternalProcess");
-        
-        assertNotNull(service.getInstance(getName() + "b"));
-    }
-
-    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();
-            }
-        }
-    }
-    
-    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 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.3.x/admin/core/src/test/java/org/apache/karaf/jpm/MainTest.java b/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/jpm/MainTest.java
deleted file mode 100644
index e7f7c83..0000000
--- a/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/jpm/MainTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jpm;
-
-public class MainTest {
-
-    public static void main(String[] args) throws Exception {
-        Thread.sleep(Long.parseLong(args[0]));
-    }
-}
diff --git a/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/jpm/ProcessTest.java b/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/jpm/ProcessTest.java
deleted file mode 100644
index 61225f3..0000000
--- a/karaf-2.3.x/admin/core/src/test/java/org/apache/karaf/jpm/ProcessTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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("\"").append(javaPath).append("\"");
-        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.3.x/admin/management/NOTICE b/karaf-2.3.x/admin/management/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/admin/management/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/admin/management/pom.xml b/karaf-2.3.x/admin/management/pom.xml
deleted file mode 100644
index fb152b2..0000000
--- a/karaf-2.3.x/admin/management/pom.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?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.3.1</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,
-                            *
-                        </Import-Package>
-                        <Private-Package>org.apache.karaf.admin.management.internal</Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/AdminServiceMBean.java b/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/AdminServiceMBean.java
deleted file mode 100644
index f2e878e..0000000
--- a/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/AdminServiceMBean.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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) throws Exception;
-    void startInstance(String name, String opts) throws Exception;
-    void startInstance(String name, String opts, boolean wait) throws Exception;
-    void stopInstance(String name) throws Exception;
-    void renameInstance(String originalName, String newName) throws Exception;
-    void cloneInstance(String name, String cloneName, int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts) throws Exception;
-
-    // Attributes
-    TabularData getInstances() throws Exception;
-
-}
diff --git a/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/codec/JmxInstance.java b/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/codec/JmxInstance.java
deleted file mode 100644
index 1453399..0000000
--- a/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/codec/JmxInstance.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImpl.java b/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImpl.java
deleted file mode 100644
index 3eda345..0000000
--- a/karaf-2.3.x/admin/management/src/main/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImpl.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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) throws Exception {
-        getExistingInstance(name).start(null);
-    }
-
-    public void startInstance(String name, String opts) throws Exception {
-        getExistingInstance(name).start(opts);
-    }
-
-    public void startInstance(String name, String opts, boolean wait) throws Exception {
-        Instance child = getExistingInstance(name);
-        if (wait) {
-            String state = child.getState();
-            if (Instance.STOPPED.equals(state)) {
-                child.start(opts);
-            }
-            if (!Instance.STARTED.equals(state)) {
-                do {
-                    Thread.sleep(500);
-                    state = child.getState();
-                } while (Instance.STARTING.equals(state));
-            }
-        } else {
-            child.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 void cloneInstance(String name, String cloneName, int sshPort, int rmiRegistryPort, int rmiServerPort, String location, String javaOpts) throws Exception {
-        if ("".equals(location)) {
-            location = null;
-        }
-        if ("".equals(javaOpts)) {
-            javaOpts = null;
-        }
-
-        InstanceSettings settings = new InstanceSettings(sshPort, rmiRegistryPort, rmiServerPort, location, javaOpts, null, null);
-        adminService.cloneInstance(name, cloneName, settings);
-    }
-
-    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.3.x/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml b/karaf-2.3.x/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
deleted file mode 100644
index 8d74b26..0000000
--- a/karaf-2.3.x/admin/management/src/main/resources/OSGI-INF/blueprint/admin-management.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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" init-method="init" destroy-method="destroy">
-        <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.3.x/admin/management/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/admin/management/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index c183bd4..0000000
--- a/karaf-2.3.x/admin/management/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,27 +0,0 @@
-\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.3.x/admin/management/src/test/java/org/apache/karaf/admin/management/codec/JmxInstanceTest.java b/karaf-2.3.x/admin/management/src/test/java/org/apache/karaf/admin/management/codec/JmxInstanceTest.java
deleted file mode 100644
index 02145ae..0000000
--- a/karaf-2.3.x/admin/management/src/test/java/org/apache/karaf/admin/management/codec/JmxInstanceTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/management/src/test/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImplTest.java b/karaf-2.3.x/admin/management/src/test/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
deleted file mode 100644
index 1bc4bd2..0000000
--- a/karaf-2.3.x/admin/management/src/test/java/org/apache/karaf/admin/management/internal/AdminServiceMBeanImplTest.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/admin/pom.xml b/karaf-2.3.x/admin/pom.xml
deleted file mode 100644
index 8d58b0f..0000000
--- a/karaf-2.3.x/admin/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.3.1</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.3.x/archetypes/assembly/NOTICE b/karaf-2.3.x/archetypes/assembly/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/archetypes/assembly/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/archetypes/assembly/pom.xml b/karaf-2.3.x/archetypes/assembly/pom.xml
deleted file mode 100644
index bf14340..0000000
--- a/karaf-2.3.x/archetypes/assembly/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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.3.1</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.3.x/archetypes/assembly/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.3.x/archetypes/assembly/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index 9fae87c..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<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.3.x/archetypes/assembly/src/main/resources/archetype-resources/pom.xml b/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index 956631d..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,139 +0,0 @@
-<?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>
-
-    <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.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/unix-bin.xml b/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/unix-bin.xml
deleted file mode 100644
index 6a9b9b0..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/unix-bin.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/windows-bin.xml b/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/windows-bin.xml
deleted file mode 100644
index b788dbb..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/descriptors/windows-bin.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/filtered-resources/etc/my.bundle.cfg b/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/filtered-resources/etc/my.bundle.cfg
deleted file mode 100644
index ee0620e..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/main/resources/archetype-resources/src/main/filtered-resources/etc/my.bundle.cfg
+++ /dev/null
@@ -1,21 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-# Custom configuration file
-key = value
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/assembly/src/test/resources/projects/assembly/archetype.properties b/karaf-2.3.x/archetypes/assembly/src/test/resources/projects/assembly/archetype.properties
deleted file mode 100644
index 3c053d3..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/test/resources/projects/assembly/archetype.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-groupId=archetype.it
-artifactId=assembly
-version=1.0-SNAPSHOT
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/assembly/src/test/resources/projects/assembly/goal.txt b/karaf-2.3.x/archetypes/assembly/src/test/resources/projects/assembly/goal.txt
deleted file mode 100644
index deea798..0000000
--- a/karaf-2.3.x/archetypes/assembly/src/test/resources/projects/assembly/goal.txt
+++ /dev/null
@@ -1 +0,0 @@
-clean install verify
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/blueprint/NOTICE b/karaf-2.3.x/archetypes/blueprint/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/archetypes/blueprint/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/archetypes/blueprint/pom.xml b/karaf-2.3.x/archetypes/blueprint/pom.xml
deleted file mode 100644
index c0c2b70..0000000
--- a/karaf-2.3.x/archetypes/blueprint/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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.3.1</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.3.x/archetypes/blueprint/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.3.x/archetypes/blueprint/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index 636320e..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<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.3.x/archetypes/blueprint/src/main/resources/archetype-resources/pom.xml b/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index 207a8e8..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?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>
-
-    <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>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Version>${project.version}</Bundle-Version>
-                        <Export-Package>
-                            ${package}*;version=${project.version}
-                        </Export-Package>
-                        <Import-Package>
-                            *
-                        </Import-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyService.java b/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyService.java
deleted file mode 100644
index 29357b4..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package ${package};
-
-public interface MyService {
-
-    public String echo(String message);
-
-}
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyServiceImpl.java b/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyServiceImpl.java
deleted file mode 100644
index bc0ba43..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/java/MyServiceImpl.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package ${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.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/my-service.xml b/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/my-service.xml
deleted file mode 100644
index 0acda83..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/my-service.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/archetypes/blueprint/src/test/resources/projects/blueprint/archetype.properties b/karaf-2.3.x/archetypes/blueprint/src/test/resources/projects/blueprint/archetype.properties
deleted file mode 100644
index 84b7147..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/test/resources/projects/blueprint/archetype.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/archetypes/blueprint/src/test/resources/projects/blueprint/goal.txt b/karaf-2.3.x/archetypes/blueprint/src/test/resources/projects/blueprint/goal.txt
deleted file mode 100644
index deea798..0000000
--- a/karaf-2.3.x/archetypes/blueprint/src/test/resources/projects/blueprint/goal.txt
+++ /dev/null
@@ -1 +0,0 @@
-clean install verify
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/bundle/NOTICE b/karaf-2.3.x/archetypes/bundle/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/archetypes/bundle/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/archetypes/bundle/pom.xml b/karaf-2.3.x/archetypes/bundle/pom.xml
deleted file mode 100644
index daa81fc..0000000
--- a/karaf-2.3.x/archetypes/bundle/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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.3.1</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.3.x/archetypes/bundle/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.3.x/archetypes/bundle/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index 5cf9079..0000000
--- a/karaf-2.3.x/archetypes/bundle/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<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.3.x/archetypes/bundle/src/main/resources/archetype-resources/pom.xml b/karaf-2.3.x/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index f61b83d..0000000
--- a/karaf-2.3.x/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?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>
-
-    <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.3.x/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/Activator.java b/karaf-2.3.x/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/Activator.java
deleted file mode 100644
index 01edbbc..0000000
--- a/karaf-2.3.x/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/Activator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package ${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.3.x/archetypes/bundle/src/test/resources/projects/bundle/archetype.properties b/karaf-2.3.x/archetypes/bundle/src/test/resources/projects/bundle/archetype.properties
deleted file mode 100644
index 2129605..0000000
--- a/karaf-2.3.x/archetypes/bundle/src/test/resources/projects/bundle/archetype.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/archetypes/bundle/src/test/resources/projects/bundle/goal.txt b/karaf-2.3.x/archetypes/bundle/src/test/resources/projects/bundle/goal.txt
deleted file mode 100644
index deea798..0000000
--- a/karaf-2.3.x/archetypes/bundle/src/test/resources/projects/bundle/goal.txt
+++ /dev/null
@@ -1 +0,0 @@
-clean install verify
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/command/NOTICE b/karaf-2.3.x/archetypes/command/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/archetypes/command/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/archetypes/command/pom.xml b/karaf-2.3.x/archetypes/command/pom.xml
deleted file mode 100644
index 785c280..0000000
--- a/karaf-2.3.x/archetypes/command/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?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.3.1</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.3.x/archetypes/command/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.3.x/archetypes/command/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index c869b8a..0000000
--- a/karaf-2.3.x/archetypes/command/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<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.3.x/archetypes/command/src/main/resources/archetype-resources/pom.xml b/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index ce0489c..0000000
--- a/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?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>
-
-    <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.3.x/archetypes/command/src/main/resources/archetype-resources/src/main/java/__command__.java b/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/src/main/java/__command__.java
deleted file mode 100644
index b118d09..0000000
--- a/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/src/main/java/__command__.java
+++ /dev/null
@@ -1,37 +0,0 @@
-##---------------------------------------------------------------------------
-##  Licensed to the Apache Software Foundation (ASF) under one or more
-##  contributor license agreements.  See the NOTICE file distributed with
-##  this work for additional information regarding copyright ownership.
-##  The ASF licenses this file to You under the Apache License, Version 2.0
-##  (the "License"); you may not use this file except in compliance with
-##  the License.  You may obtain a copy of the License at
-##
-##     http://www.apache.org/licenses/LICENSE-2.0
-##
-##  Unless required by applicable law or agreed to in writing, software
-##  distributed under the License is distributed on an "AS IS" BASIS,
-##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-##  See the License for the specific language governing permissions and
-##  limitations under the License.
-##---------------------------------------------------------------------------
-#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.3.x/archetypes/command/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-log.xml b/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-log.xml
deleted file mode 100644
index d705e86..0000000
--- a/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-log.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/archetypes/command/src/main/resources/archetype-resources/src/test/java/__command__Test.java b/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/src/test/java/__command__Test.java
deleted file mode 100644
index 07844ac..0000000
--- a/karaf-2.3.x/archetypes/command/src/main/resources/archetype-resources/src/test/java/__command__Test.java
+++ /dev/null
@@ -1,47 +0,0 @@
-##---------------------------------------------------------------------------
-##  Licensed to the Apache Software Foundation (ASF) under one or more
-##  contributor license agreements.  See the NOTICE file distributed with
-##  this work for additional information regarding copyright ownership.
-##  The ASF licenses this file to You under the Apache License, Version 2.0
-##  (the "License"); you may not use this file except in compliance with
-##  the License.  You may obtain a copy of the License at
-##
-##     http://www.apache.org/licenses/LICENSE-2.0
-##
-##  Unless required by applicable law or agreed to in writing, software
-##  distributed under the License is distributed on an "AS IS" BASIS,
-##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-##  See the License for the specific language governing permissions and
-##  limitations under the License.
-##---------------------------------------------------------------------------
-#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.3.x/archetypes/command/src/test/resources/projects/command/archetype.properties b/karaf-2.3.x/archetypes/command/src/test/resources/projects/command/archetype.properties
deleted file mode 100644
index 4768603..0000000
--- a/karaf-2.3.x/archetypes/command/src/test/resources/projects/command/archetype.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/archetypes/command/src/test/resources/projects/command/goal.txt b/karaf-2.3.x/archetypes/command/src/test/resources/projects/command/goal.txt
deleted file mode 100644
index deea798..0000000
--- a/karaf-2.3.x/archetypes/command/src/test/resources/projects/command/goal.txt
+++ /dev/null
@@ -1 +0,0 @@
-clean install verify
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/feature/NOTICE b/karaf-2.3.x/archetypes/feature/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/archetypes/feature/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/archetypes/feature/pom.xml b/karaf-2.3.x/archetypes/feature/pom.xml
deleted file mode 100644
index c0b4d9b..0000000
--- a/karaf-2.3.x/archetypes/feature/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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.3.1</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.3.x/archetypes/feature/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.3.x/archetypes/feature/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index cc2ab74..0000000
--- a/karaf-2.3.x/archetypes/feature/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<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.3.x/archetypes/feature/src/main/resources/archetype-resources/pom.xml b/karaf-2.3.x/archetypes/feature/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index 1b086a0..0000000
--- a/karaf-2.3.x/archetypes/feature/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?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>
-
-    <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.3.x/archetypes/feature/src/test/resources/projects/feature/archetype.properties b/karaf-2.3.x/archetypes/feature/src/test/resources/projects/feature/archetype.properties
deleted file mode 100644
index b988b4a..0000000
--- a/karaf-2.3.x/archetypes/feature/src/test/resources/projects/feature/archetype.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-groupId=archetype.it
-artifactId=feature
-version=1.0-SNAPSHOT
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/feature/src/test/resources/projects/feature/goal.txt b/karaf-2.3.x/archetypes/feature/src/test/resources/projects/feature/goal.txt
deleted file mode 100644
index deea798..0000000
--- a/karaf-2.3.x/archetypes/feature/src/test/resources/projects/feature/goal.txt
+++ /dev/null
@@ -1 +0,0 @@
-clean install verify
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/kar/NOTICE b/karaf-2.3.x/archetypes/kar/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/archetypes/kar/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/archetypes/kar/pom.xml b/karaf-2.3.x/archetypes/kar/pom.xml
deleted file mode 100644
index b94cab7..0000000
--- a/karaf-2.3.x/archetypes/kar/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?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.3.1</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.3.x/archetypes/kar/src/main/resources/META-INF/maven/archetype-metadata.xml b/karaf-2.3.x/archetypes/kar/src/main/resources/META-INF/maven/archetype-metadata.xml
deleted file mode 100644
index 8784fe9..0000000
--- a/karaf-2.3.x/archetypes/kar/src/main/resources/META-INF/maven/archetype-metadata.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<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.3.x/archetypes/kar/src/main/resources/archetype-resources/pom.xml b/karaf-2.3.x/archetypes/kar/src/main/resources/archetype-resources/pom.xml
deleted file mode 100644
index b18449d..0000000
--- a/karaf-2.3.x/archetypes/kar/src/main/resources/archetype-resources/pom.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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>
-
-    <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.3.x/archetypes/kar/src/main/resources/archetype-resources/src/main/feature/feature.xml b/karaf-2.3.x/archetypes/kar/src/main/resources/archetype-resources/src/main/feature/feature.xml
deleted file mode 100644
index 42ac002..0000000
--- a/karaf-2.3.x/archetypes/kar/src/main/resources/archetype-resources/src/main/feature/feature.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/archetypes/kar/src/test/resources/projects/kar/archetype.properties b/karaf-2.3.x/archetypes/kar/src/test/resources/projects/kar/archetype.properties
deleted file mode 100644
index 10c289f..0000000
--- a/karaf-2.3.x/archetypes/kar/src/test/resources/projects/kar/archetype.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-groupId=archetype.it
-artifactId=kar
-version=1.0-SNAPSHOT
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/kar/src/test/resources/projects/kar/goal.txt b/karaf-2.3.x/archetypes/kar/src/test/resources/projects/kar/goal.txt
deleted file mode 100644
index deea798..0000000
--- a/karaf-2.3.x/archetypes/kar/src/test/resources/projects/kar/goal.txt
+++ /dev/null
@@ -1 +0,0 @@
-clean install verify
\ No newline at end of file
diff --git a/karaf-2.3.x/archetypes/pom.xml b/karaf-2.3.x/archetypes/pom.xml
deleted file mode 100644
index efffb8b..0000000
--- a/karaf-2.3.x/archetypes/pom.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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.3.1</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.3.x/assemblies/apache-karaf/.gitignore b/karaf-2.3.x/assemblies/apache-karaf/.gitignore
deleted file mode 100644
index 38afe6e..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-!bin
diff --git a/karaf-2.3.x/assemblies/apache-karaf/pom.xml b/karaf-2.3.x/assemblies/apache-karaf/pom.xml
deleted file mode 100644
index b30927c..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/pom.xml
+++ /dev/null
@@ -1,729 +0,0 @@
-<?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.3.1</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.api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.cm</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.proxy</groupId>
-            <artifactId>org.apache.aries.proxy.api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.proxy</groupId>
-            <artifactId>org.apache.aries.proxy.impl</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.api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.jmx</groupId>
-            <artifactId>org.apache.aries.jmx.blueprint.core</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.ow2.asm</groupId>
-            <artifactId>asm-all</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>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.activator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.locator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.jaxp-api-1.4</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.jaxb-api-2.2</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.jaxws-api-2.2</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.saaj-api-1.3</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.servicemix.specs</groupId>
-            <artifactId>org.apache.servicemix.specs.stax-api-1.2</artifactId>
-        </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>
-                </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>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.3.x/assemblies/apache-karaf/src/main/descriptors/unix-bin.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-bin.xml
deleted file mode 100644
index 726ea7d..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-bin.xml
+++ /dev/null
@@ -1,328 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-   
-    http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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>
-            <fileMode>0644</fileMode>
-        </fileSet>
-        <!-- Copy over the examples -->
-        <fileSet>
-            <directory>target/classes/demos</directory>
-            <outputDirectory>/demos/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-            <fileMode>0644</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>../../demos</directory>
-            <outputDirectory>/demos/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-            <fileMode>0644</fileMode>
-            <excludes>
-                <exclude>**/target/**</exclude>
-                <exclude>**/*.iml</exclude>
-            </excludes>
-        </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>
-            <fileMode>0644</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>target/features-repo</directory>
-            <outputDirectory>system</outputDirectory>
-            <fileMode>0644</fileMode>
-        </fileSet>
-    </fileSets>
-
-    <dependencySets>
-        <dependencySet>
-            <outputDirectory>/lib</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0644</fileMode>
-            <includes>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.activator</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-            </includes>
-        </dependencySet>
-
-        <dependencySet>
-            <outputDirectory>/lib/endorsed</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0644</fileMode>
-            <includes>
-                <include>org.apache.karaf:org.apache.karaf.exception</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.jaxp-api-1.4</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.jaxb-api-2.2</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.jaxws-api-2.2</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.saaj-api-1.3</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.stax-api-1.2</include>
-            </includes>
-        </dependencySet>
-
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <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.api</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.core</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.cm</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0644</fileMode>
-            <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.api</include>
-                <include>org.apache.aries.proxy:org.apache.aries.proxy.impl</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0644</fileMode>
-            <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>
-            <fileMode>0644</fileMode>
-            <outputFileNameMapping>
-                org/ow2/asm/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
-            </outputFileNameMapping>
-            <includes>
-                <include>org.ow2.asm:asm-all</include>
-            </includes>
-        </dependencySet>
-    </dependencySets>
-
-</assembly>
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-minimal-bin.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-minimal-bin.xml
deleted file mode 100644
index 6b3dcbe..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-minimal-bin.xml
+++ /dev/null
@@ -1,309 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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>
-            <fileMode>0664</fileMode>
-        </fileSet>
-
-        <fileSet>
-            <directory>target/classes/minimal</directory>
-            <outputDirectory>/etc/</outputDirectory>
-            <lineEnding>unix</lineEnding>
-            <fileMode>0664</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>
-            <fileMode>0664</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>target/features-repo</directory>
-            <includes>
-            	<include>**/*.xml</include>
-            </includes>
-            <outputDirectory>system</outputDirectory>
-            <fileMode>0664</fileMode>
-        </fileSet>
-
-    </fileSets>
-
-    <dependencySets>
-        <dependencySet>
-            <outputDirectory>/lib/endorsed</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0664</fileMode>
-            <includes>
-                <include>org.apache.karaf:org.apache.karaf.exception</include>
-            </includes>
-        </dependencySet>
-
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <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.api</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.core</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.cm</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0664</fileMode>
-            <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.api</include>
-                <include>org.apache.aries.proxy:org.apache.aries.proxy.impl</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0664</fileMode>
-            <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>
-            <fileMode>0664</fileMode>
-            <outputFileNameMapping>
-                org/ow2/asm/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
-            </outputFileNameMapping>
-            <includes>
-                <include>org.ow2.asm:asm-all</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/system</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <fileMode>0664</fileMode>
-            <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.api</include>
-                <include>org.apache.aries.jmx:org.apache.aries.jmx.blueprint.core</include>
-            </includes>
-        </dependencySet>
-    </dependencySets>
-</assembly>
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-src.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-src.xml
deleted file mode 100644
index aeee285..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/unix-src.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<assembly>
-    <id>src</id>
-    <formats>
-        <format>tar.gz</format>
-    </formats>
-
-    <fileSets>
-        <!-- Copy BUILDING and other files from root -->
-        <fileSet>
-            <directory>../..</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>BUILDING</include>
-                <include>README</include>
-                <include>RELEASE*</include>
-            </includes>
-            <lineEnding>unix</lineEnding>
-        </fileSet>
-
-        <!-- Copy src LICENSE and NOTICE -->
-        <fileSet>
-            <directory>src/main/distribution/src</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>LICENSE</include>
-                <include>NOTICE</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.3.x/assemblies/apache-karaf/src/main/descriptors/windows-bin.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-bin.xml
deleted file mode 100644
index 82708be..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-bin.xml
+++ /dev/null
@@ -1,310 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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>
-                <exclude>**/*.iml</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</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <includes>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.activator</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.locator</include>
-            </includes>
-        </dependencySet>
-
-        <dependencySet>
-            <outputDirectory>/lib/endorsed</outputDirectory>
-            <unpack>false</unpack>
-            <useProjectArtifact>false</useProjectArtifact>
-            <includes>
-                <include>org.apache.karaf:org.apache.karaf.exception</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.jaxp-api-1.4</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.jaxb-api-2.2</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.jaxws-api-2.2</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.saaj-api-1.3</include>
-                <include>org.apache.servicemix.specs:org.apache.servicemix.specs.stax-api-1.2</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.api</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.core</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.cm</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.api</include>
-                <include>org.apache.aries.proxy:org.apache.aries.proxy.impl</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/ow2/asm/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
-            </outputFileNameMapping>
-            <includes>
-                <include>org.ow2.asm:asm-all</include>
-            </includes>
-        </dependencySet>
-    </dependencySets>
-
-</assembly>
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-minimal-bin.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-minimal-bin.xml
deleted file mode 100644
index 900fc7a..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-minimal-bin.xml
+++ /dev/null
@@ -1,295 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.api</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.core</include>
-                <include>org.apache.aries.blueprint:org.apache.aries.blueprint.cm</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.api</include>
-                <include>org.apache.aries.proxy:org.apache.aries.proxy.impl</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/ow2/asm/${artifact.artifactId}/${artifact.baseVersion}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}
-            </outputFileNameMapping>
-            <includes>
-                <include>org.ow2.asm:asm-all</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.api</include>
-                <include>org.apache.aries.jmx:org.apache.aries.jmx.blueprint.core</include>
-            </includes>
-        </dependencySet>
-
-    </dependencySets>
-
-</assembly>
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-src.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-src.xml
deleted file mode 100644
index 9e5357a..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/descriptors/windows-src.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-  
-  http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<assembly>
-    <id>src</id>
-    <formats>
-        <format>zip</format>
-    </formats>
-
-    <fileSets>
-        <!-- Copy BUILDING and other files from root -->
-        <fileSet>
-            <directory>../..</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>BUILDING</include>
-                <include>README</include>
-                <include>RELEASE*</include>
-            </includes>
-            <lineEnding>dos</lineEnding>
-        </fileSet>
-
-        <!-- Copy src LICENSE and NOTICE -->
-        <fileSet>
-            <directory>src/main/distribution/src</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>LICENSE</include>
-                <include>NOTICE</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.3.x/assemblies/apache-karaf/src/main/distribution/src/LICENSE b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/src/LICENSE
deleted file mode 100644
index 7a4a3ea..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/src/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 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.
\ No newline at end of file
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/src/NOTICE b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/src/NOTICE
deleted file mode 100644
index 19fb4bc..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/src/NOTICE
+++ /dev/null
@@ -1,2 +0,0 @@
-Apache Karaf
-Copyright 2010-2012 The Apache Software Foundation
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/data/tmp/README b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/data/tmp/README
deleted file mode 100644
index 47d6dda..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/data/tmp/README
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-This folder is used for any temporary file
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/deploy/README b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/deploy/README
deleted file mode 100644
index 5904fe9..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/deploy/README
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-This folder can be used to deploy artifacts into the OSGi framework.
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/java.util.logging.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/java.util.logging.properties
deleted file mode 100644
index b7b50c5..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/java.util.logging.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-# 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.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/keys.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/keys.properties
deleted file mode 100644
index 2eb3b01..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/keys.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# This file contains the valid users who can log into Karaf. Each line have to be of
-# the format:
-#
-# USER=KEY,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=AAAAB3NzaC1kc3MAAACBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAAAAFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QAAAIEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoAAACBAKKSU2PFl/qOLxIwmBZPPIcJshVe7bVUpFvyl3BbJDow8rXfskl8wO63OzP/qLmcJM0+JbcRU/53JjTuyk31drV2qxhIOsLDC9dGCWj47Y7TyhPdXh/0dthTRBy6bqGtRPxGa7gJov1xm/UuYYXPIUR/3x9MAZvZ5xvE0kYXO+rx,admin
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg
deleted file mode 100644
index 5262eb3..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.felix.fileinstall-deploy.cfg
+++ /dev/null
@@ -1,22 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-felix.fileinstall.dir     = ${karaf.base}/deploy
-felix.fileinstall.tmpdir  = ${karaf.data}/generated-bundles
-felix.fileinstall.poll    = 1000
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.features.obr.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.features.obr.cfg
deleted file mode 100644
index 12ba4cd..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.features.obr.cfg
+++ /dev/null
@@ -1,38 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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
-
-#
-# Defines whether resolved bundles should be started by default. The default is true.
-#
-startByDefault = true
-
-#
-# Defines the start level for resolved bundles. The default is 80.
-#
-startLevel = 80
\ No newline at end of file
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.jaas.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.jaas.cfg
deleted file mode 100644
index 19f3fa0..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.jaas.cfg
+++ /dev/null
@@ -1,61 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.log.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.log.cfg
deleted file mode 100644
index e6bda65..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.log.cfg
+++ /dev/null
@@ -1,36 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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} | %-32.32C %4L | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.management.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.management.cfg
deleted file mode 100644
index f100620..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.management.cfg
+++ /dev/null
@@ -1,68 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# The properties in this file define the configuration of Apache Karaf's JMX Management
-#
-
-#
-# Port number for RMI registry connection
-#
-rmiRegistryPort = 1099
-
-#
-# Host for RMI registry
-#
-rmiRegistryHost = 0.0.0.0
-
-#
-# Port number for RMI server connection
-#
-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://${rmiRegistryHost}:${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.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.shell.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.shell.cfg
deleted file mode 100644
index 5798ad9..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.apache.karaf.shell.cfg
+++ /dev/null
@@ -1,62 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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
-
-#
-# The sshIdleTimeout defines the inactivity timeout to logout the SSH session.
-# The sshIdleTimeout is in milliseconds, and the default is set to 30 minutes.
-#
-sshIdleTimeout=1800000
-
-#
-# 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
-
-#
-# Self defined key size in 1024, 2048, 3072, or 4096
-# If not set, this defaults to 1024.
-#
-# keySize=1024
-
-#
-# Specify host key algorithm, defaults to DSA
-#
-# algorithm=DSA
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg
deleted file mode 100644
index f69d7eb..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.logging.cfg
+++ /dev/null
@@ -1,50 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-# Root logger
-log4j.rootLogger=INFO, out, osgi:*
-log4j.throwableRenderer=org.apache.log4j.OsgiThrowableRenderer
-
-# To avoid flooding the log when using DEBUG level on an ssh connection and doing log:tail
-log4j.logger.org.apache.sshd.server.channel.ChannelSession = INFO
-
-# 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} | %-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{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %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} | %-32.32C %4L | %m%n
-log4j.appender.sift.appender.file=${karaf.data}/log/$\\{bundle.name\\}.log
-log4j.appender.sift.appender.append=true
-
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg
deleted file mode 100644
index db1361e..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/org.ops4j.pax.url.mvn.cfg
+++ /dev/null
@@ -1,103 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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 don't wanna use the proxy settings
-# from the Maven conf/settings.xml file
-#
-# org.ops4j.pax.url.mvn.proxySupport=false
-
-#
-# 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
-#    @id=reponid : the id for the repository, just like in the settings.xml this is optional but recomendet
-#
-# 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@id=karaf.${karaf.default.repository}
-
-#
-# Comma separated list of repositories scanned when resolving an artifact.
-# The default list includes the following repositories:
-#    http://repo1.maven.org/maven2
-#    https://oss.sonatype.org/content/repositories/snapshots
-#    https://oss.sonatype.org/content/repositories/ops4j-snapshots
-#    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@id=central, \
-    https://oss.sonatype.org/content/repositories/snapshots@snapshots@noreleases@id=sonatype-snapshot, \
-    https://oss.sonatype.org/content/repositories/ops4j-snapshots@snapshots@noreleases@id=ops4j-snapshot, \
-    http://repository.apache.org/content/groups/snapshots-group@snapshots@noreleases@id=apache, \
-    http://svn.apache.org/repos/asf/servicemix/m2-repo@id=servicemix, \
-    http://repository.springsource.com/maven/bundles/release@id=springsource, \
-    http://repository.springsource.com/maven/bundles/external@id=springsourceext, \
-    http://oss.sonatype.org/content/repositories/releases/@id=sonatype
-
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/shell.init.script b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/shell.init.script
deleted file mode 100644
index c1c90e6..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/shell.init.script
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-// 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)" } ;
-help = { *:help $args | more } ;
-man = { help $args } ;
-
-enable-3x-aliases = {
-
-    // system:* aliases
-    system:framework = { dev:framework $args } ;
-    system:name = { osgi:name $args } ;
-    system:shutdown = { osgi:shutdown $args } ;
-    system:start-level = { osgi:start-level $args } ;
-    system:property = { dev:system-property $args } ;
-    system:version = { osgi:version $args } ;
-
-    // service:* aliases
-    service:list = { ls $args } ;
-    service:wait = { dev:wait-for-service $args } ;
-
-    // bundle:* aliases
-    bundle:dynamic-import = { dev:dynamic-import $args } ;
-    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:classes = { osgi:classes $args } ;
-    bundle:find-class = { osgi:find-class $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:services = { osgi:bundle-services $args } ;
-    bundle:start-level = { osgi:start-level $args } ;
-    bundle:tree-show = { dev:show-tree $args } ;
-    bundle:update = { osgi:update $args } ;
-    bundle:watch = { dev:watch $args } ;
-
-    // config:* aliases
-    config:property-append = { config:propappend $args } ;
-    config:property-delete = { config:propdel $args } ;
-    config:property-list = { config:proplist $args } ;
-    config:property-set = { config:propset $args } ;
-
-    // dev:* aliases
-    dev:dump-create = { dev:create-dump $args } ;
-
-    // package:* aliases
-    package:exports = { packages:exports $args } ;
-    package:imports = { packages:imports $args } ;
-
-    // feature:* aliases
-    feature:add-url = { features:addurl $args } ;
-    feature:repo-add = { 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:repo-remove = { features:removeurl $args } ;
-    feature:list = { features:list $args } ;
-    feature:uninstall = { features:uninstall $args } ;
-    feature:repo-list = { features:listrepositories $args } ;
-    feature:url-list = { features:listurl $args } ;
-    feature:version-list = { features:listversions $args } ;
-
-    // system:* aliases
-    system:property = { dev:system-property $args } ;
-
-    // instance:* aliases
-    instance:opts-change = { admin:change-opts $args } ;
-    instance:rmi-registry-port-change = { admin:change-rmi-registry-port $args } ;
-    instance:rmi-server-port-change = { admin:change-rmi-server-port $args } ;
-    instance:ssh-port-change = { admin:change-ssh-port $args } ;
-    instance:clone = { admin:clone $args } ;
-    instance:connect = { admin:connect $args } ;
-    instance:create = { admin:create $args } ;
-    instance:destroy = { admin:destroy $args } ;
-    instance:list = { admin:list $args } ;
-    instance:rename = { admin:rename $args } ;
-    instance:start = { admin:start $args } ;
-    instance:stop = { admin:stop $args } ;
-
-    // jaas:* aliases
-    jaas:pending-list = { jaas:pending $args } ;
-    jaas:realm-list = { jaas:realms $args } ;
-    jaas:user-list = { jaas:users $args } ;
-    jaas:realm-manage = { jaas:manage $args } ;
-    jaas:role-add = { jaas:roleadd $args } ;
-    jaas:role-delete = { jaas:roledel $args } ;
-    jaas:user-add = { jaas:useradd $args } ;
-    jaas:user-delete = { jaas:userdel $args } ;
-
-    // obr:* aliases
-    obr:url-add = { obr:addUrl $args } ;
-    obr:url-list = { obr:listUrl $args } ;
-    obr:url-refresh = { obr:refreshUrl $args } ;
-    obr:url-remove = { obr:removeUrl $args } ;
-
-    echo "Karaf 3.x aliases enabled"
-
-}
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/system.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/system.properties
deleted file mode 100644
index 25ea5ea..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/system.properties
+++ /dev/null
@@ -1,90 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# The 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
-
-#
-# ServiceMix specs options
-#
-org.apache.servicemix.specs.debug=false
-org.apache.servicemix.specs.timeout=0
-
-#
-# Settings for the OSGi 4.3 Weaving
-# By default, we will not weave any classes. Change this setting to include classes
-# that you application needs to have woven.
-#
-org.apache.aries.proxy.weaving.enabled=none
-# Classes not to weave - Aries default + Xerces which is known to have issues.
-org.apache.aries.proxy.weaving.disabled=org.objectweb.asm.*,org.slf4j.*,org.apache.log4j.*,javax.*,org.apache.xerces.*
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/users.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/users.properties
deleted file mode 100644
index 25c63e6..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/etc/users.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/README b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/README
deleted file mode 100644
index 9eca75a..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/README
+++ /dev/null
@@ -1,27 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/endorsed/README b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/endorsed/README
deleted file mode 100644
index 0665a52..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/endorsed/README
+++ /dev/null
@@ -1,23 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/ext/README b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/ext/README
deleted file mode 100644
index 09ff822..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/text/lib/ext/README
+++ /dev/null
@@ -1,23 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/karaf b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/karaf
deleted file mode 100755
index 2e16915..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/karaf
+++ /dev/null
@@ -1,387 +0,0 @@
-#!/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
-
-#
-# Check the mode that initiated the script
-#
-if [ "x$1" != "x" ]; then
-    MODE=$1
-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
-        # Ignore DEBUG in case of stop or client mode
-        if [ "x$MODE" = "xstop" ]; then
-            return
-        fi
-        if [ "x$MODE" = "xclient" ]; then
-            return
-        fi
-        # 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.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/setenv b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/setenv
deleted file mode 100755
index 337d8c0..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/setenv
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/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.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/start b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/start
deleted file mode 100755
index 12903e6..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/start
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/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.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/stop b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/stop
deleted file mode 100755
index 04fdea2..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/unix-shell/bin/stop
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/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.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/karaf.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/karaf.bat
deleted file mode 100755
index 34ebaf9..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/karaf.bat
+++ /dev/null
@@ -1,303 +0,0 @@
-@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 JAVA_MODE=-server
-if not exist "%JAVA_HOME%\bin\server\jvm.dll" (
-    if not exist "%JAVA_HOME%\jre\bin\server\jvm.dll" (
-        echo WARNING: Running karaf on a Java HotSpot Client VM because server-mode is not available.
-        echo Install Java Developer Kit to fix this.
-        echo For more details see http://java.sun.com/products/hotspot/whitepaper.html#client
-        set JAVA_MODE=-client
-    )
-)
-set DEFAULT_JAVA_OPTS=%JAVA_MODE% -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
-    if "%1" == "stop" goto :KARAF_DEBUG_END
-    if "%1" == "client" 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.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/setenv.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/setenv.bat
deleted file mode 100644
index 98142cd..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/setenv.bat
+++ /dev/null
@@ -1,57 +0,0 @@
-@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.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/start.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/start.bat
deleted file mode 100755
index c861a90..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/start.bat
+++ /dev/null
@@ -1,81 +0,0 @@
-@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.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/stop.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/stop.bat
deleted file mode 100755
index 69fa4a6..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/distribution/windows-text/bin/stop.bat
+++ /dev/null
@@ -1,80 +0,0 @@
-@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.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin
deleted file mode 100644
index f24d67d..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin
+++ /dev/null
@@ -1,335 +0,0 @@
-#!/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.api/${aries.blueprint.api.version}/org.apache.aries.blueprint.api-${aries.blueprint.api.version}.jar:${KARAF_HOME}/system/org/apache/aries/blueprint/org.apache.aries.blueprint.core/${aries.blueprint.core.version}/org.apache.aries.blueprint.core-${aries.blueprint.core.version}.jar:${KARAF_HOME}/system/org/apache/aries/blueprint/org.apache.aries.blueprint.cm/${aries.blueprint.cm.version}/org.apache.aries.blueprint.cm-${aries.blueprint.cm.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.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin.bat
deleted file mode 100644
index 1932f07..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/admin.bat
+++ /dev/null
@@ -1,127 +0,0 @@
-@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.api\${aries.blueprint.api.version}\org.apache.aries.blueprint.api-${aries.blueprint.api.version}.jar;%KARAF_HOME%\system\org\apache\aries\blueprint\org.apache.aries.blueprint.core\${aries.blueprint.core.version}\org.apache.aries.blueprint.core-${aries.blueprint.core.version}.jar;%KARAF_HOME%\system\org\apache\aries\blueprint\org.apache.aries.blueprint.cm\${aries.blueprint.cm.version}\org.apache.aries.blueprint.cm-${aries.blueprint.cm.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.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client
deleted file mode 100644
index 6d8454b..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client
+++ /dev/null
@@ -1,301 +0,0 @@
-#!/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"
-}
-
-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"
-
-}
-
-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
-
-}
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client.bat
deleted file mode 100644
index deddd7e..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/client.bat
+++ /dev/null
@@ -1,121 +0,0 @@
-@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=
-
-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%
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell
deleted file mode 100644
index 4285d9d..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell
+++ /dev/null
@@ -1,327 +0,0 @@
-#!/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.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell.bat b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell.bat
deleted file mode 100644
index a7a32c5..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/bin/shell.bat
+++ /dev/null
@@ -1,128 +0,0 @@
-@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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/command/README.txt b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/command/README.txt
deleted file mode 100644
index af21424..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/command/README.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/bundle/README.TXT b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/bundle/README.TXT
deleted file mode 100644
index 9789247..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/bundle/README.TXT
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/feature/README.TXT b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/feature/README.TXT
deleted file mode 100644
index 19afc58..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/feature/README.TXT
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/kar/README.txt b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/kar/README.txt
deleted file mode 100644
index 8255acb..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/kar/README.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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 uncompress the KAR archive in the system
-repository 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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/wrap/README.txt b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/wrap/README.txt
deleted file mode 100644
index 9b86fe5..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/deployer/wrap/README.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/dump/README.txt b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/dump/README.txt
deleted file mode 100644
index 32e9e21..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/dump/README.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/web/README.txt b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/web/README.txt
deleted file mode 100644
index ca139f0..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/demos/web/README.txt
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/config.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/config.properties
deleted file mode 100644
index 189a936..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/config.properties
+++ /dev/null
@@ -1,122 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.startlevel;uses:="org.osgi.framework";version="1.0", \
- org.osgi.framework.wiring;uses:="org.osgi.resource,org.osgi.framework";version="1.1", \
- org.osgi.framework.hooks.bundle;uses:="org.osgi.framework";version="1.1", \
- org.osgi.framework.hooks.service;uses:="org.osgi.framework";version="1.1", \
- org.osgi.framework.hooks.resolver;uses:="org.osgi.framework.wiring";version="1.0", \
- org.osgi.framework.launch;uses:="org.osgi.framework";version="1.1", \
- org.osgi.framework.namespace;uses:="org.osgi.resource";version="1.0", \
- org.osgi.framework;version="1.7",\
- org.osgi.framework.hooks.weaving;uses:="org.osgi.framework.wiring";version="1.0",\
- org.osgi.resource;version="1.0",org.osgi.service.url;version="1.0",\
- org.osgi.service.startlevel;uses:="org.osgi.framework";version="1.1",\
- org.osgi.service.packageadmin;uses:="org.osgi.framework";version="1.2",\
- org.osgi.service.url;version="1.0", \
- org.osgi.util.tracker;uses:="org.osgi.framework";version="1.5.1", \
- org.apache.karaf.jaas.boot;version="${karaf.osgi.version}", \
- org.apache.karaf.jaas.boot.principal;version="${karaf.osgi.version}", \
- org.apache.karaf.version;version="${karaf.osgi.version}", \
- ${jre-${java.specification.version}}
-
-# Extra packages appended after standard packages
-# 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 = 
-
-karaf.delay.console=false
-
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/custom.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/custom.properties
deleted file mode 100644
index fbdb62a..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/custom.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties
deleted file mode 100644
index ec0a344..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/jre.properties
+++ /dev/null
@@ -1,509 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# Java platform package export properties.
-#
-
-# Standard package set.  Note that:
-#   - javax.transaction* is exported with a mandatory attribute
-jre-1.6= \
- javax.accessibility, \
- javax.activation;version="1.1", \
- 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;version="2.2.1", \
- javax.xml.bind.annotation;version="2.2.1", \
- javax.xml.bind.annotation.adapters;version="2.2.1", \
- javax.xml.bind.attachment;version="2.2.1", \
- javax.xml.bind.helpers;version="2.2.1", \
- javax.xml.bind.util;version="2.2.1", \
- 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;version="1.3", \
- javax.xml.stream;version="1.2", \
- javax.xml.stream.events;version="1.2", \
- javax.xml.stream.util;version="1.2", \
- 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;version="2.2", \
- javax.xml.ws.handler;version="2.2", \
- javax.xml.ws.handler.soap;version="2.2", \
- javax.xml.ws.http;version="2.2", \
- javax.xml.ws.soap;version="2.2", \
- javax.xml.ws.spi;version="2.2", \
- javax.xml.ws.wsaddressing;version="2.2", \
- javax.xml.ws.spi.http;version="2.2", \
- 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;version="1.1", \
- 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;version="2.2.1", \
- javax.xml.bind.annotation;version="2.2.1", \
- javax.xml.bind.annotation.adapters;version="2.2.1", \
- javax.xml.bind.attachment;version="2.2.1", \
- javax.xml.bind.helpers;version="2.2.1", \
- javax.xml.bind.util;version="2.2.1", \
- 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;version="1.3", \
- javax.xml.stream;version="1.2", \
- javax.xml.stream.events;version="1.2", \
- javax.xml.stream.util;version="1.2", \
- 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;version="2.2", \
- javax.xml.ws.handler;version="2.2", \
- javax.xml.ws.handler.soap;version="2.2", \
- javax.xml.ws.http;version="2.2", \
- javax.xml.ws.soap;version="2.2", \
- javax.xml.ws.spi;version="2.2", \
- javax.xml.ws.wsaddressing;version="2.2", \
- javax.xml.ws.spi.http;version="2.2", \
- 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
-
-jre-1.8= \
- javax.accessibility, \
- javax.activation;version="1.1", \
- 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;version="2.2.1", \
- javax.xml.bind.annotation;version="2.2.1", \
- javax.xml.bind.annotation.adapters;version="2.2.1", \
- javax.xml.bind.attachment;version="2.2.1", \
- javax.xml.bind.helpers;version="2.2.1", \
- javax.xml.bind.util;version="2.2.1", \
- 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;version="1.3", \
- javax.xml.stream;version="1.2", \
- javax.xml.stream.events;version="1.2", \
- javax.xml.stream.util;version="1.2", \
- 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;version="2.2", \
- javax.xml.ws.handler;version="2.2", \
- javax.xml.ws.handler.soap;version="2.2", \
- javax.xml.ws.http;version="2.2", \
- javax.xml.ws.soap;version="2.2", \
- javax.xml.ws.spi;version="2.2", \
- javax.xml.ws.wsaddressing;version="2.2", \
- javax.xml.ws.spi.http;version="2.2", \
- 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
\ No newline at end of file
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.cfg
deleted file mode 100644
index c9cf408..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.cfg
+++ /dev/null
@@ -1,30 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-respectStartLvlDuringFeatureStartup=false
-
-#
-# 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.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.repos.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.repos.cfg
deleted file mode 100644
index ce184c6..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/org.apache.karaf.features.repos.cfg
+++ /dev/null
@@ -1,30 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# This file describes the features repository URL for some projects
-#
-cellar=org.apache.karaf.cellar:apache-karaf-cellar:xml:features:(0,]
-camel=org.apache.camel.karaf:apache-camel:xml:features:(0,]
-cxf=org.apache.cxf.karaf:apache-cxf:xml:features:(0,]
-cxf-dosgi=org.apache.cxf.dosgi:cxf-dosgi: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.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/startup.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/startup.properties
deleted file mode 100644
index b40ec23..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/etc/startup.properties
+++ /dev/null
@@ -1,81 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-# 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/ow2/asm/asm-all/${asm.version}/asm-all-${asm.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.api/${aries.proxy.api.version}/org.apache.aries.proxy.api-${aries.proxy.api.version}.jar=20
-org/apache/aries/proxy/org.apache.aries.proxy.impl/${aries.proxy.version}/org.apache.aries.proxy.impl-${aries.proxy.version}.jar=20
-org/apache/aries/blueprint/org.apache.aries.blueprint.api/${aries.blueprint.api.version}/org.apache.aries.blueprint.api-${aries.blueprint.api.version}.jar=20
-org/apache/aries/blueprint/org.apache.aries.blueprint.core/${aries.blueprint.core.version}/org.apache.aries.blueprint.core-${aries.blueprint.core.version}.jar=20
-org/apache/aries/blueprint/org.apache.aries.blueprint.cm/${aries.blueprint.cm.version}/org.apache.aries.blueprint.cm-${aries.blueprint.cm.version}.jar=20
-
-org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar=25
-
-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.api.version}/org.apache.aries.jmx.api-${aries.jmx.api.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.core/${aries.jmx.core.version}/org.apache.aries.jmx.core-${aries.jmx.core.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.blueprint.api/${aries.jmx.blueprint.api.version}/org.apache.aries.jmx.blueprint.api-${aries.jmx.blueprint.api.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.blueprint.core/${aries.jmx.blueprint.core.version}/org.apache.aries.jmx.blueprint.core-${aries.jmx.blueprint.core.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.3.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/org.apache.karaf.features.cfg b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/org.apache.karaf.features.cfg
deleted file mode 100644
index 1357ce0..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/org.apache.karaf.features.cfg
+++ /dev/null
@@ -1,35 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# Defines if the startlvl should be respected during feature startup. The default value is for 3.x is true. 
-# The default behavior for 2.x is false (!) for this property
-#
-#respectStartLvlDuringFeatureStartup=false
-
-#
-# 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.3.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties b/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
deleted file mode 100644
index 6a69fc1..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/filtered-resources/minimal/startup.properties
+++ /dev/null
@@ -1,62 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-# 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/ow2/asm/asm-all/${asm.version}/asm-all-${asm.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.api/${aries.proxy.api.version}/org.apache.aries.proxy.api-${aries.proxy.api.version}.jar=20
-org/apache/aries/proxy/org.apache.aries.proxy.impl/${aries.proxy.version}/org.apache.aries.proxy.impl-${aries.proxy.version}.jar=20
-org/apache/aries/blueprint/org.apache.aries.blueprint.api/${aries.blueprint.api.version}/org.apache.aries.blueprint.api-${aries.blueprint.api.version}.jar=20
-org/apache/aries/blueprint/org.apache.aries.blueprint.core/${aries.blueprint.core.version}/org.apache.aries.blueprint.core-${aries.blueprint.core.version}.jar=20
-org/apache/aries/blueprint/org.apache.aries.blueprint.cm/${aries.blueprint.cm.version}/org.apache.aries.blueprint.cm-${aries.blueprint.cm.version}.jar=20
-
-org/apache/karaf/shell/org.apache.karaf.shell.console/${project.version}/org.apache.karaf.shell.console-${project.version}.jar=25
-
-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.api.version}/org.apache.aries.jmx.api-${aries.jmx.api.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.core/${aries.jmx.core.version}/org.apache.aries.jmx.core-${aries.jmx.core.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.blueprint.api/${aries.jmx.blueprint.api.version}/org.apache.aries.jmx.blueprint.api-${aries.jmx.blueprint.api.version}.jar=30
-org/apache/aries/jmx/org.apache.aries.jmx.blueprint.core/${aries.jmx.blueprint.core.version}/org.apache.aries.jmx.blueprint.core-${aries.jmx.blueprint.core.version}.jar=30
diff --git a/karaf-2.3.x/assemblies/apache-karaf/src/main/resources/extra/jetty.xml b/karaf-2.3.x/assemblies/apache-karaf/src/main/resources/extra/jetty.xml
deleted file mode 100644
index dfdc00e..0000000
--- a/karaf-2.3.x/assemblies/apache-karaf/src/main/resources/extra/jetty.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<!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!                                           -->
-    <!-- =========================================================== -->
-
-    <!-- 
-         !!WARNING!! We use a blocking instead of a selector connector here to 
-         make the default configuration avoid the jetty issue 357318. If you're 
-         sure that the JDK/JRE you're usign does not face that issue feel free 
-         to change that back but please make sure that you've read the Jetty
-         bug and make sure that it does not affect you first! !! WARNING!!
-    -->
-    <Call name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.server.nio.BlockingChannelConnector">
-                <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">1</Set>
-                <Set name="statsOn">false</Set>
-                <Set name="confidentialPort">8443</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.3.x/assemblies/features/enterprise/pom.xml b/karaf-2.3.x/assemblies/features/enterprise/pom.xml
deleted file mode 100644
index 8ba1130..0000000
--- a/karaf-2.3.x/assemblies/features/enterprise/pom.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?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.3.1</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.3.x/assemblies/features/enterprise/src/main/resources/features.xml b/karaf-2.3.x/assemblies/features/enterprise/src/main/resources/features.xml
deleted file mode 100644
index b5ee3e8..0000000
--- a/karaf-2.3.x/assemblies/features/enterprise/src/main/resources/features.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<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>JTA implementation provided by Apache Aries Transaction ${aries.transaction.version}</details>
-        <config name="org.apache.aries.transaction">
-            aries.transaction.recoverable = true
-            aries.transaction.timeout = 600
-            aries.transaction.howl.logFileDir = ${karaf.data}/txlog
-            aries.transaction.howl.maxLogFiles = 2
-            aries.transaction.howl.maxBlocksPerFile = 512
-            aries.transaction.howl.bufferSizeKBytes = 4
-        </config>
-        <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.blueprint.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.transaction/org.apache.aries.transaction.manager/${aries.transaction.manager.version}</bundle>
-    </feature>
-
-    <feature name="jpa" description="OSGi Persistence Container" version="${aries.jpa.version}" resolver="(obr)">
-        <details>JPA implementation provided by Apache Aries JPA ${aries.jpa.version}. NB: this feature doesn't provide the JPA engine, you have to install one by yourself (OpenJPA for instance)</details>
-        <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.jpa/org.apache.aries.jpa.api/${aries.jpa.api.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.blueprint.aries/${aries.jpa.blueprint.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/${aries.jpa.container.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jpa/org.apache.aries.jpa.container.context/${aries.jpa.container.context.version}</bundle>
-    </feature>
-
-    <feature name="jndi" description="OSGi Service Registry JNDI access" version="${aries.jndi.version}" resolver="(obr)">
-        <details>JNDI support provided by Apache Aries JNDI ${aries.jndi.version}</details>
-        <bundle start-level="30">mvn:org.apache.aries.jndi/org.apache.aries.jndi.api/${aries.jndi.api.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" description="Provide EBA archive support" version="${aries.application.version}">
-        <details>Support of the Aries EBA archives</details>
-        <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.api.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.application/org.apache.aries.application.management/${aries.application.management.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.resolver.noop/${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.3.x/assemblies/features/framework/src/main/filtered-resources/resources/etc/jre.properties.cxf b/karaf-2.3.x/assemblies/features/framework/src/main/filtered-resources/resources/etc/jre.properties.cxf
deleted file mode 100644
index 271b71a..0000000
--- a/karaf-2.3.x/assemblies/features/framework/src/main/filtered-resources/resources/etc/jre.properties.cxf
+++ /dev/null
@@ -1,632 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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
-
-jre-1.8= \
- 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
\ No newline at end of file
diff --git a/karaf-2.3.x/assemblies/features/pom.xml b/karaf-2.3.x/assemblies/features/pom.xml
deleted file mode 100644
index 2124d03..0000000
--- a/karaf-2.3.x/assemblies/features/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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.3.1</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.3.x/assemblies/features/standard/pom.xml b/karaf-2.3.x/assemblies/features/standard/pom.xml
deleted file mode 100644
index 3617aa6..0000000
--- a/karaf-2.3.x/assemblies/features/standard/pom.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?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.3.1</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.3.x/assemblies/features/standard/src/main/resources/features.xml b/karaf-2.3.x/assemblies/features/standard/src/main/resources/features.xml
deleted file mode 100644
index 73fbd99..0000000
--- a/karaf-2.3.x/assemblies/features/standard/src/main/resources/features.xml
+++ /dev/null
@@ -1,383 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-      Licensed to the Apache Software Foundation (ASF) under one or more
-      contributor license agreements.  See the NOTICE file distributed with
-      this work for additional information regarding copyright ownership.
-      The ASF licenses this file to You under the Apache License, Version 2.0
-      (the "License"); you may not use this file except in compliance with
-      the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-      Unless required by applicable law or agreed to in writing, software
-      distributed under the License is distributed on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-      See the License for the specific language governing permissions and
-      limitations under the License.
--->
-<features name="karaf-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0">
-
-    <feature name="karaf-framework" description="Karaf core feature" 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.ow2.asm/asm-all/${asm.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.api/${aries.proxy.api.version}</bundle>
-        <bundle start-level="20">mvn:org.apache.aries.proxy/org.apache.aries.proxy.impl/${aries.proxy.version}</bundle>
-        <bundle start-level="20">mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.api/${aries.blueprint.api.version}</bundle>
-        <bundle start-level="20">mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.core/${aries.blueprint.core.version}</bundle>
-        <bundle start-level="20">mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.cm/${aries.blueprint.cm.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.api.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.core/${aries.jmx.core.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint.api/${aries.jmx.blueprint.api.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint.core/${aries.jmx.blueprint.core.version}</bundle>
-    </feature>
-
-    <!-- Spring 2 support -->
-    <feature name="spring" description="Spring support" 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" description="Spring 2 Web support" version="${spring2.version}" resolver="(obr)">
-    	<feature version="${spring2.version}">spring</feature>
-    	<feature version="${http.feature.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>
-
-    <!-- Spring 3.0 support -->
-
-    <feature name="spring" description="Spring 3.0.x support" version="${spring30.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/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-asm/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-expression/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-beans/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-aop/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-context/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-context-support/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-aspects" description="Spring AOP support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-aspects/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-dm" description="Spring DM support" 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" description="Spring DM Web Support" 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="${http.feature.version}">http</feature>
-		<bundle start-level="30">mvn:org.springframework.osgi/spring-osgi-web/${spring.osgi.version}</bundle>
-    </feature>
-
-    <feature name="spring-instrument" description="Spring Instrument support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-instrument/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-jdbc" description="Spring JDBC support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring-tx</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-jdbc/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-jms" description="Spring JMS support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.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/${spring30.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-tx/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-struts" description="Spring Struts support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring-web</feature>
-        <feature>war</feature>
-        <bundle dependency="true" start-level="30">mvn:commons-collections/commons-collections/${commons-collections.version}</bundle>
-        <bundle dependency="true" start-level="30">mvn:commons-beanutils/commons-beanutils/${commons-beanutils.version}</bundle>
-        <bundle dependency="true" start-level="30">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.struts/${struts.bundle.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-struts/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-test" description="Spring Test support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-test/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-orm" description="Spring ORM support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring-jdbc</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-orm/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-oxm" description="Spring OXM support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-oxm/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-tx" description="Spring Transaction (TX) support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-tx/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-web" description="Spring Web support" version="${spring30.version}" resolver="(obr)">
-    	<feature version="${spring30.version}">spring</feature>
-    	<feature version="${http.feature.version}">http</feature>
-    	<bundle start-level="30">mvn:org.springframework/spring-web/${spring30.version}</bundle>
-		<bundle start-level="30">mvn:org.springframework/spring-webmvc/${spring30.version}</bundle>
-    </feature>
-
-    <feature name="spring-web-portlet" description="Spring Web Portlet support" version="${spring30.version}" resolver="(obr)">
-        <feature version="${spring30.version}">spring-web</feature>
-        <bundle dependency="true" start-level="30">mvn:javax.portlet/portlet-api/${portlet-api.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-webmvc-portlet/${spring30.version}</bundle>
-    </feature>
-
-    <!-- Spring 3.1 support -->
-
-    <feature name="spring" description="Spring 3.1.x support" version="${spring31.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/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-asm/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-expression/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-beans/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-aop/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-context/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-context-support/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-aspects" description="Spring 3.1 AOP support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-aspects/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-instrument" description="Spring 3.1 Instrument support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-instrument/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-jdbc" description="Spring 3.1 JDBC support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring-tx</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-jdbc/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-jms" description="Spring 3.1 JMS support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.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/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-tx/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-struts" description="Spring 3.1 Struts support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring-web</feature>
-        <feature>war</feature>
-        <bundle dependency="true" start-level="30">mvn:commons-collections/commons-collections/${commons-collections.version}</bundle>
-        <bundle dependency="true" start-level="30">mvn:commons-beanutils/commons-beanutils/${commons-beanutils.version}</bundle>
-        <bundle dependency="true" start-level="30">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.struts/${struts.bundle.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-struts/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-test" description="Spring 3.1 Test support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-test/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-orm" description="Spring 3.1 ORM support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring-jdbc</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-orm/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-oxm" description="Spring 3.1 OXM support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-oxm/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-tx" description="Spring 3.1 Transaction (TX) support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-tx/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-web" description="Spring 3.1 Web support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring</feature>
-        <feature version="${http.feature.version}">http</feature>
-        <bundle start-level="30">mvn:org.springframework/spring-web/${spring31.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-webmvc/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="spring-web-portlet" description="Spring 3.1 Web Portlet support" version="${spring31.version}" resolver="(obr)">
-        <feature version="${spring31.version}">spring-web</feature>
-        <bundle dependency="true" start-level="30">mvn:javax.portlet/portlet-api/${portlet-api.version}</bundle>
-        <bundle start-level="30">mvn:org.springframework/spring-webmvc-portlet/${spring31.version}</bundle>
-    </feature>
-
-    <feature name="wrapper" description="Provide OS integration" version="${project.version}">
-        <bundle>mvn:org.apache.karaf.shell/org.apache.karaf.shell.wrapper/${project.version}</bundle>
-    </feature>
-
-    <feature name="obr" description="Provide OSGi Bundle Repository (OBR) support" 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" description="Provide OSGi ConfigAdmin support" version="${project.version}">
-        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.config/${project.version}</bundle>
-    </feature>
-
-    <feature name="jetty" description="Provide Jetty engine support" 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" description="Implementation of the OSGi HTTP service" 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 version="${http.feature.version}">http</feature>
-        <bundle start-level="30">mvn:org.ops4j.pax.web/pax-web-extender-whiteboard/${pax.web.version}</bundle>
-    </feature>
-
-    <feature name="war" description="Turn Karaf as a full WebContainer" 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" description="Provide KAR (KARaf archive) support" 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" description="Base support of the Karaf WebConsole" version="${project.version}">
-        <config name="org.apache.karaf.webconsole">
-            realm=karaf
-            role=${karaf.admin.role}
-        </config>
-        <feature version="${http.feature.version}">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" description="Karaf WebConsole for administration and monitoring" 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" description="Provide a SSHd server on Karaf" 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" description="Provide a JMX MBeanServer and a set of MBeans in Karaf" 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.api.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.core/${aries.jmx.core.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint.api/${aries.jmx.blueprint.api.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint.core/${aries.jmx.blueprint.core.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" description="OSGi Event Admin service specification for event-based communication" version="${project.version}">
-		<bundle start-level='30'>mvn:org.apache.felix/org.apache.felix.eventadmin/${felix.eventadmin.version}</bundle>
-    </feature>
-
-    <feature name="jasypt-encryption" description="Advanced encryption support for Karaf security" 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>
-
-    <feature name="scr" description="Declarative Service support" version="${project.version}" resolver="(obr)">
-        <feature>eventadmin</feature>
-        <bundle dependency="true" start-level="30">mvn:org.apache.felix/org.apache.felix.metatype/${felix.metatype.version}</bundle>
-        <bundle dependency="true" start-level="30">mvn:org.apache.felix/org.apache.felix.scr/${felix.scr.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.karaf.shell/org.apache.karaf.shell.scr/${project.version}</bundle>
-        <bundle start-level="30">mvn:org.apache.karaf.management.mbeans/org.apache.karaf.management.mbeans.scr/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/karaf-2.3.x/assemblies/pom.xml b/karaf-2.3.x/assemblies/pom.xml
deleted file mode 100644
index 3c8a428..0000000
--- a/karaf-2.3.x/assemblies/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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.3.1</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.3.x/client/NOTICE b/karaf-2.3.x/client/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/client/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/client/pom.xml b/karaf-2.3.x/client/pom.xml
deleted file mode 100644
index 1053929..0000000
--- a/karaf-2.3.x/client/pom.xml
+++ /dev/null
@@ -1,134 +0,0 @@
-<?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.3.1</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>
-                        <Include-Resource>
-                            ../shell/console/src/main/resources/karaf.key,
-                            {maven-resources}
-                        </Include-Resource>
-                        <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.3.x/client/src/main/java/org/apache/karaf/client/Main.java b/karaf-2.3.x/client/src/main/java/org/apache/karaf/client/Main.java
deleted file mode 100644
index 5fe8574..0000000
--- a/karaf-2.3.x/client/src/main/java/org/apache/karaf/client/Main.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.client;
-
-import java.io.*;
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.security.KeyPair;
-import java.util.Locale;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-
-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.agent.SshAgent;
-import org.apache.sshd.agent.local.AgentImpl;
-import org.apache.sshd.agent.local.LocalAgentFactory;
-import org.apache.sshd.client.channel.ChannelShell;
-import org.apache.sshd.client.future.ConnectFuture;
-import org.apache.sshd.common.RuntimeSshException;
-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 = null;
-        StringBuilder sb = new StringBuilder();
-        int level = 1;
-        int retryAttempts = 0;
-        int retryDelay = 2;
-        boolean batch = false;
-        String file = null;
-
-        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("-v")) {
-                    level++;
-                } else if (args[i].equals("-r")) {
-                    retryAttempts = Integer.parseInt(args[++i]);
-                } else if (args[i].equals("-p")) {
-                    password = args[++i];
-                } else if (args[i].equals("-d")) {
-                    retryDelay = Integer.parseInt(args[++i]);
-                } else if (args[i].equals("-b")) {
-                    batch = true;
-                } else if (args[i].equals("-f")) {
-                    file = 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 (optional, if not provided, the password is prompted)");
-                    System.out.println("                NB: this option is deprecated and will be removed in next Karaf version");
-                    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("  -b            batch mode, specify multiple commands via standard input");
-                    System.out.println("  -f [file]    read commands from the specified file");
-                    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);
-
-        if (file != null) {
-            Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-            try {
-                sb.setLength(0);
-                for (int c = reader.read(); c >= 0; c = reader.read()) {
-                    sb.append((char) c);
-                }
-            } finally {
-                reader.close();
-            }
-        } else if (batch) {
-            // read all stdin
-            Reader reader = new BufferedReader(new InputStreamReader(System.in));
-            sb.setLength(0);
-            for (int c = reader.read(); c >= 0; c = reader.read()) {
-                sb.append((char) c);
-            }
-        }
-
-        SshClient client = null;
-        Terminal terminal = null;
-        SshAgent agent = null;
-        try {
-            agent = startAgent(user);
-            client = SshClient.setUpDefaultClient();
-            client.setAgentFactory(new LocalAgentFactory(agent));
-            client.getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, "local");
-            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.authAgent(user).await().isSuccess()) {
-                if (password == null) {
-                    Console console = System.console();
-                    if (console != null) {
-                        char[] readPassword = console.readPassword("Password: ");
-                        if (readPassword != null) {
-                            password = new String(readPassword);
-                        }
-                    } else {
-                        throw new Exception("Unable to prompt password: could not get system console");
-                    }
-                }
-                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");
-                ConsoleInputStream in = new ConsoleInputStream(terminal.wrapInIfNeeded(System.in));
-                new Thread(in).start();
-                channel.setIn(in);
-                ((ChannelShell) channel).setupSensibleDefaultPty();
-                ((ChannelShell) channel).setAgentForwarding(true);
-                String ctype = System.getenv("LC_CTYPE");
-                if (ctype == null) {
-                    ctype = Locale.getDefault().toString() + "."
-                                + System.getProperty("input.encoding", Charset.defaultCharset().name());
-                }
-                ((ChannelShell) channel).setEnv("LC_CTYPE", ctype);
-            }
-            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);
-    }
-
-    protected static SshAgent startAgent(String user) {
-        try {
-            SshAgent local = new AgentImpl();
-            URL url = Main.class.getClassLoader().getResource("karaf.key");
-            InputStream is = url.openStream();
-            ObjectInputStream r = new ObjectInputStream(is);
-            KeyPair keyPair = (KeyPair) r.readObject();
-            local.addIdentity(keyPair, "karaf");
-            return local;
-        } catch (Throwable e) {
-            System.err.println("Error starting ssh agent for: " + e.getMessage());
-            return null;
-        }
-    }
-
-    public static String readLine(String msg) throws IOException {
-        StringBuffer sb = new StringBuffer();
-        System.err.print(msg);
-        System.err.flush();
-        for (;;) {
-            int c = System.in.read();
-            if (c < 0) {
-                return null;
-            }
-            System.err.print((char) c);
-            if (c == '\r' || c == '\n') {
-                break;
-            }
-            sb.append((char) c);
-        }
-        return sb.toString();
-    }
-
-    private static class ConsoleInputStream extends InputStream implements Runnable {
-
-        private InputStream in;
-        private boolean eof = false;
-        private final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1024);
-
-        public ConsoleInputStream(InputStream in) {
-            this.in = in;
-        }
-
-        private int read(boolean wait) throws IOException
-        {
-            if (eof && queue.isEmpty()) {
-                return -1;
-            }
-            Integer i;
-            if (wait) {
-                try {
-                    i = queue.take();
-                } catch (InterruptedException e) {
-                    throw new InterruptedIOException();
-                }
-            } 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();
-        }
-
-        public void run() {
-            try {
-                while (true) {
-                    try {
-                        int c = in.read();
-                        if (c == -1) {
-                            return;
-                        }
-                        queue.put(c);
-                    } catch (Throwable t) {
-                        return;
-                    }
-                }
-            } finally {
-                eof = true;
-                try {
-                    queue.put(-1);
-                } catch (InterruptedException e) {
-                }
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/client/src/main/java/org/slf4j/impl/SimpleLogger.java b/karaf-2.3.x/client/src/main/java/org/slf4j/impl/SimpleLogger.java
deleted file mode 100644
index c8126c4..0000000
--- a/karaf-2.3.x/client/src/main/java/org/slf4j/impl/SimpleLogger.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.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.3.x/client/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/client/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 17b5cb4..0000000
--- a/karaf-2.3.x/client/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,27 +0,0 @@
-\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.3.x/client/src/main/resources/client.login.conf b/karaf-2.3.x/client/src/main/resources/client.login.conf
deleted file mode 100644
index 1e190f1..0000000
--- a/karaf-2.3.x/client/src/main/resources/client.login.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-//
-// $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.3.x/demos/branding/pom.xml b/karaf-2.3.x/demos/branding/pom.xml
deleted file mode 100644
index 163c9ec..0000000
--- a/karaf-2.3.x/demos/branding/pom.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?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.3.1</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.3.x/demos/branding/shell/NOTICE b/karaf-2.3.x/demos/branding/shell/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/branding/shell/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/branding/shell/README.txt b/karaf-2.3.x/demos/branding/shell/README.txt
deleted file mode 100644
index 0fb69ea..0000000
--- a/karaf-2.3.x/demos/branding/shell/README.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/demos/branding/shell/pom.xml b/karaf-2.3.x/demos/branding/shell/pom.xml
deleted file mode 100644
index 3090f4d..0000000
--- a/karaf-2.3.x/demos/branding/shell/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?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.3.1</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.3.x/demos/branding/shell/src/main/resources/org/apache/karaf/branding/branding.properties b/karaf-2.3.x/demos/branding/shell/src/main/resources/org/apache/karaf/branding/branding.properties
deleted file mode 100644
index 2f772ae..0000000
--- a/karaf-2.3.x/demos/branding/shell/src/main/resources/org/apache/karaf/branding/branding.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/demos/command/NOTICE b/karaf-2.3.x/demos/command/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/command/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/command/pom.xml b/karaf-2.3.x/demos/command/pom.xml
deleted file mode 100644
index 4c6c33d..0000000
--- a/karaf-2.3.x/demos/command/pom.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?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.3.1</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.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.karaf.shell</groupId>
-            <artifactId>org.apache.karaf.shell.console</artifactId>
-            <scope>provided</scope>
-        </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.3.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCommand.java b/karaf-2.3.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCommand.java
deleted file mode 100644
index a5227db..0000000
--- a/karaf-2.3.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCommand.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.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.3.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCompleter.java b/karaf-2.3.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCompleter.java
deleted file mode 100644
index 2596cb9..0000000
--- a/karaf-2.3.x/demos/command/src/main/java/org/apache/karaf/demos/command/MyCompleter.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.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.3.x/demos/command/src/main/resources/OSGI-INF/blueprint/mycommand.xml b/karaf-2.3.x/demos/command/src/main/resources/OSGI-INF/blueprint/mycommand.xml
deleted file mode 100644
index 3589797..0000000
--- a/karaf-2.3.x/demos/command/src/main/resources/OSGI-INF/blueprint/mycommand.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-
-<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.3.x/demos/deployer/bundle/NOTICE b/karaf-2.3.x/demos/deployer/bundle/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/deployer/bundle/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/deployer/bundle/pom.xml b/karaf-2.3.x/demos/deployer/bundle/pom.xml
deleted file mode 100644
index 46900e5..0000000
--- a/karaf-2.3.x/demos/deployer/bundle/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.demos.deployer.bundle</groupId>
-    <artifactId>my-bundle</artifactId>
-    <version>2.3.1</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.3.x/demos/deployer/bundle/src/main/java/org/apache/karaf/demos/deployer/bundle/Activator.java b/karaf-2.3.x/demos/deployer/bundle/src/main/java/org/apache/karaf/demos/deployer/bundle/Activator.java
deleted file mode 100644
index d2847b2..0000000
--- a/karaf-2.3.x/demos/deployer/bundle/src/main/java/org/apache/karaf/demos/deployer/bundle/Activator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.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.3.x/demos/deployer/feature/NOTICE b/karaf-2.3.x/demos/deployer/feature/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/deployer/feature/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/deployer/feature/pom.xml b/karaf-2.3.x/demos/deployer/feature/pom.xml
deleted file mode 100644
index 8fb71ec..0000000
--- a/karaf-2.3.x/demos/deployer/feature/pom.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.demos.deployer.feature</groupId>
-    <artifactId>my-feature</artifactId>
-    <version>2.3.1</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.3.1</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.3.x/demos/deployer/kar/NOTICE b/karaf-2.3.x/demos/deployer/kar/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/deployer/kar/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/deployer/kar/pom.xml b/karaf-2.3.x/demos/deployer/kar/pom.xml
deleted file mode 100644
index 9a2e08d..0000000
--- a/karaf-2.3.x/demos/deployer/kar/pom.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?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.3.1</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.3.1</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.3.x/demos/deployer/kar/src/main/resources/features.xml b/karaf-2.3.x/demos/deployer/kar/src/main/resources/features.xml
deleted file mode 100644
index 6ee1f39..0000000
--- a/karaf-2.3.x/demos/deployer/kar/src/main/resources/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/demos/deployer/pom.xml b/karaf-2.3.x/demos/deployer/pom.xml
deleted file mode 100644
index 706e4c0..0000000
--- a/karaf-2.3.x/demos/deployer/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.3.1</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.3.x/demos/deployer/wrap/NOTICE b/karaf-2.3.x/demos/deployer/wrap/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/deployer/wrap/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/deployer/wrap/pom.xml b/karaf-2.3.x/demos/deployer/wrap/pom.xml
deleted file mode 100644
index 59d812c..0000000
--- a/karaf-2.3.x/demos/deployer/wrap/pom.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.demos.deployer.wrap</groupId>
-    <artifactId>osgi.commons-lang</artifactId>
-    <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>*;-split-package:=merge-first</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.3.x/demos/dump/NOTICE b/karaf-2.3.x/demos/dump/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/dump/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/dump/pom.xml b/karaf-2.3.x/demos/dump/pom.xml
deleted file mode 100644
index c1c92c1..0000000
--- a/karaf-2.3.x/demos/dump/pom.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?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.3.1</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.3.x/demos/dump/src/main/java/org/apache/karaf/diagnostic/demo/ScreenshotDumpProvider.java b/karaf-2.3.x/demos/dump/src/main/java/org/apache/karaf/diagnostic/demo/ScreenshotDumpProvider.java
deleted file mode 100644
index b8bb7d1..0000000
--- a/karaf-2.3.x/demos/dump/src/main/java/org/apache/karaf/diagnostic/demo/ScreenshotDumpProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/demos/dump/src/main/resources/OSGI-INF/blueprint/screenshot.xml b/karaf-2.3.x/demos/dump/src/main/resources/OSGI-INF/blueprint/screenshot.xml
deleted file mode 100644
index 62068d1..0000000
--- a/karaf-2.3.x/demos/dump/src/main/resources/OSGI-INF/blueprint/screenshot.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/demos/pom.xml b/karaf-2.3.x/demos/pom.xml
deleted file mode 100644
index 4ec0c85..0000000
--- a/karaf-2.3.x/demos/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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.3.1</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.3.x/demos/web/NOTICE b/karaf-2.3.x/demos/web/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/demos/web/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/demos/web/pom.xml b/karaf-2.3.x/demos/web/pom.xml
deleted file mode 100644
index 7cd4fef..0000000
--- a/karaf-2.3.x/demos/web/pom.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?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.3.1</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>
-                            <target>
-                                <move todir="${project.build.directory}/karaf/WEB-INF/karaf">
-                                    <fileset dir="${project.build.directory}/karaf/WEB-INF/apache-karaf-${project.version}" />
-                                </move>
-                            </target>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/demos/web/src/main/java/org/apache/karaf/web/WebAppListener.java b/karaf-2.3.x/demos/web/src/main/java/org/apache/karaf/web/WebAppListener.java
deleted file mode 100644
index 50441e4..0000000
--- a/karaf-2.3.x/demos/web/src/main/java/org/apache/karaf/web/WebAppListener.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/demos/web/src/main/webapp/WEB-INF/web.xml b/karaf-2.3.x/demos/web/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index b78af46..0000000
--- a/karaf-2.3.x/demos/web/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-   
-    http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-
-<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.3.x/demos/web/src/main/webapp/index.jsp b/karaf-2.3.x/demos/web/src/main/webapp/index.jsp
deleted file mode 100644
index 812d187..0000000
--- a/karaf-2.3.x/demos/web/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,34 +0,0 @@
-<%--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-   
-    http://www.apache.org/licenses/LICENSE-2.0
-   
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
---%>
-<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.3.x/deployer/blueprint/NOTICE b/karaf-2.3.x/deployer/blueprint/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/deployer/blueprint/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/deployer/blueprint/pom.xml b/karaf-2.3.x/deployer/blueprint/pom.xml
deleted file mode 100644
index d433f65..0000000
--- a/karaf-2.3.x/deployer/blueprint/pom.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?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.3.1</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,
-                            org.apache.karaf.util
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java b/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
deleted file mode 100644
index 5a9c6ec..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListener.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java b/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
deleted file mode 100644
index a8f31aa..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintTransformer.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.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;
-
-import static org.apache.karaf.util.MvnUtils.getMvnPath;
-
-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 = getMvnPath(url);
-        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();
-        // check .xml file extension
-        if( !name.endsWith(".xml")) {
-            name +=".xml";
-        }
-        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());
-    }
-
-}
diff --git a/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java b/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
deleted file mode 100644
index 452f4cb..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/java/org/apache/karaf/deployer/blueprint/BlueprintURLHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml b/karaf-2.3.x/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml
deleted file mode 100644
index 172548e..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/resources/OSGI-INF/blueprint/blueprint-deployer.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/blueprint/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/deployer/blueprint/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 6b8c192..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/blueprint-deployer-1.0.0.xsd b/karaf-2.3.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/blueprint-deployer-1.0.0.xsd
deleted file mode 100644
index 81adc3c..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/blueprint-deployer-1.0.0.xsd
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/extract.xsl b/karaf-2.3.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/extract.xsl
deleted file mode 100644
index eb44e25..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/main/resources/org/apache/karaf/deployer/blueprint/extract.xsl
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/blueprint/src/test/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java b/karaf-2.3.x/deployer/blueprint/src/test/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java
deleted file mode 100644
index d705c23..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/test/java/org/apache/karaf/deployer/blueprint/BlueprintDeploymentListenerTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 java.util.zip.ZipEntry;
-
-import javax.xml.transform.dom.DOMSource;
-
-import junit.framework.TestCase;
-
-public class BlueprintDeploymentListenerTest extends TestCase {
-	
-	private static final String BLUEPRINT_ENTRY = "OSGI-INF/blueprint/";
-
-    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();
-        }
-    }
-
-    // KARAF-1617
-    public void testAppendDescriptorFileExtension() throws Exception {
-    	final String expectedFileName = "test-fileextension";
-        File f = File.createTempFile("smx", ".jar");
-        try {
-        	ZipEntry zipEntry = null;
-            OutputStream os = new FileOutputStream(f);
-			BlueprintTransformer.transform(getClass().getClassLoader().getResource(expectedFileName), os);
-            os.close();
-            InputStream is = new FileInputStream(f);
-            JarInputStream jar = new JarInputStream(is);
-            while(true) {
-                zipEntry = jar.getNextEntry();
-                if( null == zipEntry) {
-                    break;
-                }
-                if ( zipEntry.getName() != null && zipEntry.getName().contains(expectedFileName)) {
-                	break;
-                }
-            }
-            is.close();
-            assertNotNull("blueprint service descriptor JAR file entry",zipEntry);
-        	assertEquals(BLUEPRINT_ENTRY+expectedFileName+".xml",zipEntry.getName());
-        } finally {
-            f.delete();
-        }
-        
-    }
-
-    public void testAppendNotTwiceDescriptorFileExtension() throws Exception {
-    	final String expectedFileName = "test.xml";
-        File f = File.createTempFile("smx", ".jar");
-        try {
-        	ZipEntry zipEntry = null;
-            OutputStream os = new FileOutputStream(f);
-			BlueprintTransformer.transform(getClass().getClassLoader().getResource(expectedFileName), os);
-            os.close();
-            InputStream is = new FileInputStream(f);
-            JarInputStream jar = new JarInputStream(is);
-            while(true) {
-                zipEntry = jar.getNextEntry();
-                if( null == zipEntry) {
-                    break;
-                }
-                if ( zipEntry.getName() != null && zipEntry.getName().contains(expectedFileName)) {
-                	break;
-                }
-            }
-            is.close();
-            assertNotNull("blueprint service descriptor JAR file entry",zipEntry);
-        	assertEquals(BLUEPRINT_ENTRY+expectedFileName,zipEntry.getName());
-        } finally {
-            f.delete();
-        }
-        
-    }
-}
diff --git a/karaf-2.3.x/deployer/blueprint/src/test/resources/test-fileextension b/karaf-2.3.x/deployer/blueprint/src/test/resources/test-fileextension
deleted file mode 100644
index 158e125..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/test/resources/test-fileextension
+++ /dev/null
@@ -1,87 +0,0 @@
-<?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.3.x/deployer/blueprint/src/test/resources/test.xml b/karaf-2.3.x/deployer/blueprint/src/test/resources/test.xml
deleted file mode 100644
index 158e125..0000000
--- a/karaf-2.3.x/deployer/blueprint/src/test/resources/test.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?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.3.x/deployer/features/NOTICE b/karaf-2.3.x/deployer/features/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/deployer/features/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/deployer/features/pom.xml b/karaf-2.3.x/deployer/features/pom.xml
deleted file mode 100644
index 69c73e8..0000000
--- a/karaf-2.3.x/deployer/features/pom.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?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.3.1</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,
-                            org.apache.karaf.util;-split-package:=merge-first
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java b/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
deleted file mode 100644
index b598749..0000000
--- a/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureDeploymentListener.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.URI;
-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.FeaturesNamespaces;
-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);
-    }
-
-    private boolean isKnownFeaturesURI(String uri){
-    	if(uri == null){
-    		return true;
-    	}
-    	if(FeaturesNamespaces.URI_0_0_0.equalsIgnoreCase(uri)){
-    		return true;
-    	}
-    	if(FeaturesNamespaces.URI_1_0_0.equalsIgnoreCase(uri)){
-    		return true;
-    	}
-    	if(FeaturesNamespaces.URI_1_1_0.equalsIgnoreCase(uri)){
-    		return true;
-    	}
-    	if(FeaturesNamespaces.URI_CURRENT.equalsIgnoreCase(uri)){
-    		return true;
-    	}
-    	return false;
-    }
-
-    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) ) {
-                	if(isKnownFeaturesURI(uri)){
-                        return true;
-                	} else {
-                		logger.error("unknown features uri", new Exception("" + uri));
-                	}
-                }
-            }
-        } 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());
-                            URI needRemovedRepo = null;
-                            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));
-                                } else {
-                                    //remove older out-of-data feature repo
-                                    if (repo.getURI().toString().contains(FEATURE_PATH)) {
-                                        String featureFileName = repo.getURI().toString();
-                                        featureFileName = featureFileName.substring(featureFileName.lastIndexOf('/') + 1);
-                                        String newFeatureFileName = url.toURI().toString();
-                                        newFeatureFileName = newFeatureFileName.substring(newFeatureFileName.lastIndexOf('/') + 1);
-                                        if (featureFileName.equals(newFeatureFileName)) {
-                                            needRemovedRepo = repo.getURI();
-                                        }
-                                    }
-                                }
-                            }
-                            urls.add(url);
-                            if (needRemovedRepo != null) {
-                                featuresService.removeRepository(needRemovedRepo);
-                            }
-                        } 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.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureTransformer.java b/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureTransformer.java
deleted file mode 100644
index 50c4c75..0000000
--- a/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureTransformer.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.apache.karaf.util.MvnUtils;
-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 = MvnUtils.getMvnPath(url);
-        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.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureURLHandler.java b/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureURLHandler.java
deleted file mode 100644
index 20608b3..0000000
--- a/karaf-2.3.x/deployer/features/src/main/java/org/apache/karaf/deployer/features/FeatureURLHandler.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml b/karaf-2.3.x/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml
deleted file mode 100644
index 2ecc8ae..0000000
--- a/karaf-2.3.x/deployer/features/src/main/resources/OSGI-INF/blueprint/features-deployer.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/features/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/deployer/features/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index d23030b..0000000
--- a/karaf-2.3.x/deployer/features/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/deployer/kar/NOTICE b/karaf-2.3.x/deployer/kar/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/deployer/kar/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/deployer/kar/pom.xml b/karaf-2.3.x/deployer/kar/pom.xml
deleted file mode 100644
index d75b29c..0000000
--- a/karaf-2.3.x/deployer/kar/pom.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?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.3.1</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</Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java b/karaf-2.3.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java
deleted file mode 100644
index bb7fa5a..0000000
--- a/karaf-2.3.x/deployer/kar/src/main/java/org/apache/karaf/deployer/kar/KarArtifactInstaller.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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/system";
-
-    private String timestampPath;
-
-    private DocumentBuilderFactory dbf;
-
-    private FeaturesService featuresService;
-
-    public void init() {
-        dbf = DocumentBuilderFactory.newInstance();
-        dbf.setNamespaceAware(true);
-
-        timestampPath = localRepoPath + File.separator + ".timestamps";
-        File timestampFile = new File(timestampPath);
-        if (!timestampFile.exists() && !timestampFile.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);
-
-        File karFile = new File(localRepoPath, file.getName());
-        copy(file.toURI(), karFile);
-
-        ZipFile zipFile = null;
-
-        List<URI> featuresRepositoriesInKar = new ArrayList<URI>();
-
-        try {
-            zipFile = new ZipFile(karFile);
-
-            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);
-                }
-            }
-        } catch (Exception e) {
-            throw e;
-        } finally {
-            if (zipFile != null) {
-                try {
-                    zipFile.close();
-                } catch (Exception e) {
-                    // nothing to do
-                }
-            }
-        }
-
-        installFeatures(featuresRepositoriesInKar);
-
-        updateTimestamp(file);
-    }
-
-
-    /**
-     * Create a destination file using a source URL.
-     *
-     * @param url  the source URL.
-     * @param file the destination file
-     * @throws Exception in case of copy failure
-     */
-    private void copy(URI url, File file) throws Exception {
-        InputStream is = null;
-        FileOutputStream fos = null;
-        try {
-            is = url.toURL().openStream();
-            fos = new FileOutputStream(file);
-            byte[] buffer = new byte[8192];
-            int count = is.read(buffer);
-            while (count >= 0) {
-                fos.write(buffer, 0, count);
-                count = is.read(buffer);
-            }
-        } finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (Exception e) {
-                    // nothing to do
-                }
-            }
-            if (fos != null) {
-                try {
-                    fos.flush();
-                    fos.close();
-                } catch (Exception e) {
-                    // nothing to do
-                }
-            }
-        }
-    }
-
-    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 void uninstallFeatures(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.uninstallFeature(feature.getName(), feature.getVersion());
-                            } catch (Exception e) {
-                                logger.warn("Unable to uninstall 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 = null;
-            FileOutputStream out = null;
-
-            try {
-            in = zipFile.getInputStream(entry);
-            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);
-            } catch (IOException ioException) {
-                throw ioException;
-            } finally {
-                if (in != null)
-                    try {
-                        in.close();
-                    } catch (Exception e) {
-                        // nothing to do
-                    }
-                if (out != null) {
-                    try {
-                        out.flush();
-                        out.close();
-                    } catch (Exception e) {
-                        // nothing to do
-                    }
-                }
-            }
-        }
-        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 {
-        logger.debug("Looking for KAR entries to purge the local repository");
-        File karFile = new File(localRepoPath, file.getName());
-        List<URI> featuresRepositories = new ArrayList<URI>();
-
-        ZipFile zipFile = null;
-
-        try {
-        zipFile = new ZipFile(karFile);
-        Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zipFile.entries();
-        while (entries.hasMoreElements()) {
-            ZipEntry entry = entries.nextElement();
-            String repoEntryName = getRepoEntryName(entry);
-            if (repoEntryName != null) {
-                File toDelete = new File(localRepoPath + File.separator + repoEntryName);
-                if (isFeaturesRepository(toDelete)) {
-                    featuresRepositories.add(toDelete.toURI());
-                } else {
-                    if (toDelete.isFile() && toDelete.exists()) {
-                        toDelete.delete();
-                    }
-                }
-            }
-            if (entry.getName().startsWith("resource")) {
-                String resourceEntryName = entry.getName().substring("resource/".length());
-                File toDelete = new File(base + File.separator + resourceEntryName);
-                if (toDelete.isFile() && toDelete.exists()) {
-                    toDelete.delete();
-                }
-            }
-        }
-        } catch (Exception e) {
-            throw e;
-        } finally {
-            if (zipFile != null) {
-                try {
-                    zipFile.close();
-                } catch (Exception e) {
-                    // nothing to do
-                }
-            }
-        }
-
-        uninstallFeatures(featuresRepositories);
-        for (URI featuresRepository : featuresRepositories) {
-            featuresService.removeRepository(featuresRepository);
-            File toDelete = new File(featuresRepository);
-            if (toDelete.exists() && toDelete.isFile()) {
-                toDelete.delete();
-            }
-        }
-
-        karFile.delete();
-
-        File timestamp = getArchiveTimestampFile(file);
-        if (timestamp.exists()) {
-            logger.debug("Removing the timestamp file");
-            timestamp.delete();
-        }
-    }
-
-    public void update(File file) throws Exception {
-        logger.warn("Karaf archive '{}' has been updated; redeploying.", file);
-        uninstall(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.3.x/deployer/kar/src/main/resources/OSGI-INF/blueprint/kar-deployer.xml b/karaf-2.3.x/deployer/kar/src/main/resources/OSGI-INF/blueprint/kar-deployer.xml
deleted file mode 100644
index ca94ec3..0000000
--- a/karaf-2.3.x/deployer/kar/src/main/resources/OSGI-INF/blueprint/kar-deployer.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-	<!--
-
-		Licensed to the Apache Software Foundation (ASF) under one or more
-		contributor license agreements. See the NOTICE file distributed with
-		this work for additional information regarding copyright ownership.
-		The ASF licenses this file to You under the Apache License, Version
-		2.0 (the "License"); you may not use this file except in compliance
-		with the License. You may obtain a copy of the License at
-
-		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
-		applicable law or agreed to in writing, software distributed under the
-		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-		CONDITIONS OF ANY KIND, either express or implied. See the License for
-		the specific language governing permissions and limitations under the
-		License.
-	-->
-<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.3.x/deployer/kar/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/deployer/kar/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index f6f9a72..0000000
--- a/karaf-2.3.x/deployer/kar/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,16 +0,0 @@
-\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.3.x/deployer/kar/src/test/java/org/apache/karaf/deployer/kar/KarArtifactInstallerTest.java b/karaf-2.3.x/deployer/kar/src/test/java/org/apache/karaf/deployer/kar/KarArtifactInstallerTest.java
deleted file mode 100644
index bbd31e9..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/java/org/apache/karaf/deployer/kar/KarArtifactInstallerTest.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.deployer.kar;
-
-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;
-
-import java.io.File;
-import java.net.URI;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-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/system");
-
-        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 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 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.3.x/deployer/kar/src/test/resources/badFeaturesXml.xml b/karaf-2.3.x/deployer/kar/src/test/resources/badFeaturesXml.xml
deleted file mode 100644
index 065b834..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/badFeaturesXml.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<message>This is not a features file!</message>
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/badZipFile.zip b/karaf-2.3.x/deployer/kar/src/test/resources/badZipFile.zip
deleted file mode 100644
index b158994..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/badZipFile.zip
+++ /dev/null
@@ -1 +0,0 @@
-This is *not* a well formed .kar file :(
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/goodKarFile.kar b/karaf-2.3.x/deployer/kar/src/test/resources/goodKarFile.kar
deleted file mode 100644
index 18abf7d..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/goodKarFile.kar
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/goodKarFile/org/foo/goodFeaturesXml.xml b/karaf-2.3.x/deployer/kar/src/test/resources/goodKarFile/org/foo/goodFeaturesXml.xml
deleted file mode 100644
index 70af79f..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/goodKarFile/org/foo/goodFeaturesXml.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<features name="goodFeaturesRepo">
-  <feature name='goodFeature' version='1.0.0'>
-  </feature>
- </features>
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZip.zip b/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZip.zip
deleted file mode 100644
index af29c3b..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZip.zip
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZip/org/foo/goodFeaturesXml.xml b/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZip/org/foo/goodFeaturesXml.xml
deleted file mode 100644
index e7b79bf..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZip/org/foo/goodFeaturesXml.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<features>
-  <feature name='goodFeature' version='1.0.0'>
-  </feature>
- </features>
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZipNoManifest.zip b/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZipNoManifest.zip
deleted file mode 100644
index d4ced05..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZipNoManifest.zip
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZipNoManifest/org/foo/goodFeaturesXml.xml b/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZipNoManifest/org/foo/goodFeaturesXml.xml
deleted file mode 100644
index e7b79bf..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/karFileAsZipNoManifest/org/foo/goodFeaturesXml.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<features>
-  <feature name='goodFeature' version='1.0.0'>
-  </feature>
- </features>
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/kar/src/test/resources/log4j.properties b/karaf-2.3.x/deployer/kar/src/test/resources/log4j.properties
deleted file mode 100644
index e1a6590..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/deployer/kar/src/test/resources/malformedXml.xml b/karaf-2.3.x/deployer/kar/src/test/resources/malformedXml.xml
deleted file mode 100644
index 0508c8d..0000000
--- a/karaf-2.3.x/deployer/kar/src/test/resources/malformedXml.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<This is malformed XML.
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/pom.xml b/karaf-2.3.x/deployer/pom.xml
deleted file mode 100644
index 952b2eb..0000000
--- a/karaf-2.3.x/deployer/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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.3.1</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.3.x/deployer/spring/NOTICE b/karaf-2.3.x/deployer/spring/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/deployer/spring/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/deployer/spring/pom.xml b/karaf-2.3.x/deployer/spring/pom.xml
deleted file mode 100644
index 441d649..0000000
--- a/karaf-2.3.x/deployer/spring/pom.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-<?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.3.1</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,
-                            org.apache.karaf.util
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java b/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
deleted file mode 100644
index a332029..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringDeploymentListener.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java b/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
deleted file mode 100644
index 8d3650e..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringTransformer.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.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;
-
-import static org.apache.karaf.util.MvnUtils.getMvnPath;
-
-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 = getMvnPath(url);
-        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());
-    }
-
-}
diff --git a/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java b/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
deleted file mode 100644
index d471123..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/java/org/apache/karaf/deployer/spring/SpringURLHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml b/karaf-2.3.x/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml
deleted file mode 100644
index b061629..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/resources/OSGI-INF/blueprint/spring-deployer.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/spring/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/deployer/spring/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 278f120..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/extract.xsl b/karaf-2.3.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/extract.xsl
deleted file mode 100644
index 4b06b69..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/extract.xsl
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/spring-deployer-1.0.0.xsd b/karaf-2.3.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/spring-deployer-1.0.0.xsd
deleted file mode 100644
index 1e800a5..0000000
--- a/karaf-2.3.x/deployer/spring/src/main/resources/org/apache/karaf/deployer/spring/spring-deployer-1.0.0.xsd
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/spring/src/test/java/org/apache/karaf/deployer/spring/SpringDeploymentListenerTest.java b/karaf-2.3.x/deployer/spring/src/test/java/org/apache/karaf/deployer/spring/SpringDeploymentListenerTest.java
deleted file mode 100644
index 3b567e1..0000000
--- a/karaf-2.3.x/deployer/spring/src/test/java/org/apache/karaf/deployer/spring/SpringDeploymentListenerTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/spring/src/test/resources/test.xml b/karaf-2.3.x/deployer/spring/src/test/resources/test.xml
deleted file mode 100644
index 03d0abc..0000000
--- a/karaf-2.3.x/deployer/spring/src/test/resources/test.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/wrap/NOTICE b/karaf-2.3.x/deployer/wrap/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/deployer/wrap/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/deployer/wrap/pom.xml b/karaf-2.3.x/deployer/wrap/pom.xml
deleted file mode 100644
index 88ccb57..0000000
--- a/karaf-2.3.x/deployer/wrap/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?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.3.1</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,
-                            org.apache.karaf.util
-                        </Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/WrapDeploymentListener.java b/karaf-2.3.x/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/WrapDeploymentListener.java
deleted file mode 100644
index 7e0840f..0000000
--- a/karaf-2.3.x/deployer/wrap/src/main/java/org/apache/karaf/deployer/wrap/WrapDeploymentListener.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/deployer/wrap/src/main/resources/OSGI-INF/blueprint/wrap-deployer.xml b/karaf-2.3.x/deployer/wrap/src/main/resources/OSGI-INF/blueprint/wrap-deployer.xml
deleted file mode 100644
index c5295a5..0000000
--- a/karaf-2.3.x/deployer/wrap/src/main/resources/OSGI-INF/blueprint/wrap-deployer.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/deployer/wrap/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/deployer/wrap/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index c19e194..0000000
--- a/karaf-2.3.x/deployer/wrap/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,16 +0,0 @@
-\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.3.x/diagnostic/command/NOTICE b/karaf-2.3.x/diagnostic/command/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/diagnostic/command/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/diagnostic/command/pom.xml b/karaf-2.3.x/diagnostic/command/pom.xml
deleted file mode 100644
index ec6d893..0000000
--- a/karaf-2.3.x/diagnostic/command/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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.3.x/diagnostic/command/src/main/java/org/apache/karaf/diagnostic/command/DumpCommand.java b/karaf-2.3.x/diagnostic/command/src/main/java/org/apache/karaf/diagnostic/command/DumpCommand.java
deleted file mode 100644
index 88ec298..0000000
--- a/karaf-2.3.x/diagnostic/command/src/main/java/org/apache/karaf/diagnostic/command/DumpCommand.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/command/src/main/resources/OSGI-INF/blueprint/shell-diagnostic.xml b/karaf-2.3.x/diagnostic/command/src/main/resources/OSGI-INF/blueprint/shell-diagnostic.xml
deleted file mode 100644
index b14434f..0000000
--- a/karaf-2.3.x/diagnostic/command/src/main/resources/OSGI-INF/blueprint/shell-diagnostic.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/diagnostic/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/diagnostic/command/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 615e359..0000000
--- a/karaf-2.3.x/diagnostic/command/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,16 +0,0 @@
-\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.3.x/diagnostic/common/NOTICE b/karaf-2.3.x/diagnostic/common/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/diagnostic/common/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/diagnostic/common/pom.xml b/karaf-2.3.x/diagnostic/common/pom.xml
deleted file mode 100644
index a14165c..0000000
--- a/karaf-2.3.x/diagnostic/common/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?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.3.1</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.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/BundleDumpProvider.java b/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/BundleDumpProvider.java
deleted file mode 100644
index 6f72aeb..0000000
--- a/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/BundleDumpProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/FeaturesDumpProvider.java b/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/FeaturesDumpProvider.java
deleted file mode 100644
index 408057c..0000000
--- a/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/FeaturesDumpProvider.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/LogDumpProvider.java b/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/LogDumpProvider.java
deleted file mode 100644
index 3ce7abe..0000000
--- a/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/LogDumpProvider.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java b/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
deleted file mode 100644
index bc1c8c0..0000000
--- a/karaf-2.3.x/diagnostic/common/src/main/java/org/apache/karaf/diagnostic/common/ThreadDumpProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/common/src/main/resources/OSGI-INF/blueprint/diagnostic-services.xml b/karaf-2.3.x/diagnostic/common/src/main/resources/OSGI-INF/blueprint/diagnostic-services.xml
deleted file mode 100644
index 809c1bb..0000000
--- a/karaf-2.3.x/diagnostic/common/src/main/resources/OSGI-INF/blueprint/diagnostic-services.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/diagnostic/common/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/diagnostic/common/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 697f53d..0000000
--- a/karaf-2.3.x/diagnostic/common/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,19 +0,0 @@
-\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.3.x/diagnostic/core/NOTICE b/karaf-2.3.x/diagnostic/core/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/diagnostic/core/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/diagnostic/core/pom.xml b/karaf-2.3.x/diagnostic/core/pom.xml
deleted file mode 100644
index 5263e8c..0000000
--- a/karaf-2.3.x/diagnostic/core/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?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.3.1</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.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpDestination.java b/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpDestination.java
deleted file mode 100644
index 39c4edc..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpDestination.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpProvider.java b/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpProvider.java
deleted file mode 100644
index ec7724c..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/DumpProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ClosingEntryOutputStreamWrapper.java b/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ClosingEntryOutputStreamWrapper.java
deleted file mode 100644
index 0c4f9db..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ClosingEntryOutputStreamWrapper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/DirectoryDumpDestination.java b/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/DirectoryDumpDestination.java
deleted file mode 100644
index 37ae72e..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/DirectoryDumpDestination.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/TextDumpProvider.java b/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/TextDumpProvider.java
deleted file mode 100644
index 2faafdc..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/TextDumpProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ZipDumpDestination.java b/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ZipDumpDestination.java
deleted file mode 100644
index bafd38d..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/java/org/apache/karaf/diagnostic/core/common/ZipDumpDestination.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/core/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/diagnostic/core/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index d8a62f2..0000000
--- a/karaf-2.3.x/diagnostic/core/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/diagnostic/management/NOTICE b/karaf-2.3.x/diagnostic/management/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/diagnostic/management/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/diagnostic/management/pom.xml b/karaf-2.3.x/diagnostic/management/pom.xml
deleted file mode 100644
index 7f57fe0..0000000
--- a/karaf-2.3.x/diagnostic/management/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?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.3.1</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</Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/DiagnosticDumpMBean.java b/karaf-2.3.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/DiagnosticDumpMBean.java
deleted file mode 100644
index 46384b7..0000000
--- a/karaf-2.3.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/DiagnosticDumpMBean.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/internal/DiagnosticDumpMBeanImpl.java b/karaf-2.3.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/internal/DiagnosticDumpMBeanImpl.java
deleted file mode 100644
index aa850b1..0000000
--- a/karaf-2.3.x/diagnostic/management/src/main/java/org/apache/karaf/diagnostic/management/internal/DiagnosticDumpMBeanImpl.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.3.x/diagnostic/management/src/main/resources/OSGI-INF/blueprint/diagnostic-management.xml b/karaf-2.3.x/diagnostic/management/src/main/resources/OSGI-INF/blueprint/diagnostic-management.xml
deleted file mode 100644
index 1ff894b..0000000
--- a/karaf-2.3.x/diagnostic/management/src/main/resources/OSGI-INF/blueprint/diagnostic-management.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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" init-method="init" destroy-method="destroy">
-        <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.3.x/diagnostic/management/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/diagnostic/management/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index b17e412..0000000
--- a/karaf-2.3.x/diagnostic/management/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,16 +0,0 @@
-\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.3.x/diagnostic/pom.xml b/karaf-2.3.x/diagnostic/pom.xml
deleted file mode 100644
index 7b11b77..0000000
--- a/karaf-2.3.x/diagnostic/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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.3.1</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.3.x/etc/appended-resources/supplemental-models.xml b/karaf-2.3.x/etc/appended-resources/supplemental-models.xml
deleted file mode 100644
index 383f61d..0000000
--- a/karaf-2.3.x/etc/appended-resources/supplemental-models.xml
+++ /dev/null
@@ -1,1349 +0,0 @@
-<?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.3.x/exception/NOTICE b/karaf-2.3.x/exception/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/exception/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/exception/pom.xml b/karaf-2.3.x/exception/pom.xml
deleted file mode 100644
index b7c18f4..0000000
--- a/karaf-2.3.x/exception/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?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.3.1</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.3.x/exception/src/main/java/java/lang/Exception.java b/karaf-2.3.x/exception/src/main/java/java/lang/Exception.java
deleted file mode 100644
index 2be5593..0000000
--- a/karaf-2.3.x/exception/src/main/java/java/lang/Exception.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package 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.3.x/features/command/NOTICE b/karaf-2.3.x/features/command/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/features/command/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/features/command/pom.xml b/karaf-2.3.x/features/command/pom.xml
deleted file mode 100644
index e4a9fed..0000000
--- a/karaf-2.3.x/features/command/pom.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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.3.x/features/command/src/main/java/org/apache/karaf/features/command/AddUrlCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/AddUrlCommand.java
deleted file mode 100644
index ecd6609..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/AddUrlCommand.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features.command;
-
-import java.net.URI;
-import java.util.ArrayList;
-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;
-import org.apache.karaf.shell.console.MultiException;
-
-@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;
-
-    @Option(name = "-i", aliases = { "--install-all" }, description = "Install all features contained in the repository URLs", required = false, multiValued = false)
-    boolean install;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-        List<Exception> exceptions = new ArrayList<Exception>();
-        for (String url : urls) {
-            try {
-                admin.addRepository(new URI(url), install);
-            } catch (Exception e) {
-                exceptions.add(e);
-            }
-        }
-        MultiException.throwIf("Unable to add repositories", exceptions);
-    }
-}
diff --git a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/Artifact.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/Artifact.java
deleted file mode 100644
index da7d6aa..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/Artifact.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/ChooseUrlCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ChooseUrlCommand.java
deleted file mode 100644
index 43de93d..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ChooseUrlCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.
- */
-@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.3.x/features/command/src/main/java/org/apache/karaf/features/command/FeatureFinder.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/FeatureFinder.java
deleted file mode 100644
index 9cd3647..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/FeatureFinder.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/FeaturesCommandSupport.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/FeaturesCommandSupport.java
deleted file mode 100644
index b7a039b..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/FeaturesCommandSupport.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features.command;
-
-import java.net.URI;
-
-import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-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.3.x/features/command/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java
deleted file mode 100644
index e1210aa..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/InfoFeatureCommand.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/InstallFeatureCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/InstallFeatureCommand.java
deleted file mode 100644
index 6120071..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/InstallFeatureCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeatureVersionsCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeatureVersionsCommand.java
deleted file mode 100644
index 47440f4..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeatureVersionsCommand.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeaturesCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeaturesCommand.java
deleted file mode 100644
index f627f96..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListFeaturesCommand.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.Collections;
-import java.util.Comparator;
-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;
-
-    @Option(name = "-o", aliases = {"--ordered"}, description = "Display a list using alphabetical order ", required = false, multiValued = false)
-    boolean ordered;
-    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;
-        if (ordered) {
-            Collections.sort(features, new FeatureComparator());
-        }
-        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");
-        }
-
-    }
-    
-    class FeatureComparator implements Comparator<Feature>
-    {
-        public int compare(Feature o1, Feature o2)
-        {
-            return o1.getName().toLowerCase().compareTo( o2.getName().toLowerCase() );
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListRepositoriesCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListRepositoriesCommand.java
deleted file mode 100644
index 022473b..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListRepositoriesCommand.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListUrlCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListUrlCommand.java
deleted file mode 100644
index 63c16e2..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/ListUrlCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/RefreshUrlCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RefreshUrlCommand.java
deleted file mode 100644
index 3bbc99f..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RefreshUrlCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-import org.apache.karaf.shell.console.MultiException;
-
-@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());
-            }
-        }
-        List<Exception> exceptions = new ArrayList<Exception>();
-        for (String strUri : urls) {
-            try {
-                URI uri = new URI(strUri);
-                admin.removeRepository(uri);
-                admin.addRepository(uri);
-            } catch (Exception e) {
-                exceptions.add(e);
-                //get chance to restore previous, fix for KARAF-4
-                admin.restoreRepository(new URI(strUri));
-            }
-        }
-        MultiException.throwIf("Unable to add repositories", exceptions);
-    }
-}
diff --git a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveRepositoryCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveRepositoryCommand.java
deleted file mode 100644
index efb6c71..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveRepositoryCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveUrlCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveUrlCommand.java
deleted file mode 100644
index e592aad..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/RemoveUrlCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.felix.gogo.commands.Option;
-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;
-
-    @Option(name = "-u", aliases = { "--uninstall-all"}, description = "Uninstall all features contained in the repository URLs", required = false, multiValued = false)
-    boolean uninstall;
-
-    protected void doExecute(FeaturesService admin) throws Exception {
-        for (String url : urls) {
-            admin.removeRepository(new URI(url), uninstall);
-        }
-    }
-}
diff --git a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
deleted file mode 100644
index 0399046..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/UninstallFeatureCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AllFeatureCompleter.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AllFeatureCompleter.java
deleted file mode 100644
index cbb2cbd..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AllFeatureCompleter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AvailableFeatureCompleter.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AvailableFeatureCompleter.java
deleted file mode 100644
index 7345799..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/AvailableFeatureCompleter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureCompleterSupport.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureCompleterSupport.java
deleted file mode 100644
index 891779e..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureCompleterSupport.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepoNameCompleter.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepoNameCompleter.java
deleted file mode 100644
index 0c12ec7..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepoNameCompleter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryCompleter.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryCompleter.java
deleted file mode 100644
index f734e75..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryCompleter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryNameCompleter.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryNameCompleter.java
deleted file mode 100644
index 43fe803..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/FeatureRepositoryNameCompleter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/InstalledFeatureCompleter.java b/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/InstalledFeatureCompleter.java
deleted file mode 100644
index 6f900d3..0000000
--- a/karaf-2.3.x/features/command/src/main/java/org/apache/karaf/features/command/completers/InstalledFeatureCompleter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml b/karaf-2.3.x/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml
deleted file mode 100644
index 603bde0..0000000
--- a/karaf-2.3.x/features/command/src/main/resources/OSGI-INF/blueprint/features-command.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/features/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/features/command/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 671f894..0000000
--- a/karaf-2.3.x/features/command/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,26 +0,0 @@
-\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.3.x/features/core/NOTICE b/karaf-2.3.x/features/core/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/features/core/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/features/core/pom.xml b/karaf-2.3.x/features/core/pom.xml
deleted file mode 100644
index aec63ff..0000000
--- a/karaf-2.3.x/features/core/pom.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?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.3.1</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.karaf</groupId>
-            <artifactId>org.apache.karaf.util</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,
-                            org.apache.felix.utils.version;-split-package:=merge-first,
-                            org.apache.felix.utils.manifest;-split-package:=merge-first,
-                            org.apache.karaf.util.collections;-split-package:=merge-first
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java
deleted file mode 100644
index 97a541f..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/BundleInfo.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/ConfigFileInfo.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/ConfigFileInfo.java
deleted file mode 100644
index 960fb31..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/ConfigFileInfo.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features;
-
-public interface ConfigFileInfo {
-	
-	String getLocation();
-	
-	String getFinalname();
-	
-	boolean isOverride();
-
-}
diff --git a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/EventConstants.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/EventConstants.java
deleted file mode 100644
index f83f185..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/EventConstants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/Feature.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/Feature.java
deleted file mode 100644
index b87bc97..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/Feature.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/FeatureEvent.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeatureEvent.java
deleted file mode 100644
index 516c988..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeatureEvent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesListener.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesListener.java
deleted file mode 100644
index 69f68c6..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features;
-
-public interface FeaturesListener {
-
-    void featureEvent(FeatureEvent event);
-
-    void repositoryEvent(RepositoryEvent event);
-
-}
diff --git a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java
deleted file mode 100644
index 1a1bae2..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesNamespaces.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.features;
-
-import javax.xml.namespace.QName;
-
-/**
- * Provides features XML/XSD constants.
- */
-public interface FeaturesNamespaces {
-
-    String URI_0_0_0 = "";
-    String URI_1_0_0 = "http://karaf.apache.org/xmlns/features/v1.0.0";
-    String URI_1_1_0 = "http://karaf.apache.org/xmlns/features/v1.1.0";
-
-    String URI_CURRENT = URI_1_1_0;
-
-    QName FEATURES_0_0_0 = new QName("features");
-    QName FEATURES_1_0_0 = new QName(URI_1_0_0, "features");
-    QName FEATURES_1_1_0 = new QName(URI_1_1_0, "features");
-
-    QName FEATURES_CURRENT = FEATURES_1_1_0;
-
-}
diff --git a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
deleted file mode 100644
index c3a2795..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/FeaturesService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 addRepository(URI url, boolean install) throws Exception;
-
-    void removeRepository(URI url) throws Exception;
-
-    void removeRepository(URI url, boolean uninstall) throws Exception;
-    
-    void restoreRepository(URI url) throws Exception;
-
-    Repository[] listRepositories();
-
-    void installFeature(String name) throws Exception;
-
-    void installFeature(String name, EnumSet<Option> options) 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.3.x/features/core/src/main/java/org/apache/karaf/features/Repository.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/Repository.java
deleted file mode 100644
index 6ee96da..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/Repository.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/RepositoryEvent.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/RepositoryEvent.java
deleted file mode 100644
index 68f287b..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/RepositoryEvent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/Resolver.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/Resolver.java
deleted file mode 100644
index d2fa941..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/Resolver.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features;
-
-import java.util.List;
-
-public interface Resolver {
-
-    List<BundleInfo> resolve(Feature feature) throws Exception;
-
-}
diff --git a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java
deleted file mode 100644
index 0486e14..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/BundleInfoImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/internal/ConfigFileInfoImpl.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/ConfigFileInfoImpl.java
deleted file mode 100644
index fc5b8f5..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/ConfigFileInfoImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/internal/EventAdminListener.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/EventAdminListener.java
deleted file mode 100644
index de2eb4c..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/EventAdminListener.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
deleted file mode 100644
index a4b4259..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureImpl.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java
deleted file mode 100644
index 7e21690..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeatureValidationUtil.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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);
-        
-        /** FIXME should move to 1.1.0 ? */
-        // 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.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
deleted file mode 100644
index fb93d88..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java
+++ /dev/null
@@ -1,1443 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.features.internal;
-
-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.Comparator;
-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.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.apache.karaf.util.collections.CopyOnWriteArrayIdentityList;
-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 static final int KARAF_BUNDLE_START_LEVEL =
-                        Integer.parseInt(System.getProperty("karaf.startlevel.bundle", "80"));
-
-    private BundleContext bundleContext;
-    private ConfigurationAdmin configAdmin;
-    private PackageAdmin packageAdmin;
-    private StartLevel startLevel;
-    private boolean respectStartLvlDuringFeatureStartup;
-    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 CopyOnWriteArrayIdentityList<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 setRespectStartLvlDuringFeatureStartup(boolean respectStartLvlDuringFeatureStartup) {
-        this.respectStartLvlDuringFeatureStartup = respectStartLvlDuringFeatureStartup;
-    }
-
-    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.
-     *
-     * @param uri the features repository URI.
-     */
-    public void validateRepository(URI uri) throws Exception {
-        FeatureValidationUtil.validate(uri);
-    }
-
-    /**
-     * Register a features repository.
-     * @param uri the features repository URI.
-     * @throws Exception in case of adding failure.
-     */
-    public void addRepository(URI uri) throws Exception {
-        addRepository(uri, false);
-    }
-
-    /**
-     * Register a features repository.
-     *
-     * @param uri
-     * @param install
-     * @throws Exception
-     */
-    public void addRepository(URI uri, boolean install) throws Exception {
-        if (!repositories.containsKey(uri)) {
-            RepositoryImpl repository = internalAddRepository(uri);
-            saveState();
-            if (install) {
-                for (Feature feature : repository.getFeatures()) {
-                    installFeature(feature, EnumSet.noneOf(Option.class));
-                }
-            }
-        } else {
-            refreshRepository(uri, install);
-        }
-    }
-
-    /**
-     * Add a features repository into the internal registry.
-     *
-     * @param uri the features repository URI.
-     * @return the internal <code>RepositoryImpl</code> representation.
-     * @throws Exception in case of adding failure.
-     */
-    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;
-
-    }
-
-    /**
-     * Refresh a features repository.
-     *
-     * @param uri the features repository URI.
-     * @throws Exception in case of refresh failure.
-     */
-    protected void refreshRepository(URI uri) throws Exception {
-        this.refreshRepository(uri, false);
-    }
-
-    /**
-     * Refresh a features repository.
-     *
-     * @param uri     the features repository URI.
-     * @param install if true, install all features in the features repository.
-     * @throws Exception in case of refresh failure.
-     */
-    protected void refreshRepository(URI uri, boolean install) throws Exception {
-        try {
-            removeRepository(uri, install);
-            addRepository(uri, install);
-        } catch (Exception e) {
-            //get chance to restore previous, fix for KARAF-4
-            restoreRepository(uri);
-            throw new Exception("Unable to refresh features repository " + uri, e);
-        }
-    }
-
-    /**
-     * Remove a features repository.
-     *
-     * @param uri the features repository URI.
-     * @throws Exception in case of remove failure.
-     */
-    public void removeRepository(URI uri) throws Exception {
-        this.removeRepository(uri, false);
-    }
-
-    /**
-     * Remove a features repository.
-     *
-     * @param uri       the features repository URI.
-     * @param uninstall if true, uninstall all features from the features repository.
-     * @throws Exception in case of remove failure.
-     */
-    public void removeRepository(URI uri, boolean uninstall) throws Exception {
-        if (repositories.containsKey(uri)) {
-            if (uninstall) {
-                RepositoryImpl repositoryImpl = repositories.get(uri);
-                for (Feature feature : repositoryImpl.getFeatures()) {
-                    this.uninstallFeature(feature.getName(), feature.getVersion());
-                }
-            }
-            internalRemoveRepository(uri);
-            saveState();
-        }
-    }
-
-    /**
-     * Remove a features repository from the internal registry.
-     *
-     * @param uri the features repository URI.
-     */
-    public void internalRemoveRepository(URI uri) {
-        Repository repo = repositories.remove(uri);
-        this.repo.set(repo);
-        callListeners(new RepositoryEvent(repo, RepositoryEvent.EventType.RepositoryRemoved, false));
-        features = null;
-    }
-
-    /**
-     * Restore a features repository.
-     *
-     * @param uri the features repository URI.
-     * @throws Exception in case of restore failure.
-     */
-    public void restoreRepository(URI uri) throws Exception {
-        repositories.put(uri, (RepositoryImpl) repo.get());
-        callListeners(new RepositoryEvent(repo.get(), RepositoryEvent.EventType.RepositoryAdded, false));
-        features = null;
-    }
-
-    /**
-     * List the features repositories.
-     *
-     * @return the list of features repositories.
-     */
-    public Repository[] listRepositories() {
-        Collection<RepositoryImpl> repos = repositories.values();
-        return repos.toArray(new Repository[repos.size()]);
-    }
-
-    /**
-     * Install a feature identified by a name.
-     *
-     * @param name the name of the feature.
-     * @throws Exception in case of installation failure.
-     */
-    public void installFeature(String name) throws Exception {
-        installFeature(name, FeatureImpl.DEFAULT_VERSION);
-    }
-
-    /**
-     * Install a feature identified by a name, including installation options.
-     *
-     * @param name the name of the feature.
-     * @param options the installation options.
-     * @throws Exception in case of installation failure.
-     */
-    public void installFeature(String name, EnumSet<Option> options) throws Exception {
-        installFeature(name, FeatureImpl.DEFAULT_VERSION, options);
-    }
-
-    /**
-     * Install a feature identified by a name and a version.
-     *
-     * @param name the name of the feature.
-     * @param version the version of the feature.
-     * @throws Exception in case of installation failure.
-     */
-    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 {
-        final InstallationState state = new InstallationState();
-        final 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 sorted by startlvl if wished for
-            List<Bundle> bundlesSortedByStartLvl = new ArrayList<Bundle>(state.bundles);
-            if (respectStartLvlDuringFeatureStartup) {
-                Collections.sort(bundlesSortedByStartLvl, new Comparator<Bundle>() {
-                    @Override
-                    public int compare(Bundle bundle, Bundle bundle1) {
-                        int startLevel = state.bundleInfos.get(bundle.getBundleId()).getStartLevel();
-                        startLevel = startLevel == 0 ? KARAF_BUNDLE_START_LEVEL : startLevel;
-                        int startLevel1 = state.bundleInfos.get(bundle1.getBundleId()).getStartLevel();
-                        startLevel1 = startLevel1 == 0 ? KARAF_BUNDLE_START_LEVEL : startLevel1;
-                        return startLevel - startLevel1;
-                    }
-                });
-            }
-            for (Bundle b : bundlesSortedByStartLvl) {
-                // 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");
-            }
-            if (state.features.containsKey(fi)) {
-                LOGGER.debug("Feature {} with version {} is already being installed", feature.getName(), feature.getVersion());
-            } else {
-                if (! (fi.getName().equals(feature.getName())
-                    && fi.getVersion().equals(feature.getVersion()))) {
-                    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>();
-        List<InstallResult> installResultList = new LinkedList<InstallResult>();
-        for (BundleInfo bInfo : resolve(feature)) {
-            InstallResult result = installBundleIfNeeded(state, bInfo, verbose);
-            bundles.add(result.getBundle().getBundleId());
-            state.bundleInfos.put(result.getBundle().getBundleId(), bInfo);
-            installResultList.add(result);
-        }
-        for (InstallResult result : installResultList) {
-            if (!result.isPreviouslyInstalled()) {
-                startBundleIfNeeded(result.getBundle(), result.getStartLevel());
-            }
-        }
-        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(findBundlesWithFragmentsToRefresh(state));
-        return bundles;
-    }
-
-    protected Set<Bundle> findBundlesWithFragmentsToRefresh(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 static class InstallResult {
-
-        private final boolean previouslyInstalled;
-        private final Bundle bundle;
-        private final int startLevel;
-
-        protected InstallResult(boolean previouslyInstalled, Bundle bundle, int startLevel) {
-            this.previouslyInstalled = previouslyInstalled;
-            this.bundle = bundle;
-            this.startLevel = startLevel;
-        }
-
-        public boolean isPreviouslyInstalled() {
-            return previouslyInstalled;
-        }
-
-        public Bundle getBundle() {
-            return bundle;
-        }
-
-        public int getStartLevel() {
-            return startLevel;
-        }
-
-    }
-
-    protected InstallResult 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 new InstallResult(true, b, 0);
-                    }
-                }
-            }
-            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);
-
-            state.bundles.add(b);
-            state.installed.add(b);
-            return new InstallResult(false, b, bundleInfo.getStartLevel());
-        } finally {
-            is.close();
-        }
-    }
-
-    private void startBundleIfNeeded(Bundle bundle, int startLevel) {
-        if (startLevel > 0) {
-            getStartLevel().setBundleStartLevel(bundle, startLevel);
-        }
-    }
-
-    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.3.x/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java b/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
deleted file mode 100644
index 982de6e..0000000
--- a/karaf-2.3.x/features/core/src/main/java/org/apache/karaf/features/internal/RepositoryImpl.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml b/karaf-2.3.x/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml
deleted file mode 100644
index aba621d..0000000
--- a/karaf-2.3.x/features/core/src/main/resources/OSGI-INF/blueprint/gshell-features.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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:property name="respectStartLvlDuringFeatureStartup" value="false"/>
-        </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="respectStartLvlDuringFeatureStartup" value="$[respectStartLvlDuringFeatureStartup]" />
-        <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.3.x/features/core/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/features/core/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 6368630..0000000
--- a/karaf-2.3.x/features/core/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,17 +0,0 @@
-\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.3.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd b/karaf-2.3.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
deleted file mode 100644
index 3b839c8..0000000
--- a/karaf-2.3.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0.xsd
+++ /dev/null
@@ -1,238 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements. See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License. You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd b/karaf-2.3.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd
deleted file mode 100644
index 7138573..0000000
--- a/karaf-2.3.x/features/core/src/main/resources/org/apache/karaf/features/karaf-features-1.1.0.xsd
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements. See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License. You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<xs:schema elementFormDefault="qualified"
-    targetNamespace="http://karaf.apache.org/xmlns/features/v1.1.0"
-    xmlns:tns="http://karaf.apache.org/xmlns/features/v1.1.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 an required 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" use="required"/>
-    </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 text shown for this feature when using 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[
-Marks if the feaute will be automatically started when thrown to 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 the Karaf's config.properties.
-                        ]]>
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:attribute>
-                <xs:attribute name="start" type="xs:boolean" default="true">
-                    <xs:annotation>
-                        <xs:documentation><![CDATA[
-If false, leaves bundle in resolved state 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 this 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.3.x/features/core/src/test/java/org/apache/karaf/features/FeatureTest.java b/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/FeatureTest.java
deleted file mode 100644
index 5ff45f9..0000000
--- a/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/FeatureTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java b/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
deleted file mode 100644
index aaf88ca..0000000
--- a/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java
+++ /dev/null
@@ -1,914 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 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.3.x/features/core/src/test/java/org/apache/karaf/features/RepositoryTest.java b/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/RepositoryTest.java
deleted file mode 100644
index 2e1c6da..0000000
--- a/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/RepositoryTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/core/src/test/java/org/apache/karaf/features/internal/FeaturesServiceImplTest.java b/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/internal/FeaturesServiceImplTest.java
deleted file mode 100644
index 8080029..0000000
--- a/karaf-2.3.x/features/core/src/test/java/org/apache/karaf/features/internal/FeaturesServiceImplTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-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.BundleInfo;
-import org.apache.karaf.features.Feature;
-import org.easymock.EasyMock;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-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));
-        }
-    }
-
-    /**
-     * This test ensures that every feature get installed only once, even if it appears multiple times in the list
-     * of transitive feature dependencies (KARAF-1600)
-     */
-    public void testNoDuplicateFeaturesInstallation() throws Exception {
-        final List<Feature> installed = new LinkedList<Feature>();
-
-        final FeaturesServiceImpl impl = new FeaturesServiceImpl() {
-            // override methods which refers to bundle context to avoid mocking everything
-            @Override
-            protected boolean loadState() {
-                return true;
-            }
-
-            @Override
-            protected void saveState() {
-
-            }
-
-            @Override
-            protected void doInstallFeature(InstallationState state, Feature feature, boolean verbose) throws Exception {
-                installed.add(feature);
-
-                super.doInstallFeature(state, feature, verbose);
-            }
-
-            @Override
-            protected InstallResult installBundleIfNeeded(InstallationState state, BundleInfo bundleInfo, boolean verbose) throws IOException, BundleException {
-                // let's return a mock bundle and bundle id to keep the features service happy
-                Bundle bundle = createNiceMock(Bundle.class);
-                expect(bundle.getBundleId()).andReturn(10l).anyTimes();
-                replay(bundle);
-                return new InstallResult(false, bundle, 0);
-            }
-        };
-        impl.addRepository(getClass().getResource("repo2.xml").toURI());
-
-        try {
-            impl.installFeature("all");
-
-            // copying the features to a set to filter out the duplicates
-            Set<Feature> noduplicates = new HashSet<Feature>();
-            noduplicates.addAll(installed);
-
-            assertEquals("Every feature should only have been installed once", installed.size(), noduplicates.size());
-        } catch (Exception e) {
-            fail(String.format("Service should not throw any exceptions: %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.3.x/features/core/src/test/resources/org/apache/karaf/features/internal/repo2.xml b/karaf-2.3.x/features/core/src/test/resources/org/apache/karaf/features/internal/repo2.xml
deleted file mode 100644
index 307ae55..0000000
--- a/karaf-2.3.x/features/core/src/test/resources/org/apache/karaf/features/internal/repo2.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<features name="repo2">
-    <feature name="common">
-        <bundle>b1</bundle>
-    </feature>
-    <feature name="f1">
-        <feature>common</feature>
-        <feature>f1</feature>
-        <bundle>b2</bundle>
-    </feature>
-    <feature name="f2">
-        <feature>common</feature>
-        <feature>f1</feature>
-        <bundle>b3</bundle>
-    </feature>
-    <feature name="f3">
-        <feature>f1</feature>
-        <feature>f2</feature>
-    	<bundle>b4</bundle>
-    </feature>
-    <feature name="all">
-        <feature>f1</feature>
-        <feature>f2</feature>
-        <feature>f3</feature>
-    </feature>
-</features>
diff --git a/karaf-2.3.x/features/core/src/test/resources/org/apache/karaf/features/repo1.xml b/karaf-2.3.x/features/core/src/test/resources/org/apache/karaf/features/repo1.xml
deleted file mode 100644
index 4c8db01..0000000
--- a/karaf-2.3.x/features/core/src/test/resources/org/apache/karaf/features/repo1.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/features/management/NOTICE b/karaf-2.3.x/features/management/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/features/management/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/features/management/pom.xml b/karaf-2.3.x/features/management/pom.xml
deleted file mode 100644
index ac0317f..0000000
--- a/karaf-2.3.x/features/management/pom.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?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.3.1</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</Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
deleted file mode 100644
index 0f21aab..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/FeaturesServiceMBean.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 addRepository(String url, boolean install) throws Exception;
-
-    void removeRepository(String url) throws Exception;
-
-    void removeRepository(String url, boolean uninstall) throws Exception;
-
-    void installFeature(String name) throws Exception;
-
-    void installFeature(String name, boolean noClean, boolean noRefresh) throws Exception;
-
-    void installFeature(String name, String version) throws Exception;
-
-    void installFeature(String name, String version, boolean noClean, boolean noRefresh) 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.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeature.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeature.java
deleted file mode 100644
index ad682be..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeature.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeatureEvent.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeatureEvent.java
deleted file mode 100644
index 81f446b..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxFeatureEvent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepository.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepository.java
deleted file mode 100644
index f535b2b..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepository.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepositoryEvent.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepositoryEvent.java
deleted file mode 100644
index bf7910a..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/codec/JmxRepositoryEvent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
deleted file mode 100644
index 14f5e15..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImpl.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * 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.*;
-import javax.management.MBeanNotificationInfo;
-import javax.management.MBeanRegistration;
-import javax.management.MBeanServer;
-import javax.management.NotCompliantMBeanException;
-import javax.management.Notification;
-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) {
-        registerService();
-    }
-
-    public void preDeregister() {
-        unregisterService();
-    }
-
-    public void postDeregister() {
-    }
-
-    public void registerService() {
-        unregisterService();
-        registration = bundleContext.registerService(FeaturesListener.class.getName(),
-                getFeaturesListener(), new Hashtable());
-    }
-
-    public void unregisterService() {
-        if (registration != null) {
-            try {
-                registration.unregister();
-            } finally {
-                registration = null;
-            }
-        }
-    }
-
-    /**
-     * {@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 addRepository(String uri, boolean install) throws Exception {
-        featuresService.addRepository(new URI(uri), install);
-    }
-
-    public void removeRepository(String uri) throws Exception {
-        featuresService.removeRepository(new URI(uri));
-    }
-
-    public void removeRepository(String uri, boolean uninstall) throws Exception {
-        featuresService.removeRepository(new URI(uri), uninstall);
-    }
-
-    public void installFeature(String name) throws Exception {
-        featuresService.installFeature(name);
-    }
-
-    public void installFeature(String name, boolean noClean, boolean noRefresh) throws Exception {
-        EnumSet<FeaturesService.Option> options = EnumSet.noneOf(FeaturesService.Option.class);
-        if (noClean) {
-            options.add(FeaturesService.Option.NoCleanIfFailure);
-        }
-        if (noRefresh) {
-            options.add(FeaturesService.Option.NoAutoRefreshBundles);
-        }
-        featuresService.installFeature(name, options);
-    }
-
-    public void installFeature(String name, String version) throws Exception {
-        featuresService.installFeature(name, version);
-    }
-
-    public void installFeature(String name, String version, boolean noClean, boolean noRefresh) throws Exception {
-        EnumSet<FeaturesService.Option> options = EnumSet.noneOf(FeaturesService.Option.class);
-        if (noClean) {
-            options.add(FeaturesService.Option.NoCleanIfFailure);
-        }
-        if (noRefresh) {
-            options.add(FeaturesService.Option.NoAutoRefreshBundles);
-        }
-        featuresService.installFeature(name, version, options);
-    }
-
-    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.3.x/features/management/src/main/java/org/apache/karaf/features/management/internal/StandardEmitterMBean.java b/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/internal/StandardEmitterMBean.java
deleted file mode 100644
index 58f587c..0000000
--- a/karaf-2.3.x/features/management/src/main/java/org/apache/karaf/features/management/internal/StandardEmitterMBean.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.3.x/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml b/karaf-2.3.x/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml
deleted file mode 100644
index 5f47e06..0000000
--- a/karaf-2.3.x/features/management/src/main/resources/OSGI-INF/blueprint/features-management.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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" destroy-method="unregisterService">
-        <property name="bundleContext" ref="blueprintBundleContext" />
-        <property name="featuresService" ref="featuresService" />
-    </bean>
-
-    <bean id="mbeanRegister" class="org.apache.karaf.management.MBeanRegistrer" init-method="init"  destroy-method="destroy">
-        <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.3.x/features/management/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/features/management/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 13fed77..0000000
--- a/karaf-2.3.x/features/management/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,23 +0,0 @@
-\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.3.x/features/management/src/test/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImplTest.java b/karaf-2.3.x/features/management/src/test/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImplTest.java
deleted file mode 100644
index 0a8a00e..0000000
--- a/karaf-2.3.x/features/management/src/test/java/org/apache/karaf/features/management/internal/FeaturesServiceMBeanImplTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.3.x/features/obr/NOTICE b/karaf-2.3.x/features/obr/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/features/obr/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/features/obr/pom.xml b/karaf-2.3.x/features/obr/pom.xml
deleted file mode 100644
index 60585a7..0000000
--- a/karaf-2.3.x/features/obr/pom.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-<?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.3.1</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</Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java b/karaf-2.3.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java
deleted file mode 100644
index ac48da8..0000000
--- a/karaf-2.3.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/BundleInfoImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java b/karaf-2.3.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
deleted file mode 100644
index 2fd1eeb..0000000
--- a/karaf-2.3.x/features/obr/src/main/java/org/apache/karaf/features/obr/internal/ObrResolver.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-    private boolean startByDefault;
-    private int startLevel;
-
-    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 void setStartByDefault(boolean startByDefault) {
-        this.startByDefault = startByDefault;
-    }
-
-    public void setStartLevel(int startLevel) {
-        this.startLevel = startLevel;
-    }
-
-    public List<BundleInfo> resolve(Feature feature) throws Exception {
-        List<Requirement> reqs = new ArrayList<Requirement>();
-        List<Resource> ress = new ArrayList<Resource>();
-        List<Resource> featureDeploy = 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>();
-        List<Resource> deploy = new ArrayList<Resource>();
-        Collections.addAll(deploy, resolver.getRequiredResources());
-        if (resolveOptionalImports) {
-            Collections.addAll(deploy, resolver.getOptionalResources());
-        }
-        Collections.addAll(deploy, resolver.getAddedResources());
-        deploy.addAll(featureDeploy);
-        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(), this.startLevel, this.startByDefault, false);
-            }
-            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.3.x/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml b/karaf-2.3.x/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml
deleted file mode 100644
index e03caf2..0000000
--- a/karaf-2.3.x/features/obr/src/main/resources/OSGI-INF/blueprint/features-obr.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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:property name="startByDefault" value="true"/>
-            <ext:property name="startLevel" value="80"/>
-        </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]" />
-        <property name="startByDefault" value="$[startByDefault]" />
-        <property name="startLevel" value="$[startLevel]" />
-    </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.3.x/features/obr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/features/obr/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 0a73a45..0000000
--- a/karaf-2.3.x/features/obr/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java b/karaf-2.3.x/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java
deleted file mode 100644
index 31c9956..0000000
--- a/karaf-2.3.x/features/obr/src/test/java/org/apache/karaf/features/obr/internal/ObrResolverTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/features/pom.xml b/karaf-2.3.x/features/pom.xml
deleted file mode 100644
index 94dfd76..0000000
--- a/karaf-2.3.x/features/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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.3.1</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.3.x/itests/NOTICE b/karaf-2.3.x/itests/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/itests/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/itests/pom.xml b/karaf-2.3.x/itests/pom.xml
deleted file mode 100644
index d110e84..0000000
--- a/karaf-2.3.x/itests/pom.xml
+++ /dev/null
@@ -1,146 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.itests</groupId>
-    <artifactId>itests</artifactId>
-    <packaging>jar</packaging>
-    <name>Apache Karaf :: Integration Tests</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.apache.karaf</groupId>
-            <artifactId>apache-karaf</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-            <type>tar.gz</type>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.karaf</groupId>
-                    <artifactId>org.apache.karaf.client</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.karaf</groupId>
-            <artifactId>apache-karaf</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-            <type>zip</type>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.karaf</groupId>
-                    <artifactId>org.apache.karaf.client</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.karaf.features</groupId>
-            <artifactId>org.apache.karaf.features.core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.karaf.tooling.exam</groupId>
-            <artifactId>org.apache.karaf.tooling.exam.container</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-junit4</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <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>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>jar-test-classes</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>test-jar</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.3.x/itests/src/test/java/org/apache/karaf/itests/AdminTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/AdminTest.java
deleted file mode 100644
index 78d7361..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/AdminTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.openmbean.TabularData;
-import javax.management.remote.JMXConnector;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class AdminTest extends KarafTestSupport {
-
-    @Test
-    public void createDestroyCommand() throws Exception {
-        System.out.println(executeCommand("admin:create itest"));
-        String adminListOutput = executeCommand("admin:list");
-        System.out.println(adminListOutput);
-        assertTrue(adminListOutput.contains("itest"));
-        System.out.println(executeCommand("admin:destroy itest"));
-        adminListOutput = executeCommand("admin:list");
-        System.out.println(adminListOutput);
-        assertFalse(adminListOutput.contains("itest"));
-    }
-
-    @Test
-    public void createDestroyViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=admin,name=root");
-            connection.invoke(name, "createInstance", new Object[]{ "itest", 0, 0, 0, null, null, null, null },
-                    new String[]{ "java.lang.String", "int", "int", "int", "java.lang.String", "java.lang.String", "java.lang.String", "java.lang.String" });
-            TabularData instances = (TabularData) connection.getAttribute(name, "Instances");
-            assertEquals(instances.size(), 2);
-            connection.invoke(name, "destroyInstance", new Object[]{ "itest" }, new String[]{ "java.lang.String" });
-            instances = (TabularData) connection.getAttribute(name, "Instances");
-            assertEquals(instances.size(), 1);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void cloneCommand() throws Exception {
-        System.out.println(executeCommand("admin:clone root itest"));
-        String adminListOutput = executeCommand("admin:list");
-        System.out.println(adminListOutput);
-        assertTrue(adminListOutput.contains("itest"));
-    }
-
-    @Test
-    public void cloneViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=admin,name=root");
-            connection.invoke(name, "cloneInstance", new Object[]{ "root", "itest", 0, 0, 0, null, null },
-                    new String[]{ "java.lang.String", "java.lang.String", "int", "int", "int", "java.lang.String", "java.lang.String" });
-            TabularData instances = (TabularData) connection.getAttribute(name, "Instances");
-            assertEquals(instances.size(), 2);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void renameCommand() throws Exception {
-        System.out.println(executeCommand("admin:create itest"));
-        System.out.println(executeCommand("admin:rename itest new_itest"));
-        String instanceListOutput = executeCommand("admin:list");
-        System.out.println(instanceListOutput);
-        assertTrue(instanceListOutput.contains("new_itest"));
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ConfigTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ConfigTest.java
deleted file mode 100644
index 53f1ef9..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ConfigTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class ConfigTest extends KarafTestSupport {
-
-    @Test
-    public void listCommand() throws Exception {
-        String configListOutput = executeCommand("config:list");
-        System.out.println(configListOutput);
-        assertFalse(configListOutput.isEmpty());
-        configListOutput = executeCommand("config:list \"(service.pid=org.apache.karaf.features)\"");
-        System.out.println(configListOutput);
-        assertFalse(configListOutput.isEmpty());
-    }
-
-    @Test
-    public void listViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=config,name=root");
-            List<String> configs = (List<String>) connection.invoke(name, "list", new Object[]{ }, new String[]{ });
-            assertTrue(configs.size() > 0);
-            assertTrue(configs.contains("org.apache.karaf.features"));
-            Map<String, String> properties = (Map<String, String>) connection.invoke(name, "proplist", new Object[]{ "org.apache.karaf.features" }, new String[]{ "java.lang.String" });
-            assertTrue(properties.keySet().size() > 0);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/EnterpriseFeaturesTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/EnterpriseFeaturesTest.java
deleted file mode 100644
index c5676cf..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/EnterpriseFeaturesTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class EnterpriseFeaturesTest extends KarafTestSupport {
-
-    private void installAndAssertFeature(String feature) throws Exception {
-        featuresService.installFeature(feature);
-        assertFeatureInstalled(feature);
-    }
-
-    @Test
-    public void testTransactionFeature() throws Exception {
-        installAndAssertFeature("transaction");
-    }
-
-    @Test
-    public void testJpaFeature() throws Exception {
-        installAndAssertFeature("jpa");
-    }
-
-    @Test
-    public void testJndiFeature() throws Exception {
-        installAndAssertFeature("jndi");
-    }
-
-    @Test
-    public void testApplicationWithoutIsolationFeature() throws Exception {
-        installAndAssertFeature("application-without-isolation");
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/FeaturesTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/FeaturesTest.java
deleted file mode 100644
index 688e771..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/FeaturesTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.openmbean.TabularData;
-import javax.management.remote.JMXConnector;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class FeaturesTest extends KarafTestSupport {
-
-    @Test
-    public void listCommand() throws Exception {
-        String listOutput = executeCommand("features:list");
-        System.out.println(listOutput);
-        assertFalse(listOutput.isEmpty());
-        listOutput = executeCommand("features:list -i");
-        System.out.println(listOutput);
-        assertFalse(listOutput.isEmpty());
-    }
-
-    @Test
-    public void listViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=features,name=root");
-            TabularData features = (TabularData) connection.getAttribute(name, "Features");
-            assertTrue(features.size() > 0);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void installUninstallCommand() throws Exception {
-        String featureInstallOutput = executeCommand("features:install -v eventadmin");
-        System.out.println(featureInstallOutput);
-        assertFalse(featureInstallOutput.isEmpty());
-        String featureListOutput = executeCommand("features:list -i | grep eventadmin");
-        System.out.println(featureListOutput);
-        assertFalse(featureListOutput.isEmpty());
-        System.out.println(executeCommand("features:uninstall eventadmin"));
-        featureListOutput = executeCommand("features:list -i | grep eventadmin");
-        System.out.println(featureListOutput);
-        assertTrue(featureListOutput.isEmpty());
-    }
-
-    @Test
-    public void installUninstallViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=features,name=root");
-            connection.invoke(name, "installFeature", new Object[] { "eventadmin" }, new String[]{ "java.lang.String" });
-            connection.invoke(name, "uninstallFeature", new Object[] { "eventadmin" }, new String[]{ "java.lang.String" });
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void repoAddRemoveCommand() throws Exception {
-        System.out.println(executeCommand("features:addurl mvn:org.apache.karaf.cellar/apache-karaf-cellar/2.2.4/xml/features"));
-        String repoListOutput = executeCommand("features:listurl");
-        System.out.println(repoListOutput);
-        assertTrue(repoListOutput.contains("apache-karaf-cellar"));
-        System.out.println(executeCommand("features:removeurl mvn:org.apache.karaf.cellar/apache-karaf-cellar/2.2.4/xml/features"));
-        repoListOutput = executeCommand("features:listurl");
-        System.out.println(repoListOutput);
-        assertFalse(repoListOutput.contains("apache-karaf-cellar"));
-    }
-
-    @Test
-    public void repoAddRemoveViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=features,name=root");
-            connection.invoke(name, "addRepository", new Object[] { "mvn:org.apache.karaf.cellar/apache-karaf-cellar/2.2.4/xml/features" }, new String[]{ "java.lang.String" });
-            connection.invoke(name, "removeRepository", new Object[] { "mvn:org.apache.karaf.cellar/apache-karaf-cellar/2.2.4/xml/features" }, new String[]{ "java.lang.String" });
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/JaasTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/JaasTest.java
deleted file mode 100644
index 032b888..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/JaasTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class JaasTest extends KarafTestSupport {
-
-    @Test
-    public void realmListCommand() throws Exception {
-        String listRealmsOutput = executeCommand("jaas:realms");
-        System.out.println(listRealmsOutput);
-        assertTrue(listRealmsOutput.contains("PropertiesLoginModule"));
-        assertTrue(listRealmsOutput.contains("PublickeyLoginModule"));
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java
deleted file mode 100644
index 2744fb8..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * 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.itests;
-
-import org.apache.felix.service.command.CommandProcessor;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.features.Feature;
-import org.apache.karaf.features.FeaturesService;
-import org.apache.karaf.tooling.exam.options.LogLevelOption;
-import org.junit.Assert;
-import org.ops4j.pax.exam.MavenUtils;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.TestProbeBuilder;
-import org.ops4j.pax.exam.junit.Configuration;
-import org.ops4j.pax.exam.junit.ProbeBuilder;
-import org.osgi.framework.*;
-import org.osgi.util.tracker.ServiceTracker;
-
-import javax.inject.Inject;
-import javax.management.remote.JMXConnector;
-import javax.management.remote.JMXConnectorFactory;
-import javax.management.remote.JMXServiceURL;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.PrintStream;
-import java.util.*;
-import java.util.concurrent.*;
-
-import static org.apache.karaf.tooling.exam.options.KarafDistributionOption.karafDistributionConfiguration;
-import static org.apache.karaf.tooling.exam.options.KarafDistributionOption.keepRuntimeFolder;
-import static org.apache.karaf.tooling.exam.options.KarafDistributionOption.logLevel;
-
-import static org.ops4j.pax.exam.CoreOptions.maven;
-
-public class KarafTestSupport {
-
-    static final Long COMMAND_TIMEOUT = 10000L;
-    static final Long SERVICE_TIMEOUT = 30000L;
-
-    ExecutorService executor = Executors.newCachedThreadPool();
-
-    @Inject
-    protected BundleContext bundleContext;
-
-    @Inject
-    protected FeaturesService featuresService;
-
-    @ProbeBuilder
-    public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
-        probe.setHeader(Constants.DYNAMICIMPORT_PACKAGE, "*,org.apache.felix.service.*;status=provisional");
-        return probe;
-    }
-
-    @Configuration
-    public Option[] config() {
-        return new Option[]{
-                karafDistributionConfiguration().frameworkUrl(maven().groupId("org.apache.karaf").artifactId("apache-karaf").versionAsInProject().type("tar.gz"))
-                        .karafVersion(MavenUtils.getArtifactVersion("org.apache.karaf", "apache-karaf")).name("Apache Karaf").unpackDirectory(new File("target/exam")),
-                keepRuntimeFolder(),
-                logLevel(LogLevelOption.LogLevel.ERROR)};
-    }
-
-    /**
-     * Executes a shell command and returns output as a String.
-     * Commands have a default timeout of 10 seconds.
-     *
-     * @param command
-     * @return
-     */
-    protected String executeCommand(final String command) {
-        return executeCommand(command, COMMAND_TIMEOUT, false);
-    }
-
-    /**
-     * Executes a shell command and returns output as a String.
-     * Commands have a default timeout of 10 seconds.
-     *
-     * @param command The command to execute.
-     * @param timeout The amount of time in millis to wait for the command to execute.
-     * @param silent  Specifies if the command should be displayed in the screen.
-     * @return
-     */
-    protected String executeCommand(final String command, final Long timeout, final Boolean silent) {
-        String response;
-        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        final PrintStream printStream = new PrintStream(byteArrayOutputStream);
-        final CommandProcessor commandProcessor = getOsgiService(CommandProcessor.class);
-        final CommandSession commandSession = commandProcessor.createSession(System.in, printStream, System.err);
-        FutureTask<String> commandFuture = new FutureTask<String>(
-                new Callable<String>() {
-                    public String call() {
-                        try {
-                            if (!silent) {
-                                System.err.println(command);
-                            }
-                            commandSession.execute(command);
-                        } catch (Exception e) {
-                            e.printStackTrace(System.err);
-                        }
-                        printStream.flush();
-                        return byteArrayOutputStream.toString();
-                    }
-                });
-
-        try {
-            executor.submit(commandFuture);
-            response = commandFuture.get(timeout, TimeUnit.MILLISECONDS);
-        } catch (Exception e) {
-            e.printStackTrace(System.err);
-            response = "SHELL COMMAND TIMED OUT: ";
-        }
-
-        return response;
-    }
-
-
-    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, SERVICE_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 Collection<ServiceReference> asCollection(ServiceReference[] references) {
-        return references != null ? Arrays.asList(references) : Collections.<ServiceReference>emptyList();
-    }
-
-    public JMXConnector getJMXConnector() throws Exception {
-        JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root");
-        Hashtable env = new Hashtable();
-        String[] credentials = new String[]{"karaf", "karaf"};
-        env.put("jmx.remote.credentials", credentials);
-        JMXConnector connector = JMXConnectorFactory.connect(url, env);
-        return connector;
-    }
-
-    public void assertFeatureInstalled(String featureName) {
-        Feature[] features = featuresService.listInstalledFeatures();
-        for (Feature feature : features) {
-            if (featureName.equals(feature.getName())) {
-                return;
-            }
-        }
-        Assert.fail("Feature " + featureName + " should be installed but is not");
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/LogTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/LogTest.java
deleted file mode 100644
index 9c3e494..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/LogTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.Attribute;
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class LogTest extends KarafTestSupport {
-
-    @Test
-    public void setDebugAndDisplay() throws Exception {
-        System.out.println(executeCommand("log:set DEBUG"));
-        String displayOutput = executeCommand("log:display");
-        System.out.println(displayOutput);
-        assertTrue(displayOutput.contains("DEBUG"));
-    }
-
-    @Test
-    public void setDebugViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=log,name=root");
-            Attribute attribute = new Attribute("Level", "DEBUG");
-            connection.setAttribute(name, attribute);
-            String logLevel = (String) connection.getAttribute(name, "Level");
-            assertEquals("Level: DEBUG", logLevel);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void setGetDebugAndClear() throws Exception {
-        System.out.println(executeCommand("log:set DEBUG"));
-        String getOutput = executeCommand("log:get");
-        System.out.println(getOutput);
-        assertTrue(getOutput.contains("DEBUG"));
-        System.out.println(executeCommand("log:set INFO"));
-        System.out.println(executeCommand("log:clear"));
-        String displayOutput = executeCommand("log:display");
-        System.out.println(displayOutput.trim());
-        assertTrue(displayOutput.trim().isEmpty());
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ObrTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ObrTest.java
deleted file mode 100644
index 2fee98c..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ObrTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.openmbean.TabularData;
-import javax.management.remote.JMXConnector;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class ObrTest extends KarafTestSupport {
-
-    @Before
-    public void installObrFeature() throws Exception {
-        System.out.println(executeCommand("features:install obr"));
-        // give it time on faster machines to complete
-        Thread.sleep(500);
-    }
-
-    @Test
-    public void listCommands() throws Exception {
-        System.out.println(executeCommand("obr:listUrl"));
-        System.out.println(executeCommand("obr:list"));
-    }
-
-    @Test
-    public void listsViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=obr,name=root");
-            List<String> urls = (List<String>) connection.invoke(name, "listUrls", new Object[]{ }, new String[]{ });
-            assertEquals(0, urls.size());
-            TabularData bundles = (TabularData) connection.getAttribute(name, "Bundles");
-            assertEquals(0, bundles.size());
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/OsgiTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/OsgiTest.java
deleted file mode 100644
index 05f7f66..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/OsgiTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.openmbean.TabularData;
-import javax.management.remote.JMXConnector;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class OsgiTest extends KarafTestSupport {
-
-    @Test
-    public void listCommand() throws Exception {
-        String listOutput = executeCommand("osgi:list -t 0");
-        System.out.println(listOutput);
-        assertFalse(listOutput.isEmpty());
-    }
-
-    @Test
-    public void listViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=bundles,name=root");
-            TabularData bundles = (TabularData) connection.invoke(name, "list", new Object[]{ }, new String[]{ });
-            assertTrue(bundles.size() > 0);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void classesCommand() throws Exception {
-        String classesOutput = executeCommand("osgi:classes --force org.apache.aries.proxy.api");
-        System.out.println(classesOutput);
-        assertFalse(classesOutput.isEmpty());
-        classesOutput = executeCommand("osgi:classes --force org.apache.aries.proxy.api");
-        System.out.println(classesOutput);
-        assertTrue(classesOutput.contains("org/apache/aries/proxy"));
-    }
-
-    @Test
-    public void findClassCommand() throws Exception {
-        String findClassOutput = executeCommand("osgi:find-class jmx");
-        System.out.println(findClassOutput);
-        assertFalse(findClassOutput.isEmpty());
-    }
-
-    @Test
-    public void headersCommand() throws Exception {
-        String headersOutput = executeCommand("osgi:headers --force org.apache.aries.proxy.api");
-        System.out.println(headersOutput);
-        assertTrue(headersOutput.contains("Bundle-SymbolicName = org.apache.aries.proxy.api"));
-    }
-
-    @Test
-    public void infoCommand() throws Exception {
-        String infoOutput = executeCommand("osgi:info --force org.apache.aries.proxy.api");
-        System.out.println(infoOutput);
-        assertTrue(infoOutput.contains("Apache Aries Proxy API"));
-    }
-
-    @Test
-    public void installCommand() throws Exception {
-        String installOutput = executeCommand("osgi:install mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-lang/2.4_6");
-        System.out.println(installOutput);
-        String listOutput = executeCommand("osgi:list | grep -i commons-lang");
-        assertFalse(listOutput.isEmpty());
-    }
-
-    @Test
-    public void nameCommand() throws Exception {
-        String nameOutput = executeCommand("osgi:name");
-        System.out.println(nameOutput);
-        assertEquals("root", nameOutput.trim());
-    }
-
-    @Test
-    public void nameViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=system,name=root");
-            String currentName = (String) connection.getAttribute(name, "Name");
-            assertEquals("root", currentName);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void versionCommand() throws Exception {
-        String versionOutput = executeCommand("osgi:version");
-        System.out.println(versionOutput);
-        assertTrue(versionOutput.contains("2.3"));
-    }
-
-    @Test
-    public void versionViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=system,name=root");
-            String version = (String) connection.getAttribute(name, "Version");
-            assertTrue(version.contains("2.3"));
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void startLevelCommand() throws Exception {
-        String startLevelOutput = executeCommand("osgi:start-level");
-        System.out.println(startLevelOutput);
-        assertTrue(startLevelOutput.contains("100"));
-    }
-
-    @Test
-    public void shutdownCommand() throws Exception {
-        System.out.println(executeCommand("osgi:shutdown -f"));
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/PackagesTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/PackagesTest.java
deleted file mode 100644
index 546f1ae..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/PackagesTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-
-import java.util.ArrayList;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class PackagesTest extends KarafTestSupport {
-
-    @Test
-    public void exportsCommand() throws Exception {
-        String exportsOutput = executeCommand("packages:exports");
-        System.out.println(exportsOutput);
-        assertFalse(exportsOutput.isEmpty());
-    }
-
-    @Test
-    public void exportsViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=packages,name=root");
-            ArrayList exports = (ArrayList) connection.invoke(name, "exportedPackages", new Object[]{ }, new String[]{ });
-            assertTrue(exports.size() > 0);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-    @Test
-    public void importsCommand() throws Exception {
-        String importsOutput = executeCommand("packages:imports");
-        System.out.println(importsOutput);
-        assertFalse(importsOutput.isEmpty());
-    }
-
-    @Test
-    public void importsViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=packages,name=root");
-            ArrayList imports = (ArrayList) connection.invoke(name, "importedPackages", new Object[]{ }, new String[]{ });
-            assertTrue(imports.size() > 0);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ServicesTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ServicesTest.java
deleted file mode 100644
index 13730e0..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/ServicesTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.openmbean.TabularData;
-import javax.management.remote.JMXConnector;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class ServicesTest extends KarafTestSupport {
-
-    @Test
-    public void listCommand() throws Exception {
-        String listOutput = executeCommand("ls");
-        System.out.println(listOutput);
-        assertFalse(listOutput.isEmpty());
-    }
-
-    @Test
-    public void listViaMBean() throws Exception {
-        JMXConnector connector = null;
-        try {
-            connector = this.getJMXConnector();
-            MBeanServerConnection connection = connector.getMBeanServerConnection();
-            ObjectName name = new ObjectName("org.apache.karaf:type=services,name=root");
-            TabularData services = (TabularData) connection.invoke(name, "list", new Object[]{ }, new String[]{ });
-            assertTrue(services.size() > 0);
-        } finally {
-            if (connector != null)
-                connector.close();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/StandardFeaturesTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/StandardFeaturesTest.java
deleted file mode 100644
index 8ff7770..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/StandardFeaturesTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class StandardFeaturesTest extends KarafTestSupport {
-
-    @Test
-    public void testBootFeatures() throws Exception {
-        assertFeatureInstalled("config");
-        assertFeatureInstalled("ssh");
-        assertFeatureInstalled("management");
-        assertFeatureInstalled("kar");
-    }
-
-    private void installAndAssertFeature(String feature) throws Exception {
-        featuresService.installFeature(feature);
-        assertFeatureInstalled(feature);
-    }
-
-    @Test
-    public void testSpringFeature() throws Exception {
-        installAndAssertFeature("spring");
-    }
-
-    @Test
-    public void testSpringAspectsFeature() throws Exception {
-        installAndAssertFeature("spring-aspects");
-    }
-
-    @Test
-    public void testSpringDmFeature() throws Exception {
-        installAndAssertFeature("spring-dm");
-    }
-
-    @Test
-    public void testSpringDmWebFeature() throws Exception {
-        installAndAssertFeature("spring-dm-web");
-    }
-
-    @Test
-    public void testSpringInstrumentFeature() throws Exception {
-        installAndAssertFeature("spring-instrument");
-    }
-
-    @Test
-    public void testSpringJdbcFeature() throws Exception {
-        installAndAssertFeature("spring-jdbc");
-    }
-
-    @Test
-    public void testSpringJmsFeature() throws Exception {
-        installAndAssertFeature("spring-jms");
-    }
-
-    @Test
-    public void testSpringStrutsFeature() throws Exception {
-        installAndAssertFeature("spring-struts");
-    }
-
-    @Test
-    public void testSpringTestFeature() throws Exception {
-        installAndAssertFeature("spring-test");
-    }
-
-    @Test
-    public void testSpringOrmFeature() throws Exception {
-        installAndAssertFeature("spring-orm");
-    }
-
-    @Test
-    public void testSpringOxmFeature() throws Exception {
-        installAndAssertFeature("spring-oxm");
-    }
-
-    @Test
-    public void testSpringTxFeature() throws Exception {
-        installAndAssertFeature("spring-tx");
-    }
-
-    @Test
-    public void testSpringWebFeature() throws Exception {
-        installAndAssertFeature("spring-web");
-    }
-
-    @Test
-    public void testSpringWebPortletFeature() throws Exception {
-        installAndAssertFeature("spring-web-portlet");
-    }
-
-    @Test
-    public void testWrapperFeature() throws Exception {
-        installAndAssertFeature("wrapper");
-    }
-
-    @Test
-    public void testObrFeature() throws Exception {
-        installAndAssertFeature("obr");
-    }
-
-    @Test
-    public void testJettyFeature() throws Exception {
-        installAndAssertFeature("jetty");
-    }
-
-    @Test
-    public void testHttpFeature() throws Exception {
-        installAndAssertFeature("http");
-    }
-
-    @Test
-    public void testHttpWhiteboardFeature() throws Exception {
-        installAndAssertFeature("http-whiteboard");
-    }
-
-    @Test
-    public void testWarFeature() throws Exception {
-        installAndAssertFeature("war");
-    }
-
-    @Test
-    public void testWebconsoleFeature() throws Exception {
-        installAndAssertFeature("webconsole");
-    }
-
-    @Test
-    public void testEventadminFeature() throws Exception {
-        installAndAssertFeature("eventadmin");
-    }
-
-    @Test
-    public void testJasyptEncryptionFeature() throws Exception {
-        installAndAssertFeature("jasypt-encryption");
-    }
-
-}
diff --git a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/WrapperTest.java b/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/WrapperTest.java
deleted file mode 100644
index 73e09e1..0000000
--- a/karaf-2.3.x/itests/src/test/java/org/apache/karaf/itests/WrapperTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.itests;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.junit.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-import javax.management.MBeanServerConnection;
-import javax.management.ObjectName;
-import javax.management.remote.JMXConnector;
-
-import static org.junit.Assert.assertFalse;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class WrapperTest extends KarafTestSupport {
-
-    @Before
-    public void installObrFeature() throws Exception {
-        System.out.println(executeCommand("features:install wrapper"));
-        // give it time on faster machines to complete
-        Thread.sleep(500);
-    }
-
-
-    @Test
-    public void installCommand() throws Exception {
-        String installOutput = executeCommand("wrapper:install");
-        System.out.println(installOutput);
-        assertFalse(installOutput.isEmpty());
-    }
-
-}
diff --git a/karaf-2.3.x/jaas/boot/NOTICE b/karaf-2.3.x/jaas/boot/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/jaas/boot/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/jaas/boot/pom.xml b/karaf-2.3.x/jaas/boot/pom.xml
deleted file mode 100644
index 4cd9fb9..0000000
--- a/karaf-2.3.x/jaas/boot/pom.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?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.3.1</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.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java b/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java
deleted file mode 100644
index 6f65b5d..0000000
--- a/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/ProxyLoginModule.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/GroupPrincipal.java b/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/GroupPrincipal.java
deleted file mode 100644
index f993473..0000000
--- a/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/GroupPrincipal.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  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.boot.principal;
-
-import java.security.Principal;
-import java.security.acl.Group;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-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.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/RolePolicy.java b/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/RolePolicy.java
deleted file mode 100644
index e2965ea..0000000
--- a/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/RolePolicy.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  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.boot.principal;
-
-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;
-
-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.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/RolePrincipal.java b/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/RolePrincipal.java
deleted file mode 100644
index 2c97244..0000000
--- a/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/RolePrincipal.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jaas.boot.principal;
-
-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.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/UserPrincipal.java b/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/UserPrincipal.java
deleted file mode 100644
index 7a06a9b..0000000
--- a/karaf-2.3.x/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/UserPrincipal.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jaas.boot.principal;
-
-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.3.x/jaas/boot/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/jaas/boot/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index a334424..0000000
--- a/karaf-2.3.x/jaas/boot/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,22 +0,0 @@
-\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.3.x/jaas/command/NOTICE b/karaf-2.3.x/jaas/command/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/jaas/command/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/jaas/command/pom.xml b/karaf-2.3.x/jaas/command/pom.xml
deleted file mode 100644
index e7367ec..0000000
--- a/karaf-2.3.x/jaas/command/pom.xml
+++ /dev/null
@@ -1,146 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/CancelCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/CancelCommand.java
deleted file mode 100644
index fd4fe14..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/CancelCommand.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.command;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.jaas.modules.BackingEngine;
-
-import java.util.LinkedList;
-
-@Command(scope = "jaas", name = "cancel", description = "Cancel the modification on 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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/JaasCommandSupport.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/JaasCommandSupport.java
deleted file mode 100644
index 5706f21..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/JaasCommandSupport.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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;
-
-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;
-    }
-
-    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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListPendingCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListPendingCommand.java
deleted file mode 100644
index ff4eda7..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListPendingCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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;
-
-@Command(scope = "jaas", name = "pending", description = "List the modification on the selected JAAS Realm/Login 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 Login Module %s", realm.getName(), moduleClass));
-
-            if (commandQueue != null && !commandQueue.isEmpty()) {
-                for (JaasCommandSupport command : commandQueue) {
-                    System.out.println(command);
-                }
-            } else {
-                System.err.println("No JAAS pending modification");
-            }
-        } else {
-            System.err.println("No JAAS Realm/Login 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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListRealmsCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListRealmsCommand.java
deleted file mode 100644
index 904f47b..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListRealmsCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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;
-
-@Command(scope = "jaas", name = "realms", description = "List 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 JAAS Login Module found for JAAS Realm"));
-                }
-            }
-        } else {
-            System.err.println("No realm found");
-        }
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListUsersCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListUsersCommand.java
deleted file mode 100644
index 00a4248..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ListUsersCommand.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-
-@Command(scope = "jaas", name = "users", description = "List the users of the selected JAAS Realm/Login 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("Can't get the list of users (no backing engine service registered)");
-            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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ManageRealmCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ManageRealmCommand.java
deleted file mode 100644
index 8502847..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/ManageRealmCommand.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.command;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.gogo.commands.Option;
-import org.apache.karaf.jaas.boot.ProxyLoginModule;
-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.List;
-import java.util.Queue;
-
-@Command(scope = "jaas", name = "manage", description = "Manage users and roles of a JAAS Realm")
-public class ManageRealmCommand extends JaasCommandSupport {
-
-    @Option(name = "--realm", description = "Realm Name", required = false, multiValued = false)
-    String realmName;
-
-    @Option(name = "--index", description = "Realm Index", required = false, multiValued = false)
-    int index;
-
-    @Option(name = "--module", aliases = {}, description = "Login Module Class Name", required = false, multiValued = false)
-    String moduleName;
-
-    @Option(name = "-f", aliases = {"--force"}, 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 JAAS 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 JAAS Login Module is being edited. Cancel/update first, or use the --force option.");
-        } else {
-
-            JaasRealm realm = null;
-            AppConfigurationEntry entry = null;
-
-            if (index > 0) {
-                // user provided the index, get the realm AND entry from the index
-                List<JaasRealm> realms = getRealms();
-                if (realms != null && realms.size() > 0) {
-                    int i = 1;
-                    for (JaasRealm r : realms) {
-                        AppConfigurationEntry[] entries = r.getEntries();
-
-                        if (entries != null) {
-                            for (int j = 0; j < entries.length; j++) {
-                                if (i == index) {
-                                    realm = r;
-                                    entry = entries[j];
-                                    break;
-                                }
-                                i++;
-                            }
-                        }
-                    }
-                }
-            } else {
-                List<JaasRealm> realms = getRealms();
-                if (realms != null && realms.size() > 0) {
-                    for (JaasRealm r : realms) {
-                        if (r.getName().equals(realmName)) {
-                            realm = r;
-                            break;
-                        }
-                    }
-
-                }
-                AppConfigurationEntry[] entries = realm.getEntries();
-                if (entries != null) {
-                    for (AppConfigurationEntry e : entries) {
-                        String moduleClass = (String) e.getOptions().get(ProxyLoginModule.PROPERTY_MODULE);
-                        if (moduleName == null) {
-                            entry = e;
-                            break;
-                        } else {
-                            if (moduleName.equals(e.getLoginModuleName()) || moduleName.equals(moduleClass)) {
-                                entry = e;
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            if (realm == null) {
-                System.err.println("JAAS realm has not been found.");
-                return null;
-            }
-
-            if (entry == null) {
-                System.err.println("JAAS module has not been found.");
-                return 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);
-        }
-        return null;
-    }
-
-    @Override
-    protected Object doExecute(BackingEngine engine) throws Exception {
-        return null;
-    }
-}
diff --git a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleAddCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleAddCommand.java
deleted file mode 100644
index 81ec514..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleAddCommand.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.jaas.modules.BackingEngine;
-
-@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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleDeleteCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleDeleteCommand.java
deleted file mode 100644
index a44b17e..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/RoleDeleteCommand.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.jaas.modules.BackingEngine;
-
-@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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UpdateCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UpdateCommand.java
deleted file mode 100644
index dfa9a4e..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UpdateCommand.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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;
-
-@Command(scope = "jaas", name = "update", description = "Update the selected 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/Login Module selected");
-            return null;
-        }
-
-        BackingEngine engine = backingEngineService.get(entry);
-
-        if (engine == null) {
-            System.err.println("Can't update the JAAS realm (no backing engine service registered)");
-            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 pending modification");
-            return null;
-        }
-
-        // loop in 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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserAddCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserAddCommand.java
deleted file mode 100644
index b8887bd..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserAddCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.jaas.modules.BackingEngine;
-
-@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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserDeleteCommand.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserDeleteCommand.java
deleted file mode 100644
index 6f392ed..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/UserDeleteCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.command;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.jaas.modules.BackingEngine;
-
-@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.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/completers/LoginModuleNameCompleter.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/completers/LoginModuleNameCompleter.java
deleted file mode 100644
index 1256953..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/completers/LoginModuleNameCompleter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jaas.command.completers;
-
-import java.util.LinkedList;
-import java.util.List;
-import javax.security.auth.login.AppConfigurationEntry;
-import org.apache.karaf.jaas.boot.ProxyLoginModule;
-import org.apache.karaf.jaas.config.JaasRealm;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
-
-public class LoginModuleNameCompleter implements Completer {
-
-    private List<JaasRealm> realms;
-
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        StringsCompleter delegate = new StringsCompleter();
-        try {
-            if (realms != null && !realms.isEmpty())
-                for (JaasRealm realm : realms) {
-                    List<String> moduleClassNames = findLoginModuleClassNames(realm);
-                    if (moduleClassNames != null && !moduleClassNames.isEmpty())
-                    delegate.getStrings().addAll(moduleClassNames);
-                }
-        } catch (Exception e) {
-            // Ignore
-        }
-        return delegate.complete(buffer, cursor, candidates);
-    }
-
-    /**
-     * Finds the login module class name in the {@link JaasRealm} entries.
-     * @param realm
-     * @return
-     */
-    private List<String> findLoginModuleClassNames(JaasRealm realm) {
-        List<String> moduleClassNames = new LinkedList<String>();
-        for (AppConfigurationEntry entry : realm.getEntries()) {
-            String moduleClass = (String) entry.getOptions().get(ProxyLoginModule.PROPERTY_MODULE);
-            if (moduleClass != null) {
-                moduleClassNames.add(moduleClass);
-            }
-
-        }
-        return moduleClassNames;
-    }
-
-    public List<JaasRealm> getRealms() {
-        return realms;
-    }
-
-    public void setRealms(List<JaasRealm> realms) {
-        this.realms = realms;
-    }
-
-}
diff --git a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/completers/RealmCompleter.java b/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/completers/RealmCompleter.java
deleted file mode 100644
index d973acb..0000000
--- a/karaf-2.3.x/jaas/command/src/main/java/org/apache/karaf/jaas/command/completers/RealmCompleter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jaas.command.completers;
-
-import java.util.List;
-import org.apache.karaf.jaas.config.JaasRealm;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
-
-public class RealmCompleter implements Completer {
-
-    private List<JaasRealm> realms;
-
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        StringsCompleter delegate = new StringsCompleter();
-        try {
-            if (realms != null && !realms.isEmpty())
-                for (JaasRealm realm : realms) {
-                    delegate.getStrings().add(realm.getName());
-                }
-        } catch (Exception e) {
-            // Ignore
-        }
-        return delegate.complete(buffer, cursor, candidates);
-    }
-
-    public List<JaasRealm> getRealms() {
-        return realms;
-    }
-
-    public void setRealms(List<JaasRealm> realms) {
-        this.realms = realms;
-    }
-
-}
diff --git a/karaf-2.3.x/jaas/command/src/main/resources/OSGI-INF/blueprint/jaas-command.xml b/karaf-2.3.x/jaas/command/src/main/resources/OSGI-INF/blueprint/jaas-command.xml
deleted file mode 100644
index 84c5f9d..0000000
--- a/karaf-2.3.x/jaas/command/src/main/resources/OSGI-INF/blueprint/jaas-command.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command name="jaas/manage">
-            <action class="org.apache.karaf.jaas.command.ManageRealmCommand">
-                <property name="realms" ref="realms"/>
-            </action>
-            <optional-completers>
-                <entry key="--realm" value-ref="realmCompleter"/>
-                <entry key="--module" value-ref="moduleClassNameCompleter"/>
-            </optional-completers>
-        </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"/>
-
-    <!-- Completers -->
-    <bean id="realmCompleter" class="org.apache.karaf.jaas.command.completers.RealmCompleter">
-        <property name="realms" ref="realms"/>
-    </bean>
-
-    <bean id="moduleClassNameCompleter" class="org.apache.karaf.jaas.command.completers.LoginModuleNameCompleter">
-        <property name="realms" ref="realms"/>
-    </bean>
-
-</blueprint>
diff --git a/karaf-2.3.x/jaas/command/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/jaas/command/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 6432a50..0000000
--- a/karaf-2.3.x/jaas/command/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,26 +0,0 @@
-\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.3.x/jaas/config/NOTICE b/karaf-2.3.x/jaas/config/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/jaas/config/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/jaas/config/pom.xml b/karaf-2.3.x/jaas/config/pom.xml
deleted file mode 100644
index c75795e..0000000
--- a/karaf-2.3.x/jaas/config/pom.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?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.3.1</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.apache.karaf</groupId>
-            <artifactId>org.apache.karaf.util</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.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>
-                        <Export-Package>${project.artifactId};version=${project.version}</Export-Package>
-                        <Import-Package>!${project.artifactId},*</Import-Package>
-                        <Private-Package>
-                            ${project.artifactId}.impl;-split-package:=merge-first,
-                            org.apache.karaf.util.collections
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java
deleted file mode 100644
index d3fc014..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/JaasRealm.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeyIsLocked.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeyIsLocked.java
deleted file mode 100644
index e0e76f7..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeyIsLocked.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreInstance.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreInstance.java
deleted file mode 100644
index 11e9ca2..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreInstance.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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
- */
-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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreIsLocked.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreIsLocked.java
deleted file mode 100644
index 1ee4dc8..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreIsLocked.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreManager.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreManager.java
deleted file mode 100644
index 146ba50..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/KeystoreManager.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Config.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Config.java
deleted file mode 100644
index b7966b1..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Config.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Module.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Module.java
deleted file mode 100644
index 0a990d4..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/Module.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/NamespaceHandler.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/NamespaceHandler.java
deleted file mode 100644
index a6ed36c..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/NamespaceHandler.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiConfiguration.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiConfiguration.java
deleted file mode 100644
index 6c995ba..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiConfiguration.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jaas.config.impl;
-
-import java.util.List;
-import java.util.Map;
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-
-import org.apache.karaf.jaas.config.JaasRealm;
-import org.apache.karaf.util.collections.CopyOnWriteArrayIdentityList;
-
-public class OsgiConfiguration extends Configuration {
-
-    private final List<JaasRealm> realms = new CopyOnWriteArrayIdentityList<JaasRealm>();
-
-    public void init() {
-        Configuration.setConfiguration(this);
-    }
-
-    public void close() {
-        realms.clear();
-        Configuration.setConfiguration(null);
-    }
-
-    public void register(JaasRealm realm, Map<String,?> properties) {
-        if (realm != null) {
-            realms.add(realm);
-        }
-    }
-
-    public void unregister(JaasRealm realm, Map<String,?> properties) {
-        if (realm != null) {
-            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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiKeystoreManager.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiKeystoreManager.java
deleted file mode 100644
index 3cc43d9..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/OsgiKeystoreManager.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.jaas.config.impl;
-
-import java.security.GeneralSecurityException;
-import java.security.SecureRandom;
-import java.util.List;
-import java.util.Map;
-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.apache.karaf.util.collections.CopyOnWriteArrayIdentityList;
-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 CopyOnWriteArrayIdentityList<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();
-    }
-
-    /**
-     * 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 ) throws GeneralSecurityException {
-        long start = System.currentTimeMillis();
-        while (true) {
-            KeystoreInstance keyInstance = getKeystore(keyStore);
-            KeystoreInstance trustInstance = trustStore == null ? null : getKeystore(trustStore);
-            if (keyStore != null && keyInstance == null) {
-                logger.info( "Keystore {} not found", keyStore );
-            } else if (keyStore != null && keyInstance.isKeystoreLocked()) {
-                logger.info( "Keystore {} locked", keyStore );
-            } else if (keyStore != null && keyAlias != null && keyInstance.isKeyLocked(keyAlias)) {
-                logger.info( "Keystore's key {} locked", keyAlias );
-            } else if (trustStore != null && trustInstance == null) {
-                logger.info( "Truststore {} not found", trustStore );
-            } else if (trustStore != null && trustInstance.isKeystoreLocked()) {
-                logger.info( "Truststore {} locked", keyStore );
-            } else {
-                return true;
-            }
-            if (System.currentTimeMillis() - start < timeout) {
-                try {
-                    Thread.sleep(1000);
-                } catch (InterruptedException e) {
-                    throw new GeneralSecurityException("Interrupted", e);
-                }
-            } else {
-                return false;
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java
deleted file mode 100644
index acdee67..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ProxyLoginModuleInitializer.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ResourceKeystoreInstance.java b/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ResourceKeystoreInstance.java
deleted file mode 100644
index f2c7260..0000000
--- a/karaf-2.3.x/jaas/config/src/main/java/org/apache/karaf/jaas/config/impl/ResourceKeystoreInstance.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml b/karaf-2.3.x/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml
deleted file mode 100644
index 8698f87..0000000
--- a/karaf-2.3.x/jaas/config/src/main/resources/OSGI-INF/blueprint/karaf-jaas.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/jaas/config/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/jaas/config/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 17e17f4..0000000
--- a/karaf-2.3.x/jaas/config/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,18 +0,0 @@
-\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.3.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd b/karaf-2.3.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd
deleted file mode 100644
index 225665c..0000000
--- a/karaf-2.3.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.0.0.xsd
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd b/karaf-2.3.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd
deleted file mode 100644
index f56b206..0000000
--- a/karaf-2.3.x/jaas/config/src/main/resources/org/apache/karaf/jaas/config/karaf-jaas-1.1.0.xsd
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/jaas/jasypt/NOTICE b/karaf-2.3.x/jaas/jasypt/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/jaas/jasypt/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/jaas/jasypt/pom.xml b/karaf-2.3.x/jaas/jasypt/pom.xml
deleted file mode 100644
index b25962e..0000000
--- a/karaf-2.3.x/jaas/jasypt/pom.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-<?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.3.1</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>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.cm</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.configadmin</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- Force osgi 4.2 so that blueprint bundle tracker works correctly -->
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>4.2.0</version>
-            <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.6</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.impl</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>
-                            org.apache.karaf.jaas.jasypt.impl,
-                            com.ibm.icu*
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholder.java b/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholder.java
deleted file mode 100644
index c8e518e..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholder.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  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.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/NamespaceHandler.java b/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/NamespaceHandler.java
deleted file mode 100644
index 4a196c0..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/handler/NamespaceHandler.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  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.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryption.java b/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryption.java
deleted file mode 100644
index 99311a8..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryption.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  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.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionService.java b/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionService.java
deleted file mode 100644
index 24c49af..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  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.3.x/jaas/jasypt/src/main/resources/OSGI-INF/blueprint/karaf-jaas-jasypt.xml b/karaf-2.3.x/jaas/jasypt/src/main/resources/OSGI-INF/blueprint/karaf-jaas-jasypt.xml
deleted file mode 100644
index e74ee76..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/resources/OSGI-INF/blueprint/karaf-jaas-jasypt.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/jaas/jasypt/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/jaas/jasypt/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index d191ded..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,26 +0,0 @@
-\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.3.x/jaas/jasypt/src/main/resources/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd b/karaf-2.3.x/jaas/jasypt/src/main/resources/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd
deleted file mode 100644
index f5e6921..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/main/resources/org/apache/karaf/jaas/jasypt/handler/karaf-jasypt-1.0.0.xsd
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholderTest.java b/karaf-2.3.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholderTest.java
deleted file mode 100644
index 0e7c274..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/handler/EncryptablePropertyPlaceholderTest.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  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.3.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionTest.java b/karaf-2.3.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionTest.java
deleted file mode 100644
index a118ef9..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/test/java/org/apache/karaf/jaas/jasypt/impl/JasyptEncryptionTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  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.3.x/jaas/jasypt/src/test/resources/log4j.properties b/karaf-2.3.x/jaas/jasypt/src/test/resources/log4j.properties
deleted file mode 100644
index e1cbdd1..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-## ---------------------------------------------------------------------------
-## Licensed to the Apache Software Foundation (ASF) under one or more
-## contributor license agreements.  See the NOTICE file distributed with
-## this work for additional information regarding copyright ownership.
-## The ASF licenses this file to You under the Apache License, Version 2.0
-## (the "License"); you may not use this file except in compliance with
-## the License.  You may obtain a copy of the License at
-##
-## http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing, software
-## distributed under the License is distributed on an "AS IS" BASIS,
-## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-## See the License for the specific language governing permissions and
-## limitations under the License.
-## ---------------------------------------------------------------------------
-
-#
-# The logging properties used during tests..
-#
-log4j.rootLogger=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.3.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/config-adminTest.xml b/karaf-2.3.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/config-adminTest.xml
deleted file mode 100644
index a0f6619..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/config-adminTest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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"
-        xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0">
-
-    <cm:property-placeholder persistent-id="encrypt.config" update-strategy="reload" >
-        <cm:default-properties>
-            <cm:property name="encoded" value="ENC(${foo})"/>
-        </cm:default-properties>
-    </cm: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>
-
-</blueprint>
\ No newline at end of file
diff --git a/karaf-2.3.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/test.xml b/karaf-2.3.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/test.xml
deleted file mode 100644
index 5829d63..0000000
--- a/karaf-2.3.x/jaas/jasypt/src/test/resources/org/apache/karaf/jaas/jasypt/handler/test.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<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.3.x/jaas/modules/NOTICE b/karaf-2.3.x/jaas/modules/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/jaas/modules/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/jaas/modules/pom.xml b/karaf-2.3.x/jaas/modules/pom.xml
deleted file mode 100644
index 18fdd1c..0000000
--- a/karaf-2.3.x/jaas/modules/pom.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.utils</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.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>
-                            javax.net,
-                            org.apache.karaf.jaas.config,
-                            org.apache.aries.blueprint.ext,
-                            *
-                        </Import-Package>
-                        <Private-Package>
-                            org.apache.felix.utils*
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/AbstractKarafLoginModule.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/AbstractKarafLoginModule.java
deleted file mode 100644
index 17624fc..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/AbstractKarafLoginModule.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  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.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-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.apache.karaf.jaas.modules.encryption.EncryptionSupport;
-import org.apache.karaf.jaas.boot.principal.RolePolicy;
-import org.osgi.framework.BundleContext;
-
-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 {
-        if (principals.isEmpty()) {
-            return false;
-        }
-        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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngine.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngine.java
deleted file mode 100644
index 07a3d0b..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngine.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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;
-
-import org.apache.karaf.jaas.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineFactory.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineFactory.java
deleted file mode 100644
index 22cad9dc..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules;
-
-import java.util.Map;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineService.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineService.java
deleted file mode 100644
index f978cf2..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/BackingEngineService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules;
-
-import org.apache.karaf.jaas.boot.ProxyLoginModule;
-
-import javax.security.auth.login.AppConfigurationEntry;
-import java.util.List;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java
deleted file mode 100644
index 8fe568d..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/Encryption.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java
deleted file mode 100644
index a1438a5..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/EncryptionService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryption.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryption.java
deleted file mode 100644
index 28fcbb0..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryption.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *  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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryptionService.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryptionService.java
deleted file mode 100644
index 505eb6f..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/BasicEncryptionService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/EncryptionSupport.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/EncryptionSupport.java
deleted file mode 100644
index cc2d074..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/encryption/EncryptionSupport.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  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;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
deleted file mode 100644
index 4f93e11..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngine.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules.jdbc;
-
-import org.apache.karaf.jaas.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.apache.karaf.jaas.modules.BackingEngine;
-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;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngineFactory.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngineFactory.java
deleted file mode 100644
index e863d5f..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCBackingEngineFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCLoginModule.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCLoginModule.java
deleted file mode 100644
index b6c9d02..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCLoginModule.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * 
- *  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.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
-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;
-
-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.user";
-
-    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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCUtils.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCUtils.java
deleted file mode 100644
index b68e366..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/jdbc/JDBCUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules.jdbc;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-import javax.naming.InitialContext;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/ldap/LDAPLoginModule.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/ldap/LDAPLoginModule.java
deleted file mode 100644
index 568732a..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/ldap/LDAPLoginModule.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- *
- *  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.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.apache.karaf.jaas.config.KeystoreManager;
-import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/ConfigAdminHolder.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/ConfigAdminHolder.java
deleted file mode 100644
index 417b971..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/ConfigAdminHolder.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java
deleted file mode 100644
index 1491507..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/osgi/OsgiConfigLoginModule.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
deleted file mode 100644
index a8ae1a7..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngine.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules.properties;
-
-import org.apache.karaf.jaas.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.jaas.modules.BackingEngine;
-import org.apache.karaf.jaas.modules.encryption.EncryptionSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-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 = (String) 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>();
-
-        Set<String> userSet = users.keySet();
-
-        for (String userNames : userSet) {
-            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 = (String) 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 = (String) 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 = (String) 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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngineFactory.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngineFactory.java
deleted file mode 100644
index c4d2b6c..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesBackingEngineFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules.properties;
-
-import org.apache.felix.utils.properties.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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
-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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesConverter.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesConverter.java
deleted file mode 100644
index 5be9cfa..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesLoginModule.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesLoginModule.java
deleted file mode 100644
index 10f79cd..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/properties/PropertiesLoginModule.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-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 = (String) 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.");
-            }
-            if (user.contains("\\")) {
-                users.remove(user);
-                user = user.replace("\\", "\\\\");
-            }
-            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.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/publickey/PublickeyCallback.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/publickey/PublickeyCallback.java
deleted file mode 100644
index 8beb517..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/publickey/PublickeyCallback.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules.publickey;
-
-import java.security.PublicKey;
-import javax.security.auth.callback.Callback;
-
-public class PublickeyCallback implements Callback {
-
-    private PublicKey publicKey;
-
-    public PublicKey getPublicKey() {
-        return publicKey;
-    }
-
-    public void setPublicKey(PublicKey publicKey) {
-        this.publicKey = publicKey;
-    }
-
-}
diff --git a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/publickey/PublickeyLoginModule.java b/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/publickey/PublickeyLoginModule.java
deleted file mode 100644
index eb1a99d..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/java/org/apache/karaf/jaas/modules/publickey/PublickeyLoginModule.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.jaas.modules.publickey;
-
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.security.Principal;
-import java.security.PublicKey;
-import java.security.interfaces.DSAPublicKey;
-import java.security.interfaces.RSAKey;
-import java.security.interfaces.RSAPublicKey;
-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.UnsupportedCallbackException;
-import javax.security.auth.login.FailedLoginException;
-import javax.security.auth.login.LoginException;
-
-import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.jaas.modules.AbstractKarafLoginModule;
-import org.apache.karaf.jaas.boot.principal.RolePrincipal;
-import org.apache.karaf.jaas.boot.principal.UserPrincipal;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.apache.karaf.jaas.modules.encryption.BasicEncryption.base64Encode;
-
-public class PublickeyLoginModule extends AbstractKarafLoginModule {
-
-    private final Logger LOG = LoggerFactory.getLogger(PublickeyLoginModule.class);
-
-    private static final String USERS_FILE = "users";
-
-    private String usersFile;
-
-    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
-        super.initialize(subject, callbackHandler, options);
-        usersFile = (String) options.get(USERS_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 PublickeyCallback();
-        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();
-        if (user == null) {
-            throw new FailedLoginException("Unable to retrieve user name");
-        }
-        PublicKey key = ((PublickeyCallback) callbacks[1]).getPublicKey();
-        if (key == null) {
-            throw new FailedLoginException("Unable to retrieve public key");
-        }
-
-        // user infos container read from the users properties file
-        String userInfos = null;
-
-        try {
-            userInfos = (String) 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 storedKey = infos[0];
-
-        // check if the stored password is flagged as encrypted
-        String encryptedKey = getEncryptedPassword(storedKey);
-        if (!storedKey.equals(encryptedKey)) {
-            if (debug) {
-                LOG.debug("The key isn't flagged as encrypted, encrypt it.");
-            }
-            if (debug) {
-                LOG.debug("Rebuild the user informations string.");
-            }
-            userInfos = encryptedKey + ",";
-            for (int i = 2; 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);
-            }
-            storedKey = encryptedKey;
-        }
-
-        // check the provided password
-        if (!checkPassword(getString(key), storedKey)) {
-            if (!this.detailedLoginExcepion) {
-                throw new FailedLoginException("login failed");
-            } else {
-                throw new FailedLoginException("Public key 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;
-    }
-
-    private String getString(PublicKey key) throws FailedLoginException {
-        try {
-            if (key instanceof DSAPublicKey) {
-                DSAPublicKey dsa = (DSAPublicKey) key;
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                DataOutputStream dos = new DataOutputStream(baos);
-                write(dos, "ssh-dss");
-                write(dos, dsa.getParams().getP());
-                write(dos, dsa.getParams().getQ());
-                write(dos, dsa.getParams().getG());
-                write(dos, dsa.getY());
-                dos.close();
-                return base64Encode(baos.toByteArray());
-            } else if (key instanceof RSAKey) {
-                RSAPublicKey rsa = (RSAPublicKey) key;
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                DataOutputStream dos = new DataOutputStream(baos);
-                write(dos, "ssh-rsa");
-                write(dos, rsa.getPublicExponent());
-                write(dos, rsa.getModulus());
-                dos.close();
-                return base64Encode(baos.toByteArray());
-            } else {
-                throw new FailedLoginException("Unsupported key type " + key.getClass().toString());
-            }
-        } catch (IOException e) {
-            throw new FailedLoginException("Unable to check public key");
-        }
-    }
-
-    private void write(DataOutputStream dos, BigInteger integer) throws IOException {
-        byte[] data = integer.toByteArray();
-        dos.writeInt(data.length);
-        dos.write(data, 0, data.length);
-    }
-
-    private void write(DataOutputStream dos, String str) throws IOException {
-        byte[] data = str.getBytes();
-        dos.writeInt(data.length);
-        dos.write(data);
-    }
-
-    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.3.x/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml b/karaf-2.3.x/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml
deleted file mode 100644
index ecc899f..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/resources/OSGI-INF/blueprint/karaf-jaas-module.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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="sufficient">
-            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:module className="org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule" flags="sufficient">
-            users = $[karaf.base]/etc/keys.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.3.x/jaas/modules/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/jaas/modules/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index f65cb6e..0000000
--- a/karaf-2.3.x/jaas/modules/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,20 +0,0 @@
-\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.3.x/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/properties/PropertiesConverterTest.java b/karaf-2.3.x/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/properties/PropertiesConverterTest.java
deleted file mode 100644
index 0156ef8..0000000
--- a/karaf-2.3.x/jaas/modules/src/test/java/org/apache/karaf/jaas/modules/properties/PropertiesConverterTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/jaas/pom.xml b/karaf-2.3.x/jaas/pom.xml
deleted file mode 100644
index 7ff6771..0000000
--- a/karaf-2.3.x/jaas/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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.3.1</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.3.x/main/NOTICE b/karaf-2.3.x/main/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/main/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/main/pom.xml b/karaf-2.3.x/main/pom.xml
deleted file mode 100644
index c64ce56..0000000
--- a/karaf-2.3.x/main/pom.xml
+++ /dev/null
@@ -1,241 +0,0 @@
-<?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.3.1</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*,
-                            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.3.x/main/src/main/java/org/apache/karaf/main/Bootstrap.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Bootstrap.java
deleted file mode 100644
index 77c895d..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Bootstrap.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/java/org/apache/karaf/main/BootstrapLogManager.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/BootstrapLogManager.java
deleted file mode 100644
index 5bf0b73..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/BootstrapLogManager.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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 () throws Exception {
-        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);
-        }
-
-
-        return new BootstrapLogManager.SimpleFileHandler(log);
-
-    }
-
-    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.3.x/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java
deleted file mode 100644
index 452fbe6..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/DefaultJDBCLock.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.
- */
-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) {
-        try {
-            LOG.addHandler(BootstrapLogManager.getDefaultHandler());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        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.3.x/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java
deleted file mode 100644
index cd0fbe1..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/DerbyJDBCLock.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.
- */
-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.3.x/main/src/main/java/org/apache/karaf/main/Lock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Lock.java
deleted file mode 100644
index 6c2d84f..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Lock.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/java/org/apache/karaf/main/Main.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java
deleted file mode 100644
index 45ed309..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Main.java
+++ /dev/null
@@ -1,1570 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.jar.Manifest;
-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.BundleActivator;
-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.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
-
-    public static final String KARAF_ACTIVATOR = "Karaf-Activator";
-
-    public static final String SECURITY_PROVIDERS = "org.apache.karaf.security.providers";
-
-    public static final String KARAF_STARTUP_MESSAGE = "karaf.startup.message";
-    
-    private static final String KARAF_DELAY_CONSOLE = "karaf.delay.console";
-
-	public static final String OVERRIDE_PREFIX = "karaf.override.";
-
-    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;
-    private List<BundleActivator> karafActivators = new ArrayList<BundleActivator>();
-    private Object startLevelLock = new Object();
-    private StartLevelListener startLevelListener;
-
-    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);
-
-        boolean delayConsoleStart = Boolean.parseBoolean(configProps.getProperty(KARAF_DELAY_CONSOLE, "false"));
-        System.setProperty(KARAF_DELAY_CONSOLE, new Boolean(delayConsoleStart).toString());
-
-        if (delayConsoleStart) {
-        	System.out.println(configProps.getProperty(KARAF_STARTUP_MESSAGE, "Apache Karaf starting up. Press Enter to open shell now ..."));
-        }
-
-        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));
-        System.setProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL, Integer.toString(this.defaultStartLevel));
-        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());
-
-        startLevelListener = new StartLevelListener(startLevelLock);
-        framework.getBundleContext().addFrameworkListener(startLevelListener);
-
-        framework.start();
-        // Start custom activators
-        startKarafActivators(classLoader);
-        
-        if (delayConsoleStart) {
-            // Progress bar
-            new StartupListener(framework.getBundleContext());
-        }
-        // Start lock monitor
-        new Thread() {
-            public void run() {
-                lock(configProps);
-            }
-        }.start();
-    }
-
-    private void startKarafActivators(ClassLoader classLoader) throws IOException {
-        Enumeration<URL> urls = classLoader.getResources("META-INF/MANIFEST.MF");
-        while (urls != null && urls.hasMoreElements()) {
-            URL url = urls.nextElement();
-            String className = null;
-            InputStream is = url.openStream();
-            try {
-                Manifest mf = new Manifest(is);
-                className = mf.getMainAttributes().getValue(KARAF_ACTIVATOR);
-                if (className != null) {
-                    BundleActivator activator = (BundleActivator) classLoader.loadClass(className).newInstance();
-                    activator.start(framework.getBundleContext());
-                    karafActivators.add(activator);
-                }
-            } catch (Throwable e) {
-                if (className != null) {
-                    System.err.println("Error starting karaf activator " + className + ": " + e.getMessage());
-                    LOG.log(Level.WARNING, "Error starting karaf activator " + className + " from url " + url, e);
-                }
-            } finally {
-                if (is != null) {
-                    try {
-                        is.close();
-                    } catch (IOException e) {
-                    }
-                }
-            }
-        }
-    }
-
-    private void stopKarafActivators() {
-        for (BundleActivator activator : karafActivators) {
-            try {
-                activator.stop(framework.getBundleContext());
-            } catch (Throwable e) {
-                LOG.log(Level.WARNING, "Error stopping karaf activator " + activator.getClass().getName(), e);
-            }
-        }
-    }
-
-    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) {
-                    stopKarafActivators();
-                    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 (IOException ioe){
-                main.destroy();
-                main.setExitCode(-1);
-                System.err.println("Karaf can't startup, make sure the log file can be accessed and written by the user starting Karaf : " + ioe.getMessage());
-            } 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 occurred 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(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"));
-
-                    // update root name if karaf.name got updated since the last container start
-                    if (isRoot) {
-                        for (int i = 0; i < count; i++) {
-                            //looking for root instance entry
-                            String name = props.getProperty("item." + i + ".name");
-                            boolean root = Boolean.parseBoolean(props.getProperty("item." + i + ".root", "false"));
-                            if (name != null && root && !name.equals(instanceName)) {
-                                props.setProperty("item." + i + ".name", instanceName);
-                            }
-                        }
-                    }
-
-                    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();
-			if (name.startsWith(OVERRIDE_PREFIX)) {
-				String overrideName = name.substring(OVERRIDE_PREFIX.length());
-				String value = props.getProperty(name);
-				System.setProperty(overrideName, substVars(value, name, null, props));
-			} else {
-				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, reducing start level to " + lockStartLevel);
-                    synchronized (startLevelLock) {
-                        setStartLevel(lockStartLevel);
-                        
-                        // we have to wait for the start level to be reduced here because
-                        // if the lock is regained before the start level is fully changed
-                        // things may not come up as expected
-                        LOG.fine("Waiting for start level change to complete...");
-                        startLevelLock.wait(shutdownTimeout);
-                    }
-                }
-            } 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();
-        }
-    }
-
-    public Lock getLock() {
-        return lock;
-    }
-
-    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.3.x/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java
deleted file mode 100644
index 780708f..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/MySQLJDBCLock.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.
- */
-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.3.x/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java
deleted file mode 100644
index 699a025..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/OracleJDBCLock.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.
- */
-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.3.x/main/src/main/java/org/apache/karaf/main/PostgreSQLJDBCLock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/PostgreSQLJDBCLock.java
deleted file mode 100644
index 2ce7478..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/PostgreSQLJDBCLock.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.main;
-
-import java.util.Properties;
-
-/**
- * Represents an exclusive lock on a database,
- * used to avoid multiple Karaf instances attempting
- * to become master.
- */
-public class PostgreSQLJDBCLock extends DefaultJDBCLock {
-
-    public PostgreSQLJDBCLock(Properties props) {
-        super(props);
-    }
-
-    @Override
-    boolean aquireLock() {
-        this.timeout = 0;
-
-        return super.aquireLock();
-    }
-}
diff --git a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/ShutdownCallback.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/ShutdownCallback.java
deleted file mode 100644
index bd0bf30..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/ShutdownCallback.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java
deleted file mode 100644
index 8f21dc8..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/SimpleFileLock.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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 ioe){
-            throw new RuntimeException("Karaf can't startup, make sure the log file can be accessed and written by the user starting Karaf : " + ioe.getMessage());
-        } catch (Exception 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.3.x/main/src/main/java/org/apache/karaf/main/StartLevelListener.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StartLevelListener.java
deleted file mode 100644
index 5a09152..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StartLevelListener.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.main;
-
-import java.util.logging.Logger;
-
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
-
-public class StartLevelListener implements FrameworkListener {
-
-    Logger LOG = Logger.getLogger(this.getClass().getName());
-    private Object startLevelLock;
-    
-    public StartLevelListener(Object startLevelLock) {
-        this.startLevelLock = startLevelLock;
-    }
-
-    public void frameworkEvent(FrameworkEvent event) {
-        if (event.getType() == FrameworkEvent.STARTLEVEL_CHANGED) {
-            synchronized (startLevelLock) {
-                LOG.fine("Start level change complete.");
-                startLevelLock.notifyAll();
-            }
-        }
-    }
-}
diff --git a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StartupListener.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StartupListener.java
deleted file mode 100644
index 3d4321f..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StartupListener.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.main;
-
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
-import org.osgi.framework.SynchronousBundleListener;
-import org.osgi.framework.startlevel.FrameworkStartLevel;
-
-/**
- * Watches the startup of the framework and displays a progress bar of the number of bundles started / total.
- * The listener will remove itself after the desired start level is reached or the system property karaf.console.started is set to 
- * true. 
- */
-class StartupListener implements FrameworkListener, SynchronousBundleListener {
-    private static final String SYSTEM_PROP_KARAF_CONSOLE_STARTED = "karaf.console.started";
-    private int currentPercentage;
-
-	private final BundleContext context;
-    StartupListener(BundleContext context) {
-        this.context = context;
-        this.currentPercentage = 0;
-        context.addBundleListener(this);
-        context.addFrameworkListener(this);
-    }
-    public synchronized void bundleChanged(BundleEvent bundleEvent) {
-        Bundle[] bundles = context.getBundles();
-        int numActive = 0;
-        int numBundles = bundles.length;
-        for (Bundle bundle : bundles) {
-            if (bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null) {
-                numBundles--;
-            } else if (bundle.getState() == Bundle.ACTIVE) {
-                numActive ++;
-            }
-        }
-        boolean started = Boolean.parseBoolean(System.getProperty(SYSTEM_PROP_KARAF_CONSOLE_STARTED, "false"));
-        if (!started) {
-            showProgressBar(numActive, numBundles);
-        }
-    }
-    public synchronized void frameworkEvent(FrameworkEvent frameworkEvent) {
-        if (frameworkEvent.getType() == FrameworkEvent.STARTLEVEL_CHANGED) {
-            int defStartLevel = Integer.parseInt(System.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
-            int startLevel = ((FrameworkStartLevel) context.getBundle(0).adapt(FrameworkStartLevel.class)).getStartLevel();
-            if (startLevel >= defStartLevel) {
-                context.removeBundleListener(this);
-                context.removeFrameworkListener(this);
-            }
-        }
-    }
-    public void showProgressBar(int done, int total) {
-        // progress bar can only have 72 characters so that 80 char wide terminal will display properly
-        int percent = (done * 100) / total;
-        int scaledPercent = (int) (72.0 * (percent / 100.0));
-        // Make sure we do not go backwards with percentage
-        if (percent > currentPercentage) {
-            currentPercentage = percent;
-            StringBuilder sb = new StringBuilder();
-            sb.append(String.format("\r%3d%% [", percent));
-            for (int i = 0; i < 72; i++) {
-                if (i < scaledPercent) {
-                    sb.append('=');
-                } else if (i == scaledPercent) {
-                    sb.append('>');
-                } else {
-                    sb.append(' ');
-                }
-            }
-            sb.append(']');
-            System.out.print(sb.toString());
-            System.out.flush();
-        }
-        if (done == total) {
-            System.out.println();
-        }
-    }
-}
diff --git a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Statements.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Statements.java
deleted file mode 100644
index 04623e4..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Statements.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/java/org/apache/karaf/main/Stop.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Stop.java
deleted file mode 100644
index 2370b20..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Stop.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/java/org/apache/karaf/main/StringMap.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StringMap.java
deleted file mode 100644
index c14f8ea..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/StringMap.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/java/org/apache/karaf/main/Utils.java b/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Utils.java
deleted file mode 100644
index f3354a9..0000000
--- a/karaf-2.3.x/main/src/main/java/org/apache/karaf/main/Utils.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/main/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 9a02230..0000000
--- a/karaf-2.3.x/main/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/main/src/main/resources/config.properties b/karaf-2.3.x/main/src/main/resources/config.properties
deleted file mode 100644
index 6fe20f9..0000000
--- a/karaf-2.3.x/main/src/main/resources/config.properties
+++ /dev/null
@@ -1,529 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-#
-# 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.3.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java
deleted file mode 100644
index c57825e..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java
deleted file mode 100644
index 6589860..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/BaseJDBCLockTest.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java
deleted file mode 100644
index 7620528..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java
deleted file mode 100644
index 08b2508..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DefaultJDBCLockTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java
deleted file mode 100644
index 61a0429..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java
deleted file mode 100644
index f041214..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/DerbyJDBCLockTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/MainLockingTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MainLockingTest.java
deleted file mode 100644
index c79dbc9..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MainLockingTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.main;
-
-import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.withBnd;
-
-import java.io.File;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.launch.Framework;
-import org.osgi.service.startlevel.StartLevel;
-
-public class MainLockingTest {
-    
-    @Test
-    public void testLostMasterLock() 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");
-        
-        // enable locking
-        System.setProperty("karaf.lock","true");
-        System.setProperty("karaf.lock.delay","1000");
-        System.setProperty("karaf.lock.class","org.apache.karaf.main.MockLock");
-
-        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();       
-        
-        BundleContext ctx = framework.getBundleContext();
-        ServiceReference[] refs = ctx.getServiceReferences(StartLevel.class.getName(), null);
-        StartLevel sl = (StartLevel) ctx.getService(refs[0]);
-
-        MockLock lock = (MockLock) main.getLock();
-
-        Assert.assertEquals(100, sl.getStartLevel());       
-
-        // simulate losing a lock
-        lock.setIsAlive(false);
-        lock.setLock(false);
-        
-        // lets wait until the start level change is complete
-        lock.waitForLock();
-        Assert.assertEquals(1, sl.getStartLevel());
-
-        Thread.sleep(1000);
-        
-        // get lock back
-        lock.setIsAlive(true);
-        lock.setLock(true);
-
-        // wait for loop to recognize lock
-        lock.waitForLock();
-        
-        Thread.sleep(1000);
-        
-        // exit framework + lock loop
-        main.destroy();
-    }    
-}
diff --git a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MainStartTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MainStartTest.java
deleted file mode 100644
index 6ccfef8..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MainStartTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/MockLock.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MockLock.java
deleted file mode 100644
index 9e67324..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MockLock.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.apache.karaf.main;
-
-import java.util.Properties;
-import java.util.logging.Logger;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-public class MockLock implements Lock {
-
-    private boolean lock = true;
-    private boolean isAlive = true; 
-    private static final Logger LOG = Logger.getLogger(MockLock.class.getName());
-    private Object lockLock = new Object();
-    
-    public MockLock(Properties props) {
-    }
-    
-    public boolean lock() throws Exception {
-        synchronized (lockLock) {
-            LOG.fine("lock = " + lock);        
-            lockLock.notifyAll();
-        }
-        return lock;
-    }
-
-    public void release() throws Exception {
-        LOG.fine("release");
-    }
-
-    public boolean isAlive() throws Exception {
-        LOG.fine("isAlive = " + isAlive);
-        return isAlive;
-    }
-
-    public void setLock(boolean lock) {
-        this.lock = lock;
-    }
-
-    public void setIsAlive(boolean isAlive) {
-        this.isAlive = isAlive;
-    }
-    
-    public void waitForLock() throws InterruptedException {
-        synchronized (lockLock) {
-            lockLock.wait(1000 * 60 * 5);
-        }
-    }
-}
diff --git a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java
deleted file mode 100644
index db5409f..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java
deleted file mode 100644
index 021c82a..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/MySQLJDBCLockTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java
deleted file mode 100644
index cd2c55b..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java
deleted file mode 100644
index fa27edf..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/OracleJDBCLockTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/PostgreSQLJDBCLockIntegrationTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/PostgreSQLJDBCLockIntegrationTest.java
deleted file mode 100644
index c374e3e..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/PostgreSQLJDBCLockIntegrationTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.main;
-
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.Properties;
-
-import static org.junit.Assert.assertTrue;
-
-
-@Ignore
-public class PostgreSQLJDBCLockIntegrationTest extends BaseJDBCLockIntegrationTest {
-
-    @Before
-    @Override
-    public void setUp() throws Exception {
-        password = "secret";
-        driver = "org.postgresql.Driver";
-        url = "jdbc:postgresql://127.0.0.1:5432/test";
-        
-        super.setUp();
-    }
-    
-    @Override
-    PostgreSQLJDBCLock createLock(Properties props) {
-        return new PostgreSQLJDBCLock(props);
-    }
-    
-    @Test
-    public void initShouldCreateTheDatabaseIfItNotExists() throws Exception {
-        String database = "test" + System.currentTimeMillis();
-        url = "jdbc:postgresql://127.0.0.1:5432/" + 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.3.x/main/src/test/java/org/apache/karaf/main/PostgreSQLJDBCLockTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/PostgreSQLJDBCLockTest.java
deleted file mode 100644
index 7f72f60..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/PostgreSQLJDBCLockTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.main;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Properties;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-
-public class PostgreSQLJDBCLockTest extends BaseJDBCLockTest {
-    
-    @Before
-    @Override
-    public void setUp() throws Exception {
-        password = "secret";
-        driver = "org.postgresql.Driver";
-        url = "jdbc:postgresql://127.0.0.1:5432/test";
-        
-        super.setUp();
-    }
-    
-    DefaultJDBCLock createLock(Properties props) {
-        return new PostgreSQLJDBCLock(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
-    public void createConnectionShouldConcatinateOptionsCorrect() {
-        props.put("karaf.lock.jdbc.url", this.url + ";dataEncryption=false");
-        
-        lock = new PostgreSQLJDBCLock(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(0);
-        expect(preparedStatement.execute()).andReturn(true);
-        preparedStatement.close();
-        expect(connection.isClosed()).andReturn(false);
-        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
-        preparedStatement.setQueryTimeout(0);
-        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
-    @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(0);
-        expect(preparedStatement.execute()).andReturn(true);
-        preparedStatement.close();
-        expect(connection.isClosed()).andReturn(false);
-        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
-        preparedStatement.setQueryTimeout(0);
-        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
-    @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(0);
-        expect(preparedStatement.execute()).andReturn(true);
-        preparedStatement.close();
-        expect(connection.isClosed()).andReturn(false);
-        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
-        preparedStatement.setQueryTimeout(0);
-        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
-    @Override
-    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(0);
-        expect(preparedStatement.execute()).andReturn(true);
-        preparedStatement.close();
-        expect(connection.isClosed()).andReturn(false);
-        expect(connection.prepareStatement("UPDATE " + tableName + " SET MOMENT = 1")).andReturn(preparedStatement);
-        preparedStatement.setQueryTimeout(0);
-        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.3.x/main/src/test/java/org/apache/karaf/main/StatementsTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/StatementsTest.java
deleted file mode 100644
index b03e1d3..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/StatementsTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/StringMapTest.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/StringMapTest.java
deleted file mode 100644
index f3c2933..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/StringMapTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/java/org/apache/karaf/main/TimeoutShutdownActivator.java b/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/TimeoutShutdownActivator.java
deleted file mode 100644
index 32d73c2..0000000
--- a/karaf-2.3.x/main/src/test/java/org/apache/karaf/main/TimeoutShutdownActivator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/main/src/test/resources/foo b/karaf-2.3.x/main/src/test/resources/foo
deleted file mode 100644
index e69de29..0000000
--- a/karaf-2.3.x/main/src/test/resources/foo
+++ /dev/null
diff --git a/karaf-2.3.x/main/src/test/resources/test-karaf-home/bundles/pax-url-mvn.jar b/karaf-2.3.x/main/src/test/resources/test-karaf-home/bundles/pax-url-mvn.jar
deleted file mode 100755
index 54d77bd..0000000
--- a/karaf-2.3.x/main/src/test/resources/test-karaf-home/bundles/pax-url-mvn.jar
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/main/src/test/resources/test-karaf-home/etc/config.properties b/karaf-2.3.x/main/src/test/resources/test-karaf-home/etc/config.properties
deleted file mode 100755
index 4089252..0000000
--- a/karaf-2.3.x/main/src/test/resources/test-karaf-home/etc/config.properties
+++ /dev/null
@@ -1,43 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.3.x/main/src/test/resources/test-karaf-home/etc/startup.properties b/karaf-2.3.x/main/src/test/resources/test-karaf-home/etc/startup.properties
deleted file mode 100644
index f894430..0000000
--- a/karaf-2.3.x/main/src/test/resources/test-karaf-home/etc/startup.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-# This file allows you to control the start level of each bundle.
-#
-
-#
-# Startup core services like logging
-#
diff --git a/karaf-2.3.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.3.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
deleted file mode 100755
index 41c3821..0000000
--- a/karaf-2.3.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
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/management/mbeans/bundles/NOTICE b/karaf-2.3.x/management/mbeans/bundles/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/bundles/pom.xml b/karaf-2.3.x/management/mbeans/bundles/pom.xml
deleted file mode 100644
index 50fb6b2..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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.3.1</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.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java b/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
deleted file mode 100644
index b31e27c..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/BundlesMBean.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.bundles;
-
-import javax.management.openmbean.TabularData;
-
-/**
- * Bundles MBean.
- */
-public interface BundlesMBean {
-
-    /**
-     * List the bundles.
-     *
-     * @return the list of bundles.
-     * @throws Exception
-     */
-    TabularData getBundles() throws Exception;
-
-    /**
-     * @deprecated use getBundles() instead.
-     */
-    TabularData list() throws Exception;
-
-    /**
-     * Get the start level of a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @return the start level of the bundle.
-     * @throws Exception
-     */
-    int getStartLevel(String bundleId) throws Exception;
-
-    /**
-     * Set the start level of a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @param bundleStartLevel the new start level of the bundle.
-     * @throws Exception
-     */
-    void setStartLevel(String bundleId, int bundleStartLevel) throws Exception;
-
-    /**
-     * Refresh all bundles.
-     *
-     * @throws Exception
-     */
-    void refresh() throws Exception;
-
-    /**
-     * Refresh a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void refresh(String bundleId) throws Exception;
-
-    /**
-     * Update a given bundle from its location.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void update(String bundleId) throws Exception;
-
-    /**
-     * Update a given bundle from a given location.
-     *
-     * @param bundleId the bundle ID.
-     * @param location the target location.
-     * @throws Exception
-     */
-    void update(String bundleId, String location) throws Exception;
-
-    /**
-     * Resolve the bundle.
-     * @throws Exception
-     */
-    void resolve() throws Exception;
-
-    /**
-     * Resolve a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void resolve(String bundleId) throws Exception;
-
-    /**
-     * Restart the given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void restart(String bundleId) throws Exception;
-
-    /**
-     * Install a bundle at a given URL.
-     *
-     * @param url the bundle URL.
-     * @return the bundle ID.
-     * @throws Exception
-     */
-    long install(String url) throws Exception;
-
-    /**
-     * Install a bundle at a given URL and start the bundle.
-     *
-     * @param url the bundle URL.
-     * @param start true to start the bundle, false else.
-     * @return the bundle ID.
-     * @throws Exception
-     */
-    long install(String url, boolean start) throws Exception;
-
-    /**
-     * Start a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void start(String bundleId) throws Exception;
-
-    /**
-     * Stop a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void stop(String bundleId) throws Exception;
-
-    /**
-     * Uninstall a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @throws Exception
-     */
-    void uninstall(String bundleId) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java b/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
deleted file mode 100644
index d60bafd..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesMBeanImpl.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 getBundles() 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;
-    }
-
-    /**
-     * @deprecated use getBundles() instead.
-     */
-    public TabularData list() throws Exception {
-        return getBundles();
-    }
-
-    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.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java b/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java
deleted file mode 100644
index 91b222e..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/src/main/java/org/apache/karaf/management/mbeans/bundles/internal/BundlesSelector.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/management/mbeans/bundles/src/main/resources/OSGI-INF/blueprint/bundles-management.xml b/karaf-2.3.x/management/mbeans/bundles/src/main/resources/OSGI-INF/blueprint/bundles-management.xml
deleted file mode 100644
index dfef065..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/src/main/resources/OSGI-INF/blueprint/bundles-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/bundles/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/bundles/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index bc836a0..0000000
--- a/karaf-2.3.x/management/mbeans/bundles/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,32 +0,0 @@
-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.3.x/management/mbeans/config/NOTICE b/karaf-2.3.x/management/mbeans/config/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/config/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/config/pom.xml b/karaf-2.3.x/management/mbeans/config/pom.xml
deleted file mode 100644
index 83eab2e..0000000
--- a/karaf-2.3.x/management/mbeans/config/pom.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?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.3.1</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>
diff --git a/karaf-2.3.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/ConfigMBean.java b/karaf-2.3.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/ConfigMBean.java
deleted file mode 100644
index cb7bf86..0000000
--- a/karaf-2.3.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/ConfigMBean.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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 configuration PIDs.
-     * @throws Exception
-     */
-    List<String> getConfigs() throws Exception;
-
-    /**
-     * @deprecated use getConfigs() instead.
-     */
-    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 given configuration PID.
-     *
-     * @param pid the configuration PID.
-     * @return the list of properties associated to the PID.
-     * @throws Exception
-     */
-    Map<String, String> listProperties(String pid) throws Exception;
-
-    /**
-     * @deprecated used listProperties() instead.
-     */
-    Map<String, String> proplist(String pid) throws Exception;
-
-    /**
-     * Delete the configuration property identified by the given key.
-     *
-     * @param pid the configuration PID.
-     * @param key the property key.
-     * @throws Exception
-     */
-    void deleteProperty(String pid, String key) throws Exception;
-
-    /**
-     * @deprecated use deleteProperty() instead.
-     */
-    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 appendProperty(String pid, String key, String value) throws Exception;
-
-    /**
-     * @deprecated use appendProperty() instead.
-     */
-    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 setProperty(String pid, String key, String value) throws Exception;
-
-    /**
-     * @deprecated use setProperty() instead.
-     */
-    void propset(String pid, String key, String value) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java b/karaf-2.3.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
deleted file mode 100644
index 4433519..0000000
--- a/karaf-2.3.x/management/mbeans/config/src/main/java/org/apache/karaf/management/mbeans/config/internal/ConfigMBeanImpl.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * 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> getConfigs() 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;
-    }
-
-    /**
-     * @deprecated used getConfigs() instead.
-     */
-    public List<String> list() throws Exception {
-        return getConfigs();
-    }
-
-    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> listProperties(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;
-    }
-
-    /**
-     * @deprecated use listProperties() instead.
-     */
-    public Map<String, String> proplist(String pid) throws Exception {
-        return listProperties(pid);
-    }
-
-    public void deleteProperty(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);
-    }
-
-    /**
-     * @deprecated use deleteProperty() instead.
-     */
-    public void propdel(String pid, String key) throws Exception {
-        deleteProperty(pid, key);
-    }
-
-    public void appendProperty(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);
-    }
-
-    /**
-     * @deprecated use appendProperty() instead.
-     */
-    public void propappend(String pid, String key, String value) throws Exception {
-        appendProperty(pid, key, value);
-    }
-
-    public void setProperty(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);
-    }
-
-    /**
-     * @deprecated use setProperty() instead.
-     */
-    public void propset(String pid, String key, String value) throws Exception {
-        setProperty(pid, key, value);
-    }
-
-    /**
-     * 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.3.x/management/mbeans/config/src/main/resources/OSGI-INF/blueprint/config-management.xml b/karaf-2.3.x/management/mbeans/config/src/main/resources/OSGI-INF/blueprint/config-management.xml
deleted file mode 100644
index 9c4bdbe..0000000
--- a/karaf-2.3.x/management/mbeans/config/src/main/resources/OSGI-INF/blueprint/config-management.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/config/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/config/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 19c54db..0000000
--- a/karaf-2.3.x/management/mbeans/config/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,25 +0,0 @@
-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.3.x/management/mbeans/dev/NOTICE b/karaf-2.3.x/management/mbeans/dev/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/dev/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/dev/pom.xml b/karaf-2.3.x/management/mbeans/dev/pom.xml
deleted file mode 100644
index 821fee6..0000000
--- a/karaf-2.3.x/management/mbeans/dev/pom.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?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.3.1</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.3.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/DevMBean.java b/karaf-2.3.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/DevMBean.java
deleted file mode 100644
index d886019..0000000
--- a/karaf-2.3.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/DevMBean.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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;
-
-/**
- * MBean providing dev actions.
- */
-public interface DevMBean {
-
-    /**
-     * Get the current OSGi framework in use.
-     *
-     * @deprecated use SystemMBean#getFramework() instead.
-     * @return the name of the OSGi framework in use.
-     * @throws Exception
-     */
-    String framework() throws Exception;
-
-    /**
-     * OSGi framework options.
-     *
-     * @deprecated use SystemMBean#setFrameworkDebug() instead.
-     * @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.
-     *
-     * @deprecated use SystemMBean#reboot() instead.
-     * @param clean if true, Karaf is cleanup, false else.
-     * @throws Exception
-     */
-    void restart(boolean clean) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/internal/DevMBeanImpl.java b/karaf-2.3.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/internal/DevMBeanImpl.java
deleted file mode 100644
index 65c3194..0000000
--- a/karaf-2.3.x/management/mbeans/dev/src/main/java/org/apache/karaf/management/mbeans/dev/internal/DevMBeanImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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) {
-            // switch the framework is use
-            if (!framework.equalsIgnoreCase("felix") && !framework.equalsIgnoreCase("equinox")) {
-                throw new IllegalArgumentException("Unsupported framework " + framework);
-            }
-            properties.put("karaf.framework", framework.toLowerCase());
-        }
-        if (debug) {
-            properties.put("felix.log.level", "4");
-            properties.put("osgi.debug", "etc/equinox-debug.properties");
-            // TODO populate the equinox-debug.properties file with the one provided in shell/dev module
-        } else {
-            properties.remove("felix.log.level");
-            properties.remove("osgi.debug");
-        }
-        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.3.x/management/mbeans/dev/src/main/resources/OSGI-INF/blueprint/dev-management.xml b/karaf-2.3.x/management/mbeans/dev/src/main/resources/OSGI-INF/blueprint/dev-management.xml
deleted file mode 100644
index c6e0472..0000000
--- a/karaf-2.3.x/management/mbeans/dev/src/main/resources/OSGI-INF/blueprint/dev-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/dev/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/dev/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 25423ef..0000000
--- a/karaf-2.3.x/management/mbeans/dev/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,20 +0,0 @@
-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.3.x/management/mbeans/log/NOTICE b/karaf-2.3.x/management/mbeans/log/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/log/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/log/pom.xml b/karaf-2.3.x/management/mbeans/log/pom.xml
deleted file mode 100644
index 06f6fbd..0000000
--- a/karaf-2.3.x/management/mbeans/log/pom.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?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.3.1</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>
diff --git a/karaf-2.3.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/LogMBean.java b/karaf-2.3.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/LogMBean.java
deleted file mode 100644
index cc97d4b..0000000
--- a/karaf-2.3.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/LogMBean.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.log;
-
-import java.util.List;
-
-/**
- * Log MBean.
- */
-public interface LogMBean {
-
-    /**
-     * Set the level of the root logger.
-     *
-     * @param level the new level value (INFO, ERROR, etc).
-     * @throws Exception
-     */
-    void setLevel(String level) throws Exception;
-
-    /**
-     * Set the level of a given logger.
-     *
-     * @param level the new level value (INFO, ERROR, etc).
-     * @param logger the target logger where to change the level.
-     * @throws Exception
-     */
-    void setLevel(String level, String logger) throws Exception;
-
-    /**
-     * Get the level of the root logger.
-     *
-     * @return the value of the level (INFO, ERROR, etc).
-     * @throws Exception
-     */
-    String getLevel() throws Exception;
-
-    /**
-     * Get the level of a given logger.
-     *
-     * @param logger the target logger.
-     * @return the level of the logger.
-     * @throws Exception
-     */
-    String getLevel(String logger) throws Exception;
-
-    /**
-     * @deprecated please, use setLevel() instead.
-     */
-    void set(String level) throws Exception;
-
-    /**
-     * @deprecated please, use setLevel() instead.
-     */
-    void set(String level, String logger) throws Exception;
-
-    /**
-     * @deprecated please, use getLevel() instead.
-     */
-    String get() throws Exception;
-
-    /**
-     * @deprecated please, use getLevel() instead.
-     */
-    String get(String logger) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java b/karaf-2.3.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java
deleted file mode 100644
index 24ddcd0..0000000
--- a/karaf-2.3.x/management/mbeans/log/src/main/java/org/apache/karaf/management/mbeans/log/internal/LogMBeanImpl.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 setLevel(String level) throws Exception {
-        setLevel(level, null);
-    }
-
-    public void setLevel(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 getLevel() throws Exception {
-        return getLevel(null);
-    }
-
-    public String getLevel(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 = getLevelValue(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;
-    }
-
-    public void set(String level) throws Exception {
-        setLevel(level);
-    }
-
-    public void set(String logger, String level) throws Exception {
-        setLevel(logger, level);
-    }
-
-    public String get() throws Exception {
-        return getLevel();
-    }
-
-    public String get(String logger) throws Exception {
-        return getLevel(logger);
-    }
-
-    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 getLevelValue(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.3.x/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml b/karaf-2.3.x/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml
deleted file mode 100644
index edf3a68..0000000
--- a/karaf-2.3.x/management/mbeans/log/src/main/resources/OSGI-INF/blueprint/log-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/log/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/log/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 4550dcc..0000000
--- a/karaf-2.3.x/management/mbeans/log/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,23 +0,0 @@
-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.3.x/management/mbeans/obr/NOTICE b/karaf-2.3.x/management/mbeans/obr/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/obr/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/obr/pom.xml b/karaf-2.3.x/management/mbeans/obr/pom.xml
deleted file mode 100644
index de97c04..0000000
--- a/karaf-2.3.x/management/mbeans/obr/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?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.3.1</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.3.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/ObrMBean.java b/karaf-2.3.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/ObrMBean.java
deleted file mode 100644
index b64bcc0..0000000
--- a/karaf-2.3.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/ObrMBean.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.obr;
-
-import javax.management.openmbean.TabularData;
-import java.util.List;
-
-/**
- * OBR MBean.
- */
-public interface ObrMBean {
-
-    /**
-     * Get the URLs registered in the OBR service.
-     *
-     * @return the list of URLs in the OBR service.
-     * @throws Exception
-     */
-    List<String> getUrls() throws Exception;
-
-    /**
-     * @deprecated use getUrls() instead.
-     */
-    List<String> listUrls() throws Exception;
-
-    /**
-     * Add a new URL in the OBR service.
-     *
-     * @param url the URL to add in the OBR service
-     * @throws Exception
-     */
-    void addUrl(String url) throws Exception;
-
-    /**
-     * Remove an URL from the OBR service.
-     *
-     * @param url the URL to remove from the OBR service.
-     * @throws Exception
-     */
-    void removeUrl(String url) throws Exception;
-
-    /**
-     * Refresh an URL in the OBR service.
-     *
-     * @param url the URL to refresh in the OBR service.
-     * @throws Exception
-     */
-    void refreshUrl(String url) throws Exception;
-
-    /**
-     * Get the bundles available in the OBR service.
-     *
-     * @return the list of bundles available in the OBR service.
-     * @throws Exception
-     */
-    TabularData getBundles() throws Exception;
-
-    /**
-     * @deprecated use getBundles() instead.
-     */
-    TabularData list() throws Exception;
-
-    /**
-     * Deploy a bundle available in the OBR service.
-     *
-     * @param bundle the bundle to deploy.
-     * @throws Exception
-     */
-    void deploy(String bundle) throws Exception;
-
-    /**
-     * Deploy a bundle available in the OBR service and eventually start it.
-     *
-     * @param bundle the bundle to deploy.
-     * @param start true to start the bundle, false else.
-     * @param deployOptional true to deploy optional bundles, false else.
-     * @throws Exception
-     */
-    void deploy(String bundle, boolean start, boolean deployOptional) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/internal/ObrMBeanImpl.java b/karaf-2.3.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/internal/ObrMBeanImpl.java
deleted file mode 100644
index bb8cf8f..0000000
--- a/karaf-2.3.x/management/mbeans/obr/src/main/java/org/apache/karaf/management/mbeans/obr/internal/ObrMBeanImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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> getUrls() 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;
-    }
-
-    /**
-     * @deprecated use getUrls() instead.
-     */
-    public List<String> listUrls() throws Exception {
-        return getUrls();
-    }
-
-    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 getBundles() 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;
-    }
-
-    /**
-     * @deprecated use getBundles() instead.
-     */
-    public TabularData list() throws Exception {
-        return getBundles();
-    }
-
-    public void deploy(String bundle) throws Exception {
-        deploy(bundle, false, false);
-    }
-
-    public void deploy(String bundle, boolean start, boolean deployOptional) 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(deployOptional ? 0 : Resolver.NO_OPTIONAL_RESOURCES)) {
-                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.3.x/management/mbeans/obr/src/main/resources/OSGI-INF/blueprint/obr-management.xml b/karaf-2.3.x/management/mbeans/obr/src/main/resources/OSGI-INF/blueprint/obr-management.xml
deleted file mode 100644
index 4669388..0000000
--- a/karaf-2.3.x/management/mbeans/obr/src/main/resources/OSGI-INF/blueprint/obr-management.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/obr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/obr/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 3e8431b..0000000
--- a/karaf-2.3.x/management/mbeans/obr/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,24 +0,0 @@
-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.3.x/management/mbeans/packages/NOTICE b/karaf-2.3.x/management/mbeans/packages/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/packages/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/packages/pom.xml b/karaf-2.3.x/management/mbeans/packages/pom.xml
deleted file mode 100644
index 3ce222c..0000000
--- a/karaf-2.3.x/management/mbeans/packages/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?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.3.1</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.3.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/PackagesMBean.java b/karaf-2.3.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/PackagesMBean.java
deleted file mode 100644
index bc63086..0000000
--- a/karaf-2.3.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/PackagesMBean.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.packages;
-
-import java.util.List;
-
-public interface PackagesMBean {
-
-    /**
-     * Get the exported packages.
-     *
-     * @return the list of exported packages.
-     * @throws Exception
-     */
-    List<String> getExports() throws Exception;
-
-    /**
-     * Get the exported packages of a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @return the exported packages of the bundle.
-     * @throws Exception
-     */
-    List<String> getExports(long bundleId) throws Exception;
-
-    /**
-     * Get the imported packages.
-     *
-     * @return the list of imported packages.
-     * @throws Exception
-     */
-    List<String> getImports() throws Exception;
-
-    /**
-     * Get the imported packages of a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @return the list of imported packages of the bundle.
-     * @throws Exception
-     */
-    List<String> getImports(long bundleId) throws Exception;
-
-    /* for backward compatibility */
-
-    /**
-     * @deprecated use getExports() instead
-     */
-    List<String> exportedPackages() throws Exception;
-
-    /**
-     * @deprecated use getExports() instead
-     */
-    List<String> exportedPackages(long bundleId) throws Exception;
-
-    /**
-     * @deprecated use getImports(bundleId) instead
-     */
-    List<String> importedPackages() throws Exception;
-
-    /**
-     * @deprecated use getImports(bundleId) instead
-     */
-    List<String> importedPackages(long bundleId) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/internal/PackagesMBeanImpl.java b/karaf-2.3.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/internal/PackagesMBeanImpl.java
deleted file mode 100644
index e2581d6..0000000
--- a/karaf-2.3.x/management/mbeans/packages/src/main/java/org/apache/karaf/management/mbeans/packages/internal/PackagesMBeanImpl.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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> getExports() throws Exception {
-        return getExports(-1);
-    }
-
-    public List<String> getExports(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> getImports() throws Exception {
-        return getImports(-1);
-    }
-
-    public List<String> getImports(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;
-    }
-
-    /**
-     * @deprecated use getExports() instead.
-     */
-    public List<String> exportedPackages() throws Exception {
-        return getExports();
-    }
-
-    /**
-     * @deprecated use getExports()
-     */
-    public List<String> exportedPackages(long bundleId) throws Exception {
-        return getExports(bundleId);
-    }
-
-    /**
-     * @deprecated use getImports() instead.
-     */
-    public List<String> importedPackages() throws Exception {
-        return getImports();
-    }
-
-    /**
-     * @deprecated use getImports() instead.
-     */
-    public List<String> importedPackages(long bundleId) throws Exception {
-        return getImports(bundleId);
-    }
-
-    public BundleContext getBundleContext() {
-        return this.bundleContext;
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-}
diff --git a/karaf-2.3.x/management/mbeans/packages/src/main/resources/OSGI-INF/blueprint/packages-management.xml b/karaf-2.3.x/management/mbeans/packages/src/main/resources/OSGI-INF/blueprint/packages-management.xml
deleted file mode 100644
index e62b658..0000000
--- a/karaf-2.3.x/management/mbeans/packages/src/main/resources/OSGI-INF/blueprint/packages-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/packages/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/packages/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index f669f36..0000000
--- a/karaf-2.3.x/management/mbeans/packages/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,21 +0,0 @@
-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.3.x/management/mbeans/pom.xml b/karaf-2.3.x/management/mbeans/pom.xml
deleted file mode 100644
index 3f5fde8..0000000
--- a/karaf-2.3.x/management/mbeans/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?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.3.1</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>scr</module>
-        <module>web</module>
-    </modules>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/management/mbeans/scr/NOTICE b/karaf-2.3.x/management/mbeans/scr/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/scr/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/scr/pom.xml b/karaf-2.3.x/management/mbeans/scr/pom.xml
deleted file mode 100644
index e561504..0000000
--- a/karaf-2.3.x/management/mbeans/scr/pom.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>org.apache.karaf.management.mbeans.scr</artifactId>
-    <packaging>bundle</packaging>
-    <name>Apache Karaf :: Management :: MBeans :: Services</name>
-    <description>This bundle provides MBeans to manipulate Service Components via JMX.</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.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>biz.aQute</groupId>
-            <artifactId>bndlib</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.karaf.management</groupId>
-            <artifactId>org.apache.karaf.management.server</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>
-                            org.apache.karaf.management.mbeans.scr
-                        </Export-Package>
-                        <Private-Package>
-                            org.apache.karaf.management.mbeans.scr.internal
-                        </Private-Package>
-                        <Service-Component>*</Service-Component>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/management/mbeans/scr/src/main/java/org/apache/karaf/management/mbeans/scr/ScrServiceMBean.java b/karaf-2.3.x/management/mbeans/scr/src/main/java/org/apache/karaf/management/mbeans/scr/ScrServiceMBean.java
deleted file mode 100644
index ba04820..0000000
--- a/karaf-2.3.x/management/mbeans/scr/src/main/java/org/apache/karaf/management/mbeans/scr/ScrServiceMBean.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.scr;
-
-/**
- * The management interface for SCR Components.
- */
-public interface ScrServiceMBean {
-    
-    
-    /**
-     * Presents a {@ String} array of components currently registered with the SCR.
-     * 
-     * @return String[]
-     * @throws Exception
-     */
-    String[] listComponents() throws Exception;
-
-    /**
-     * Verifies if the named component is currently in an ACTIVE state.
-     * 
-     * @param componentName the components name
-     * @return true if ACTIVE, otherwise false
-     * @throws Exception
-     */
-    boolean isComponentActive(String componentName) throws Exception;
-
-    /**
-     * Returns the named components state
-     * 
-     * @param componentName the components name
-     * @return
-     * @throws Exception
-     */
-    int componentState(String componentName) throws Exception;
-
-    /**
-     * Activates a component that is currently in a DISABLED state.
-     * 
-     * @param componentName the components name
-     * @throws Exception
-     */
-    void activateComponent(String componentName) throws Exception;
-
-    /**
-     * Disables a component that is not in an ACTIVE state.
-     * 
-     * @param componentName the components name
-     * @throws Exception
-     */
-    void deactiveateComponent(String componentName) throws Exception;
-}
diff --git a/karaf-2.3.x/management/mbeans/scr/src/main/java/org/apache/karaf/management/mbeans/scr/internal/ScrServiceMBeanImpl.java b/karaf-2.3.x/management/mbeans/scr/src/main/java/org/apache/karaf/management/mbeans/scr/internal/ScrServiceMBeanImpl.java
deleted file mode 100644
index 362117e..0000000
--- a/karaf-2.3.x/management/mbeans/scr/src/main/java/org/apache/karaf/management/mbeans/scr/internal/ScrServiceMBeanImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.scr.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import javax.management.MBeanServer;
-import javax.management.NotCompliantMBeanException;
-import javax.management.ObjectName;
-import javax.management.StandardMBean;
-
-import aQute.bnd.annotation.component.Activate;
-import aQute.bnd.annotation.component.Deactivate;
-import aQute.bnd.annotation.component.Reference;
-
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.management.mbeans.scr.ScrServiceMBean;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@aQute.bnd.annotation.component.Component(name = ScrServiceMBeanImpl.COMPONENT_NAME, enabled = true, immediate = true)
-public class ScrServiceMBeanImpl extends StandardMBean implements ScrServiceMBean {
-
-    public static final String OBJECT_NAME = "org.apache.karaf:type=scr,name=" + System.getProperty("karaf.name", "root");
-
-    public static final String COMPONENT_NAME = "ScrServiceMBean";
-
-    public static final String COMPONENT_LABEL = "Apache Karaf SCR Service MBean";
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ScrServiceMBeanImpl.class);
-
-    private MBeanServer mBeanServer;
-
-    private ScrService scrService;
-
-    private ReadWriteLock lock = new ReentrantReadWriteLock();
-
-    /**
-     * Creates new Declarative Services mbean.
-     * 
-     * @throws NotCompliantMBeanException
-     */
-    public ScrServiceMBeanImpl() throws NotCompliantMBeanException {
-        super(ScrServiceMBean.class);
-    }
-
-
-    /**
-     * Service component activation call back. Called when all dependencies are
-     * satisfied.
-     * 
-     * @throws Exception
-     */
-    @Activate
-    public void activate() throws Exception {
-        LOGGER.info("Activating the " + COMPONENT_LABEL);
-        Map<Object, String> mbeans = new HashMap<Object, String>();
-        mbeans.put(this, "org.apache.karaf:type=scr,name=${karaf.name}");
-        try {
-            lock.writeLock().lock();
-            if (mBeanServer != null) {
-                mBeanServer.registerMBean(this, new ObjectName(OBJECT_NAME));
-            }
-        } catch (Exception e) {
-            LOGGER.error("Exception registering the SCR Management MBean: " + e.getLocalizedMessage(), e);
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-
-    /**
-     * Service component deactivation call back. Called after the component is
-     * in an active state when any dependencies become unsatisfied.
-     * 
-     * @throws Exception
-     */
-    @Deactivate
-    public void deactivate() throws Exception {
-        LOGGER.info("Deactivating the " + COMPONENT_LABEL);
-        try {
-            lock.writeLock().lock();
-            if (mBeanServer != null) {
-                mBeanServer.unregisterMBean(new ObjectName(OBJECT_NAME));
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-    /*
-     * @see org.apache.karaf.management.mbeans.scr.ScrServiceMBean#listComponents()
-     *
-     * @return
-     * @throws Exception
-     */
-    public String[] listComponents() throws Exception {
-        Component[] components = safe(scrService.getComponents());
-        String[] componentNames = new String[components.length];
-        for (int i = 0; i < componentNames.length; i++) {
-            componentNames[i] = components[i].getName();
-        }
-        return componentNames;
-    }
-
-    /*
-     * @see org.apache.karaf.management.mbeans.scr.ScrServiceMBean#isComponentActive(java.lang.String)
-     *
-     * @param componentName
-     * @return
-     * @throws Exception
-     */
-    public boolean isComponentActive(String componentName) throws Exception {
-        return (componentState(componentName) == Component.STATE_ACTIVE) ? true : false;
-    }
-
-    /*
-     * @see org.apache.karaf.management.mbeans.scr.ScrServiceMBean#componentState(java.lang.String)
-     *
-     * @param componentName
-     * @return
-     * @throws Exception
-     */
-    public int componentState(String componentName) throws Exception {
-        int state = -1;
-        final Component component = findComponent(componentName);
-        if (component != null)
-            state = component.getState();
-        else
-            LOGGER.warn("No component found for name: " + componentName);
-        return state;
-    }
-
-    /*
-     * @see org.apache.karaf.management.mbeans.scr.ScrServiceMBean#activateComponent(java.lang.String)
-     *
-     * @param componentName
-     * @throws Exception
-     */
-    public void activateComponent(String componentName) throws Exception {
-        final Component component = findComponent(componentName);
-        if (component != null)
-            component.enable();
-        else
-            LOGGER.warn("No component found for name: " + componentName);
-    }
-
-    /*
-     * @see org.apache.karaf.management.mbeans.scr.ScrServiceMBean#deactiveateComponent(java.lang.String)
-     *
-     * @param componentName
-     * @throws Exception
-     */
-    public void deactiveateComponent(String componentName) throws Exception {
-        final Component component = findComponent(componentName);
-        if (component != null)
-            component.disable();
-        else
-            LOGGER.warn("No component found for name: " + componentName);
-    }
-
-    private Component findComponent(String componentName) {
-        Component answer = null;
-        if (scrService.getComponents(componentName) != null) {
-            Component[] components = scrService.getComponents(componentName);
-            for (Component component : safe(components)) {
-                answer = component;
-            }
-        }
-        return answer;
-    }
-
-    private Component[] safe(Component[] components) {
-        return components == null ? new Component[0] : components;
-    }
-
-    /**
-     * @param mBeanServer the mBeanServer to set
-     */
-    @Reference
-    public void setmBeanServer(MBeanServer mBeanServer) {
-        this.mBeanServer = mBeanServer;
-    }
-
-    public void unsetmBeanServer(MBeanServer mBeanServer) {
-        this.mBeanServer = null;
-    }
-
-    /**
-     * @param scrService the scrService to set
-     */
-    @Reference
-    public void setScrService(ScrService scrService) {
-        this.scrService = scrService;
-    }
-
-    public void unsetScrService(ScrService scrService) {
-        this.scrService = null;
-    }
-
-}
diff --git a/karaf-2.3.x/management/mbeans/scr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/scr/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index e8eba83..0000000
--- a/karaf-2.3.x/management/mbeans/scr/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,20 +0,0 @@
-\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 provide MBean to manage Declarative Service Components in Karaf features via JMX.
-
-    Especially, it provides the ScrServiceMBean supporting the following operations:
-    \u001B[36mlistComponents()\u001B[0m Gets the list of the currently available components.
-    \u001B[36mactivateComponent(String)\u001B[0m Activates a component for the given component name.
-    \u001B[36mdeactiveateComponent(String)\u001B[0m Deactivates a component for the given component name.
-    \u001B[36misComponentActive(String)\u001B[0m Check to see if a given component is in an ACTIVE state.
-    
-
-\u001B[1mSEE ALSO\u001B[0m
-    \u001B[36mDeclarative Services\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.3.x/management/mbeans/services/NOTICE b/karaf-2.3.x/management/mbeans/services/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/services/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/services/pom.xml b/karaf-2.3.x/management/mbeans/services/pom.xml
deleted file mode 100644
index 09f8020..0000000
--- a/karaf-2.3.x/management/mbeans/services/pom.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?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.3.1</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.3.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/ServicesMBean.java b/karaf-2.3.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/ServicesMBean.java
deleted file mode 100644
index 6326ec5..0000000
--- a/karaf-2.3.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/ServicesMBean.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.services;
-
-import javax.management.openmbean.TabularData;
-
-/**
- * Services MBean.
- */
-public interface ServicesMBean {
-
-    /**
-     * Get the list of services.
-     *
-     * @return the list of services.
-     * @throws Exception
-     */
-    TabularData getServices() throws Exception;
-
-    /**
-     * Get the list of services, eventually currently in use.
-     *
-     * @param inUse true to list only the services in use, false else.
-     * @return the list of services.
-     * @throws Exception
-     */
-    TabularData getServices(boolean inUse) throws Exception;
-
-    /**
-     * Get the list of services provided by a given bundle.
-     *
-     * @param bundleId the bundle ID.
-     * @return the list of services provided by the given bundle.
-     * @throws Exception
-     */
-    TabularData getServices(long bundleId) throws Exception;
-
-    /**
-     * Get the list of services provided by a given bundle and eventually in use.
-     *
-     * @param bundleId the bundle ID.
-     * @param inUse true to list only the services in use, false else.
-     * @return the list of services.
-     * @throws Exception
-     */
-    TabularData getServices(long bundleId, boolean inUse) throws Exception;
-
-    /**
-     * @deprecated use the Services attribute instead
-     */
-    TabularData list() throws Exception;
-
-    /**
-     * @deprecated use getServices() instead
-     */
-    TabularData list(boolean inUse) throws Exception;
-
-    /**
-     * @deprecated use getServices() instead
-     */
-    TabularData list(long bundleId) throws Exception;
-
-    /**
-     * @deprecated use getServices() instead
-     */
-    TabularData list(long bundleId, boolean inUse) throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/internal/ServicesMBeanImpl.java b/karaf-2.3.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/internal/ServicesMBeanImpl.java
deleted file mode 100644
index 9089b3c..0000000
--- a/karaf-2.3.x/management/mbeans/services/src/main/java/org/apache/karaf/management/mbeans/services/internal/ServicesMBeanImpl.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 getServices() throws Exception {
-        return getServices(-1, false);
-    }
-
-    public TabularData getServices(boolean inUse) throws Exception {
-        return getServices(-1, inUse);
-    }
-
-    public TabularData getServices(long bundleId) throws Exception {
-        return getServices(bundleId, false);
-    }
-
-    public TabularData getServices(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;
-    }
-
-    /* for backward compatibility */
-
-    public TabularData list() throws Exception {
-        return getServices();
-    }
-
-    public TabularData list(boolean inUse) throws Exception {
-        return getServices(inUse);
-    }
-
-    public TabularData list(long bundleId) throws Exception {
-        return getServices(bundleId);
-    }
-
-    public TabularData list(long bundleId, boolean inUse) throws Exception {
-        return getServices(bundleId, inUse);
-    }
-
-    public BundleContext getBundleContext() {
-        return this.bundleContext;
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-}
diff --git a/karaf-2.3.x/management/mbeans/services/src/main/resources/OSGI-INF/blueprint/services-management.xml b/karaf-2.3.x/management/mbeans/services/src/main/resources/OSGI-INF/blueprint/services-management.xml
deleted file mode 100644
index cb2d853..0000000
--- a/karaf-2.3.x/management/mbeans/services/src/main/resources/OSGI-INF/blueprint/services-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/services/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/services/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 5f52639..0000000
--- a/karaf-2.3.x/management/mbeans/services/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,18 +0,0 @@
-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.3.x/management/mbeans/system/NOTICE b/karaf-2.3.x/management/mbeans/system/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/system/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/system/pom.xml b/karaf-2.3.x/management/mbeans/system/pom.xml
deleted file mode 100644
index ec51d1b..0000000
--- a/karaf-2.3.x/management/mbeans/system/pom.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?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.3.1</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>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</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>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,
-                            org.apache.felix.utils*,
-                            !*
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/SystemMBean.java b/karaf-2.3.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/SystemMBean.java
deleted file mode 100644
index dc6f0be..0000000
--- a/karaf-2.3.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/SystemMBean.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.system;
-
-/**
- * System MBean.
- */
-public interface SystemMBean {
-
-    /**
-     * Shutdown the Karaf instance.
-     *
-     * @throws Exception
-     */
-    void halt() throws Exception;
-
-    /**
-     * Shutdown the Karaf instance at a certain time.
-     *
-     * @param time the time when to shutdown the Karaf instance.
-     * @throws Exception
-     */
-    void halt(String time) throws Exception;
-
-    /**
-     * Reboot the Karaf instance.
-     *
-     * @throws Exception
-     */
-    void reboot() throws Exception;
-
-    /**
-     * Reboot the Karaf instance at a certain time and eventually cleanup the instance files.
-     *
-     * @param time the time when to reboot the Karaf instance.
-     * @param clean true to clean the instance files, false else.
-     * @throws Exception
-     */
-    void reboot(String time, boolean clean) throws Exception;
-
-    /**
-     * Get the name of the Karaf instance.
-     *
-     * @return the Karaf instance name.
-     */
-    String getName();
-
-    /**
-     * Set the name of the Karaf instance.
-     *
-     * @param name the new Karaf instance name. NB: the change require an instance reboot.
-     */
-    void setName(String name);
-
-    /**
-     * Get the Karaf version used by the Karaf instance.
-     *
-     * @return the Karaf version.
-     */
-    String getVersion();
-
-    /**
-     * Get the current OSGi framework in use.
-     *
-     * @return the name of the OSGi framework in use.
-     */
-    String getFramework();
-
-    /**
-     * Change the OSGi framework to run Karaf.
-     *
-     * @param framework the name of the framework to use (felix or equinox).
-     */
-    void setFramework(String framework) throws Exception;
-
-    /**
-     * Enable or disable the debug option on the OSGi framework.
-     *
-     * @param debug true to enable debug, false else.
-     */
-    void setFrameworkDebug(boolean debug) throws Exception;
-
-    /**
-     * Get the system start level.
-     *
-     * @return the current system start level.
-     */
-    int getStartLevel();
-
-    /**
-     * Set the system start level.
-     *
-     * @param startLevel the new system start level.
-     */
-    void setStartLevel(int startLevel);
-
-    /* for backward compatibility */
-
-    /**
-     * @deprecated use halt() instead.
-     */
-    void shutdown() throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/internal/SystemMBeanImpl.java b/karaf-2.3.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/internal/SystemMBeanImpl.java
deleted file mode 100644
index e625d2a..0000000
--- a/karaf-2.3.x/management/mbeans/system/src/main/java/org/apache/karaf/management/mbeans/system/internal/SystemMBeanImpl.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.system.internal;
-
-import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.management.mbeans.system.SystemMBean;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.startlevel.FrameworkStartLevel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.management.NotCompliantMBeanException;
-import javax.management.StandardMBean;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-
-/**
- * System MBean implementation.
- */
-public class SystemMBeanImpl extends StandardMBean implements SystemMBean {
-
-    private final static transient Logger LOGGER = LoggerFactory.getLogger(SystemMBeanImpl.class);
-
-    private BundleContext bundleContext;
-
-    public SystemMBeanImpl() throws NotCompliantMBeanException {
-        super(SystemMBean.class);
-    }
-
-    public String getName() {
-        return bundleContext.getProperty("karaf.name");
-    }
-
-    public void setName(String name) {
-        try {
-            String karafBase = bundleContext.getProperty("karaf.base");
-            File etcDir = new File(karafBase, "etc");
-            File syspropsFile = new File(etcDir, "system.properties");
-            FileInputStream fis = new FileInputStream(syspropsFile);
-            Properties props = new Properties();
-            props.load(fis);
-            fis.close();
-            props.setProperty("karaf.name", name);
-            FileOutputStream fos = new FileOutputStream(syspropsFile);
-            props.store(fos, "");
-            fos.close();
-        } catch (Exception e) {
-            throw new RuntimeException(e.getMessage(), e);
-        }
-    }
-
-    public String getVersion() {
-        return System.getProperty("karaf.version");
-    }
-
-    public void halt() throws Exception {
-        halt(null);
-    }
-
-    public void halt(String time) throws Exception {
-        shutdown(timeToSleep(time));
-    }
-
-    public void reboot() throws Exception {
-        reboot(null, false);
-    }
-
-    public void reboot(String time, boolean cleanup) throws Exception {
-        reboot(timeToSleep(time), cleanup);
-    }
-
-    public void setFrameworkDebug(boolean debug) throws Exception {
-        Properties properties = new Properties(new File(System.getProperty("karaf.base"), "etc/config.properties"));
-        if (debug) {
-            properties.put("felix.log.level", "4");
-            properties.put("osgi.debug", "etc/equinox-debug.properties");
-            // TODO populate the equinox-debug.properties file with the one provided in shell/dev module
-        } else {
-            properties.remove("felix.log.level");
-            properties.remove("osgi.debug");
-        }
-        properties.save();
-    }
-
-    public String getFramework() {
-        if (bundleContext.getBundle(0).getSymbolicName().contains("felix")) {
-            return "felix";
-        } else {
-            return "equinox";
-        }
-    }
-
-    public void setFramework(String framework) throws Exception {
-        Properties properties = new Properties(new File(System.getProperty("karaf.base"), "etc/config.properties"));
-        if (!framework.equals("felix") || !framework.equals("equinox"))
-            throw new IllegalArgumentException("Framework name is not supported. Only felix or equinox are supported.");
-        properties.put("karaf.framework", framework);
-        properties.save();
-    }
-
-    public void setStartLevel(int startLevel) {
-        Bundle b = getBundleContext().getBundle(0);
-        FrameworkStartLevel fsl = (FrameworkStartLevel) b.adapt(FrameworkStartLevel.class);
-        fsl.setStartLevel(startLevel, null);
-    }
-
-    public int getStartLevel() {
-        Bundle b = getBundleContext().getBundle(0);
-        FrameworkStartLevel fsl = (FrameworkStartLevel) b.adapt(FrameworkStartLevel.class);
-        return fsl.getStartLevel();
-    }
-
-    /* for backward compatibility */
-
-    /**
-     * @deprecated use halt() instead.
-     */
-    public void shutdown() throws Exception {
-        halt();
-    }
-
-    public BundleContext getBundleContext() {
-        return this.bundleContext;
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    private void shutdown(final long sleep) {
-        new Thread() {
-            public void run() {
-                try {
-                    sleepWithMsg(sleep, "Shutdown in " + sleep / 1000 / 60 + " minute(s)");
-                    getBundleContext().getBundle(0).stop();
-                } catch (Exception e) {
-                    LOGGER.error("Halt error", e);
-                }
-            }
-        }.start();
-    }
-
-    private void reboot(final long sleep, final boolean clean) {
-        new Thread() {
-            public void run() {
-                try {
-                    sleepWithMsg(sleep, "Reboot in " + sleep / 1000 / 60 + " minute(s)");
-                    System.setProperty("karaf.restart", "true");
-                    System.setProperty("karaf.restart.clean", Boolean.toString(clean));
-                    bundleContext.getBundle(0).stop();
-                } catch (Exception e) {
-                    LOGGER.error("Reboot error", e);
-                }
-            }
-        }.start();
-    }
-
-    private void sleepWithMsg(final long sleep, String msg)
-            throws InterruptedException {
-        if (sleep > 0) {
-            LOGGER.info(msg);
-            System.err.println(msg);
-        }
-        Thread.sleep(sleep);
-    }
-
-    /**
-     * Convert a time string to sleep period (in millisecond).
-     *
-     * @param time the time string.
-     * @return the corresponding sleep period in millisecond.
-     */
-    private long timeToSleep(String time) 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) {
-                        throw new IllegalArgumentException("Time " + time + " is not valid");
-                    }
-                } else {
-                    // try to parse the date in hh:mm
-                    String[] strings = time.split(":");
-                    if (strings.length != 2) {
-                        throw new IllegalArgumentException("Time " + time + " is not valid");
-                    }
-                    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();
-                }
-            }
-        }
-        return sleep;
-    }
-
-}
diff --git a/karaf-2.3.x/management/mbeans/system/src/main/resources/OSGI-INF/blueprint/system-management.xml b/karaf-2.3.x/management/mbeans/system/src/main/resources/OSGI-INF/blueprint/system-management.xml
deleted file mode 100644
index 6396ec5..0000000
--- a/karaf-2.3.x/management/mbeans/system/src/main/resources/OSGI-INF/blueprint/system-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/system/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/system/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 8c96394..0000000
--- a/karaf-2.3.x/management/mbeans/system/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,19 +0,0 @@
-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.3.x/management/mbeans/web/NOTICE b/karaf-2.3.x/management/mbeans/web/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/mbeans/web/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/mbeans/web/pom.xml b/karaf-2.3.x/management/mbeans/web/pom.xml
deleted file mode 100644
index 9112293..0000000
--- a/karaf-2.3.x/management/mbeans/web/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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.3.1</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>
-                            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.3.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/WebMBean.java b/karaf-2.3.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/WebMBean.java
deleted file mode 100644
index 7e353df..0000000
--- a/karaf-2.3.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/WebMBean.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management.mbeans.web;
-
-import javax.management.openmbean.TabularData;
-
-/**
- * Web MBean.
- */
-public interface WebMBean {
-
-    TabularData list() throws Exception;
-
-}
diff --git a/karaf-2.3.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/internal/WebMBeanImpl.java b/karaf-2.3.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/internal/WebMBeanImpl.java
deleted file mode 100644
index 5009f77..0000000
--- a/karaf-2.3.x/management/mbeans/web/src/main/java/org/apache/karaf/management/mbeans/web/internal/WebMBeanImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- *
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/management/mbeans/web/src/main/resources/OSGI-INF/blueprint/web-management.xml b/karaf-2.3.x/management/mbeans/web/src/main/resources/OSGI-INF/blueprint/web-management.xml
deleted file mode 100644
index 0d112e9..0000000
--- a/karaf-2.3.x/management/mbeans/web/src/main/resources/OSGI-INF/blueprint/web-management.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?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" init-method="init" destroy-method="destroy">
-        <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.3.x/management/mbeans/web/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/mbeans/web/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 40e7dc9..0000000
--- a/karaf-2.3.x/management/mbeans/web/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,18 +0,0 @@
-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.3.x/management/pom.xml b/karaf-2.3.x/management/pom.xml
deleted file mode 100644
index 1410b87..0000000
--- a/karaf-2.3.x/management/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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.3.1</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.3.x/management/server/NOTICE b/karaf-2.3.x/management/server/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/management/server/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/management/server/pom.xml b/karaf-2.3.x/management/server/pom.xml
deleted file mode 100644
index 25f47f1..0000000
--- a/karaf-2.3.x/management/server/pom.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?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.3.1</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.3.x/management/server/src/main/java/org/apache/karaf/management/ConnectorServerFactory.java b/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/ConnectorServerFactory.java
deleted file mode 100644
index 6e45587..0000000
--- a/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/ConnectorServerFactory.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management;
-
-import org.apache.karaf.jaas.config.KeystoreManager;
-
-import java.io.IOException;
-import java.net.BindException;
-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) {
-                            if (ex.getCause() instanceof BindException){
-                                // we want just the port message
-                                int endIndex = ex.getMessage().indexOf("nested exception is");
-                                // check to make sure we do not get an index out of range
-                                if (endIndex > ex.getMessage().length() || endIndex < 0){
-                                    endIndex = ex.getMessage().length();
-                                }
-                                throw new RuntimeException("\n" + ex.getMessage().substring(0, endIndex) +
-                                        "\nYou may have started two containers.  If you need to start a second container or the default ports are already in use " +
-                                        "update the config file etc/org.apache.karaf.management.cfg and change the Registry Port and Server Port to unused ports");
-                            }
-                            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.3.x/management/server/src/main/java/org/apache/karaf/management/JaasAuthenticator.java b/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/JaasAuthenticator.java
deleted file mode 100644
index 428b877..0000000
--- a/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/JaasAuthenticator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.boot.principal.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.3.x/management/server/src/main/java/org/apache/karaf/management/MBeanRegistrer.java b/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/MBeanRegistrer.java
deleted file mode 100644
index e4dc90e..0000000
--- a/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/MBeanRegistrer.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import javax.management.JMException;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
-
-public class MBeanRegistrer {
-
-    private MBeanServer mbeanServer;
-
-    private Map<Object, String> mbeans;
-    private Set<String> registered = new HashSet<String>();
-
-    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();
-    }
-
-    public void destroy() throws Exception {
-        unregisterMBeans();
-    }
-
-    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));
-                registered.add(value);
-            }
-        }
-    }
-
-    protected void unregisterMBeans() throws JMException {
-        if (mbeanServer != null && mbeans != null) {
-            while (!registered.isEmpty()) {
-                String name = registered.iterator().next();
-                mbeanServer.unregisterMBean(new ObjectName(name));
-                registered.remove(name);
-            }
-        }
-    }
-
-    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.3.x/management/server/src/main/java/org/apache/karaf/management/MBeanServerFactory.java b/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/MBeanServerFactory.java
deleted file mode 100644
index f89aa09..0000000
--- a/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/MBeanServerFactory.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/management/server/src/main/java/org/apache/karaf/management/RmiRegistryFactory.java b/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/RmiRegistryFactory.java
deleted file mode 100644
index 75ce54c..0000000
--- a/karaf-2.3.x/management/server/src/main/java/org/apache/karaf/management/RmiRegistryFactory.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.management;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.UnknownHostException;
-import java.rmi.RemoteException;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.registry.Registry;
-import java.rmi.server.RMIClientSocketFactory;
-import java.rmi.server.RMIServerSocketFactory;
-import java.rmi.server.RMISocketFactory;
-import java.rmi.server.UnicastRemoteObject;
-
-public class RmiRegistryFactory {
-
-    private int port = Registry.REGISTRY_PORT;
-    private String host;
-    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 String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-
-    public Object getObject() throws Exception {
-        return registry;
-    }
-
-    public void init() throws RemoteException, UnknownHostException {
-        if (registry == null && locate) {
-            try {
-                Registry reg = LocateRegistry.getRegistry(host, getPort());
-                reg.list();
-                registry = reg;
-            } catch (RemoteException e) {
-                // ignore
-            }
-        }
-        if (registry == null && create) {
-            if (host != null && !host.isEmpty()) {
-                RMIClientSocketFactory socketFactory = RMISocketFactory.getDefaultSocketFactory();
-                InetAddress addr = InetAddress.getByName(host);
-                RMIServerSocketFactory serverSocketFactory = new KarafServerSocketFactory(addr, port);
-
-                registry = LocateRegistry.createRegistry(getPort(), socketFactory, serverSocketFactory);
-            } else {
-                registry = LocateRegistry.createRegistry(getPort());
-            }
-            locallyCreated = true;
-        }
-    }
-
-    public void destroy() throws RemoteException {
-        if (registry != null && locallyCreated) {
-            Registry reg = registry;
-            registry = null;
-            UnicastRemoteObject.unexportObject(reg, true);
-        }
-    }
-
-    private static class KarafServerSocketFactory implements RMIServerSocketFactory {
-        private final int port;
-        private final InetAddress addr;
-
-        private KarafServerSocketFactory(InetAddress addr, int port) {
-            this.addr = addr;
-            this.port = port;
-        }
-
-        public ServerSocket createServerSocket(int i) throws IOException {
-            return new ServerSocket(port, 0, addr);
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/blueprint/karaf-management.xml b/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/blueprint/karaf-management.xml
deleted file mode 100644
index df23fe77..0000000
--- a/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/blueprint/karaf-management.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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="rmiRegistryHost" value="0.0.0.0"/>
-            <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="host" value="${rmiRegistryHost}"/>
-        <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.3.x/management/server/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 44745cb..0000000
--- a/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index caa3780..0000000
--- a/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /dev/null
@@ -1,73 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-#
-# 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
-
-rmiRegistryHost.name = RMI Registry Host
-rmiRegistryHost.description = host of the registry for the exported RMI service. Blank for all interfaces
-
-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.3.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index e67bde6..0000000
--- a/karaf-2.3.x/management/server/src/main/resources/OSGI-INF/metatype/metatype.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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="rmiRegistryHost" type="String" default="" name="%rmiRegistryHost.name"
-            description="%rmiRegistryHost.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.3.x/management/server/src/test/configs/factories/management.properties b/karaf-2.3.x/management/server/src/test/configs/factories/management.properties
deleted file mode 100644
index 0357bf2..0000000
--- a/karaf-2.3.x/management/server/src/test/configs/factories/management.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-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.3.x/management/server/src/test/configs/services/org.ops4j.pax.logging.properties b/karaf-2.3.x/management/server/src/test/configs/services/org.ops4j.pax.logging.properties
deleted file mode 100644
index d1f34a6..0000000
--- a/karaf-2.3.x/management/server/src/test/configs/services/org.ops4j.pax.logging.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-# 
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed  under the  License is distributed on an "AS IS" BASIS,
-# WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
-# implied.
-#  
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#
-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.3.x/management/server/src/test/java/org/apache/karaf/management/MBeanRegistererTest.java b/karaf-2.3.x/management/server/src/test/java/org/apache/karaf/management/MBeanRegistererTest.java
deleted file mode 100644
index e02f127..0000000
--- a/karaf-2.3.x/management/server/src/test/java/org/apache/karaf/management/MBeanRegistererTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/manual/pom.xml b/karaf-2.3.x/manual/pom.xml
deleted file mode 100644
index da3686d..0000000
--- a/karaf-2.3.x/manual/pom.xml
+++ /dev/null
@@ -1,415 +0,0 @@
-<?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.3.1</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>
-                <configuration>
-                    <useDefaultDelimiters>false</useDefaultDelimiters>
-                    <delimiters>
-                        <delimiter>${*}</delimiter>
-                    </delimiters>
-                </configuration>
-                <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.3.x/manual/src/fallback/manual.html b/karaf-2.3.x/manual/src/fallback/manual.html
deleted file mode 100644
index 4aa3dbd..0000000
--- a/karaf-2.3.x/manual/src/fallback/manual.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<div class="wiki-content">
-    Unable to generate manual.
-</div>
\ No newline at end of file
diff --git a/karaf-2.3.x/manual/src/fallback/manual.pdf b/karaf-2.3.x/manual/src/fallback/manual.pdf
deleted file mode 100644
index 72f3d80..0000000
--- a/karaf-2.3.x/manual/src/fallback/manual.pdf
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/.livereload b/karaf-2.3.x/manual/src/main/webapp/.livereload
deleted file mode 100644
index b185045..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/.livereload
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.3.x/manual/src/main/webapp/WEB-INF/scalate/layouts/default.scaml b/karaf-2.3.x/manual/src/main/webapp/WEB-INF/scalate/layouts/default.scaml
deleted file mode 100644
index c88ba58..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/WEB-INF/scalate/layouts/default.scaml
+++ /dev/null
@@ -1,116 +0,0 @@
--#
--# 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} Guides"
-- 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.3.x/manual/src/main/webapp/WEB-INF/scalate/layouts/print.ssp b/karaf-2.3.x/manual/src/main/webapp/WEB-INF/scalate/layouts/print.ssp
deleted file mode 100644
index 5888547..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/WEB-INF/scalate/layouts/print.ssp
+++ /dev/null
@@ -1,817 +0,0 @@
-<%--
-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} Guides" %>
-<% 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.3.x/manual/src/main/webapp/WEB-INF/web.xml b/karaf-2.3.x/manual/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index d461465..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?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.3.x/manual/src/main/webapp/_banner.ssp b/karaf-2.3.x/manual/src/main/webapp/_banner.ssp
deleted file mode 100644
index 1f9c27d..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/_banner.ssp
+++ /dev/null
@@ -1,14 +0,0 @@
-      <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.3.x/manual/src/main/webapp/_navigation.conf b/karaf-2.3.x/manual/src/main/webapp/_navigation.conf
deleted file mode 100644
index 4ecf08f..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/_navigation.conf
+++ /dev/null
@@ -1,43 +0,0 @@
-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]
-- [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]
-- [Github Contributions|/developers-guide/github-contributions]
-
-h3. [Commands|/commands/commands]
diff --git a/karaf-2.3.x/manual/src/main/webapp/_quicklinks.ssp b/karaf-2.3.x/manual/src/main/webapp/_quicklinks.ssp
deleted file mode 100644
index 1594d7e..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/_quicklinks.ssp
+++ /dev/null
@@ -1,8 +0,0 @@
-<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.3.x/manual/src/main/webapp/css/pygmentize.css b/karaf-2.3.x/manual/src/main/webapp/css/pygmentize.css
deleted file mode 100644
index 80efdcd..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/css/pygmentize.css
+++ /dev/null
@@ -1,134 +0,0 @@
-.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.3.x/manual/src/main/webapp/css/scalate/console.css b/karaf-2.3.x/manual/src/main/webapp/css/scalate/console.css
deleted file mode 100644
index 4b2dfe7..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/css/scalate/console.css
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * 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.3.x/manual/src/main/webapp/css/style.css b/karaf-2.3.x/manual/src/main/webapp/css/style.css
deleted file mode 100644
index 496901e..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/css/style.css
+++ /dev/null
@@ -1,1588 +0,0 @@
-/**
- * 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.3.x/manual/src/main/webapp/developers-guide/archetypes.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/archetypes.conf
deleted file mode 100644
index 24291c5..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/archetypes.conf
+++ /dev/null
@@ -1,361 +0,0 @@
-
-
-
-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.3.x/manual/src/main/webapp/developers-guide/branding-console.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/branding-console.conf
deleted file mode 100644
index 68b29d3..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/branding-console.conf
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-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.
diff --git a/karaf-2.3.x/manual/src/main/webapp/developers-guide/connect-console.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/connect-console.conf
deleted file mode 100644
index 0253960..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/connect-console.conf
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/developers-guide/creating-bundles.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/creating-bundles.conf
deleted file mode 100644
index e3fd1a4..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/creating-bundles.conf
+++ /dev/null
@@ -1,185 +0,0 @@
-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:
-
-from the shell
-{code}
-root@karaf> osgi:install -s 'wrap:mvn:commons-lang/commons-lang/2.4$Bundle-SymbolicName=commons-lang&Bundle-Version=2.4'
-{code}
-
-from features.xml
-{code}
-<bundle>wrap:mvn:commons-lang/commons-lang/2.4$Bundle-SymbolicName=commons-lang&amp;Bundle-Version=2.4</bundle>
-{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.3.x/manual/src/main/webapp/developers-guide/custom-distribution.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/custom-distribution.conf
deleted file mode 100644
index 1d6cd56..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/custom-distribution.conf
+++ /dev/null
@@ -1,412 +0,0 @@
-
-
-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.assemblies.features</groupId>
-      <artifactId>standard</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.assemblies.features/standard/${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/assemblies/]
-* [Apache ServiceMix NMR|http://svn.apache.org/repos/asf/servicemix/smx4/nmr/trunk/bundle/]
-* [BuildProcess BuildEraser|http://buildprocess.svn.sourceforge.net/viewvc/buildprocess/builderaser/trunk/assembly/]
diff --git a/karaf-2.3.x/manual/src/main/webapp/developers-guide/debugging.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/debugging.conf
deleted file mode 100644
index 5d45753..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/debugging.conf
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/developers-guide/developer-commands.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/developer-commands.conf
deleted file mode 100644
index f10230a..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/developer-commands.conf
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/developers-guide/extending-console.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/extending-console.conf
deleted file mode 100644
index f6bfbd0..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/extending-console.conf
+++ /dev/null
@@ -1,306 +0,0 @@
-
-
-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/xsd/maven-4.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.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-add.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-add.conf
deleted file mode 100644
index 60291d4..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-add.conf
+++ /dev/null
@@ -1,50 +0,0 @@
-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.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-create-kar.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-create-kar.conf
deleted file mode 100644
index 24d6e3e..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-create-kar.conf
+++ /dev/null
@@ -1,39 +0,0 @@
-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.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-generate.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-generate.conf
deleted file mode 100644
index dc36c2c..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-generate.conf
+++ /dev/null
@@ -1,53 +0,0 @@
-h2. Goal {{features:generate}}
-
-The {{features:generate-features-xml}} 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-features-xml</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.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-validate.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-validate.conf
deleted file mode 100644
index 2c74edb..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin-validate.conf
+++ /dev/null
@@ -1,50 +0,0 @@
-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.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin.conf
deleted file mode 100644
index 14d2f11..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/features-maven-plugin.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-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.3.x/manual/src/main/webapp/developers-guide/github-contributions.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/github-contributions.conf
deleted file mode 100644
index d278f0d..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/github-contributions.conf
+++ /dev/null
@@ -1,73 +0,0 @@
-h1. Github Contributions
-
-Some people prefer to make contributions to karaf source via github. If you are one of them, this is for you!
-
-
-h2. Introduction
-
-Apache Karaf is available as a periodically replicated mirror on: [https://github.com/apache/karaf] 
-
-
-h2. Suggested Workflow
-
-# make a fork of karaf repo github mirror
-# do all your new work on your own karaf fork
-# when ready, file a jira issue [https://issues.apache.org/jira/browse/KARAF], attach the link to your github pull request, and ask for a review
-# one of karaf committers will discuss your pull request on github; and at some point your pull request will be accepted 
-# when your pull request is accepted, squash it into a single commit and attach single patch file to the original jira, with ASF grant check box selected  
-# now pray to your favorite ASF committer to really accept the patch :-)
-# when your patch is committed to the svn, and you can verify it in the latest karaf snapshot, close your pull request on github 
-
-
-h2. License Reminder
-
-in order for your contributions to be accepted:
-
-* all files must contain ASL license grant header
-
-* you must select ASF grant check box when attaching patch to the jira
-
-
-h2. How to Generate a One-File-Patch Via Throw-Away Branch
-
-here is one way to generate squash of your commits:
-
-[http://stackoverflow.com/questions/616556/how-do-you-squash-commits-into-one-patch-with-git-format-patch]
-
-{code}
-
-#
-# 'archon' referers to karaf mirror
-# 'origin' referers to your own fork
-#
-
-# attach karaf mirror as remote, if not done yet
-git remote add archon https://github.com/apache/karaf
-
-# fetch latest karaf mirror
-git fetch archon 
-
-# ensure you are on your fork trunk
-git checkout origin/trunk
-
-# kill previous patch delivery, if you had one
-git branch -D delivery
-
-# make new delivery throw-away branch, based on latest karaf mirror
-git branch delivery archon/trunk
-
-# use it
-git checkout delivery
-
-# squash all your local development into a single commit
-git merge --squash trunk
-
-# commit it to the delivery branch
-git commit -m "delivery"
-
-# generate a patch file against the mirror
-git format-patch archon/trunk
-
-{code}
-
-root of your karaf source now contains a file named "0001-delivery.patch.txt" (please attach the .txt ending;this will allow commiters to open your patch directly in the browser and give it a short look there) which you should attach to your karaf jira, and ask to commit to the svn trunk
diff --git a/karaf-2.3.x/manual/src/main/webapp/developers-guide/index.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/index.conf
deleted file mode 100644
index 99fe708..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/index.conf
+++ /dev/null
@@ -1,15 +0,0 @@
-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]
-* [Github Contributions|github-contributions]
diff --git a/karaf-2.3.x/manual/src/main/webapp/developers-guide/security-framework.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/security-framework.conf
deleted file mode 100644
index c6cbb96..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/security-framework.conf
+++ /dev/null
@@ -1,416 +0,0 @@
-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>
-
-    <service interface="org.apache.karaf.jaas.modules.BackingEngineFactory">
-        <bean class="org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory"/>
-    </service>
-
-</blueprint>
-{pygmentize}
-
-NB: Don't forge to expose the BackingEngine as an OSGi service.
-
-{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
-
-| LoginModule           | org.apache.karaf.jaas.modules.properties.PropertiesLoginModule            |
-| BackingEngineFactory  | org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory   |
-
-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
-
-| LoginModule           | org.apache.karaf.jaas.modules.osgi.OsgiConfigLoginModule            |
-| BackingEngineFactory  |                                                                     |
-
-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
-
-| LoginModule           | org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule            |
-| BackingEngineFactory  | org.apache.karaf.jaas.modules.jdbc.JDBCBackingEngineFactory   |
-
-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
-
-| LoginModule           | org.apache.karaf.jaas.modules.ldap.LDAPLoginModule            |
-| BackingEngineFactory  |                                                               |
-
-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.
-
-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.3.x/manual/src/main/webapp/developers-guide/shell-syntax.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/shell-syntax.conf
deleted file mode 100644
index 3b74180..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/shell-syntax.conf
+++ /dev/null
@@ -1,92 +0,0 @@
-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.3.x/manual/src/main/webapp/developers-guide/writing-tests.conf b/karaf-2.3.x/manual/src/main/webapp/developers-guide/writing-tests.conf
deleted file mode 100644
index c125188..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/developers-guide/writing-tests.conf
+++ /dev/null
@@ -1,327 +0,0 @@
-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.
-
-Starting with Karaf 2.3.0 and 3.0 we've also included a component briding between Karaf and Pax Exam making it easier to write integration tests for Karaf or Karaf based Distributions such as [Servicemix|http://servicemix.apache.org] or [Geronimo|http://geronimo.apache.org].
-
-h2. Introduction
-
-To make use of this new framework simply add the following dependencies into your integration tests pom.xml:
-
-{pygmentize:xml}
-<!-- Karaf Test Framework Version -->
-<dependency>
-  <groupId>org.apache.karaf.tooling.exam</groupId>
-  <artifactId>org.apache.karaf.tooling.exam.container</artifactId>
-  <version>${project.version}</version>
-  <scope>test</scope>
-</dependency>
-<!-- Pax Exam version you would like to use. At least 2.2.x is required. -->
-<dependency>
-  <groupId>org.ops4j.pax.exam</groupId>
-  <artifactId>pax-exam-junit4</artifactId>
-  <version>${pax.exam.version}</version>
-  <scope>test</scope>
-</dependency>
-{pygmentize}
-
-As a next step you need to reference the distribution you want to run your tests on. For example, if you want to run your tests on Karaf the following section would be required in the integration tests pom.xml:
-
-{pygmentize:xml}
-<dependency>
-  <groupId>org.apache.karaf</groupId>
-  <artifactId>apache-karaf</artifactId>
-  <version>${project.version}</version>
-  <type>zip</type>
-  <scope>test</scope>
-</dependency>
-{pygmentize}
-
-If you want to make use of Exams "versionAsInProject" feature you also need to add the following section:
-
-{pygmentize:xml}
-<build>
-  <plugins>
-    <plugin>
-      <groupId>org.apache.servicemix.tooling</groupId>
-      <artifactId>depends-maven-plugin</artifactId>
-      <version>${plugin.depends.version}</version>
-      <executions>
-        <execution>
-          <id>generate-depends-file</id>
-          <goals>
-            <goal>generate-depends-file</goal>
-          </goals>
-        </execution>
-      </executions>
-    </plugin>
-  </plugins>
-</build>
-{pygmentize}
-
-With this done we can start writing our first test case:
-
-{pygmentize:java}
-import static junit.framework.Assert.assertTrue;
-import static org.apache.karaf.tooling.exam.options.KarafDistributionOption.karafDistributionConfiguration;
-import static org.ops4j.pax.exam.CoreOptions.maven;
-
-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.ExamReactorStrategy;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
-import org.ops4j.pax.exam.spi.reactors.AllConfinedStagedReactorFactory;
-
-@RunWith(JUnit4TestRunner.class)
-@ExamReactorStrategy(AllConfinedStagedReactorFactory.class)
-public class VersionAsInProjectKarafTest {
-
-    @Configuration
-    public Option[] config() {
-        return new Option[]{ karafDistributionConfiguration().frameworkUrl(
-            maven().groupId("org.apache.karaf").artifactId("apache-karaf").type("zip").versionAsInProject())
-            .karafVersion("2.2.4").name("Apache Karaf")};
-    }
-
-    @Test
-    public void test() throws Exception {
-        assertTrue(true);
-    }
-}
-{pygmentize}
-
-h2. Commands
-
-Basically the Pax Exam - Karaf bridge introduced with 3.0 should support all commands you know from Pax Exam 2.x. In addition we've added various additional commands to make your life easier. Those commands are listed and explained in this sub section.
-
-As a small remark: All of the Options explained here are also accessible via the static methods in the KarafDistributionOption class in the options package automatically on your classpath when you reference the container package.
-
-h3. KarafDistributionConfigurationOption
-
-The framework itself is non of the typical runtimes you define normally in PAXEXAM. Instead you define a packed distribution as zip or tar.gz. Those distributions have to follow the Karaf packaging style. Therefore instead of Karaf you can also enter Servicemix or Geronimo.
-
-{pygmentize:java}
-new KarafDistributionConfigurationOption(
-  "mvn:org.apache.karaf/apache-karaf/2.2.4/zip", // artifact to unpack and use
-  "karaf", // name; display only
-  "2.2.4") // the karaf version; this one is relevant since the startup script differs between versions
-{pygmentize}
-
-or for Servicemix e.g.
-
-{pygmentize:java}
-new KarafDistributionConfigurationOption(
-  "mvn:org.apache.servicemix/apache-servicemix/4.4.0/zip", // artifact to unpack and use
-  "servicemix", // name; display only
-  "2.2.4") // the karaf version; this one is relevant since the startup script differs between versions
-{pygmentize}
-
-As an alternative you can also use the maven url resolvers. Please keep in mind that this only works starting with karaf-3.0.0 since there will be problems with the pax-url version. In addition, if you want to make use of the versionAsInProject part you also need to define the following maven-plugin in the pom file of your integration tests:
-
-{pygmentize:xml}
-...
-<dependency>
-  <groupId>org.apache.karaf</groupId>
-  <artifactId>apache-karaf</artifactId>
-  <type>zip</type>
-  <classifier>bin</classifier>
-  <scope>test</scope>
-</dependency>
-...
-<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>
-{pygmentize}
-
-{pygmentize:java}
-@Configuration
-    public Option[] config() {
-        return new Option[]{ karafDistributionConfiguration().frameworkUrl(
-            maven().groupId("org.apache.karaf").artifactId("apache-karaf").type("zip")
-                .classifier("bin").versionAsInProject()) };
-    }
-{pygmentize}
-
-In addition to the framework specification options this option also includes various additional configuration options. Those options are used to configure the internal properties of the runtime environment.
-
-h4. Unpack Directory
-Paxexam-Karaf Testframework extracts the distribution you specify by default into the paxexam config directory. If you would like to unpack them into your target directory simply extend the KarafDistributionConfigurationOption with the unpackDirectoryFile like shown in the next example:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip")
-        .unpackDirectory(new File("target/paxexam/unpack/")) };
-}
-{pygmentize}
-
-h4. Use Deploy Folder
-
-Karaf distributions come by default with a deploy folder where you can simply drop artifacts to be deployed. In some distributions this folder might have been removed. To still be able to deploy your additional artifacts using default Pax Exam ProvisionOptions you can configure PaxExam Karaf to use a features.xml (which is directly added to your etc/org.apache.karaf.features.cfg) for those deploys. To use it instead of the deploy folder simply do the following:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip")
-        .useDeployFolder(false)) };
-}
-{pygmentize}
-
-h3. KarafDistributionKitConfigurationOption
-
-The KarafDistributionKitConfigurationOption is almost equal to all variations of the KarafDistributionConfigurationOption with the exception that it requires to have set a platform and optionally the executable and the files which should be made executable additionally. By default it is bin/karaf for nix platforms and bin\karaf.bat for windows platforms. The executable option comes in handy if you like to e.g. embed an own java runtime. You should add a windows AND a linux Kit definition. The framework automatically takes the correct one then. The following shows a simple example for karaf:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{
-        new KarafDistributionKitConfigurationOption("mvn:org.apache.karaf/apache-karaf/${project.version}/zip",
-            Platform.WINDOWS).executable("bin\\karaf.bat").filesToMakeExecutable("bin\\admin.bat"),
-        new KarafDistributionKitConfigurationOption("mvn:org.apache.karaf/apache-karaf/${project.version}/tar.gz", "karaf",
-            Platform.NIX).executable("bin/karaf").filesToMakeExecutable("bin/admin") };
-}
-{pygmentize}
-
-h3. KarafDistributionConfigurationFilePutOption
-
-The option replaces or adds an option to one of Karaf's configuration files:
-
-{pygmentize:java}
-new KarafDistributionConfigurationFilePutOption(
-  "etc/config.properties", // config file to modify based on karaf.base
-  "karaf.framework", // key to add or change
-  "equinox") // value to add or change
-{pygmentize}
-
-This option could also be used in "batch-mode" via a property file. Therefore use the KarafDistributionOption#editConfigurationFilePut(final String configurationFilePath, File source, String... keysToUseFromSource) method. This option allows you to add all properties found in the file as KarafDistributionConfigurationFilePutOption. If you configure the "keysToUseFromSource" array only the keys specified there will be used. That way you can easily put an entire range of properties.
-
-h3. KarafDistributionConfigurationFileExtendOption
-
-This one does the same as the KarafDistributionConfigurationFilePutOption option with the one difference that it either adds or appends a specific property. This is especially useful if you do not want to store the entire configuration in the line in your code.
-
-This option could also be extended in "batch-mode" via a property file. Therefore use the KarafDistributionOption#editConfigurationFileExtend(final String configurationFilePath, File source, String... keysToUseFromSource) method. This option allows you to extend all properties found in the file as KarafDistributionConfigurationFileExtendOption. If you configure the "keysToUseFromSource" array only the keys specified there will be used. That way you can easily extend an entire range of properties.
-
-h3. KarafDistributionConfigurationFileReplacementOption
-
-The file replacement option allows you to simply replace a file in you Karaf distribution with a different file:
-
-{pygmentize:java}
-new KarafDistributionConfigurationFileReplacementOption("etc/tests.cfg", new File(
-    "src/test/resources/BaseKarafDefaultFrameworkDuplicatedPropertyEntryTestSecondKey"));
-{pygmentize}
-
-h3. ProvisionOption
-
-The new test container fully supports the provision option. Feel free to use any option provided here by paxexam itself (e.g. Maven resolver). All those artifacts are copied into the deploy folder of your Karaf distribution before it is started. Therefore they all will be available after startup.
-
-h3. KarafDistributionConfigurationConsoleOption
-
-The test container supports options to configure if the localConsole and/or the remote shell should be started. Possible options to do so are shown in the following two examples:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip"), 
-        configureConsole().ignoreLocalConsole().startRemoteShell() };
-}
-{pygmentize}
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip"), 
-        configureConsole().startLocalConsole(), configureConsole().ignoreRemoteShell() };
-}
-{pygmentize}
-
-h3. VMOption
-
-The Karaf container passes the vmOptions now through to the Karaf environment. They are directly passed to the startup of the container. In addition the KarafDistributionOption helper has two methods (debugConfiguration() and debugConfiguration(String port, boolean hold)) to activate debugging quickly.
-
-h3. LogLevelOption
-
-The Paxexam-Karaf specific log-level option allows an easy way to set a specific log-level for the Karaf based distribution. For example simply add the following to your Option[] array to get TRACE logging:
-
-{pygmentize:java}
-import static org.openengsb.labs.paxexam.karaf.options.KarafDistributionOption.logLevel;
-...
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip"), 
-        logLevel(LogLevel.TRACE) };
-}
-{pygmentize}
-
-h3. DoNotModifyLogOption
-
-The option to modify the logging behavior requires that the container automatically modifies the logging configuration file. If you would like to suppress this behavior simply set the doNotModifyLogConfiguration option as shown in the next example:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip"), 
-        doNotModifyLogConfiguration() };
-}
-{pygmentize}
-
-h3. KeepRuntimeFolderOption
-
-Per default the test container removes all test runner folders. If you want to keep them for any reasons (e.g. check why a test fails) set the following option:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip"), 
-        keepRuntimeFolder() };
-}
-{pygmentize}
-
-h3. FeaturesScannerProvisionOption
-
-The FeaturesScannerProvisionOption (e.g. CoreOption.scanFeature()) are directly supported by the Paxexam Karaf Testframework.
-
-h3. BootDelegationOption
-
-The BootDelegationOption as known from PaxExam is also supported added the boot delegation string directly into the correct property files.
-
-h3. SystemPackageOption
-
-The Standard Exam SystemPackageOption is implemented by adding those packages to "org.osgi.framework.system.packages.extra" of the config.properties file.
-
-h3. BootClasspathLibraryOption
-
-The BootClasspathLibraryOption is honored by copying the urls into the lib directory where they are automatically taken and worked on.
-
-h3. ExamBundlesStartLevel
-
-The ExamBundlesStartLevel can be used to configure the start lvl of the bundles provided by the test-frameworks features.xml. Simply use it as a new option like:
-
-{pygmentize:java}
-@Configuration
-public Option[] config() {
-    return new Option[]{ karafDistributionConfiguration("mvn:org.apache.karaf/apache-karaf/${project.version}/zip"),
-            useOwnExamBundlesStartLevel(4) };
-}
-{pygmentize}
-
-h2. Driver
-
-Drivers are the parts of the framework responsible for running the Karaf Based Distribution. By default the already in the overview explained KarafDistributionConfigurationOption uses a JavaRunner starting the distribution platform independent but not using the scripts in the distribution. If you like to test those scripts too an option is to to use the ScriptRunner via the KarafDistributionKitConfigurationOption instead.
-
-h3. JavaRunner
-
-The JavaRunner builds the entire command itself and executes Karaf in a new JVM. This behavior is more or less exactly what the default runner does. Simply use the KarafDistributionConfigurationOption as explained in the Commands section to use this.
-
-h3. ScriptRunner
-The script runner has the disadvantage over the java runner that it is also platform dependent. The advantage though is that you can also test your specific scripts. To use it follow the explanation of the KarafDistributionKitConfigurationOption in the Commands section.
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/asf-logo.png b/karaf-2.3.x/manual/src/main/webapp/images/asf-logo.png
deleted file mode 100644
index d824fab..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/asf-logo.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/bg.png b/karaf-2.3.x/manual/src/main/webapp/images/bg.png
deleted file mode 100644
index 878a84f..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/bg.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/bg02-blue-left.png b/karaf-2.3.x/manual/src/main/webapp/images/bg02-blue-left.png
deleted file mode 100644
index 057efdf..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/bg02-blue-left.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/bg02-blue-right.png b/karaf-2.3.x/manual/src/main/webapp/images/bg02-blue-right.png
deleted file mode 100644
index edf9a9d..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/bg02-blue-right.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/bg02-white-left-nogr.png b/karaf-2.3.x/manual/src/main/webapp/images/bg02-white-left-nogr.png
deleted file mode 100644
index 1c5186c..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/bg02-white-left-nogr.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/bg02-white-right-nogr.png b/karaf-2.3.x/manual/src/main/webapp/images/bg02-white-right-nogr.png
deleted file mode 100644
index 9734def..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/bg02-white-right-nogr.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/big-bullet.png b/karaf-2.3.x/manual/src/main/webapp/images/big-bullet.png
deleted file mode 100644
index f036db5..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/big-bullet.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/deployer.png b/karaf-2.3.x/manual/src/main/webapp/images/deployer.png
deleted file mode 100644
index 505eb3c..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/deployer.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_admin.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_admin.jpg
deleted file mode 100644
index 93e8d0e..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_admin.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_connect.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_connect.jpg
deleted file mode 100644
index 6041ee1..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_connect.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_features.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_features.jpg
deleted file mode 100644
index 233e5fa..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_features.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_memory.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_memory.jpg
deleted file mode 100644
index c9fbb29..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_memory.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_overview.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_overview.jpg
deleted file mode 100644
index b41a72b..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_overview.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_summary.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_summary.jpg
deleted file mode 100644
index 7245d12..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_summary.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_threads.jpg b/karaf-2.3.x/manual/src/main/webapp/images/jconsole_threads.jpg
deleted file mode 100644
index b4c0cb2..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/jconsole_threads.jpg
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/karaf-logo.png b/karaf-2.3.x/manual/src/main/webapp/images/karaf-logo.png
deleted file mode 100644
index 066ab86..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/karaf-logo.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/karaf.png b/karaf-2.3.x/manual/src/main/webapp/images/karaf.png
deleted file mode 100644
index f9fb4a4..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/karaf.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/karaf2.png b/karaf-2.3.x/manual/src/main/webapp/images/karaf2.png
deleted file mode 100644
index f9fb4a4..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/karaf2.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/left-box-bottom.png b/karaf-2.3.x/manual/src/main/webapp/images/left-box-bottom.png
deleted file mode 100644
index 0495248..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/left-box-bottom.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/left-box-right.png b/karaf-2.3.x/manual/src/main/webapp/images/left-box-right.png
deleted file mode 100644
index 2698074..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/left-box-right.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/images/left-box-top.png b/karaf-2.3.x/manual/src/main/webapp/images/left-box-top.png
deleted file mode 100644
index e1fc26e..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/images/left-box-top.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/manual/src/main/webapp/index.conf b/karaf-2.3.x/manual/src/main/webapp/index.conf
deleted file mode 100644
index 1575417..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/index.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-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.3.x/manual/src/main/webapp/manual.conf b/karaf-2.3.x/manual/src/main/webapp/manual.conf
deleted file mode 100644
index b6c3050..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/manual.conf
+++ /dev/null
@@ -1,73 +0,0 @@
-{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/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.3.x/manual/src/main/webapp/overview.conf b/karaf-2.3.x/manual/src/main/webapp/overview.conf
deleted file mode 100644
index 30c7ad3..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/overview.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-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 {{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 {{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.3.x/manual/src/main/webapp/quick-start.conf b/karaf-2.3.x/manual/src/main/webapp/quick-start.conf
deleted file mode 100644
index c45f773..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/quick-start.conf
+++ /dev/null
@@ -1,169 +0,0 @@
-
-
-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.10.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}
-system: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.3.x/manual/src/main/webapp/users-guide/child-instances.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/child-instances.conf
deleted file mode 100644
index f59d527..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/child-instances.conf
+++ /dev/null
@@ -1,130 +0,0 @@
-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/admin] commands.
- 
-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] instance [command]
-{code}
-
-NB: the password will be prompted.
-
-NB: you can directly execute shell command on the target instance.
-
-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 {{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.3.x/manual/src/main/webapp/users-guide/configuration.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/configuration.conf
deleted file mode 100644
index 38ddf8c..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/configuration.conf
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/users-guide/deployer.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/deployer.conf
deleted file mode 100644
index ed33b17..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/deployer.conf
+++ /dev/null
@@ -1,226 +0,0 @@
-
-
-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}
-
-
-You may set the manifest headers by specifying them as URL parameters, '$' is used separate the hierarch path and query parts of the URL, with standard URL syntax for query parameters of key=value pairs joined by '&'.
-
-On the command line you must use single quotes around the URL to prevent the shell from attempting variable expansion, and if present, you must escape exclamation marks with a backslash.
-
-{code}
-install -s 'wrap:mvn:jboss/jbossall-client/4.2.3.GA/$Bundle-SymbolicName=jbossall-client&Bundle-Version=4.2.3.GA&Export-Package=org.jboss.remoting;version="4.2.3.GA",\!*'
-{code}
-
-When defined in a features.xml file, it's necessary to escape any ampersands and quotes, or use a CDATA tag.
-
-{code:lang=xml}
-<bundle>wrap:mvn:jboss/jbossall-client/4.3.2.GA/$Bundle-SymbolicName=jbossall-client&amp;Bundle-Version=4.3.2.GA&amp;Export-Package=org.jboss.remoting;version=&quot;4.3.2.GA&quot;,!*</bundle>
-{code}
-
-
diff --git a/karaf-2.3.x/manual/src/main/webapp/users-guide/directory-structure.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/directory-structure.conf
deleted file mode 100644
index 3848832..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/directory-structure.conf
+++ /dev/null
@@ -1,21 +0,0 @@
-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.3.x/manual/src/main/webapp/users-guide/failover.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/failover.conf
deleted file mode 100644
index aaa55de..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/failover.conf
+++ /dev/null
@@ -1,160 +0,0 @@
-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
-
-The same rules apply when using derby.  Make sure you have the driver jar file in the Karaf {{lib}} folder before starting Karaf.
-
-Then make you update the properties in {{$KARAF_HOME/etc/system.properties}} to look something like this example:
-
-{noformat}
-karaf.lock=true
-karaf.lock.class=org.apache.karaf.main.DerbyJDBCLock
-karaf.lock.jdbc.url=jdbc:derby://127.0.0.1:1527/dbname
-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}
-
-h3. MySQL
-
-Make sure you have the MySQL driver jar file in the Karaf {{lib}} folder before starting Karaf.
-
-*NOTE*: for 2.2.x, 2.3.x you need to rename the MySQL Driver jar to prefix with 'karaf-' in order for karaf to pick it up, otherwise you will see karaf just hang on startup and the log will show you that it could not find the driver.
-
-Then make you update the properties in {{$KARAF_HOME/etc/system.properties}} to look something like this example:
-
-{noformat}
-karaf.lock=true
-karaf.lock.class=org.apache.karaf.main.MySQLJDBCLock
-karaf.lock.jdbc.url=jdbc:mysql://127.0.0.1:3306/dbname
-karaf.lock.jdbc.driver=com.mysql.jdbc.Driver
-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}
-
-h3. PostgreSQL
-
-Make sure you have the PostgreSQL driver jar file in the Karaf {{lib}} folder before starting Karaf.
-
-*NOTE*: for 2.2.x, 2.3.x you need to rename the PostgreSQL Driver jar to prefix with 'karaf-' in order for karaf to pick it up, otherwise you will see karaf just hang on startup and the log will show you that it could not find the driver.
-
-Then make you update the properties in {{$KARAF_HOME/etc/system.properties}} to look something like this example:
-
-{noformat}
-karaf.lock=true
-karaf.lock.class=org.apache.karaf.main.PostgreSQLJDBCLock
-karaf.lock.jdbc.url=jdbc:postgresql://127.0.0.1:5432/dbname
-karaf.lock.jdbc.driver=org.postgresql.Driver
-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=0
-{noformat}
-
-{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.3.x/manual/src/main/webapp/users-guide/http.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/http.conf
deleted file mode 100644
index 750de9c..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/http.conf
+++ /dev/null
@@ -1,55 +0,0 @@
-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.3.x/manual/src/main/webapp/users-guide/index.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/index.conf
deleted file mode 100644
index da38151..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/index.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-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]
-* [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.3.x/manual/src/main/webapp/users-guide/installation.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/installation.conf
deleted file mode 100644
index bc6d2f0..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/installation.conf
+++ /dev/null
@@ -1,118 +0,0 @@
-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.3.x/manual/src/main/webapp/users-guide/jmx.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/jmx.conf
deleted file mode 100644
index 0a0932a..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/jmx.conf
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/users-guide/jre-tuning.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/jre-tuning.conf
deleted file mode 100644
index f6a592d..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/jre-tuning.conf
+++ /dev/null
@@ -1,333 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/users-guide/kar.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/kar.conf
deleted file mode 100644
index 95af036..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/kar.conf
+++ /dev/null
@@ -1,107 +0,0 @@
-
-
-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.8</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 uncompress KAR archives in the system repository and register the features descriptor.
-All features contained in a KAR archive will be automatically installed at deployment time.
-You can now see your features installed:
-
-{code}
-karaf@root> features:list|grep -i my
-[  installed] [1.0             ] my                            repo-0
-{code}
diff --git a/karaf-2.3.x/manual/src/main/webapp/users-guide/logging-system.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/logging-system.conf
deleted file mode 100644
index df89931..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/logging-system.conf
+++ /dev/null
@@ -1,177 +0,0 @@
-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.3.x/manual/src/main/webapp/users-guide/provisioning-schema.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/provisioning-schema.conf
deleted file mode 100644
index 17610d7..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/provisioning-schema.conf
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-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.3.x/manual/src/main/webapp/users-guide/provisioning.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/provisioning.conf
deleted file mode 100644
index c8092fc..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/provisioning.conf
+++ /dev/null
@@ -1,300 +0,0 @@
-
-
-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}
-
-{warning}
-Before Karaf 3.0 the start-level was NOT considered during the feature startup, but only the order in which bundles are defined in your feature.xml. Starting with 3.0 the start-level is no considered correctly. If you need to use the old behavior you can uncomment and change the respectStartLvlDuringFeatureStartup variable in org.apache.karaf.features.xml to false. But please be aware that it will be removed in 4.0 and should therefore be used only temporarily.
-{warning}
-
-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 {{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 [building custom distributions|customer-distribution] section.
-
-
diff --git a/karaf-2.3.x/manual/src/main/webapp/users-guide/remote-console.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/remote-console.conf
deleted file mode 100644
index 8f737f1..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/remote-console.conf
+++ /dev/null
@@ -1,115 +0,0 @@
-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 {{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:
-{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 {{lib}} directory:
-{code}
-bin/client -u karaf -p karaf -a 8101 hostname osgi:shutdown
-{code}
diff --git a/karaf-2.3.x/manual/src/main/webapp/users-guide/security.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/security.conf
deleted file mode 100644
index 482f633..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/security.conf
+++ /dev/null
@@ -1,83 +0,0 @@
-h1. Security
-
-h2. Managing users and passwords
-
-The default security configuration uses a property file located at {{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 {{lib/ext}}
-* modify the {{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.3.x/manual/src/main/webapp/users-guide/start-stop.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/start-stop.conf
deleted file mode 100644
index 250dd19..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/start-stop.conf
+++ /dev/null
@@ -1,107 +0,0 @@
-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 {{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}
-system: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}
-system: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}
-system:shutdown 10:35
-{code}
-
-The following command will shutdown Karaf in 10 minutes:
-
-{code}
-system: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.3.x/manual/src/main/webapp/users-guide/using-console.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/using-console.conf
deleted file mode 100644
index 09b4072..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/using-console.conf
+++ /dev/null
@@ -1,99 +0,0 @@
-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.3.x/manual/src/main/webapp/users-guide/web-applications.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/web-applications.conf
deleted file mode 100644
index 3f4fbb4..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/web-applications.conf
+++ /dev/null
@@ -1,99 +0,0 @@
-
-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.3.x/manual/src/main/webapp/users-guide/web-console.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/web-console.conf
deleted file mode 100644
index dce1abe..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/web-console.conf
+++ /dev/null
@@ -1,35 +0,0 @@
-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.3.x/manual/src/main/webapp/users-guide/wrapper.conf b/karaf-2.3.x/manual/src/main/webapp/users-guide/wrapper.conf
deleted file mode 100644
index 53821e2..0000000
--- a/karaf-2.3.x/manual/src/main/webapp/users-guide/wrapper.conf
+++ /dev/null
@@ -1,126 +0,0 @@
-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
-
-h2. Configuration Hints
-
-If you need to append parameters to the "java" invoke (like memory configurations) you add those in the KARAF-wrapper file using "wrapper.java.additional.n=PARAMETER" where "n" is the number of the additional config (typically you simply look for the last entry and use n+1) and PARAMTER is any JVM parameter you would like to append, such as "-XX:MaxPermSize=1024m".
-
-{code}
diff --git a/karaf-2.3.x/pom.xml b/karaf-2.3.x/pom.xml
deleted file mode 100644
index b42d7fd..0000000
--- a/karaf-2.3.x/pom.xml
+++ /dev/null
@@ -1,1716 +0,0 @@
-<?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>12</version>
-        <relativePath />
-    </parent>
-
-    <groupId>org.apache.karaf</groupId>
-    <artifactId>karaf</artifactId>
-    <packaging>pom</packaging>
-    <version>2.3.1</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>tooling</module>
-        <module>archetypes</module>
-        <module>diagnostic</module>
-        <module>itests</module>
-    </modules>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/karaf/tags/karaf-2.3.1</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/karaf/tags/karaf-2.3.1</developerConnection>
-        <url>http://svn.apache.org/viewvc/karaf/tags/karaf-2.3.1</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_6</aopalliance.bundle.version>
-        <asm.version>4.1</asm.version>
-        <bndlib.version>1.50.0</bndlib.version>
-        <cglib.bundle.version>2.2.2_1</cglib.bundle.version>
-        <commons-beanutils.version>1.8.3</commons-beanutils.version>
-        <commons-codec.version>1.7</commons-codec.version>
-        <commons-collections.version>3.2.1</commons-collections.version>
-        <commons-compress.version>1.4.1</commons-compress.version>
-        <commons-fileupload.version>1.2.2</commons-fileupload.version>
-        <commons-io.version>2.4</commons-io.version>
-        <commons-lang.version>2.6</commons-lang.version>
-        <injection.bundle.version>1.0</injection.bundle.version>
-        <jasypt.bundle.version>1.9.0_1</jasypt.bundle.version>
-        <jetty.version>7.6.8.v20121106</jetty.version>
-        <junit.version>4.10</junit.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.2</geronimo.servlet.version>
-        <easymock.version>3.1</easymock.version>
-        <equinox.version>3.8.0.v20120529-1548</equinox.version>
-        <felix.bundlerepository.version>1.6.6</felix.bundlerepository.version>
-        <felix.configadmin.version>1.6.0</felix.configadmin.version>
-        <felix.fileinstall.version>3.2.6</felix.fileinstall.version>
-        <felix.framework.version>4.0.3</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.2.0</felix.utils.version>
-        <felix.webconsole.version>4.0.0</felix.webconsole.version>
-        <felix.metatype.version>1.0.6</felix.metatype.version>
-        <felix.eventadmin.version>1.3.2</felix.eventadmin.version>
-        <felix.eventadmin-plugin.version>1.0.2</felix.eventadmin-plugin.version>
-        <felix.obr.version>1.0.2</felix.obr.version>
-        <felix.scr.version>1.6.2</felix.scr.version>
-        <aries.application.version>1.0.0</aries.application.version>
-        <aries.application.api.version>1.0.0</aries.application.api.version>
-        <aries.application.management.version>1.0.0</aries.application.management.version>
-        <aries.blueprint.version>1.0.1</aries.blueprint.version>
-        <aries.blueprint.api.version>1.0.0</aries.blueprint.api.version>
-        <aries.blueprint.core.version>1.1.0</aries.blueprint.core.version>
-        <aries.blueprint.cm.version>1.0.1</aries.blueprint.cm.version>
-        <aries.jmx.api.version>1.1.0</aries.jmx.api.version>
-        <aries.jmx.core.version>1.1.1</aries.jmx.core.version>
-        <aries.jmx.blueprint.api.version>1.1.0</aries.jmx.blueprint.api.version>
-        <aries.jmx.blueprint.core.version>1.1.0</aries.jmx.blueprint.core.version>
-        <aries.jpa.version>1.0.1</aries.jpa.version>
-        <aries.jpa.api.version>1.0.0</aries.jpa.api.version>
-        <aries.jpa.container.version>1.0.0</aries.jpa.container.version>
-        <aries.jpa.container.context.version>1.0.1</aries.jpa.container.context.version>
-        <aries.jpa.blueprint.version>1.0.1</aries.jpa.blueprint.version>
-        <aries.jndi.version>1.0.0</aries.jndi.version>
-        <aries.jndi.api.version>1.0.0</aries.jndi.api.version>
-        <aries.proxy.version>1.0.1</aries.proxy.version>
-        <aries.proxy.api.version>1.0.0</aries.proxy.api.version>
-        <aries.transaction.version>1.0.1</aries.transaction.version>
-        <aries.transaction.manager.version>1.0.1</aries.transaction.manager.version>
-        <aries.transaction.blueprint.version>1.0.0</aries.transaction.blueprint.version>
-        <aries.transaction.jdbc.version>1.0.0</aries.transaction.jdbc.version>
-        <aries.util.version>1.1.0</aries.util.version>
-        <jansi.version>1.9</jansi.version>
-        <jline.version>2.9</jline.version>
-        <jsw.version>3.2.3</jsw.version>
-        <log4j.version>1.2.17</log4j.version>
-        <maven.version>2.0.9</maven.version>
-        <mina.version>2.0.7</mina.version>
-        <osgi.version>4.3.1</osgi.version>
-        <pax.base.version>1.4.0</pax.base.version>
-        <pax.exam.version>2.6.0</pax.exam.version>
-        <pax.logging.version>1.7.0</pax.logging.version>
-        <pax.runner.version>1.7.6</pax.runner.version>
-        <pax.url.version>1.3.5</pax.url.version>
-        <pax.web.version>1.1.12</pax.web.version>
-        <pax.swissbox.version>1.5.1</pax.swissbox.version>
-        <pax.tinybundles.version>1.3.0</pax.tinybundles.version>
-        <plexus.utils.version>2.1</plexus.utils.version>
-        <portlet-api.version>2.0</portlet-api.version>
-        <servicemix.specs.version>2.2.0</servicemix.specs.version>
-        <servlet.api.version>2.5</servlet.api.version>
-        <slf4j.version>1.7.2</slf4j.version>
-        <spring.osgi.version>1.2.1</spring.osgi.version>
-        <spring2.version>2.5.6.SEC03</spring2.version>
-        <spring30.version>3.0.7.RELEASE</spring30.version>
-        <spring31.version>3.1.4.RELEASE</spring31.version>
-        <sshd.version>0.8.0</sshd.version>
-        <struts.bundle.version>1.3.10_1</struts.bundle.version>
-        <xbean.version>3.12</xbean.version>
-        <javax.mail.version>1.4.5</javax.mail.version>
-        <http.feature.version>[2,3)</http.feature.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>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>org.apache.felix.scr</artifactId>
-                <version>${felix.scr.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>biz.aQute</groupId>
-                <artifactId>bndlib</artifactId>
-                <version>${bndlib.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>${spring30.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>${spring30.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-core</artifactId>
-                <version>${spring30.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context</artifactId>
-                <version>${spring30.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-test</artifactId>
-                <version>${spring30.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.8.4_1</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.ow2.asm</groupId>
-                <artifactId>asm-all</artifactId>
-                <version>${asm.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>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>13.0.1</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.base</groupId>
-                <artifactId>ops4j-base-lang</artifactId>
-                <version>${pax.base.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.base</groupId>
-                <artifactId>ops4j-base-net</artifactId>
-                <version>${pax.base.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.activator</artifactId>
-                <version>${servicemix.specs.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.specs</groupId>
-                <artifactId>org.apache.servicemix.specs.locator</artifactId>
-                <version>${servicemix.specs.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.servicemix.specs</groupId>
-                <artifactId>org.apache.servicemix.specs.jaxp-api-1.4</artifactId>
-                <version>${servicemix.specs.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.specs</groupId>
-                <artifactId>org.apache.servicemix.specs.jaxb-api-2.2</artifactId>
-                <version>${servicemix.specs.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.specs</groupId>
-                <artifactId>org.apache.servicemix.specs.jaxws-api-2.2</artifactId>
-                <version>${servicemix.specs.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.specs</groupId>
-                <artifactId>org.apache.servicemix.specs.saaj-api-1.3</artifactId>
-                <version>${servicemix.specs.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.servicemix.specs</groupId>
-                <artifactId>org.apache.servicemix.specs.stax-api-1.2</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-container-remote</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-spi</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-invoker-junit</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-container-rbc</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-container-rbc-client</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-junit4</artifactId>
-                <version>${pax.exam.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-extender-service</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.exam</groupId>
-                <artifactId>pax-exam-inject</artifactId>
-                <version>${pax.exam.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.geronimo.specs</groupId>
-                <artifactId>geronimo-atinject_1.0_spec</artifactId>
-                <version>${injection.bundle.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.ops4j.pax.swissbox</groupId>
-                <artifactId>pax-swissbox-bnd</artifactId>
-                <version>${pax.swissbox.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.swissbox</groupId>
-                <artifactId>pax-swissbox-lifecycle</artifactId>
-                <version>${pax.swissbox.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.swissbox</groupId>
-                <artifactId>pax-swissbox-property</artifactId>
-                <version>${pax.swissbox.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.ops4j.pax.swissbox</groupId>
-                <artifactId>pax-swissbox-tracker</artifactId>
-                <version>${pax.swissbox.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.api</artifactId>
-                <version>${aries.blueprint.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.blueprint</groupId>
-                <artifactId>org.apache.aries.blueprint.core</artifactId>
-                <version>${aries.blueprint.core.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.blueprint</groupId>
-                <artifactId>org.apache.aries.blueprint.cm</artifactId>
-                <version>${aries.blueprint.cm.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.proxy</groupId>
-                <artifactId>org.apache.aries.proxy.api</artifactId>
-                <version>${aries.proxy.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.proxy</groupId>
-                <artifactId>org.apache.aries.proxy.impl</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.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.jmx</groupId>
-                <artifactId>org.apache.aries.jmx.core</artifactId>
-                <version>${aries.jmx.core.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.jmx</groupId>
-                <artifactId>org.apache.aries.jmx.blueprint.api</artifactId>
-                <version>${aries.jmx.blueprint.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.jmx</groupId>
-                <artifactId>org.apache.aries.jmx.blueprint.core</artifactId>
-                <version>${aries.jmx.blueprint.core.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.aries.jndi</groupId>
-                <artifactId>org.apache.aries.jndi.api</artifactId>
-                <version>${aries.jndi.api.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>org.apache.xbean</groupId>
-                <artifactId>xbean-blueprint</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>org.apache.commons</groupId>
-                <artifactId>commons-compress</artifactId>
-                <version>${commons-compress.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>${commons-io.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.5.1</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.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <version>2.4</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-enforcer-plugin</artifactId>
-                    <version>1.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.9</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.3.2</version>
-                    <configuration>
-                        <useReleaseProfile>false</useReleaseProfile>
-                        <preparationGoals>clean install</preparationGoals>
-                        <goals>deploy</goals>
-                        <arguments>-Prelease,deploy,src,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}</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.12</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-shade-plugin</artifactId>
-                    <version>1.7</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.7</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>exec-maven-plugin</artifactId>
-                    <version>1.2.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-dependency-plugin</artifactId>
-                    <version>2.4</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.3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-war-plugin</artifactId>
-                    <version>2.2</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.eclipse.m2e</groupId>
-                    <artifactId>lifecycle-mapping</artifactId>
-                    <version>1.0.0</version>
-                    <configuration>
-                        <lifecycleMappingMetadata>
-                            <pluginExecutions>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.felix</groupId>
-                                        <artifactId>maven-bundle-plugin</artifactId>
-                                        <versionRange>[2.3.7,)</versionRange>
-                                        <goals>
-                                            <goal>cleanVersions</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.maven.plugins</groupId>
-                                        <artifactId>maven-dependency-plugin</artifactId>
-                                        <versionRange>[2.4,)</versionRange>
-                                        <goals>
-                                            <goal>copy</goal>
-                                            <goal>unpack</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.fusesource.scalate</groupId>
-                                        <artifactId>maven-scalate-plugin</artifactId>
-                                        <versionRange>[1.4.0,)</versionRange>
-                                        <goals>
-                                            <goal>sitegen</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                                <pluginExecution>
-                                    <pluginExecutionFilter>
-                                        <groupId>org.apache.servicemix.tooling</groupId>
-                                        <artifactId>depends-maven-plugin</artifactId>
-                                        <versionRange>[1.2,)</versionRange>
-                                        <goals>
-                                            <goal>generate-depends-file</goal>
-                                        </goals>
-                                    </pluginExecutionFilter>
-                                    <action>
-                                        <ignore />
-                                    </action>
-                                </pluginExecution>
-                            </pluginExecutions>
-                        </lifecycleMappingMetadata>
-                    </configuration>
-                </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.1</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.1</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-report-plugin</artifactId>
-                <version>2.12</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.8</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>
-                                <!-- GIT files -->
-                                <exclude>**/.git/**/*</exclude>
-                                <!-- IDEA files -->
-                                <exclude>**/.idea/**/*</exclude>
-                                <exclude>**/*.iml</exclude>
-                                <exclude>**/*.ipr</exclude>
-                                <exclude>**/*.iws</exclude>
-                                <!-- Eclipse files -->
-                                <exclude>**/.*</exclude>
-                                <exclude>**/eclipse-classes/**/*</exclude>
-                                <exclude>**/dependency-reduced-pom.xml</exclude>
-                                <!-- Resources files -->
-                                <exclude>**/bundle.info</exclude>
-                                <exclude>**/*.txt</exclude>
-                                <exclude>**/foo</exclude>
-                                <exclude>**/pom.properties</exclude>
-                                <exclude>**/*.rat</exclude>
-                                <exclude>**/build-main.xml</exclude>
-                                <!-- Manual files -->
-                                <exclude>manual/**/*.css</exclude>
-                                <exclude>manual/**/*.ssp</exclude>
-                                <exclude>manual/**/*.conf</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.8.1</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.3.x/shell/commands/NOTICE b/karaf-2.3.x/shell/commands/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/commands/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/commands/pom.xml b/karaf-2.3.x/shell/commands/pom.xml
deleted file mode 100644
index 76053e8..0000000
--- a/karaf-2.3.x/shell/commands/pom.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?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.3.1</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;-split-package:=merge-first
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/CatAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/CatAction.java
deleted file mode 100644
index 8bcce82..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/CatAction.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.
- */
-@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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ClearAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ClearAction.java
deleted file mode 100644
index 2cebeb7..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ClearAction.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/DateAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/DateAction.java
deleted file mode 100644
index 29df1e8..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/DateAction.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.commands;
-
-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;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-@Command(scope = "shell", name = "date", description = "Display the current time in the given FORMAT")
-public class DateAction extends AbstractAction {
-
-    @Option(name = "-d", aliases = { "--date" }, description = "Display time described, not now", multiValued = false, required = false)
-    private String date;
-
-    @Argument(index = 0, name = "format", description = "Output format", multiValued = false, required = false)
-    private String format;
-
-    protected Object doExecute() throws Exception {
-        Date d;
-        if (date == null || date.equalsIgnoreCase("now")) {
-            d = new Date();
-        } else {
-            if (date.startsWith("@")) {
-                d = new Date(Long.parseLong(date.substring(1)));
-            } else {
-                d = new Date(date);
-            }
-        }
-        if (format == null) {
-            System.out.println(d);
-        } else {
-            // transform Unix format to Java SimpleDateFormat (if required)
-            format = format.replaceAll("%a","EEE");
-            format = format.replaceAll("%A", "EEEEEEE");
-            format = format.replaceAll("%b", "MMM");
-            format = format.replaceAll("%B", "MMMMMMM");
-            format = format.replaceAll("%c", "MMM EEE d HH:mm:ss yyyy");
-            format = format.replaceAll("%C","yy");
-            format = format.replaceAll("%d", "dd");
-            format = format.replaceAll("%D", "MM/dd/yy");
-            format = format.replaceAll("%e", "dd");
-            format = format.replaceAll("%F", "yyyy-MM-dd");
-            format = format.replaceAll("%g", "YY");
-            format = format.replaceAll("%G", "YYYY");
-            format = format.replaceAll("%h", "MMM");
-            format = format.replaceAll("%H", "HH");
-            format = format.replaceAll("%I", "hh");
-            format = format.replaceAll("%j", "DDD");
-            format = format.replaceAll("%k", "HH");
-            format = format.replaceAll("%l", "hh");
-            format = format.replaceAll("%m", "MM");
-            format = format.replaceAll("%M", "mm");
-            format = format.replaceAll("%n", "\n");
-            format = format.replaceAll("%N", "S");
-            format = format.replaceAll("%p", "aa");
-            format = format.replaceAll("%P", "aa");
-            format = format.replaceAll("%r", "hh:mm:ss aa");
-            format = format.replaceAll("%R", "HH:mm");
-            format = format.replaceAll("%s", "S");
-            format = format.replaceAll("%S", "ss");
-            format = format.replaceAll("%t", "\t");
-            format = format.replaceAll("%T", "HH:mm:ss");
-            format = format.replaceAll("%u", "u");
-            format = format.replaceAll("%U", "w");
-            format = format.replaceAll("%V", "W");
-            format = format.replaceAll("%w", "u");
-            format = format.replaceAll("%W", "w");
-            format = format.replaceAll("%x", "MM/dd/yy");
-            format = format.replaceAll("%X", "HH:mm:ss");
-            format = format.replaceAll("%y", "yy");
-            format = format.replaceAll("%Y", "yyyy");
-            format = format.replaceAll("%z", "X");
-            format = format.replaceAll("%:z", "XXX");
-            format = format.replaceAll("%::z", "XXXX");
-            format = format.replaceAll("%:::z", "XXXX");
-            format = format.replaceAll("%Z", "z");
-            DateFormat df = new SimpleDateFormat(format);
-            System.out.println(df.format(d));
-        }
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EachAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EachAction.java
deleted file mode 100644
index 8fb9b18..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EachAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EchoAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EchoAction.java
deleted file mode 100644
index 69fe0e7..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/EchoAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ExecuteAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ExecuteAction.java
deleted file mode 100644
index 27eae6f..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/ExecuteAction.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.
- */
-@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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/GrepAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/GrepAction.java
deleted file mode 100644
index 9414149..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/GrepAction.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java
deleted file mode 100644
index 19b598c..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HistoryAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HistoryAction.java
deleted file mode 100644
index a3aeb3c..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/HistoryAction.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/IfAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/IfAction.java
deleted file mode 100644
index 3016294..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/IfAction.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/InfoAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/InfoAction.java
deleted file mode 100644
index 662ad8f..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/InfoAction.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-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());
-            }
-
-            List<String> sections = new ArrayList<String>(properties.keySet());
-            Collections.sort(sections);
-            for (String section : sections) {
-                List<Object> keys = new ArrayList<Object>(properties.get(section).keySet());
-                if (keys.size() > 0) {
-                    System.out.println(section);
-
-                    Collections.sort(keys, new Comparator<Object>() {
-                        public int compare(Object o1, Object o2) {
-                            return String.valueOf(o1).compareTo(String.valueOf(o2));
-                        }
-                    });
-
-                    for (Object key : keys) {
-                        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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/JavaAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/JavaAction.java
deleted file mode 100644
index 118493b..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/JavaAction.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.
- */
-@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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/LogoutAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/LogoutAction.java
deleted file mode 100644
index b3738fc..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/LogoutAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
deleted file mode 100644
index 192b0ff..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/NewAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/NewAction.java
deleted file mode 100644
index c898b36..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/NewAction.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-
-/**
- * Instantiate 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 instantiating 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 instantiating object.");
-        } else {
-            throw new Exception("Multiple matching constructors found on class " + clazz.getName() + " for arguments " + args + " when instantiating 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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/PrintfAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/PrintfAction.java
deleted file mode 100644
index 3e95dc9..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/PrintfAction.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SleepAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SleepAction.java
deleted file mode 100644
index 9b200c4..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SleepAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SortAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SortAction.java
deleted file mode 100644
index 3166355..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SortAction.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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
- */
-@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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SourceAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SourceAction.java
deleted file mode 100644
index 0c8eb6c..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/SourceAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TacAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TacAction.java
deleted file mode 100644
index 14c4517..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TacAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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
- */
-@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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java
deleted file mode 100644
index 89b79b8..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/WatchAction.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/WatchAction.java
deleted file mode 100644
index 90d5503..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/WatchAction.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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 = "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();
-                watchTask.abort();
-            } 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;
-        boolean doDisplay = true;
-
-        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);
-                session.put("SCOPE", "shell:osgi:*");
-                String output = "";
-                session.execute(command);
-                output = byteArrayOutputStream.toString();
-                // make sure before displaying that this is not a forgotten long running task
-                if (doDisplay) {
-                    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
-            }
-        }
-
-        /**
-         * Aborts the task that it currently running.
-         * It will prevent it from displaying anything.
-         */
-        public void abort() {
-            doDisplay = false;
-        }
-
-        /**
-         * Closes the {@CommandSession} and the streams for I/O.
-         *
-         * @throws IOException
-         */
-        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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoBundleTrackerCustomizer.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoBundleTrackerCustomizer.java
deleted file mode 100644
index bca1be6..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoBundleTrackerCustomizer.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoProvider.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoProvider.java
deleted file mode 100644
index 0460f29..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/InfoProvider.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.commands.info;
-
-import java.util.Properties;
-
-public interface InfoProvider {
-
-	public String getName();
-
-	public Properties getProperties();
-
-}
diff --git a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/PojoInfoProvider.java b/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/PojoInfoProvider.java
deleted file mode 100644
index c4b66d3..0000000
--- a/karaf-2.3.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/info/PojoInfoProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands b/karaf-2.3.x/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
deleted file mode 100644
index 2047f27..0000000
--- a/karaf-2.3.x/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
+++ /dev/null
@@ -1,35 +0,0 @@
-##---------------------------------------------------------------------------
-##  Licensed to the Apache Software Foundation (ASF) under one or more
-##  contributor license agreements.  See the NOTICE file distributed with
-##  this work for additional information regarding copyright ownership.
-##  The ASF licenses this file to You under the Apache License, Version 2.0
-##  (the "License"); you may not use this file except in compliance with
-##  the License.  You may obtain a copy of the License at
-##
-##     http://www.apache.org/licenses/LICENSE-2.0
-##
-##  Unless required by applicable law or agreed to in writing, software
-##  distributed under the License is distributed on an "AS IS" BASIS,
-##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-##  See the License for the specific language governing permissions and
-##  limitations under the License.
-##---------------------------------------------------------------------------
-org.apache.karaf.shell.commands.CatAction
-org.apache.karaf.shell.commands.ClearAction
-org.apache.karaf.shell.commands.DateAction
-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.3.x/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml b/karaf-2.3.x/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
deleted file mode 100644
index b0b6913..0000000
--- a/karaf-2.3.x/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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/date">
-            <action class="org.apache.karaf.shell.commands.DateAction"/>
-        </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/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.3.x/shell/commands/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/commands/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 8831206..0000000
--- a/karaf-2.3.x/shell/commands/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,35 +0,0 @@
-\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:date\u001B[0m Display the current time in the given FORMAT
-    \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.3.x/shell/commands/src/main/resources/org/apache/karaf/shell/commands/grep.txt b/karaf-2.3.x/shell/commands/src/main/resources/org/apache/karaf/shell/commands/grep.txt
deleted file mode 100644
index 1ada069..0000000
--- a/karaf-2.3.x/shell/commands/src/main/resources/org/apache/karaf/shell/commands/grep.txt
+++ /dev/null
@@ -1 +0,0 @@
-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.3.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/GrepTest.java b/karaf-2.3.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/GrepTest.java
deleted file mode 100644
index 7b341bc..0000000
--- a/karaf-2.3.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/GrepTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/SortTest.java b/karaf-2.3.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/SortTest.java
deleted file mode 100644
index 11a1a61..0000000
--- a/karaf-2.3.x/shell/commands/src/test/java/org/apache/karaf/shell/commands/SortTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/config/NOTICE b/karaf-2.3.x/shell/config/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/config/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/config/pom.xml b/karaf-2.3.x/shell/config/pom.xml
deleted file mode 100644
index dde9540..0000000
--- a/karaf-2.3.x/shell/config/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.utils</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.gogo.runtime</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.felix.utils*;-split-package:=merge-first,
-                            !*
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/CancelCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/CancelCommand.java
deleted file mode 100644
index 80c47cf..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/CancelCommand.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigCommandSupport.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigCommandSupport.java
deleted file mode 100644
index c972033..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigCommandSupport.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.felix.utils.properties.Properties;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-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 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) {
-            String factoryPid = fileName;
-            if (fileName.contains(FACTORY_SEPARATOR)) {
-                factoryPid = fileName.substring(0, fileName.lastIndexOf(FACTORY_SEPARATOR));
-            }
-            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);
-                        int indexOfFileNameStart = fileInstallFileName.lastIndexOf("/");
-                        int indexOfFileNameEnd = fileInstallFileName.lastIndexOf(CONFIG_SUFFIX);
-                        String relativeFileName = fileInstallFileName.substring(indexOfFileNameStart + 1, indexOfFileNameEnd);
-                        if (fileName.equals(relativeFileName)) {
-                            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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigPropertyCommandSupport.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigPropertyCommandSupport.java
deleted file mode 100644
index 7920e02..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ConfigPropertyCommandSupport.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/DeleteCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/DeleteCommand.java
deleted file mode 100644
index 5abe4f3..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/DeleteCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/EditCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/EditCommand.java
deleted file mode 100644
index ae43af9..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/EditCommand.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ListCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ListCommand.java
deleted file mode 100644
index 3395b55..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/ListCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 = "Query in LDAP syntax. Example: \"(service.pid=org.apache.karaf.log)\"", 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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropAppendCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropAppendCommand.java
deleted file mode 100644
index 39272a7..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropAppendCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropDelCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropDelCommand.java
deleted file mode 100644
index c8a5d11..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropDelCommand.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropListCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropListCommand.java
deleted file mode 100644
index ed2f45b..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropListCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropSetCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropSetCommand.java
deleted file mode 100644
index 245340a..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/PropSetCommand.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/UpdateCommand.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/UpdateCommand.java
deleted file mode 100644
index 6c99e12..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/UpdateCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationCompleter.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationCompleter.java
deleted file mode 100644
index 0e93914..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationCompleter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.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.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationPropertyCompleter.java b/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationPropertyCompleter.java
deleted file mode 100644
index 363e182..0000000
--- a/karaf-2.3.x/shell/config/src/main/java/org/apache/karaf/shell/config/completers/ConfigurationPropertyCompleter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.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.3.x/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 41f5b3c..0000000
--- a/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/config/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 79f9b8c..0000000
--- a/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,24 +0,0 @@
-\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.3.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 3bce187..0000000
--- a/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-#
-# 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.3.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index 433d5e6..0000000
--- a/karaf-2.3.x/shell/config/src/main/resources/OSGI-INF/metatype/metatype.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/config/src/main/resources/org/apache/karaf/shell/config/edit.txt b/karaf-2.3.x/shell/config/src/main/resources/org/apache/karaf/shell/config/edit.txt
deleted file mode 100644
index aa68062..0000000
--- a/karaf-2.3.x/shell/config/src/main/resources/org/apache/karaf/shell/config/edit.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-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.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/EditCommandTest.java b/karaf-2.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/EditCommandTest.java
deleted file mode 100644
index 1174f3f..0000000
--- a/karaf-2.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/EditCommandTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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((Dictionary) 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.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/MockCommandSession.java b/karaf-2.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/MockCommandSession.java
deleted file mode 100644
index 8953373..0000000
--- a/karaf-2.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/MockCommandSession.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/UpdateCommandTest.java b/karaf-2.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/UpdateCommandTest.java
deleted file mode 100644
index e246c75..0000000
--- a/karaf-2.3.x/shell/config/src/test/java/org/apache/karaf/shell/config/UpdateCommandTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 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((Dictionary) props);
-        expect(configFac.getBundleLocation()).andReturn(null);
-        replay(admin);
-        replay(configNew);
-        replay(configFac);
-
-        command.execute(session);
-
-    }
-
-}
diff --git a/karaf-2.3.x/shell/console/NOTICE b/karaf-2.3.x/shell/console/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/console/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/console/pom.xml b/karaf-2.3.x/shell/console/pom.xml
deleted file mode 100644
index 3aaa65e..0000000
--- a/karaf-2.3.x/shell/console/pom.xml
+++ /dev/null
@@ -1,160 +0,0 @@
-<?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.3.1</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.boot</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.karaf.jaas</groupId>
-            <artifactId>org.apache.karaf.jaas.modules</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.karaf</groupId>
-            <artifactId>org.apache.karaf.util</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.aries.blueprint</groupId>
-            <artifactId>org.apache.aries.blueprint.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</artifactId>
-        </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>
-            <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,
-                            org.apache.sshd.agent*;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,
-                            org.apache.felix.service.threadio;version=${felix.gogo.version};status=provisional;mandatory:=status,
-                            org.apache.karaf.shell.console*;version=${project.version},
-                            org.fusesource.jansi;version=${jansi.version};-split-package:=merge-first,
-                            jline*;version=${jline.version},
-                            org.fusesource.hawtjni*;version=1.0;-split-package:=merge-first
-                        </Export-Package>
-                        <Private-Package>
-                            org.fusesource.jansi.internal;-split-package:=merge-first,
-                            org.apache.karaf.util*;-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.3.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding-ssh.properties b/karaf-2.3.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding-ssh.properties
deleted file mode 100644
index a078f8f..0000000
--- a/karaf-2.3.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding-ssh.properties
+++ /dev/null
@@ -1,34 +0,0 @@
-##
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-##
-##  http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-##
-
-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[1mosgi:shutdown\u001B[0m' to shutdown Karaf.\r\n\
-Hit '\u001B[1m<ctrl-d>\u001B[0m' or type '\u001B[1mlogout\u001B[0m' to disconnect shell from current session.\r\n
-
-
diff --git a/karaf-2.3.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding.properties b/karaf-2.3.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding.properties
deleted file mode 100644
index c0a278f..0000000
--- a/karaf-2.3.x/shell/console/src/main/filtered-resources/org/apache/karaf/shell/console/branding.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-##
-## Licensed to the Apache Software Foundation (ASF) under one
-## or more contributor license agreements.  See the NOTICE file
-## distributed with this work for additional information
-## regarding copyright ownership.  The ASF licenses this file
-## to you under the Apache License, Version 2.0 (the
-## "License"); you may not use this file except in compliance
-## with the License.  You may obtain a copy of the License at
-##
-##  http://www.apache.org/licenses/LICENSE-2.0
-##
-## Unless required by applicable law or agreed to in writing,
-## software distributed under the License is distributed on an
-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-## KIND, either express or implied.  See the License for the
-## specific language governing permissions and limitations
-## under the License.
-##
-
-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 type '\u001B[1mosgi:shutdown\u001B[0m' or '\u001B[1mlogout\u001B[0m' to shutdown Karaf.\r\n
-
-
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java
deleted file mode 100644
index 38c6301..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Action.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.gogo.commands;
-
-import org.apache.felix.service.command.CommandSession;
-
-
-public interface Action
-{
-
-    Object execute(CommandSession session) throws Exception;
-
-}
-
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java
deleted file mode 100644
index 691402b..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Argument.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java
deleted file mode 100644
index 7b4558f..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Command.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CommandException.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CommandException.java
deleted file mode 100644
index dc3821d..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CommandException.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CompleterValues.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CompleterValues.java
deleted file mode 100644
index 996bfc8..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/CompleterValues.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java
deleted file mode 100644
index d2a730b..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/Option.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/SubShell.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/SubShell.java
deleted file mode 100644
index 1752398..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/SubShell.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.felix.gogo.commands;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.TYPE})
-public @interface SubShell {
-
-    /**
-     * 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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java
deleted file mode 100644
index 1bf2b96..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/AbstractCommand.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java
deleted file mode 100644
index 6832bb0..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/ActionPreparator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java
deleted file mode 100644
index b6ab237..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/DefaultActionPreparator.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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) {
-        printFormatted(prefix, str, termWidth, out, true);
-    }
-
-    public static void printFormatted(String prefix, String str, int termWidth, PrintStream out, boolean prefixFirstLine) {
-        int pfxLen = length(prefix);
-        int maxwidth = termWidth - pfxLen;
-        Pattern wrap = Pattern.compile("(\\S\\S{" + maxwidth + ",}|.{1," + maxwidth + "})(\\s+|$)");
-        int cur = 0;
-        while (cur >= 0) {
-            int lst = str.indexOf('\n', cur);
-            String s = (lst >= 0) ? str.substring(cur, lst) : str.substring(cur);
-            if (s.length() == 0) {
-                out.println();
-            } else {
-                Matcher m = wrap.matcher(s);
-                while (m.find()) {
-                    if (cur > 0 || prefixFirstLine) {
-                        out.print(prefix);
-                    }
-                    out.println(m.group());
-                }
-            }
-            if (lst >= 0) {
-                cur = lst + 1;
-            } else {
-                break;
-            }
-        }
-    }
-
-    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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
deleted file mode 100644
index ad9f34b..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/basic/SimpleCommand.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java
deleted file mode 100644
index df20321..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/DefaultConverter.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java
deleted file mode 100644
index 43f5f91..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/GenericType.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java
deleted file mode 100644
index 239616e..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/commands/converter/ReifiedType.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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.3.x/shell/console/src/main/java/org/apache/felix/gogo/runtime/Closure.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/runtime/Closure.java
deleted file mode 100644
index 9f7fa7c..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/felix/gogo/runtime/Closure.java
+++ /dev/null
@@ -1,669 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/AbstractAction.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/AbstractAction.java
deleted file mode 100644
index 48c80f5..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/AbstractAction.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/BlueprintContainerAware.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/BlueprintContainerAware.java
deleted file mode 100644
index d566f48..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/BlueprintContainerAware.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-import org.osgi.service.blueprint.container.BlueprintContainer;
-
-public interface BlueprintContainerAware {
-
-    void setBlueprintContainer(BlueprintContainer blueprintContainer);
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/BundleContextAware.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/BundleContextAware.java
deleted file mode 100644
index bbd03c5..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/BundleContextAware.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-import org.osgi.framework.BundleContext;
-
-public interface BundleContextAware {
-
-    void setBundleContext(BundleContext bundleContext);
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/CloseShellException.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/CloseShellException.java
deleted file mode 100644
index 09d8346..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/CloseShellException.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-/**
- * Exception thrown to indicate the console to close.
- */
-public class CloseShellException extends Exception {
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/CompletableFunction.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/CompletableFunction.java
deleted file mode 100644
index fcb96da..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/CompletableFunction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Completer.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Completer.java
deleted file mode 100644
index 59f7897..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Completer.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-import java.util.List;
-
-public interface Completer {
-
-    int complete(String buffer, int cursor, List<String> candidates);
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Converters.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Converters.java
deleted file mode 100644
index c0f8c43..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Converters.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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((String) null, String.format(
-                "(|(service.id=%s)(service.pid=%s))", in, in));
-            if (refs != null && refs.length > 0)
-            {
-                return refs[0];
-            }
-        }
-
-        ServiceReference refs[] = context.getServiceReferences((String) 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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/HelpProvider.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/HelpProvider.java
deleted file mode 100644
index 7e3bca7..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/HelpProvider.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console;
-
-import org.apache.felix.service.command.CommandSession;
-
-public interface HelpProvider {
-    
-    String getHelp(CommandSession session, String path);
-    
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
deleted file mode 100644
index c23088e..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/Main.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-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.OutputStream;
-import java.io.PrintStream;
-import java.io.Reader;
-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);
-
-        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() {
-            }
-        });
-
-        InputStream in = parent.getKeyboard();
-        PrintStream out = parent.getConsole();
-        PrintStream err = parent.getConsole();
-        run(commandProcessor, args, in, out, err);
-    }
-
-    private void run(CommandProcessorImpl commandProcessor, String[] args, InputStream in, PrintStream out, PrintStream err) throws Exception {
-        StringBuilder sb = new StringBuilder();
-        String classpath = null;
-        boolean batch = false;
-        String file  = null;
-
-        for (int i = 0; i < args.length; i++) {
-            String arg = args[i];
-            if (arg.startsWith("--classpath=")) {
-                classpath = arg.substring("--classpath=".length());
-            } else if (arg.startsWith("-c=")) {
-                classpath = arg.substring("-c=".length());
-            } else if (arg.equals("--classpath") || arg.equals("-c")) {
-                classpath = args[++i];
-            } else if (arg.equals("-b") || arg.equals("--batch")) {
-                batch = true;
-            } else if (arg.startsWith("--file=")) {
-                file = arg.substring("--file=".length());
-            } else if (arg.startsWith("-f=")) {
-                file = arg.substring("-f=".length());
-            } else if (arg.equals("--file") || arg.equals("-f")) {
-                file = args[++i];
-            } else {
-                sb.append(arg);
-                sb.append(' ');
-            }
-        }
-
-        if (file != null) {
-            Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
-            try {
-                sb.setLength(0);
-                for (int c = reader.read(); c >= 0; c = reader.read()) {
-                    sb.append((char) c);
-                }
-            } finally {
-                reader.close();
-            }
-        } else if (batch) {
-            // read all stdin
-            Reader reader = new BufferedReader(new InputStreamReader(System.in));
-            sb.setLength(0);
-            for (int c = reader.read(); c >= 0; c = reader.read()) {
-                sb.append((char) c);
-            }
-        }
-
-        ClassLoader cl = Main.class.getClassLoader();
-        if (classpath != null) {
-            List<URL> urls = getFiles(new File(classpath));
-            cl = new URLClassLoader(urls.toArray(new URL[urls.size()]), cl);
-        }
-
-        discoverCommands(commandProcessor, cl);
-
-        run(commandProcessor, sb.toString(), in, out, err);
-    }
-
-    private void run(final CommandProcessorImpl commandProcessor, String command, final InputStream in, final PrintStream out, final PrintStream err) throws Exception {
-
-        if (command.length() > 0) {
-
-            // 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(command);
-            } 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, 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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/MultiException.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/MultiException.java
deleted file mode 100644
index f337d27..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/MultiException.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-public class MultiException extends Exception {
-
-    private List<Exception> exceptions = new ArrayList<Exception>();
-
-    public MultiException(String message) {
-        super(message);
-    }
-
-    public MultiException(String message, List<Exception> exceptions) {
-        super(message);
-        this.exceptions = exceptions;
-    }
-
-    public void addException(Exception e) {
-        exceptions.add(e);
-    }
-
-    public void throwIfExceptions() throws MultiException {
-        if (!exceptions.isEmpty()) {
-            throw this;
-        }
-    }
-
-    public Throwable[] getCauses() {
-        return exceptions.toArray(new Throwable[exceptions.size()]);
-    }
-
-    @Override
-    public void printStackTrace()
-    {
-        super.printStackTrace();
-        for (Exception e : exceptions) {
-            e.printStackTrace();
-        }
-    }
-
-
-    /* ------------------------------------------------------------------------------- */
-    /**
-     * @see java.lang.Throwable#printStackTrace(java.io.PrintStream)
-     */
-    @Override
-    public void printStackTrace(PrintStream out)
-    {
-        super.printStackTrace(out);
-        for (Exception e : exceptions) {
-            e.printStackTrace(out);
-        }
-    }
-
-    @Override
-    public void printStackTrace(PrintWriter out)
-    {
-        super.printStackTrace(out);
-        for (Exception e : exceptions) {
-            e.printStackTrace(out);
-        }
-    }
-
-    public static void throwIf(String message, List<Exception> exceptions) throws MultiException {
-        if (exceptions != null && !exceptions.isEmpty()) {
-            StringBuilder sb = new StringBuilder(message);
-            sb.append(":");
-            for (Exception e : exceptions) {
-                sb.append("\n\t");
-                sb.append(e.getMessage());
-            }
-            throw new MultiException(sb.toString(), exceptions);
-        }
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/NameScoping.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/NameScoping.java
deleted file mode 100644
index 614c430..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/NameScoping.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/OsgiCommandSupport.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/OsgiCommandSupport.java
deleted file mode 100644
index 71761ed..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/OsgiCommandSupport.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/SubShell.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/SubShell.java
deleted file mode 100644
index 2de0d20..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/SubShell.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console;
-
-public interface SubShell {
-
-    /**
-     * Returns the name of the command if used inside a shell
-     */
-    String getName();
-
-    /**
-     * Returns the description of the command which is used to generate command line help
-     */
-    String getDescription();
-
-    /**
-     * Returns a detailed description of the command
-     */
-    String getDetailedDescription();
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/AnnotatedSubShell.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/AnnotatedSubShell.java
deleted file mode 100644
index 9cd3dda..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/AnnotatedSubShell.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.shell.console.commands;
-
-import org.apache.karaf.shell.console.SubShell;
-
-public class AnnotatedSubShell implements SubShell {
-
-    public String getName() {
-        return getAnnotation().name();
-    }
-
-    public String getDescription() {
-        return getAnnotation().description();
-    }
-
-    public String getDetailedDescription() {
-        return getAnnotation().detailedDescription();
-    }
-    
-    org.apache.felix.gogo.commands.SubShell getAnnotation() {
-        org.apache.felix.gogo.commands.SubShell ann = getClass().getAnnotation(org.apache.felix.gogo.commands.SubShell.class);
-        if (ann == null) {
-            throw new IllegalStateException("The class should be annotated with the org.apache.felix.gogo.commands.SubShell annotation");
-        }
-        return ann;
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BasicSubShell.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BasicSubShell.java
deleted file mode 100644
index 3e40c5a..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BasicSubShell.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.karaf.shell.console.commands;
-
-import org.apache.karaf.shell.console.SubShell;
-
-public class BasicSubShell implements SubShell {
-    
-    private String name;
-    private String description;
-    private String detailedDescription;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getDetailedDescription() {
-        return detailedDescription;
-    }
-
-    public void setDetailedDescription(String detailedDescription) {
-        this.detailedDescription = detailedDescription;
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BlueprintCommand.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BlueprintCommand.java
deleted file mode 100644
index 6212169..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/BlueprintCommand.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/GenericType.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/GenericType.java
deleted file mode 100644
index faf7c18..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/GenericType.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
deleted file mode 100644
index 662392a..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/commands/NamespaceHandler.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/AggregateCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/AggregateCompleter.java
deleted file mode 100644
index 1037bfc..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/AggregateCompleter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/ArgumentCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/ArgumentCompleter.java
deleted file mode 100644
index 6f1aee6..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/ArgumentCompleter.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * 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.
-     */
-    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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java
deleted file mode 100644
index 75f21f2..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandNamesCompleter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console.completer;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
-import org.apache.felix.service.command.CommandProcessor;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.jline.CommandSessionHolder;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
-
-/**
- * Completes command names
- */
-public class CommandNamesCompleter implements Completer {
-
-    private CommandSession session;
-    private final Set<String> commands = new CopyOnWriteArraySet<String>();
-
-    public CommandNamesCompleter() {
-        this(CommandSessionHolder.getSession());
-    }
-
-    public CommandNamesCompleter(CommandSession session) {
-        this.session = session;
-
-        try {
-            new CommandTracker();
-        } catch (Throwable t) {
-            // Ignore in case we're not in OSGi
-        }
-    }
-
-
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        if (session == null) {
-            session = CommandSessionHolder.getSession();
-        }
-        checkData();
-        int res = new StringsCompleter(commands).complete(buffer, cursor, candidates);
-        Collections.sort(candidates);
-        return res;
-    }
-
-    protected void checkData() {
-        if (commands.isEmpty()) {
-            Set<String> names = new HashSet<String>((Set<String>) session.get(CommandSessionImpl.COMMANDS));
-            for (String name : names) {
-                commands.add(name);
-                if (name.indexOf(':') > 0) {
-                    commands.add(name.substring(0, name.indexOf(':')));
-                }
-            }
-        }
-    }
-
-    private class CommandTracker {
-        public CommandTracker() throws Exception {
-            BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
-            ServiceListener listener = new ServiceListener() {
-                public void serviceChanged(ServiceEvent event) {
-                    commands.clear();
-                }
-            };
-            context.addServiceListener(listener,
-                    String.format("(&(%s=*)(%s=*))",
-                            CommandProcessor.COMMAND_SCOPE,
-                            CommandProcessor.COMMAND_FUNCTION));
-        }
-    }
-
-}
-
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
deleted file mode 100644
index d654a72..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.Completer;
-import org.apache.karaf.shell.console.jline.CommandSessionHolder;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * 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 static final Logger LOGGER = LoggerFactory.getLogger(CommandsCompleter.class);
-
-    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) {
-                    try {
-                        completers.add(new ArgumentCompleter(session, (AbstractCommand) function, command));
-                    } catch (Throwable t) {
-                        LOGGER.debug("Unable to create completers for command '" + command + "'", t);
-                    }
-                }
-                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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/FileCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/FileCompleter.java
deleted file mode 100644
index 4e86797..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/FileCompleter.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/NullCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/NullCompleter.java
deleted file mode 100644
index 13da2df..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/NullCompleter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/Parser.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/Parser.java
deleted file mode 100644
index 8388b27..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/Parser.java
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-// 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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/StringsCompleter.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/StringsCompleter.java
deleted file mode 100644
index fc11d04..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/completer/StringsCompleter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/BrandingHelpProvider.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/BrandingHelpProvider.java
deleted file mode 100644
index 66217a1..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/BrandingHelpProvider.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.Properties;
-
-import jline.Terminal;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.HelpProvider;
-import org.apache.karaf.shell.console.util.Branding;
-
-import static org.apache.felix.gogo.commands.basic.DefaultActionPreparator.printFormatted;
-
-public class BrandingHelpProvider implements HelpProvider {
-
-    private Properties branding;
-
-    public BrandingHelpProvider() {
-        branding = Branding.loadBrandingProperties();
-    }
-
-    public String getHelp(CommandSession session, String path) {
-        if (path.indexOf('|') > 0) {
-            if (path.startsWith("branding|")) {
-                path = path.substring("branding|".length());
-            } else {
-                return null;
-            }
-        }
-        String str = branding.getProperty("help." + path);
-        if (str != null) {
-            Terminal term = (Terminal) session.get(".jline.terminal");
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            printFormatted("", str, term != null ? term.getWidth() : 80, new PrintStream(baos, true));
-            str = baos.toString();
-        }
-        return str;
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/CommandListHelpProvider.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/CommandListHelpProvider.java
deleted file mode 100644
index 2532fbf..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/CommandListHelpProvider.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.io.ByteArrayOutputStream;
-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.Command;
-import org.apache.felix.gogo.commands.basic.AbstractCommand;
-import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
-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.HelpProvider;
-import org.apache.karaf.shell.console.NameScoping;
-import org.fusesource.jansi.Ansi;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-public class CommandListHelpProvider implements HelpProvider {
-
-    public String getHelp(CommandSession session, String path) {
-        if (path.indexOf('|') > 0) {
-            if (path.startsWith("command-list|")) {
-                path = path.substring("command-list|".length());
-            } else {
-                return null;
-            }
-        }
-        SortedMap<String, String> commands = getCommandDescriptions(session, path);
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        printMethodList(session, new PrintStream(baos), commands);
-        return baos.toString();
-    }
-
-    private SortedMap<String, String> getCommandDescriptions(CommandSession session, String command) {
-        Set<String> names = (Set<String>) session.get(CommandSessionImpl.COMMANDS);
-        SortedMap<String,String> commands = new TreeMap<String,String>();
-        for (String name : names) {
-            if (command != null && !name.startsWith(command)) {
-                continue;
-            }
-            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);
-            }
-        }
-        return commands;
-    }
-
-    protected void printMethodList(CommandSession session, PrintStream out, SortedMap<String, String> commands) {
-        Terminal term = (Terminal) session.get(".jline.terminal");
-        out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("COMMANDS").a(Ansi.Attribute.RESET));
-        int max = 0;
-        for (Map.Entry<String,String> entry : commands.entrySet()) {
-            String key = NameScoping.getCommandNameWithoutGlobalPrefix(session, entry.getKey());
-            max = Math.max(max,key.length());
-        }
-        int margin = 4;
-        String prefix1 = "        ";
-        if (term != null && term.getWidth() - max - prefix1.length() - margin > 50) {
-            String prefix2 = prefix1;
-            for (int i = 0; i < max + margin; i++) {
-                prefix2 += " ";
-            }
-            for (Map.Entry<String,String> entry : commands.entrySet()) {
-                out.print(prefix1);
-                String key = NameScoping.getCommandNameWithoutGlobalPrefix(session, entry.getKey());
-                out.print(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(key).a(Ansi.Attribute.RESET));
-                for (int i = 0; i < max - key.length() + margin; i++) {
-                    out.print(' ');
-                }
-                if (entry.getValue() != null) {
-                    DefaultActionPreparator.printFormatted(prefix2, entry.getValue(), term.getWidth(), out, false);
-                }
-            }
-        } else {
-            String prefix2 = prefix1 + prefix1;
-            for (Map.Entry<String,String> entry : commands.entrySet()) {
-                out.print(prefix1);
-                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(prefix2, entry.getValue(),
-                            term != null ? term.getWidth() : 80, out);
-                }
-            }
-        }
-        out.println();
-    }
-    
-    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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/HelpAction.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/HelpAction.java
deleted file mode 100644
index 40fe7e9..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/HelpAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.shell.console.AbstractAction;
-
-/**
- * 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;
-    
-    private HelpSystem provider;
-
-    public void setProvider(HelpSystem provider) {
-        this.provider = provider;
-    }
-
-    public Object doExecute() throws Exception {
-        String help = provider.getHelp(session, command);
-        if (help != null) {
-            System.out.println(help);
-        }
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/HelpSystem.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/HelpSystem.java
deleted file mode 100644
index dab2e83..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/HelpSystem.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.HelpProvider;
-import org.apache.karaf.util.InterpolationHelper;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class HelpSystem implements HelpProvider {
-
-    private BundleContext context;
-    private ServiceTracker tracker;
-
-    public void setContext(BundleContext context) {
-        this.context = context;
-    }
-
-    public void start() {
-        tracker = new ServiceTracker(context, HelpProvider.class.getName(), null);
-        tracker.open();
-    }
-    
-    public void stop() {
-        tracker.close();
-    }
-    
-    public synchronized List<HelpProvider> getProviders() {
-        ServiceReference[] refs = tracker.getServiceReferences();
-        Arrays.sort(refs);
-        List<HelpProvider> providers = new ArrayList<HelpProvider>();
-        for (int i = refs.length - 1; i >= 0; i--) {
-            providers.add((HelpProvider) tracker.getService(refs[i]));
-        }
-        return providers;
-    }
-    
-    public String getHelp(final CommandSession session, String path) {
-        if (path == null) {
-            path = "%root%";
-        }
-        Map<String,String> props = new HashMap<String,String>();
-        props.put("data", "${" + path + "}");
-        final List<HelpProvider> providers = getProviders();
-        InterpolationHelper.performSubstitution(props, new InterpolationHelper.SubstitutionCallback() {
-            public String getValue(final String key) {
-                for (HelpProvider hp : providers) {
-                    String help = hp.getHelp(session, key);
-                    if (help != null) {
-                        if (help.endsWith("\n")) {
-                            help = help.substring(0, help.length()  -1);
-                        }
-                        return help;
-                    }
-                }
-                return null;
-            }
-        });
-        return props.get("data");
-    }
-    
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SimpleHelpProvider.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SimpleHelpProvider.java
deleted file mode 100644
index d7d37f6..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SimpleHelpProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.Map;
-
-import jline.Terminal;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.HelpProvider;
-
-import static org.apache.felix.gogo.commands.basic.DefaultActionPreparator.printFormatted;
-
-public class SimpleHelpProvider implements HelpProvider {
-    
-    private Map<String, String> help;
-
-    public Map<String, String> getHelp() {
-        return help;
-    }
-
-    public void setHelp(Map<String, String> help) {
-        this.help = help;
-    }
-
-    public String getHelp(CommandSession session, String path) {
-        if (path.indexOf('|') > 0) {
-            if (path.startsWith("simple|")) {
-                path = path.substring("simple|".length());
-            } else {
-                return null;
-            }
-        }
-        String str = help.get(path);
-        if (str != null) {
-            Terminal term = (Terminal) session.get(".jline.terminal");
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            printFormatted("", str, term != null ? term.getWidth() : 80, new PrintStream(baos, true));
-            str = baos.toString();
-        }
-        return str;
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SingleCommandHelpProvider.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SingleCommandHelpProvider.java
deleted file mode 100644
index f20cf81..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SingleCommandHelpProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.Set;
-
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.felix.service.threadio.ThreadIO;
-import org.apache.karaf.shell.console.HelpProvider;
-
-public class SingleCommandHelpProvider implements HelpProvider {
-
-    private ThreadIO io;
-
-    public void setIo(ThreadIO io) {
-        this.io = io;
-    }
-
-    public String getHelp(CommandSession session, String path) {
-        if (path.indexOf('|') > 0) {
-            if (path.startsWith("command|")) {
-                path = path.substring("command|".length());
-            } else {
-                return null;
-            }
-        }
-        Set<String> names = (Set<String>) session.get(CommandSessionImpl.COMMANDS);
-        if (path != null && names.contains(path)) {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            io.setStreams(new ByteArrayInputStream(new byte[0]), new PrintStream(baos, true), new PrintStream(baos, true));
-            try {
-                session.execute(path + " --help");
-            } catch (Throwable t) {
-                t.printStackTrace();
-            } finally {
-                io.close();
-            }
-            return baos.toString();
-        }
-        return null;
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SubShellHelpProvider.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SubShellHelpProvider.java
deleted file mode 100644
index d422edf..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/help/SubShellHelpProvider.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintStream;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.net.URL;
-
-import jline.Terminal;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.HelpProvider;
-import org.apache.karaf.shell.console.SubShell;
-import org.fusesource.jansi.Ansi;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-import static org.apache.felix.gogo.commands.basic.DefaultActionPreparator.printFormatted;
-
-public class SubShellHelpProvider implements HelpProvider {
-
-    private BundleContext context;
-    private ServiceTracker tracker;
-
-    public void setContext(BundleContext context) {
-        this.context = context;
-    }
-
-    public void start() {
-        tracker = new ServiceTracker(context, SubShell.class.getName(), null);
-        tracker.open();
-    }
-    
-    public void stop() {
-        tracker.close();
-    }
-
-    public String getHelp(CommandSession session, String path) {
-        if (path.indexOf('|') > 0) {
-            if (path.startsWith("subshell|")) {
-                path = path.substring("subshell|".length());
-            } else {
-                return null;
-            }
-        }
-        for (ServiceReference ref : tracker.getServiceReferences()) {
-            if (path.equals(ref.getProperty("name"))) {
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                printSubShellHelp(session, ref.getBundle(), (SubShell) tracker.getService(ref), new PrintStream(baos, true));
-                return baos.toString();
-            }
-        }
-        return null;
-    }
-
-    private void printSubShellHelp(CommandSession session, Bundle bundle, SubShell subShell, PrintStream out) {
-        Terminal term = session != null ? (Terminal) session.get(".jline.terminal") : null;
-        out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("SUBSHELL").a(Ansi.Attribute.RESET));
-        out.print("        ");
-        if (subShell.getName() != null) {
-            out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(subShell.getName()).a(Ansi.Attribute.RESET));
-            out.println();
-        }
-        out.print("\t");
-        out.println(subShell.getDescription());
-        out.println();
-        if (subShell.getDetailedDescription() != null) {
-            out.println(Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a("DETAILS").a(Ansi.Attribute.RESET));
-            String desc = loadDescription(bundle, subShell.getDetailedDescription());
-            while (desc.endsWith("\n")) {
-                desc = desc.substring(0, desc.length()  -1);
-            }
-            printFormatted("        ", desc, term != null ? term.getWidth() : 80, out);
-        }
-        out.println();
-        out.println("${command-list|" + subShell.getName() + ":}");
-    }
-
-    protected String loadDescription(Bundle bundle, String desc) {
-        if (desc.startsWith("classpath:")) {
-            URL url = bundle.getResource(desc.substring("classpath:".length()));
-            if (url == null) {
-                desc = "Unable to load description from " + desc;
-            } else {
-                InputStream is = null;
-                try {
-                    is = url.openStream();
-                    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;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Activator.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Activator.java
deleted file mode 100644
index f5e2e71..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Activator.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console.jline;
-
-import java.io.InputStream;
-import java.io.PrintStream;
-
-import org.apache.felix.gogo.runtime.CommandProcessorImpl;
-import org.apache.felix.gogo.runtime.CommandSessionImpl;
-import org.apache.felix.gogo.runtime.activator.EventAdminListener;
-import org.apache.felix.service.command.CommandProcessor;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.felix.service.threadio.ThreadIO;
-import org.fusesource.jansi.AnsiConsole;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-
-public class Activator implements BundleActivator {
-
-    private org.apache.felix.gogo.runtime.activator.Activator activator = new WrappedActivator();
-
-    public void start(BundleContext context) throws Exception {
-        AnsiConsole.systemInstall();
-        activator.start(context);
-    }
-
-    public void stop(BundleContext context) throws Exception {
-        activator.stop(context);
-        AnsiConsole.systemUninstall();
-    }
-
-    protected static class WrappedActivator extends org.apache.felix.gogo.runtime.activator.Activator {
-
-        @Override
-        protected ServiceRegistration newProcessor(ThreadIO tio, BundleContext context) {
-            processor = new WrappedCommandProcessor(tio);
-            try
-            {
-                processor.addListener(new EventAdminListener(context));
-            }
-            catch (NoClassDefFoundError error)
-            {
-                // Ignore the listener if EventAdmin package isn't present
-            }
-
-            // Setup the variables and commands exposed in an OSGi environment.
-            processor.addConstant(CONTEXT, context);
-            processor.addCommand("osgi", processor, "addCommand");
-            processor.addCommand("osgi", processor, "removeCommand");
-            processor.addCommand("osgi", processor, "eval");
-
-            return context.registerService(CommandProcessor.class.getName(), processor, null);
-        }
-
-    }
-
-    protected static class WrappedCommandProcessor extends CommandProcessorImpl {
-
-        public WrappedCommandProcessor(ThreadIO tio) {
-            super(tio);
-        }
-
-        @Override
-        public CommandSession createSession(InputStream in, PrintStream out, PrintStream err) {
-            CommandSessionImpl session = new WrappedCommandSession(this, in, out, err);
-            sessions.put(session, null);
-            return session;
-        }
-    }
-
-    protected static class WrappedCommandSession extends CommandSessionImpl {
-
-        public WrappedCommandSession(CommandProcessorImpl shell, InputStream in, PrintStream out, PrintStream err) {
-            super(shell, in, out, err);
-        }
-        public Object get(String name) {
-            Object val = super.get(name);
-            if (val == null) {
-                val = System.getProperty(name);
-            }
-            return val;
-        }
-
-   }
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CommandSessionHolder.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CommandSessionHolder.java
deleted file mode 100644
index cc2b244..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CommandSessionHolder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CompleterAsCompletor.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CompleterAsCompletor.java
deleted file mode 100644
index 7fd6ebb..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/CompleterAsCompletor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
deleted file mode 100644
index 3813c85..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.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.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.apache.karaf.shell.console.util.Branding;
-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,
-                   String encoding,
-                   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(null,
-                                   this.consoleInput,
-                                   this.out,
-                                   this.terminal,
-                                   encoding);
-
-        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(boolean closedByUser) {
-        //System.err.println("Closing");
-        if (!running) {
-            return;
-        }
-        if (reader.getHistory() instanceof PersistentHistory) {
-            try {
-                ((PersistentHistory) reader.getHistory()).flush();
-            } catch (IOException e) {
-                // ignore
-            }
-        }
-        running = false;
-        CommandSessionHolder.unset();
-        pipe.interrupt();
-        if (closedByUser && closeCallback != null) {
-            closeCallback.run();
-        }
-    }
-
-    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(true);
-    }
-
-    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 {
-                // jline doesn't add blank lines to the history so we don't 
-                // need to replace the command in jline's console history with
-                // an indented one
-                if (command.length() > 0 && !" ".equals(command)) {
-                    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 = Branding.loadBrandingProperties(terminal);
-        String welcome = props.getProperty("welcome");
-        if (welcome != null && welcome.length() > 0) {
-            session.getConsole().println(welcome);
-        }
-    }
-
-    protected void setSessionProperties() {
-        Properties props = Branding.loadBrandingProperties(terminal);
-        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 String getPrompt() {
-        try {
-            String prompt;
-            try {
-                Object p = session.get(PROMPT);
-                if (p != null) {
-                    prompt = p.toString();
-                } else {
-                    Properties properties = Branding.loadBrandingProperties(terminal);
-                    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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
deleted file mode 100644
index b17933e..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console.jline;
-
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.security.KeyPair;
-import java.nio.charset.Charset;
-import java.security.PrivilegedExceptionAction;
-import java.util.Hashtable;
-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.boot.principal.UserPrincipal;
-import org.apache.sshd.agent.SshAgent;
-import org.apache.sshd.agent.local.AgentImpl;
-import org.fusesource.jansi.AnsiConsole;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ConsoleFactory {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleFactory.class);
-
-    BundleContext bundleContext;
-    private CommandProcessor commandProcessor;
-    private TerminalFactory terminalFactory;
-    Console console;
-    private boolean start;
-    private ServiceRegistration registration;
-    private SshAgent local;
-
-    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 {
-        String agentId = startAgent(user);
-
-        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
-                }
-            }
-        };
-        String ctype = System.getenv("LC_CTYPE");
-        String encoding = ctype;
-        if (encoding != null && encoding.indexOf('.') > 0) {
-            encoding = encoding.substring(encoding.indexOf('.') + 1);
-        } else {
-            encoding = System.getProperty("input.encoding", Charset.defaultCharset().name());
-        }
-        this.console = new Console(commandProcessor,
-                                   in,
-                                   wrap(out),
-                                   wrap(err),
-                                   terminal,
-                                   encoding,
-                                   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());
-            }
-        });
-        if (ctype != null) {
-            session.put("LC_CTYPE", ctype);
-        }
-        session.put(".jline.terminal", terminal);
-        session.put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, agentId);
-
-        boolean delayconsole = Boolean.parseBoolean(System.getProperty("karaf.delay.console"));
-        if (delayconsole) {
-            new DelayedStarted(this.console, bundleContext, unwrappedIn).start();
-        } else {
-            new Thread(this.console, "Karaf Shell Console Thread").start();
-        }
-    }
-
-    protected String startAgent(String user) {
-        try {
-            local = SshAgentLoader.load(bundleContext);
-            String agentId = "local:" + user;
-            Hashtable properties = new Hashtable();
-            properties.put("id", agentId);
-            registration = bundleContext.registerService(SshAgent.class.getName(), local, properties);
-            return agentId;
-        } catch (Throwable e) {
-            LOGGER.warn("Error starting ssh agent for local console", e);
-            return null;
-        }
-    }
-
-    protected void stop() throws Exception {
-        if (registration != null) {
-            registration.unregister();
-        }
-        // The bundle is stopped
-        // so close the console and remove the callback so that the
-        // osgi framework isn't stopped
-        if (console != null) {
-            console.close(false);
-        }
-    }
-
-    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;
-        }
-    }
-
-    static class SshAgentLoader {
-        static SshAgent load(BundleContext bundleContext) {
-            try {
-                SshAgent agent = new AgentImpl();
-                URL url = bundleContext.getBundle().getResource("karaf.key");
-                InputStream is = url.openStream();
-                ObjectInputStream r = new ObjectInputStream(is);
-                KeyPair keyPair = (KeyPair) r.readObject();
-                agent.addIdentity(keyPair, "karaf");
-                return agent;
-            } catch (Throwable e) {
-                LOGGER.warn("Error starting ssh agent for local console", e);
-                return null;
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/DelayedStarted.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/DelayedStarted.java
deleted file mode 100644
index de68144..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/DelayedStarted.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.apache.karaf.shell.console.jline;
-
-import java.io.InputStream;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkEvent;
-import org.osgi.framework.FrameworkListener;
-import org.osgi.framework.startlevel.FrameworkStartLevel;
-
-/**
- * Delay the start of the console until the desired start level is reached or enter is pressed
- */
-class DelayedStarted extends Thread implements FrameworkListener {
-    private static final String SYSTEM_PROP_KARAF_CONSOLE_STARTED = "karaf.console.started";
-
-	private final AtomicBoolean started = new AtomicBoolean(false);
-    private final InputStream in;
-	private final Runnable console;
-	private final BundleContext bundleContext;
-
-    DelayedStarted(Runnable console, BundleContext bundleContext, InputStream in) {
-        super("Karaf Shell Console Thread");
-		this.console = console;
-		this.bundleContext = bundleContext;
-        this.in = in;
-        int defaultStartLevel = Integer.parseInt(System.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
-        int startLevel = ((FrameworkStartLevel) this.bundleContext.getBundle(0).adapt(FrameworkStartLevel.class)).getStartLevel();
-        if (startLevel >= defaultStartLevel) {
-            started.set(true);
-        } else {
-            bundleContext.addFrameworkListener(this);
-            frameworkEvent(new FrameworkEvent(FrameworkEvent.STARTLEVEL_CHANGED, bundleContext.getBundle(), null));
-        }
-    }
-
-    public void run() {
-        try {
-            while (!started.get()) {
-                if (in.available() == 0) {
-                    Thread.sleep(10);
-                }
-                while (in.available() > 0) {
-                    char ch = (char) in.read();
-                    if (ch == '\r' || ch == '\n') {
-                        started.set(true);
-                        break;
-                    }
-                }
-            }
-        } catch (Throwable t) {
-            // Ignore
-        }
-
-        // Signal to the main module that it can stop displaying the startup progress
-        System.setProperty(SYSTEM_PROP_KARAF_CONSOLE_STARTED, "true");
-
-        System.out.println();
-        this.bundleContext.removeFrameworkListener(this);
-        console.run();
-    }
-
-    public void frameworkEvent(FrameworkEvent event) {
-        if (event.getType() == FrameworkEvent.STARTLEVEL_CHANGED) {
-            int defaultStartLevel = Integer.parseInt(System.getProperty(Constants.FRAMEWORK_BEGINNING_STARTLEVEL));
-            int startLevel = ((FrameworkStartLevel) this.bundleContext.getBundle(0).adapt(FrameworkStartLevel.class)).getStartLevel();
-            if (startLevel >= defaultStartLevel) {
-                started.set(true);
-            }
-        }
-    }
-}
diff --git a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/KarafFileHistory.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/KarafFileHistory.java
deleted file mode 100644
index 138266a..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/KarafFileHistory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java
deleted file mode 100644
index 79f7f4b..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/util/Branding.java b/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/util/Branding.java
deleted file mode 100644
index 3e87448..0000000
--- a/karaf-2.3.x/shell/console/src/main/java/org/apache/karaf/shell/console/util/Branding.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-import jline.Terminal;
-
-public final class Branding {
-    
-    private Branding() { }
-
-    public static 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;
-    }
-
-    public static Properties loadBrandingProperties(Terminal terminal) {
-        Properties props = new Properties();
-        if (terminal != null && terminal.getClass().getName().endsWith("SshTerminal")) {
-            //it's a ssh client, so load branding seperately
-            loadProps(props, "org/apache/karaf/shell/console/branding-ssh.properties");
-        } else {
-            loadProps(props, "org/apache/karaf/shell/console/branding.properties");
-        }
-
-        loadProps(props, "org/apache/karaf/branding/branding.properties");
-        return props;
-    }
-    
-    protected static void loadProps(Properties props, String resource) {
-        InputStream is = null;
-        try {
-            is = Branding.class.getClassLoader().getResourceAsStream(resource);
-            if (is != null) {
-                props.load(is);
-            }
-        } catch (IOException e) {
-            // ignore
-        } finally {
-            if (is != null) {
-                try {
-                    is.close();
-                } catch (IOException e) {
-                    // Ignore
-                }
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/console/src/main/resources/META-INF/services/org/apache/karaf/shell/commands b/karaf-2.3.x/shell/console/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
deleted file mode 100644
index 28eefbc..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
+++ /dev/null
@@ -1,17 +0,0 @@
-##---------------------------------------------------------------------------
-##  Licensed to the Apache Software Foundation (ASF) under one or more
-##  contributor license agreements.  See the NOTICE file distributed with
-##  this work for additional information regarding copyright ownership.
-##  The ASF licenses this file to You under the Apache License, Version 2.0
-##  (the "License"); you may not use this file except in compliance with
-##  the License.  You may obtain a copy of the License at
-##
-##     http://www.apache.org/licenses/LICENSE-2.0
-##
-##  Unless required by applicable law or agreed to in writing, software
-##  distributed under the License is distributed on an "AS IS" BASIS,
-##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-##  See the License for the specific language governing permissions and
-##  limitations under the License.
-##---------------------------------------------------------------------------
-org.apache.karaf.shell.console.help.HelpAction
diff --git a/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml b/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
deleted file mode 100644
index db7f7f8..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/blueprint/karaf-console.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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"/>
-            <property name="completers">
-                <list>
-                    <bean class="org.apache.karaf.shell.console.completer.CommandNamesCompleter"/>
-                </list>
-            </property>
-        </bean>
-    </service>
-    <bean id="help" class="org.apache.karaf.shell.console.help.HelpAction" activation="lazy" scope="prototype">
-        <property name="provider" ref="helpSystem"/>
-    </bean>
-    
-    <bean id="helpSystem" class="org.apache.karaf.shell.console.help.HelpSystem" init-method="start" destroy-method="stop">
-        <property name="context" ref="blueprintBundleContext"/>
-    </bean>
-    
-    <service auto-export="interfaces" ranking="-20">
-        <bean class="org.apache.karaf.shell.console.help.CommandListHelpProvider" />
-    </service>
-    <service auto-export="interfaces" ranking="-10">
-        <bean class="org.apache.karaf.shell.console.help.SingleCommandHelpProvider">
-            <property name="io">
-                <reference interface="org.apache.felix.service.threadio.ThreadIO"/>
-            </property>
-        </bean>
-    </service>
-    <service auto-export="interfaces" ref="subShellHelpProvider" ranking="-10"/>
-    <bean id="subShellHelpProvider" class="org.apache.karaf.shell.console.help.SubShellHelpProvider" init-method="start" destroy-method="stop">
-        <property name="context" ref="blueprintBundleContext"/>
-    </bean>
-    <service auto-export="interfaces" ranking="-7">
-        <bean class="org.apache.karaf.shell.console.help.SimpleHelpProvider">
-            <property name="help">
-                <map>
-                    <entry key="%root%"><value><![CDATA[${command-list|}]]></value></entry>
-                    <entry key="all"><value><![CDATA[${command-list|}]]></value></entry>
-                </map>
-            </property>
-        </bean>
-    </service>
-    <service auto-export="interfaces" ranking="-5">
-        <bean class="org.apache.karaf.shell.console.help.BrandingHelpProvider"/>
-    </service>
-
-
-</blueprint>
diff --git a/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml b/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
deleted file mode 100644
index 77ec1f0..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/blueprint/shell-namespacehandler.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/console/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 84522f7..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,14 +0,0 @@
-\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.3.x/shell/console/src/main/resources/karaf.key b/karaf-2.3.x/shell/console/src/main/resources/karaf.key
deleted file mode 100644
index 708a466..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/karaf.key
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.0.0.xsd b/karaf-2.3.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.0.0.xsd
deleted file mode 100644
index 0e0dafd..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.0.0.xsd
+++ /dev/null
@@ -1,217 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $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.3.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.1.0.xsd b/karaf-2.3.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.1.0.xsd
deleted file mode 100644
index 7ad126f..0000000
--- a/karaf-2.3.x/shell/console/src/main/resources/org/apache/karaf/shell/console/commands/karaf-shell-1.1.0.xsd
+++ /dev/null
@@ -1,238 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $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.3.x/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java
deleted file mode 100644
index 80f5309..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/felix/gogo/commands/Context.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java
deleted file mode 100644
index e2ffd88..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/felix/gogo/commands/TestCommands.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
deleted file mode 100644
index 0fef365..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/ExampleSubclassMain.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.console;
-
-import java.io.InputStream;
-import java.io.PrintStream;
-
-import jline.Terminal;
-import org.apache.felix.gogo.runtime.CommandProcessorImpl;
-import org.apache.karaf.shell.console.jline.Console;
-
-/**
- * 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, 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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/ArgumentCompleterTest.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/ArgumentCompleterTest.java
deleted file mode 100644
index 9774857..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/ArgumentCompleterTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/BooleanCompleterTest.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/BooleanCompleterTest.java
deleted file mode 100644
index 2c01cc6..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/BooleanCompleterTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterTestSupport.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterTestSupport.java
deleted file mode 100644
index e5341a5..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterTestSupport.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterValuesTest.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterValuesTest.java
deleted file mode 100644
index abb0a07..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/CompleterValuesTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/DummyCommandSession.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/DummyCommandSession.java
deleted file mode 100644
index ac1a894..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/DummyCommandSession.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/FileCompleterTest.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/FileCompleterTest.java
deleted file mode 100644
index 48cbedb..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/completer/FileCompleterTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/help/TestFormatting.java b/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/help/TestFormatting.java
deleted file mode 100644
index c7f26b6..0000000
--- a/karaf-2.3.x/shell/console/src/test/java/org/apache/karaf/shell/console/help/TestFormatting.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.console.help;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
-import junit.framework.TestCase;
-import org.apache.felix.gogo.commands.basic.DefaultActionPreparator;
-
-public class TestFormatting extends TestCase {
-    
-    public void testFormat() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        DefaultActionPreparator.printFormatted("  ",
-                "  This is a test with a long paragraph\n\n  with an indented paragraph\nAnd another one\n", 20, new PrintStream(baos, true));
-        System.err.println(baos.toString());
-    }
-}
diff --git a/karaf-2.3.x/shell/dev/NOTICE b/karaf-2.3.x/shell/dev/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/dev/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/dev/pom.xml b/karaf-2.3.x/shell/dev/pom.xml
deleted file mode 100644
index fd15f2a..0000000
--- a/karaf-2.3.x/shell/dev/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?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.3.1</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.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.gogo.runtime</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*;-split-package:=merge-first,
-                            org.ops4j.pax.url.mvn,
-                            !*
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/AbstractBundleCommand.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/AbstractBundleCommand.java
deleted file mode 100644
index baaf2cf..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/AbstractBundleCommand.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/DynamicImport.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/DynamicImport.java
deleted file mode 100644
index 7f81dbd..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/DynamicImport.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/FrameworkOptions.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/FrameworkOptions.java
deleted file mode 100644
index 036eaa5..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/FrameworkOptions.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.felix.utils.properties.Properties;
-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;
-
-/**
- * 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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/PrintStackTraces.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/PrintStackTraces.java
deleted file mode 100644
index 4eacd19..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/PrintStackTraces.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java
deleted file mode 100644
index 49b4d43..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Restart.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 deleting 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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/ShowBundleTree.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/ShowBundleTree.java
deleted file mode 100644
index ffe0572..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/ShowBundleTree.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/SystemProperty.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/SystemProperty.java
deleted file mode 100644
index 87a4c42..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/SystemProperty.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.felix.utils.properties.Properties;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-
-/**
- * Command that allow access to system properties easily.
- */
-@Command(scope = "dev", name = "system-property", description = "Get or set a system property.")
-public class SystemProperty extends OsgiCommandSupport {
-
-    @Option(name = "-p", aliases = { "--persistent" }, description = "Persist the new value to the etc/system.properties file")
-    boolean persistent;
-
-    @Argument(index = 0, name = "key", description = "The system property name")
-    String key;
-
-    @Argument(index = 1, name = "value", required = false, description = "New value for the system property")
-    String value;
-
-    @Override
-    protected Object doExecute() throws Exception {
-        if (value != null) {
-            if (persistent) {
-                String base = System.getProperty("karaf.base");
-                Properties props = new Properties(new File(base, "etc/system.properties"));
-                props.put(key, value);
-                props.save();
-            }
-            return System.setProperty(key, value);
-        } else {
-            return System.getProperty(key);
-        }
-    }
-}
diff --git a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java
deleted file mode 100644
index 2e7c526..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/WaitForService.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.dev;
-
-import java.util.concurrent.TimeoutException;
-
-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.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * Command that can be used to wait for an OSGi service.
- */
-@Command(scope = "dev", name = "wait-for-service", description = "Wait for a given OSGi service.")
-public class WaitForService extends OsgiCommandSupport {
-
-    @Option(name = "-e", aliases = { "--exception" }, description = "throw an exception if the service is not found after the timeout")
-    boolean exception;
-
-    @Option(name = "-t", aliases = { "--timeout" }, description = "timeout to wait for the service (in milliseconds, negative to not wait at all, zero to wait forever)")
-    long timeout = 0;
-
-    @Argument(name = "service", description="The service class or filter", required = true, multiValued = false)
-    String service;
-
-    @Override
-    protected Object doExecute() throws Exception {
-        ServiceTracker tracker = null;
-        try {
-            String filter = service;
-            if (!filter.startsWith("(")) {
-                if (!filter.contains("=")) {
-                    filter = Constants.OBJECTCLASS + "=" + filter;
-                }
-                filter = "(" + filter + ")";
-            }
-            Filter osgiFilter = FrameworkUtil.createFilter(filter);
-            tracker = new ServiceTracker(bundleContext, osgiFilter, null);
-            tracker.open(true);
-            Object svc = tracker.getService();
-            if (timeout >= 0) {
-                svc = tracker.waitForService(timeout);
-            }
-            if (exception && svc == null) {
-                throw new TimeoutException("Can not find service '" + service + "' in the OSGi registry");
-            }
-            return svc != null;
-        } catch (InvalidSyntaxException e) {
-            throw new IllegalArgumentException("Invalid filter", e);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (tracker != null) {
-                tracker.close();
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java
deleted file mode 100644
index e4de87f..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/Watch.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Equinox.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Equinox.java
deleted file mode 100644
index 8229c35..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Equinox.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Felix.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Felix.java
deleted file mode 100644
index ec1fc93..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Felix.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Framework.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Framework.java
deleted file mode 100644
index 94a1ae3..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/framework/Framework.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Bundles.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Bundles.java
deleted file mode 100644
index 6b6adaf..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Bundles.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/IO.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/IO.java
deleted file mode 100644
index 7873f3e..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/IO.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Import.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Import.java
deleted file mode 100644
index 842e065..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Import.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Node.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Node.java
deleted file mode 100644
index b3a867d..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Node.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Tree.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Tree.java
deleted file mode 100644
index 6c92faf..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/util/Tree.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java b/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
deleted file mode 100644
index e7b492d..0000000
--- a/karaf-2.3.x/shell/dev/src/main/java/org/apache/karaf/shell/dev/watch/BundleWatcher.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml b/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
deleted file mode 100644
index 64b9943..0000000
--- a/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/blueprint/shell-dev.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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/system-property">
-            <action class="org.apache.karaf.shell.dev.SystemProperty" />
-        </command>
-        <command name="dev/wait-for-service">
-            <action class="org.apache.karaf.shell.dev.WaitForService" />
-        </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.3.x/shell/dev/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 584148a..0000000
--- a/karaf-2.3.x/shell/dev/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,24 +0,0 @@
-\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.3.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/framework/equinox-debug.properties b/karaf-2.3.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/framework/equinox-debug.properties
deleted file mode 100644
index b842875..0000000
--- a/karaf-2.3.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/framework/equinox-debug.properties
+++ /dev/null
@@ -1,111 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-
-#    http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-#### 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.3.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/watch.txt b/karaf-2.3.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/watch.txt
deleted file mode 100644
index ef4016e..0000000
--- a/karaf-2.3.x/shell/dev/src/main/resources/org/apache/karaf/shell/dev/watch.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-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.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/EquinoxTest.java b/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/EquinoxTest.java
deleted file mode 100644
index 02d5b9e..0000000
--- a/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/EquinoxTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/FelixTest.java b/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/FelixTest.java
deleted file mode 100644
index b48c76b..0000000
--- a/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/framework/FelixTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/BundlesTest.java b/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/BundlesTest.java
deleted file mode 100644
index 6e6d7d0..0000000
--- a/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/BundlesTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/ImportTest.java b/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/ImportTest.java
deleted file mode 100644
index 97dcbc0..0000000
--- a/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/ImportTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/TreeTest.java b/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/TreeTest.java
deleted file mode 100644
index 95880fc..0000000
--- a/karaf-2.3.x/shell/dev/src/test/java/org/apache/karaf/shell/dev/util/TreeTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/config.properties b/karaf-2.3.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/config.properties
deleted file mode 100644
index 9a5e11c..0000000
--- a/karaf-2.3.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/config.properties
+++ /dev/null
@@ -1,351 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.3.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/enabled-config.properties b/karaf-2.3.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/enabled-config.properties
deleted file mode 100644
index 9e6ffd4..0000000
--- a/karaf-2.3.x/shell/dev/src/test/resources/org/apache/karaf/shell/dev/framework/enabled-config.properties
+++ /dev/null
@@ -1,355 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-
-#
-# 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.3.x/shell/log/NOTICE b/karaf-2.3.x/shell/log/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/log/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/log/pom.xml b/karaf-2.3.x/shell/log/pom.xml
deleted file mode 100644
index 052c77c..0000000
--- a/karaf-2.3.x/shell/log/pom.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?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.3.1</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.apache.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/ClearLog.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/ClearLog.java
deleted file mode 100644
index df0549e..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/ClearLog.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayException.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayException.java
deleted file mode 100644
index 095a647..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayException.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java
deleted file mode 100644
index fa6f202..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/DisplayLog.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/GetLogLevel.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/GetLogLevel.java
deleted file mode 100644
index 7c3c508..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/GetLogLevel.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java
deleted file mode 100644
index 9605a72..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/Level.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
deleted file mode 100644
index d5343d7..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/LogTail.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
deleted file mode 100644
index bcd1b10..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/LruList.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/SetLogLevel.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/SetLogLevel.java
deleted file mode 100644
index 7c7fab2..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/SetLogLevel.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/VmLogAppender.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/VmLogAppender.java
deleted file mode 100644
index 4cf3c3b..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/VmLogAppender.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/completers/LogLevelCompleter.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/completers/LogLevelCompleter.java
deleted file mode 100644
index 124bd36..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/completers/LogLevelCompleter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/AbsoluteTimeDateFormat.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/AbsoluteTimeDateFormat.java
deleted file mode 100644
index 72dc398..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/AbsoluteTimeDateFormat.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/DateTimeDateFormat.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/DateTimeDateFormat.java
deleted file mode 100644
index b01b36e..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/DateTimeDateFormat.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/FormattingInfo.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/FormattingInfo.java
deleted file mode 100644
index d7bf0bc..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/FormattingInfo.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/ISO8601DateFormat.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/ISO8601DateFormat.java
deleted file mode 100644
index a9565ec..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/ISO8601DateFormat.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternConverter.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternConverter.java
deleted file mode 100644
index 5649220..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternConverter.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternParser.java b/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternParser.java
deleted file mode 100644
index ecba15c..0000000
--- a/karaf-2.3.x/shell/log/src/main/java/org/apache/karaf/shell/log/layout/PatternParser.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml b/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
deleted file mode 100644
index b8fcf96..0000000
--- a/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/blueprint/shell-log.xml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/log/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 8cbe50b..0000000
--- a/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,21 +0,0 @@
-\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.3.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index 713283f..0000000
--- a/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-#
-# 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.3.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index 147cb82..0000000
--- a/karaf-2.3.x/shell/log/src/main/resources/OSGI-INF/metatype/metatype.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java b/karaf-2.3.x/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java
deleted file mode 100644
index cedeb6a..0000000
--- a/karaf-2.3.x/shell/log/src/test/java/org/apache/karaf/shell/log/SetLogLevelTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/log/src/test/java/org/apache/karaf/shell/log/completers/LogLevelCompleterTest.java b/karaf-2.3.x/shell/log/src/test/java/org/apache/karaf/shell/log/completers/LogLevelCompleterTest.java
deleted file mode 100644
index 6bc34cd..0000000
--- a/karaf-2.3.x/shell/log/src/test/java/org/apache/karaf/shell/log/completers/LogLevelCompleterTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/NOTICE b/karaf-2.3.x/shell/obr/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/obr/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/obr/pom.xml b/karaf-2.3.x/shell/obr/pom.xml
deleted file mode 100644
index dbd6cd7..0000000
--- a/karaf-2.3.x/shell/obr/pom.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?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.3.1</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.gogo.runtime</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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/AddUrlCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/AddUrlCommand.java
deleted file mode 100644
index 7118e81..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/AddUrlCommand.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/DeployCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/DeployCommand.java
deleted file mode 100644
index 73ccefd..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/DeployCommand.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-
-    @Option(name = "-d", aliases = { "--deployOptional" }, description = "Deploy optional bundles", required = false, multiValued = false)
-    protected boolean deployOptional = false;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        doDeploy(admin, bundles, start, deployOptional);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/FindCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/FindCommand.java
deleted file mode 100644
index f9dc70e..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/FindCommand.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/InfoCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/InfoCommand.java
deleted file mode 100644
index 0dbc918..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/InfoCommand.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListCommand.java
deleted file mode 100644
index ad3b185..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListUrlCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListUrlCommand.java
deleted file mode 100644
index c5abc0e..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ListUrlCommand.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ObrCommandSupport.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ObrCommandSupport.java
deleted file mode 100644
index 155301d..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ObrCommandSupport.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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, boolean deployOptional) 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(deployOptional ? 0 : Resolver.NO_OPTIONAL_RESOURCES)) {
-                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() + ")");
-                    }
-                }
-                if (deployOptional) {
-                    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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RefreshUrlCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RefreshUrlCommand.java
deleted file mode 100644
index 20422ca..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RefreshUrlCommand.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-import org.apache.felix.gogo.commands.Option;
-
-@Command(scope = "obr", name = "refreshUrl", description = "Reloads the repositories to obtain a fresh list of bundles.")
-public class RefreshUrlCommand extends ObrCommandSupport {
-
-    @Option(name = "-i", aliases = { "--index" }, description = "Use index to identify URL", required = false, multiValued = false)
-    boolean useIndex;
-
-    @Argument(index = 0, name = "ids", description = "Repository URLs (or indexes if you use -i) to refresh (leave empty for all)", required = false, multiValued = true)
-    List<String> ids;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-		if (ids != null && !ids.isEmpty()) {
-			for (String id : ids) {
-                if (useIndex) {
-                    Repository[] repos = admin.listRepositories();
-                    int index = Integer.parseInt(id);
-                    if (index >= 0 && index < repos.length) {
-                        admin.addRepository(repos[index].getURI());
-                    } else {
-                        System.err.println("Invalid index");
-                    }
-                } else {
-				    admin.addRepository(id);
-                }
-			}
-		} 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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RemoveUrlCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RemoveUrlCommand.java
deleted file mode 100644
index 849167f..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/RemoveUrlCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-import org.apache.felix.gogo.commands.Option;
-
-@Command(scope = "obr", name = "removeUrl", description = "Removes a list of repository URLs from the OBR service.")
-public class RemoveUrlCommand extends ObrCommandSupport {
-
-    @Option(name = "-i", aliases = { "--index" }, description = "Use index to identify URL", required = false, multiValued = false)
-    boolean useIndex;
-
-    @Argument(index = 0, name = "ids", description = "Repository URLs (or indexes if you use -i) to remove from OBR service", required = true, multiValued = true)
-    List<String> ids;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        for (String id : ids) {
-            if (useIndex) {
-                Repository[] repos = admin.listRepositories();
-                int index = Integer.parseInt(id);
-                if (index >= 0 && index < repos.length) {
-                    admin.removeRepository(repos[index].getURI());
-                } else {
-                    System.err.println("Invalid index");
-                }
-            } else {
-                admin.removeRepository(id);
-            }
-        }
-        persistRepositoryList(admin);
-    }
-}
diff --git a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ResolveCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ResolveCommand.java
deleted file mode 100644
index 4cd4954..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/ResolveCommand.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/SourceCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/SourceCommand.java
deleted file mode 100644
index 8f977fc..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/SourceCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/StartCommand.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/StartCommand.java
deleted file mode 100644
index bf8fd12..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/StartCommand.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.obr;
-
-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;
-
-import java.util.List;
-
-@Command(scope = "obr", name = "start", description = "Deploys and starts a list of bundles using OBR.")
-public class StartCommand extends ObrCommandSupport {
-
-    @Argument(index = 0, name = "bundles", description = "List of bundles to deploy (separated by whitespaces)", required = true, multiValued = true)
-    protected List<String> bundles;
-
-    @Option(name = "-d", aliases = { "--deployOptional" }, description = "Deploy optional bundles", required = false, multiValued = false)
-    protected boolean deployOptional = false;
-
-    protected void doExecute(RepositoryAdmin admin) throws Exception {
-        doDeploy(admin, bundles, true, deployOptional);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/util/FileUtil.java b/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/util/FileUtil.java
deleted file mode 100644
index fcc9580..0000000
--- a/karaf-2.3.x/shell/obr/src/main/java/org/apache/karaf/shell/obr/util/FileUtil.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml b/karaf-2.3.x/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml
deleted file mode 100644
index 62c60fc..0000000
--- a/karaf-2.3.x/shell/obr/src/main/resources/OSGI-INF/blueprint/shell-obr.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/obr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/obr/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index a04b1e6..0000000
--- a/karaf-2.3.x/shell/obr/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,26 +0,0 @@
-\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.3.x/shell/osgi/NOTICE b/karaf-2.3.x/shell/osgi/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/osgi/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/osgi/pom.xml b/karaf-2.3.x/shell/osgi/pom.xml
deleted file mode 100644
index 5b6e996..0000000
--- a/karaf-2.3.x/shell/osgi/pom.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<?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.3.1</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.gogo.runtime</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*;-split-package:=merge-first,
-                            !*
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BlueprintListener.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BlueprintListener.java
deleted file mode 100644
index c262f62..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BlueprintListener.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleCommand.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleCommand.java
deleted file mode 100644
index 474f94c..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleCommand.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleLevel.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleLevel.java
deleted file mode 100644
index e61b6f9..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleLevel.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleSelector.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleSelector.java
deleted file mode 100644
index afb04e0..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleSelector.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleStateListener.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleStateListener.java
deleted file mode 100644
index 5324096..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundleStateListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommand.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommand.java
deleted file mode 100644
index a08048b..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommand.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommandOptional.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommandOptional.java
deleted file mode 100644
index 85ba12e..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/BundlesCommandOptional.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Classes.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Classes.java
deleted file mode 100644
index 2cae5ac..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Classes.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.gogo.commands.Option;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.wiring.BundleWiring;
-
-@Command(scope = "osgi", name = "classes", description = "Displays list of classes contained in bundles")
-public class Classes extends BundlesCommand {
-
-    @Option(name = "-a", aliases = { "--display-all-files" }, description = "List all classes and files in bundles", required = false, multiValued = false)
-    boolean displayAllFiles;
-
-    protected void doExecute(List<Bundle> bundles) throws Exception {
-        for (Bundle bundle : bundles) {
-            printResources(bundle);
-        }
-    }
-
-    protected void printResources(Bundle bundle) {
-        BundleWiring wiring = (BundleWiring) bundle.adapt(BundleWiring.class);
-        if (wiring != null) {
-            Collection<String> resources = null;
-            if (displayAllFiles) {
-                resources = wiring.listResources("/", null, BundleWiring.LISTRESOURCES_RECURSE);
-            } else {
-                resources = wiring.listResources("/", "*class", BundleWiring.LISTRESOURCES_RECURSE);
-            }
-            if (resources.size() > 0) {
-                System.out.println("\n" + Util.getBundleName(bundle));
-            }
-            for (String resource : resources) {
-                System.out.println(resource);
-            }
-        } else {
-            System.out.println("Bundle " + bundle.getBundleId() + " is not resolved");
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/FindClass.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/FindClass.java
deleted file mode 100644
index 788558f..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/FindClass.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import java.util.Collection;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.wiring.BundleWiring;
-
-@Command(scope = "osgi", name = "find-class", description = "Locates a specified class in any deployed bundle")
-public class FindClass extends OsgiCommandSupport {
-
-    @Argument(index = 0, name = "className", description = "Class name or partial class name to be found", required = true, multiValued = false)
-    String className;
-
-    protected Object doExecute() throws Exception {
-        findResource();
-        return null;
-    }
-
-    protected void findResource() {
-        Bundle[] bundles = bundleContext.getBundles();
-        String filter = "*" + className + "*";
-        for (Bundle bundle : bundles) {
-            BundleWiring wiring = (BundleWiring) bundle.adapt(BundleWiring.class);
-            if (wiring != null) {
-                Collection<String> resources = wiring.listResources("/", filter, BundleWiring.LISTRESOURCES_RECURSE);
-                if (resources.size() > 0) {
-                    System.out.println("\n" + Util.getBundleName(bundle));
-                }
-                for (String resource:resources) {
-                    System.out.println(resource);
-                }
-            } else {
-                System.out.println("Bundle " + bundle.getBundleId() + " is not resolved.");
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Headers.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Headers.java
deleted file mode 100644
index 0f3218e..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Headers.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Info.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Info.java
deleted file mode 100644
index d101c2d..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Info.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/InstallBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/InstallBundle.java
deleted file mode 100644
index 1138151..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/InstallBundle.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-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.felix.gogo.commands.Option;
-import org.apache.karaf.shell.console.MultiException;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.framework.Bundle;
-
-@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<Exception> exceptions = new ArrayList<Exception>();
-        List<Bundle> bundles = new ArrayList<Bundle>();
-        for (String url : urls) {
-            try {
-                bundles.add(getBundleContext().installBundle(url, null));
-            } catch (Exception e) {
-                exceptions.add(new Exception("Unable to install bundle " + url, e));
-            }
-        }
-        if (start) {
-            for (Bundle bundle : bundles) {
-                try {
-                    bundle.start();
-                } catch (Exception e) {
-                    exceptions.add(new Exception("Unable to start bundle " + bundle.getLocation() +
-                            (e.getMessage() != null ? ": " + e.getMessage() : ""), e));
-                }
-            }
-        }
-        if (bundles.size() == 1) {
-            System.out.println("Bundle ID: " + bundles.get(0).getBundleId());
-        } else {
-            StringBuffer sb = new StringBuffer("Bundle IDs: ");
-            for (Bundle bundle : bundles) {
-                if (sb.length() > 0) {
-                    sb.append(", ");
-                }
-                sb.append(bundle.getBundleId());
-            }
-            System.out.println(sb);
-        }
-        MultiException.throwIf("Error installing bundles", exceptions);
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundleServices.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundleServices.java
deleted file mode 100644
index edbaac2..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundleServices.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-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.Constants;
-import org.osgi.framework.ServiceReference;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-
-@Command(scope = "osgi", name = "bundle-services", description = "List OSGi services per bundle")
-public class ListBundleServices extends BundlesCommand {
-
-    @Option(name = "-a", aliases = {}, description = "Shows all services. (By default Karaf commands are hidden)", required = false, multiValued = false)
-    boolean showAll;
-
-    @Option(name = "-u", aliases = {}, description = "Shows the services each bundle uses. (By default the provided services are shown)", required = false, multiValued = false)
-    boolean inUse;
-
-    @Option(name = "-p", aliases = {}, description = "Shows the properties of the services", required = false, multiValued = false)
-    boolean showProperties = false;
-
-    @Override
-    protected void doExecute(List<Bundle> bundles) throws Exception {
-        for (Bundle bundle : bundles) {
-            ServiceReference[] refs = (inUse) ? bundle.getServicesInUse() : bundle.getRegisteredServices();
-            printServices(bundle, refs, showProperties);
-        }
-    }
-
-    private void printServices(Bundle bundle, ServiceReference[] refs, boolean showProperties) {
-        boolean headerPrinted = false;
-        boolean needSeparator = false;
-
-        if (refs == null) {
-            return;
-        }
-
-        for (ServiceReference serviceRef : refs) {
-            String[] objectClass = (String[]) serviceRef.getProperty(Constants.OBJECTCLASS);
-
-            boolean print = showAll || !isCommand(objectClass);
-
-            // Print header if we have not already done so.
-            if (!headerPrinted) {
-                headerPrinted = true;
-                System.out.println("");
-                String title = bundle.getSymbolicName() + ((inUse) ? " uses:" : " provides:");
-                System.out.println(title);
-                System.out.println("----------------------------------");
-            }
-
-            if (print) {
-                // Print service separator if necessary.
-                if (needSeparator && showProperties) {
-                    System.out.println("----");
-                }
-
-                if (showProperties) {
-                    printProperties(serviceRef);
-                } else {
-                    System.out.println(ListBundleServices.getValueString(objectClass));
-                }
-
-                needSeparator = true;
-            }
-        }
-    }
-
-    private boolean isCommand(String[] objectClasses) {
-        for (String objectClass : objectClasses) {
-            if (objectClass.equals(Function.class.getName())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private void printProperties(ServiceReference serviceRef) {
-        for (String key : serviceRef.getPropertyKeys()) {
-            System.out.println(key + " = " + ListBundleServices.getValueString(serviceRef.getProperty(key)));
-        }
-    }
-
-    private 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 String getUnderlineString(String s) {
-        StringBuilder sb = new StringBuilder(s.length());
-        for (int i = 0; i < s.length(); i++) {
-            sb.append('-');
-        }
-        return sb.toString();
-    }
-
-
-    private static String getValueString(Object obj) {
-        if (obj == null) {
-            return "null";
-        } else if (obj.getClass().isArray()) {
-            Object[] array = (Object[]) obj;
-            StringBuilder sb = new StringBuilder();
-            sb.append("[");
-            for (int i = 0; i < array.length; i++) {
-                if (i != 0) {
-                    sb.append(", ");
-                }
-                sb.append(getValueString(array[i]));
-            }
-            sb.append("]");
-            return sb.toString();
-        } else if (obj instanceof String) {
-            return (String) obj;
-        } 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 URI) {
-            try {
-                return ((URI) obj).toURL().toExternalForm();
-            } catch (MalformedURLException e) {
-                return obj.toString();
-            }
-        } else {
-            return obj.toString();
-        }
-    }
-
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundles.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundles.java
deleted file mode 100644
index 1456300..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListBundles.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListServices.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListServices.java
deleted file mode 100644
index 591ae98..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ListServices.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Name.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Name.java
deleted file mode 100644
index f3c32d9..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Name.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.utils.properties.Properties;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-
-@Command(scope = "osgi", name = "name", description = "Show or change Karaf instance name.")
-public class Name extends OsgiCommandSupport {
-
-    @Argument(name = "name", index = 0, description = "New name of the Karaf instance.", required = false, multiValued = false)
-    String name;
-
-    protected Object doExecute() throws Exception {
-        if (name == null) {
-            System.out.println(bundleContext.getProperty("karaf.name"));
-        } else {
-            try {
-                String karafBase = bundleContext.getProperty("karaf.base");
-                File etcDir = new File(karafBase, "etc");
-                File syspropsFile = new File(etcDir, "system.properties");
-                FileInputStream fis = new FileInputStream(syspropsFile);
-                Properties props = new Properties();
-                props.load(fis);
-                fis.close();
-                props.setProperty("karaf.name", name);
-                FileOutputStream fos = new FileOutputStream(syspropsFile);
-                props.store(fos, "");
-                fos.close();
-            } catch (Exception e) {
-                throw new RuntimeException(e.getMessage(), e);
-            }
-            System.out.println("Instance name changed to " + name + ". Restart needed for this to take effect.");
-        }
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RefreshBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RefreshBundle.java
deleted file mode 100644
index 5c784e1..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RefreshBundle.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ResolveBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ResolveBundle.java
deleted file mode 100644
index 45853e3..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/ResolveBundle.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RestartBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RestartBundle.java
deleted file mode 100644
index 3b1c279..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/RestartBundle.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.karaf.shell.console.MultiException;
-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 {
-        if (bundles.isEmpty()) {
-            System.err.println("No bundles specified.");
-            return;
-        }
-        List<Exception> exceptions = new ArrayList<Exception>();
-        for (Bundle bundle : bundles) {
-            try {
-                bundle.stop();
-            } catch (Exception e) {
-                exceptions.add(new Exception("Unable to stop bundle " + bundle.getBundleId() +
-                        (e.getMessage() != null ? ": " + e.getMessage() : ""), e));
-            }
-        }
-        for (Bundle bundle : bundles) {
-            try {
-                bundle.start();
-            } catch (Exception e) {
-                exceptions.add(new Exception("Unable to start bundle " + bundle.getBundleId() +
-                        (e.getMessage() != null ? ": " + e.getMessage() : ""), e));
-            }
-        }
-        MultiException.throwIf("Error restarting bundles", exceptions);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java
deleted file mode 100644
index 23c907f..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Shutdown.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 = "Shutdown 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);
-                    getBundleContext().getBundle(0).stop();
-                } catch (Exception e) {
-                    log.error("Error when shutting down", e);
-                }
-            }
-        }.start();
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/SpringStateListenerFactory.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/SpringStateListenerFactory.java
deleted file mode 100644
index 4eae552..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/SpringStateListenerFactory.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartBundle.java
deleted file mode 100644
index 73d6995..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartBundle.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.karaf.shell.console.MultiException;
-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 {
-        if (bundles.isEmpty()) {
-            System.err.println("No bundles specified.");
-            return;
-        }
-        List<Exception> exceptions = new ArrayList<Exception>();
-        for (Bundle bundle : bundles) {
-            try {
-                bundle.start();
-            } catch (Exception e) {
-                exceptions.add(new Exception("Unable to start bundle " + bundle.getBundleId() +
-                        (e.getMessage() != null ? ": " + e.getMessage() : ""), e));
-            }
-        }
-        MultiException.throwIf("Error starting bundles", exceptions);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartLevel.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartLevel.java
deleted file mode 100644
index 29aafcf..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StartLevel.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StopBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StopBundle.java
deleted file mode 100644
index f89a58f..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/StopBundle.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.karaf.shell.console.MultiException;
-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 {
-        if (bundles.isEmpty()) {
-            System.err.println("No bundles specified.");
-            return;
-        }
-        List<Exception> exceptions = new ArrayList<Exception>();
-        for (Bundle bundle : bundles) {
-            try {
-                bundle.stop();
-            } catch (Exception e) {
-                exceptions.add(new Exception("Unable to stop bundle " + bundle.getBundleId() +
-                        (e.getMessage() != null ? ": " + e.getMessage() : ""), e));
-            }
-        }
-        MultiException.throwIf("Error stopping bundles", exceptions);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UninstallBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UninstallBundle.java
deleted file mode 100644
index 7f02baa..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UninstallBundle.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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 {
-        if (bundles.isEmpty()) {
-            System.err.println("No bundles specified.");
-            return;
-        }
-        for (Bundle bundle : bundles) {
-            try {
-                bundle.uninstall();
-            } catch (Exception e) {
-                System.err.println(e.toString());
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UpdateBundle.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UpdateBundle.java
deleted file mode 100644
index 02a0ae8..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/UpdateBundle.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Util.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Util.java
deleted file mode 100644
index 465da06..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Util.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Version.java b/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Version.java
deleted file mode 100644
index 1815bae..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/java/org/apache/karaf/shell/osgi/Version.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.osgi;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
-
-@Command(scope = "osgi", name = "version", description = "Display the instance version.")
-public class Version extends OsgiCommandSupport {
-
-    public Object doExecute() throws Exception {
-        System.out.println(System.getProperty("karaf.version"));
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml b/karaf-2.3.x/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml
deleted file mode 100644
index 7451cfa..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/resources/OSGI-INF/blueprint/shell-osgi.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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/classes">
-            <action class="org.apache.karaf.shell.osgi.Classes"/>
-        </command>
-        <command name="osgi/find-class">
-            <action class="org.apache.karaf.shell.osgi.FindClass"/>
-        </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/bundle-services">
-            <action class="org.apache.karaf.shell.osgi.ListBundleServices"/>
-        </command>
-        <command name="osgi/name">
-            <action class="org.apache.karaf.shell.osgi.Name"/>
-        </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 name="osgi/version">
-            <action class="org.apache.karaf.shell.osgi.Version"/>
-        </command>
-    </command-bundle>
-
-    <service auto-export="interfaces">
-        <service-properties>
-            <entry key="name" value="osgi"/>
-            <entry key="description" value="Commands to manage the OSGi framework"/>
-        </service-properties>
-        <bean class="org.apache.karaf.shell.console.commands.BasicSubShell">
-            <property name="name" value="osgi"/>
-            <property name="description" value="Commands to manage the OSGi framework"/>
-            <property name="detailedDescription" value="classpath:/org/apache/karaf/shell/osgi/osgi.txt"/>
-        </bean>
-    </service>
-
-    <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.3.x/shell/osgi/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/osgi/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 969cefe..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,30 +0,0 @@
-\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.3.x/shell/osgi/src/main/resources/org/apache/karaf/shell/osgi/osgi.txt b/karaf-2.3.x/shell/osgi/src/main/resources/org/apache/karaf/shell/osgi/osgi.txt
deleted file mode 100644
index 6aa3fc2..0000000
--- a/karaf-2.3.x/shell/osgi/src/main/resources/org/apache/karaf/shell/osgi/osgi.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-The commands in this subshell can be used to inspect or modify the OSGi framework.
-
-The full list of commands is available below and you can obtain a more detailed help for a given command by using the help command followed by the name of the command:
-  > help osgi:list
-
diff --git a/karaf-2.3.x/shell/packages/NOTICE b/karaf-2.3.x/shell/packages/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/packages/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/packages/pom.xml b/karaf-2.3.x/shell/packages/pom.xml
deleted file mode 100644
index 03b43fe..0000000
--- a/karaf-2.3.x/shell/packages/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?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.3.1</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>
-
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ExportsCommand.java b/karaf-2.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ExportsCommand.java
deleted file mode 100644
index 0fa1b38..0000000
--- a/karaf-2.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ExportsCommand.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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. This command only works on started bundles, use osgi:headers instead");
-            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.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ImportsCommand.java b/karaf-2.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ImportsCommand.java
deleted file mode 100644
index 165a8f0..0000000
--- a/karaf-2.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/ImportsCommand.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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. This command only works on started bundles, use osgi:headers instead");
-        }
-    }
-
-    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.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/PackageCommandSupport.java b/karaf-2.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/PackageCommandSupport.java
deleted file mode 100644
index 8dfa1e9..0000000
--- a/karaf-2.3.x/shell/packages/src/main/java/org/apache/karaf/shell/packages/PackageCommandSupport.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml b/karaf-2.3.x/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml
deleted file mode 100644
index 379ebe8..0000000
--- a/karaf-2.3.x/shell/packages/src/main/resources/OSGI-INF/blueprint/shell-packages.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/packages/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/packages/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 431b7fc..0000000
--- a/karaf-2.3.x/shell/packages/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,19 +0,0 @@
-\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.3.x/shell/pom.xml b/karaf-2.3.x/shell/pom.xml
deleted file mode 100644
index 6e52f4f..0000000
--- a/karaf-2.3.x/shell/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?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.3.1</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>scr</module>
-        <module>web</module>
-    </modules>
-
-</project>
diff --git a/karaf-2.3.x/shell/scr/NOTICE b/karaf-2.3.x/shell/scr/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/scr/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/scr/pom.xml b/karaf-2.3.x/shell/scr/pom.xml
deleted file mode 100644
index f424448..0000000
--- a/karaf-2.3.x/shell/scr/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>org.apache.karaf.shell.scr</artifactId>
-
-    <packaging>bundle</packaging>
-    <name>Apache Karaf :: Shell :: SCR Commands</name>
-    <description>Provides the OSGi SCR commands</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.apache.karaf.shell</groupId>
-            <artifactId>org.apache.karaf.shell.console</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.scr</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>biz.aQute</groupId>
-            <artifactId>bndlib</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>
-                <inherited>true</inherited>
-                <configuration>
-                    <instructions>
-                        <Service-Component>*</Service-Component>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ActivateCommandComponent.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ActivateCommandComponent.java
deleted file mode 100644
index 0122ab5..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ActivateCommandComponent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-import aQute.bnd.annotation.component.Activate;
-import aQute.bnd.annotation.component.Component;
-import aQute.bnd.annotation.component.Deactivate;
-import aQute.bnd.annotation.component.Reference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.console.CompletableFunction;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.scr.action.ActivateAction;
-import org.apache.karaf.shell.scr.completer.ActivateCompleter;
-
-/**
- * Shell Command used to activate a Declarative Service Component.
- */
-@Component(
-        provide=CompletableFunction.class, 
-        name = ActivateCommandComponent.COMPONENT_NAME, 
-        enabled = true, 
-        immediate = true,
-        properties={ 
-            ScrCommandConstants.OSGI_COMMAND_SCOPE_KEY+"="+ScrCommandConstants.SCR_COMMAND, 
-            ScrCommandConstants.OSGI_COMMAND_FUNCTION_KEY+"="+ScrCommandConstants.ACTIVATE_FUNCTION,
-            ScrCommandConstants.HIDDEN_COMPONENT_KEY + "=true"})
-public class ActivateCommandComponent extends ScrCommandSupport {
-
-    public static final String COMPONENT_NAME = "ActivateCommand";
-
-    public static final String COMPONENT_LABEL = "Apache Karaf SCR Activate Command";
-
-    @Override
-    public Class<? extends Action> getActionClass() {
-        return ActivateAction.class;
-    }
-
-    @Override
-    public List<Class<? extends Completer>> getCompleterClasses() {
-        List<Class<? extends Completer>> completers = new ArrayList<Class<? extends Completer>>();
-        completers.add(ActivateCompleter.class);
-        return completers;
-    }
-
-    @Activate
-    public void activate() {
-        logger.info("Activating the " + COMPONENT_LABEL);
-    }
-
-    @Deactivate
-    public void deactivate() {
-        logger.info("Deactivating the " + COMPONENT_LABEL);
-    }
-
-    @Reference
-    @Override
-    public void setScrService(ScrService scrService) {
-        super.setScrService(scrService);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/DeactivateCommandComponent.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/DeactivateCommandComponent.java
deleted file mode 100644
index e86631d..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/DeactivateCommandComponent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-import aQute.bnd.annotation.component.Activate;
-import aQute.bnd.annotation.component.Component;
-import aQute.bnd.annotation.component.Deactivate;
-import aQute.bnd.annotation.component.Reference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.console.CompletableFunction;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.scr.action.DeactivateAction;
-import org.apache.karaf.shell.scr.completer.DeactivateCompleter;
-
-/**
- * Shell Command used to deactivate a Declarative Service Component.
- */
-@Component(
-        provide=CompletableFunction.class, 
-        name = DeactivateCommandComponent.COMPONENT_NAME, 
-        enabled = true, 
-        immediate = true,
-        properties={ 
-            ScrCommandConstants.OSGI_COMMAND_SCOPE_KEY+"="+ScrCommandConstants.SCR_COMMAND, 
-            ScrCommandConstants.OSGI_COMMAND_FUNCTION_KEY+"="+ScrCommandConstants.DEACTIVATE_FUNCTION,
-            ScrCommandConstants.HIDDEN_COMPONENT_KEY + "=true"})
-public class DeactivateCommandComponent extends ScrCommandSupport {
-
-    public static final String COMPONENT_NAME = "DeactivateCommand";
-
-    public static final String COMPONENT_LABEL = "Apache Karaf SCR Deactivate Command";
-
-    @Override
-    public Class<? extends Action> getActionClass() {
-        return DeactivateAction.class;
-    }
-
-    @Override
-    public List<Class<? extends Completer>> getCompleterClasses() {
-        List<Class<? extends Completer>> completers = new ArrayList<Class<? extends Completer>>();
-        completers.add(DeactivateCompleter.class);
-        return completers;
-    }
-
-    @Activate
-    public void activate() {
-        logger.info("Activating the " + COMPONENT_LABEL);
-    }
-
-    @Deactivate
-    public void deactivate() {
-        logger.info("Deactivating the " + COMPONENT_LABEL);
-    }
-
-    @Reference
-    @Override
-    public void setScrService(ScrService scrService) {
-        super.setScrService(scrService);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/DetailsCommandComponent.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/DetailsCommandComponent.java
deleted file mode 100644
index 83e3f71..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/DetailsCommandComponent.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-import aQute.bnd.annotation.component.Activate;
-import aQute.bnd.annotation.component.Component;
-import aQute.bnd.annotation.component.Deactivate;
-import aQute.bnd.annotation.component.Reference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.console.CompletableFunction;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.scr.action.DetailsAction;
-import org.apache.karaf.shell.scr.completer.DetailsCompleter;
-
-/**
- * Shell Command that prints the current state details of a given
- * Declarative Service Component.
- */
-@Component(
-        provide=CompletableFunction.class, 
-        name = DetailsCommandComponent.COMPONENT_NAME, 
-        enabled = true, 
-        immediate = true,
-        properties={ 
-            ScrCommandConstants.OSGI_COMMAND_SCOPE_KEY+"="+ScrCommandConstants.SCR_COMMAND, 
-            ScrCommandConstants.OSGI_COMMAND_FUNCTION_KEY+"="+ScrCommandConstants.DETAILS_FUNCTION,
-            ScrCommandConstants.HIDDEN_COMPONENT_KEY + "=true"})
-public class DetailsCommandComponent extends ScrCommandSupport {
-
-    public static final String COMPONENT_NAME = "DetailsCommand";
-
-    public static final String COMPONENT_LABEL = "Apache Karaf SCR Details Command";
-
-    @Override
-    public Class<? extends Action> getActionClass() {
-        return DetailsAction.class;
-    }
-
-    @Override
-    public List<Class<? extends Completer>> getCompleterClasses() {
-        List<Class<? extends Completer>> completers = new ArrayList<Class<? extends Completer>>();
-        completers.add(DetailsCompleter.class);
-        return completers;
-    }
-
-    @Activate
-    public void activate() {
-        logger.info("Activating the " + COMPONENT_LABEL);
-    }
-
-    @Deactivate
-    public void deactivate() {
-        logger.info("Deactivating the " + COMPONENT_LABEL);
-    }
-
-    @Reference
-    @Override
-    public void setScrService(ScrService scrService) {
-        super.setScrService(scrService);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ListCommandComponent.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ListCommandComponent.java
deleted file mode 100644
index 44e86b2..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ListCommandComponent.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-import aQute.bnd.annotation.component.Activate;
-import aQute.bnd.annotation.component.Component;
-import aQute.bnd.annotation.component.Deactivate;
-import aQute.bnd.annotation.component.Reference;
-
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.console.CompletableFunction;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.scr.action.ListAction;
-
-/**
- * Shell Command that lists the available Declarative Service Components.
- */
-@Component(
-        provide=CompletableFunction.class, 
-        name = ListCommandComponent.COMPONENT_NAME, 
-        enabled = true, 
-        immediate = true,
-        properties={ 
-            ScrCommandConstants.OSGI_COMMAND_SCOPE_KEY+"="+ScrCommandConstants.SCR_COMMAND, 
-            ScrCommandConstants.OSGI_COMMAND_FUNCTION_KEY+"="+ScrCommandConstants.LIST_FUNCTION,
-            ScrCommandConstants.HIDDEN_COMPONENT_KEY + "=true"})
-public class ListCommandComponent extends ScrCommandSupport {
-
-    public static final String COMPONENT_NAME = "ListCommand";
-    public static final String COMPONENT_LABEL = "Apache Karaf SCR List Command";
-
-    @Override
-    public Class<? extends Action> getActionClass() {
-        return ListAction.class;
-    }
-
-    @Override
-    public List<Class<? extends Completer>> getCompleterClasses() {
-        return null;
-    }
-
-    @Activate
-    public void activate() {
-        logger.info("Activating the " + COMPONENT_LABEL);
-    }
-
-    @Deactivate
-    public void deactivate() {
-        logger.info("Deactivating the " + COMPONENT_LABEL);
-    }
-
-    @Reference
-    @Override
-    public void setScrService(ScrService scrService) {
-        super.setScrService(scrService);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrCommandConstants.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrCommandConstants.java
deleted file mode 100644
index 44840ac..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrCommandConstants.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-public class ScrCommandConstants {
-
-    public static final String OSGI_COMMAND_SCOPE_KEY = "osgi.command.scope";
-
-    public static final String OSGI_COMMAND_FUNCTION_KEY = "osgi.command.function";
-
-    public static final String HIDDEN_COMPONENT_KEY = "hidden.component";
-
-    public static final String SCR_COMMAND = "scr";
-
-    public static final String LIST_FUNCTION = "list";
-
-    public static final String ACTIVATE_FUNCTION = "activate";
-
-    public static final String DEACTIVATE_FUNCTION = "deactivate";
-
-    public static final String DETAILS_FUNCTION = "details";
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrCommandSupport.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrCommandSupport.java
deleted file mode 100644
index 404fd09..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrCommandSupport.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.apache.felix.gogo.commands.Action;
-import org.apache.felix.gogo.commands.basic.AbstractCommand;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.console.CompletableFunction;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.scr.action.ScrActionSupport;
-import org.apache.karaf.shell.scr.completer.ScrCompleterSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class ScrCommandSupport extends AbstractCommand implements CompletableFunction {
-
-    protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
-
-    private ScrService scrService;
-    private ReadWriteLock lock = new ReentrantReadWriteLock();
-
-    @Override
-    public abstract Class<? extends Action> getActionClass();
-
-    public abstract List<Class<? extends Completer>> getCompleterClasses();
-
-    @Override
-    public Action createNewAction() {
-        try {
-            lock.readLock().lock();
-            ScrActionSupport action = (ScrActionSupport)getActionClass().newInstance();
-            action.setScrService(getScrService());
-            return action;
-        } catch (InstantiationException e) {
-            throw new RuntimeException(e);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        } finally {
-            lock.readLock().unlock();
-        }
-    }
-
-    public List<Completer> getCompleters() {
-        List<Completer> completers = null;
-
-        if (getCompleterClasses() != null) {
-            try {
-                lock.readLock().lock();
-                completers = new ArrayList<Completer>();
-                for (Class<? extends Completer> completerClass : getCompleterClasses()) {
-                    ScrCompleterSupport ccs = (ScrCompleterSupport)completerClass.newInstance();
-                    ccs.setScrService(scrService);
-                    completers.add(ccs);
-                }
-
-            } catch (InstantiationException e) {
-                throw new RuntimeException(e);
-            } catch (IllegalAccessException e) {
-                throw new RuntimeException(e);
-            } finally {
-                lock.readLock().unlock();
-            }
-        }
-        return completers;
-    }
-
-    public Map<String, Completer> getOptionalCompleters() {
-        return null;
-    }
-
-    /**
-     * Returns the instance of ScrService for this instance of
-     * ScrCommandSupport.
-     * 
-     * @return the ScrCommandSupport or null
-     */
-    public ScrService getScrService() {
-        return scrService;
-    }
-
-    public void setScrService(ScrService scrService) {
-        try {
-            lock.writeLock().lock();
-            this.scrService = scrService;
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-    public void unsetScrService(ScrService scrService) {
-        try {
-            lock.writeLock().lock();
-            this.scrService = null;
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrUtils.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrUtils.java
deleted file mode 100644
index 1d25030..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/ScrUtils.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr;
-
-import java.lang.reflect.Array;
-
-import org.apache.felix.scr.Component;
-
-public class ScrUtils {
-
-    @SuppressWarnings("unchecked")
-    public static <T> T[] emptyIfNull(Class<T> clazz, T[] objects) {
-        return objects == null ? (T[])Array.newInstance(clazz, 0) : objects;
-    }
-
-    public static String getState(int componentState) {
-        String retVal = null;
-
-        switch (componentState) {
-        case Component.STATE_ACTIVE:
-            retVal = "ACTIVE";
-            break;
-        case Component.STATE_ACTIVATING:
-            retVal = "ACTIVATING";
-            break;
-        case Component.STATE_DEACTIVATING:
-            retVal = "DEACTIVATING";
-            break;
-        case Component.STATE_DISABLED:
-            retVal = "DISABLED";
-            break;
-        case Component.STATE_DISABLING:
-            retVal = "DISABLING";
-            break;
-        case Component.STATE_DISPOSED:
-            retVal = "DISPOSED";
-            break;
-        case Component.STATE_DISPOSING:
-            retVal = "DISPOSING";
-            break;
-        case Component.STATE_ENABLING:
-            retVal = "ENABLING";
-            break;
-        case Component.STATE_FACTORY:
-            retVal = "FACTORY";
-            break;
-        case Component.STATE_REGISTERED:
-            retVal = "REGISTERED";
-            break;
-        case Component.STATE_UNSATISFIED:
-            retVal = "UNSATISFIED";
-            break;
-
-        default:
-            break;
-        }
-
-        return retVal;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ActivateAction.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ActivateAction.java
deleted file mode 100644
index 2b9a4ed..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ActivateAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.action;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.scr.ScrCommandConstants;
-import org.apache.karaf.shell.scr.ScrUtils;
-
-/**
- * Activates the given component by supplying its component name.
- */
-@Command(scope = ScrCommandConstants.SCR_COMMAND, 
-         name = ScrCommandConstants.ACTIVATE_FUNCTION, 
-         description = "Activates a Component for the given name")
-public class ActivateAction extends ScrActionSupport {
-
-    @Argument(index = 0, 
-              name = "name", 
-              description = "The name of the Component to activate ", 
-              required = true, 
-              multiValued = false)
-    String name;
-
-    @Override
-    protected Object doScrAction(ScrService scrService) throws Exception {
-        if (logger.isDebugEnabled()) {
-            logger.debug("Activate Action");
-            logger.debug("  Activating the Component: " + name);
-        }
-        Component[] components = scrService.getComponents(name);
-        for (Component component : ScrUtils.emptyIfNull(Component.class, components)) {
-            component.enable();
-        }
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/DeactivateAction.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/DeactivateAction.java
deleted file mode 100644
index 2f19f3d..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/DeactivateAction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.action;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.scr.ScrCommandConstants;
-
-/**
- * Deactivates the given component by supplying its component name.
- */
-@Command(scope = ScrCommandConstants.SCR_COMMAND, 
-         name = ScrCommandConstants.DEACTIVATE_FUNCTION, 
-         description = "Deactivates a Component for the given name")
-public class DeactivateAction extends ScrActionSupport {
-
-    @Argument(index = 0, 
-              name = "name", 
-              description = "The name of the Component to deactivate ", 
-              required = true, 
-              multiValued = false)
-    String name;
-
-    @Override
-    protected Object doScrAction(ScrService scrService) throws Exception {
-        if (logger.isDebugEnabled()) {
-            logger.debug("Deactivate Action");
-            logger.debug("  Deactivating the Component: " + name);
-        }
-        Component[] components = scrService.getComponents(name);
-        if (components != null && components.length > 0) {
-            for (int i = 0; i < components.length; i++) {
-                components[i].disable();
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/DetailsAction.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/DetailsAction.java
deleted file mode 100644
index b035f2e..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/DetailsAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.action;
-
-import java.util.Hashtable;
-
-import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.Reference;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.scr.ScrCommandConstants;
-import org.apache.karaf.shell.scr.ScrUtils;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.component.ComponentConstants;
-
-/**
- * Displays the details associated with a given component by supplying its
- * component name.
- */
-@Command(
-         scope = ScrCommandConstants.SCR_COMMAND, 
-         name = ScrCommandConstants.DETAILS_FUNCTION, 
-         description = "Displays a list of available components")
-public class DetailsAction extends ScrActionSupport {
-
-    @Argument(index = 0, name = "name", description = "The name of the Component to display the detials of", required = true, multiValued = false)
-    String name;
-
-    @SuppressWarnings({"rawtypes"})
-    @Override
-    protected Object doScrAction(ScrService scrService) throws Exception {
-        if (logger.isDebugEnabled()) {
-            logger.debug("Executing the Details Action");
-        }
-        System.out.println(getBoldString("Component Details"));
-        Component[] components = scrService.getComponents(name);
-        for (Component component : ScrUtils.emptyIfNull(Component.class, components)) {
-            printDetail("  Name                : ", component.getName());
-            printDetail("  State               : ", ScrUtils.getState(component.getState()));
-
-            Hashtable props = (Hashtable)component.getProperties();
-            if (!props.isEmpty()) {
-                System.out.println(getBoldString("  Properties          : "));
-                for (Object key : props.keySet()) {
-                    Object value = props.get(key);
-                    printDetail("    ", key + "=" + value);
-                }
-            }
-            Reference[] references = component.getReferences();
-            System.out.println(getBoldString("References"));
-
-            for (Reference reference : ScrUtils.emptyIfNull(Reference.class, references)) {
-                printDetail("  Reference           : ", reference.getName());
-                printDetail("    State             : ", (reference.isSatisfied()) ? "satisfied" : "unsatisfied");
-                printDetail("    Multiple          : ", (reference.isMultiple() ? "multiple" : "single"));
-                printDetail("    Optional          : ", (reference.isOptional() ? "optional" : "mandatory"));
-                printDetail("    Policy            : ", (reference.isStatic() ? "static" : "dynamic"));
-
-                // list bound services
-                ServiceReference[] boundRefs = reference.getServiceReferences();
-                for (ServiceReference serviceReference : ScrUtils.emptyIfNull(ServiceReference.class, boundRefs)) {
-                    final StringBuffer b = new StringBuffer();
-                    b.append("Bound Service ID ");
-                    b.append(serviceReference.getProperty(Constants.SERVICE_ID));
-
-                    String componentName = (String)serviceReference.getProperty(ComponentConstants.COMPONENT_NAME);
-                    if (componentName == null) {
-                        componentName = (String)serviceReference.getProperty(Constants.SERVICE_PID);
-                        if (componentName == null) {
-                            componentName = (String)serviceReference.getProperty(Constants.SERVICE_DESCRIPTION);
-                        }
-                    }
-                    if (componentName != null) {
-                        b.append(" (");
-                        b.append(componentName);
-                        b.append(")");
-                    }
-                    printDetail("    Service Reference : ", b.toString());
-                }
-
-                if (ScrUtils.emptyIfNull(ServiceReference.class, boundRefs).length == 0) {
-                    printDetail("    Service Reference : ", "No Services bound");
-                }
-            }
-
-        }
-
-        return null;
-    }
-
-    private void printDetail(String header, String value) {
-        System.out.println(getBoldString(header) + value);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ListAction.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ListAction.java
deleted file mode 100644
index 3d34844..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ListAction.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.action;
-
-import org.apache.felix.gogo.commands.Command;
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.scr.ScrCommandConstants;
-import org.apache.karaf.shell.scr.ScrUtils;
-
-/**
- * Lists all the components currently installed.
- */
-@Command(scope = ScrCommandConstants.SCR_COMMAND, 
-         name = ScrCommandConstants.LIST_FUNCTION, 
-         description = "Displays a list of available components")
-public class ListAction extends ScrActionSupport {
-
-    @Override
-    protected Object doScrAction(ScrService scrService) throws Exception {
-        if (logger.isDebugEnabled()) {
-            logger.debug("Executing the List Action");
-        }
-        System.out.println(getBoldString("   ID   State             Component Name"));
-        Component[] components = scrService.getComponents();
-        for (Component component : ScrUtils.emptyIfNull(Component.class, components)) {
-            if (showHidden) {
-                // We display all because we are overridden
-                printComponent(component);
-            } else {
-                if (ScrActionSupport.isHiddenComponent(component)) {
-                    // do nothing
-                } else {
-                    // We aren't hidden so print it
-                    printComponent(component);
-                }
-            }
-        }
-        return null;
-    }
-
-    private void printComponent(Component component) {
-        String name = component.getName();
-        String id = buildLeftPadBracketDisplay(component.getId() + "", 4);
-        String state = buildRightPadBracketDisplay(ScrUtils.getState(component.getState()), 16);
-        System.out.println("[" + id + "] [" + state + "] " + name);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ScrActionSupport.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ScrActionSupport.java
deleted file mode 100644
index 39f5e97..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/action/ScrActionSupport.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.action;
-
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.List;
-
-import org.apache.felix.gogo.commands.Option;
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.AbstractAction;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
-import org.apache.karaf.shell.console.jline.CommandSessionHolder;
-import org.apache.karaf.shell.scr.ScrCommandConstants;
-import org.fusesource.jansi.Ansi;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class ScrActionSupport extends AbstractAction {
-
-    @Option(name = ScrActionSupport.SHOW_ALL_OPTION, 
-            aliases = {ScrActionSupport.SHOW_ALL_ALIAS}, 
-            description = "Show all Components including the System Components (hidden by default)", 
-            required = false, 
-            multiValued = false)
-    boolean showHidden = false;
-
-    public static final String SHOW_ALL_OPTION = "-s";
-    public static final String SHOW_ALL_ALIAS = "--show-hidden";
-
-    protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
-
-    private ScrService scrService;
-
-    @Override
-    protected Object doExecute() throws Exception {
-        if (scrService == null) {
-            String msg = "ScrService is unavailable";
-            System.out.println(msg);
-            logger.warn(msg);
-        } else {
-            doScrAction(scrService);
-        }
-        return null;
-    }
-
-    protected abstract Object doScrAction(ScrService scrService) throws Exception;
-
-    protected boolean isActionable(Component component) {
-        boolean answer = true;
-
-        return answer;
-    }
-
-    public static boolean showHiddenComponent(Component component) {
-        boolean answer = false;
-
-        // First look to see if the show all options is there.
-        // If it is we set showAllFlag to true so the next
-        // section will skip
-        CommandSession commandSession = CommandSessionHolder.getSession();
-        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(ScrActionSupport.SHOW_ALL_OPTION) || arguments.contains(ScrActionSupport.SHOW_ALL_ALIAS)) {
-                answer = true;
-            }
-        }
-
-        return answer;
-    }
-
-    @SuppressWarnings("rawtypes")
-    public static boolean isHiddenComponent(Component component) {
-        boolean answer = false;
-
-        Hashtable properties = (Hashtable)component.getProperties();
-        if (properties != null && properties.containsKey(ScrCommandConstants.HIDDEN_COMPONENT_KEY)) {
-            String value = (String)properties.get(ScrCommandConstants.HIDDEN_COMPONENT_KEY);
-            // If the value is false show the hidden
-            // then someone wants us to display the name
-            // of a hidden component
-            if (value != null && value.equals("true")) {
-                answer = true;
-            }
-        }
-
-        return answer;
-    }
-
-    public String getBoldString(String value) {
-        return Ansi.ansi().a(Ansi.Attribute.INTENSITY_BOLD).a(value).a(Ansi.Attribute.INTENSITY_BOLD_OFF).toString();
-    }
-
-    public String buildRightPadBracketDisplay(String s, int max) {
-        return String.format("%1$-" + max + "s", s);
-    }
-
-    public String buildLeftPadBracketDisplay(String s, int max) {
-        return String.format("%1$-" + max + "s", s);
-    }
-
-    /**
-     * Get the bundleContext Object associated with this instance of
-     * ScrActionSupport.
-     * 
-     * @return the bundleContext
-     */
-    public BundleContext getBundleContext() {
-        return FrameworkUtil.getBundle(ListAction.class).getBundleContext();
-    }
-
-    /**
-     * Get the scrService Object associated with this instance of
-     * ScrActionSupport.
-     * 
-     * @return the scrService
-     */
-    public ScrService getScrService() {
-        return scrService;
-    }
-
-    /**
-     * Sets the scrService Object for this ScrActionSupport instance.
-     * 
-     * @param scrService the scrService to set
-     */
-    public void setScrService(ScrService scrService) {
-        this.scrService = scrService;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/ActivateCompleter.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/ActivateCompleter.java
deleted file mode 100644
index 6a926e9..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/ActivateCompleter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.completer;
-
-import org.apache.felix.scr.Component;
-
-public class ActivateCompleter extends ScrCompleterSupport {
-
-    /**
-     * Overrides the super method noted below. See super documentation for
-     * details.
-     * 
-     * @see org.apache.karaf.scr.command.completer.ScrCompleterSupport#availableComponent(org.apache.felix.scr.Component)
-     */
-    @Override
-    public boolean availableComponent(Component component) throws Exception {
-        return (component != null && component.getState() == Component.STATE_DISABLED);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/DeactivateCompleter.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/DeactivateCompleter.java
deleted file mode 100644
index e839e2c..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/DeactivateCompleter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.completer;
-
-import org.apache.felix.scr.Component;
-
-public class DeactivateCompleter extends ScrCompleterSupport {
-
-    /**
-     * Overrides the super method noted below. See super documentation for
-     * details.
-     * 
-     * @see org.apache.karaf.scr.command.completer.ScrCompleterSupport#availableComponent(org.apache.felix.scr.Component)
-     */
-    @Override
-    public boolean availableComponent(Component component) throws Exception {
-        return (component != null && (component.getState() == Component.STATE_ACTIVE));
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/DetailsCompleter.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/DetailsCompleter.java
deleted file mode 100644
index df6ca35..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/DetailsCompleter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.completer;
-
-import org.apache.felix.scr.Component;
-
-public class DetailsCompleter extends ScrCompleterSupport {
-
-    /**
-     * Overrides the super method noted below. See super documentation for
-     * details.
-     * 
-     * @see org.apache.karaf.shell.scr.completer.ScrCompleterSupport#availableComponent(org.apache.felix.scr.Component)
-     */
-    @Override
-    public boolean availableComponent(Component component) throws Exception {
-        return (component != null);
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/ScrCompleterSupport.java b/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/ScrCompleterSupport.java
deleted file mode 100644
index 5ea621f..0000000
--- a/karaf-2.3.x/shell/scr/src/main/java/org/apache/karaf/shell/scr/completer/ScrCompleterSupport.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.shell.scr.completer;
-
-import java.util.List;
-
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
-import org.apache.karaf.shell.scr.action.ScrActionSupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class ScrCompleterSupport implements Completer {
-
-    protected final transient Logger logger = LoggerFactory.getLogger(ScrCompleterSupport.class);
-
-    private ScrService scrService;
-
-    /**
-     * Overrides the super method noted below. See super documentation for
-     * details.
-     * 
-     * @see org.apache.karaf.shell.console.Completer#complete(java.lang.String,
-     *      int, java.util.List)
-     */
-    public int complete(String buffer, int cursor, List<String> candidates) {
-        StringsCompleter delegate = new StringsCompleter();
-        try {
-            for (Component component : scrService.getComponents()) {
-                if (logger.isDebugEnabled()) {
-                    logger.debug("Component Name to work on: " + component.getName());
-                }
-                if (ScrActionSupport.showHiddenComponent(component)) {
-                    // We display all because we are overridden
-                    if (availableComponent(component)) {
-                        delegate.getStrings().add(component.getName());
-                    }
-                } else {
-                    if (ScrActionSupport.isHiddenComponent(component)) {
-                        // do nothing
-                    } else {
-                        // We aren't hidden so print it
-                        if (availableComponent(component)) {
-                            delegate.getStrings().add(component.getName());
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            logger.warn("Exception completing the command request: " + e.getLocalizedMessage());
-        }
-        return delegate.complete(buffer, cursor, candidates);
-    }
-
-    public abstract boolean availableComponent(Component component) throws Exception;
-
-    /**
-     * Get the scrService Object associated with this instance of
-     * ScrCompleterSupport.
-     * 
-     * @return the scrService
-     */
-    public ScrService getScrService() {
-        return scrService;
-    }
-
-    /**
-     * Sets the scrService Object for this ScrCompleterSupport instance.
-     * 
-     * @param scrService the scrService to set
-     */
-    public void setScrService(ScrService scrService) {
-        this.scrService = scrService;
-    }
-
-}
diff --git a/karaf-2.3.x/shell/scr/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/scr/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index b518b19..0000000
--- a/karaf-2.3.x/shell/scr/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,19 +0,0 @@
-\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 DS Components.
-
-    The following commands are available:
-    \u001B[36mscr:activate\u001B[0m Activates a component for the given component name.
-    \u001B[36mscr:deactivate\u001B[0m Deactivates a component for the given component name.
-    \u001B[36mscr:details\u001B[0m Shows details for the component with the given component name.
-    \u001B[36mscr:list\u001B[0m Gets the list of the currently available components.
-
-\u001B[1mSEE ALSO\u001B[0m
-    \u001B[36mCommands\u001B[0m and \u001B[36mDeclarative Services\u001B[0m sections of the Karaf User Guide.
\ No newline at end of file
diff --git a/karaf-2.3.x/shell/ssh/NOTICE b/karaf-2.3.x/shell/ssh/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/ssh/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/ssh/pom.xml b/karaf-2.3.x/shell/ssh/pom.xml
deleted file mode 100644
index 8aab389..0000000
--- a/karaf-2.3.x/shell/ssh/pom.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?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.3.1</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.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
deleted file mode 100644
index e814000..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafAgentFactory.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.ssh;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.sshd.agent.SshAgent;
-import org.apache.sshd.agent.SshAgentFactory;
-import org.apache.sshd.agent.SshAgentServer;
-import org.apache.sshd.agent.common.AgentDelegate;
-import org.apache.sshd.agent.local.AgentServerProxy;
-import org.apache.sshd.agent.local.ChannelAgentForwarding;
-import org.apache.sshd.common.Channel;
-import org.apache.sshd.common.NamedFactory;
-import org.apache.sshd.common.Session;
-import org.apache.sshd.server.session.ServerSession;
-
-public class KarafAgentFactory implements SshAgentFactory {
-
-    private final Map<String, AgentServerProxy> proxies = new ConcurrentHashMap<String, AgentServerProxy>();
-    private final Map<String, SshAgent> locals = new ConcurrentHashMap<String, SshAgent>();
-
-    public NamedFactory<Channel> getChannelForwardingFactory() {
-        return new ChannelAgentForwarding.Factory();
-    }
-
-    public SshAgent createClient(Session session) throws IOException {
-        String proxyId = session.getFactoryManager().getProperties().get(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
-        if (proxyId == null) {
-            throw new IllegalStateException("No " + SshAgent.SSH_AUTHSOCKET_ENV_NAME + " environment variable set");
-        }
-        AgentServerProxy proxy = proxies.get(proxyId);
-        if (proxy != null) {
-            return proxy.createClient();
-        }
-        SshAgent agent = locals.get(proxyId);
-        if (agent != null) {
-            return new AgentDelegate(agent);
-        }
-        throw new IllegalStateException("No ssh agent found");
-    }
-
-    public SshAgentServer createServer(Session session) throws IOException {
-        if (!(session instanceof ServerSession)) {
-            throw new IllegalStateException("The session used to create an agent server proxy must be a server session");
-        }
-        final AgentServerProxy proxy = new AgentServerProxy((ServerSession) session);
-        proxies.put(proxy.getId(), proxy);
-        return new SshAgentServer() {
-            public String getId() {
-                return proxy.getId();
-            }
-            public void close() {
-                proxies.remove(proxy.getId());
-                proxy.close();
-            }
-        };
-    }
-
-    public void registerAgent(SshAgent agent, Map<String, ?> properties) {
-        if (agent != null) {
-            Object id = properties.get("id");
-            if (id == null) {
-                throw new IllegalStateException("Local agent can't be registered with no 'id' property");
-            }
-            locals.put(id.toString(), agent);
-        }
-    }
-
-    public void unregisterAgent(SshAgent agent, Map<String, ?> properties) {
-        if (agent != null) {
-            Object id = properties.get("id");
-            if (id == null) {
-                throw new IllegalStateException("Local agent can't be unregistered with no 'id' property");
-            }
-            locals.remove(id.toString());
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
deleted file mode 100644
index d728ec5..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.ssh;
-
-import org.apache.sshd.common.Session;
-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(Session session) {
-        return new KarafFileSystemView();
-    }
-
-}
diff --git a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
deleted file mode 100644
index 33b64fe..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafFileSystemView.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java
deleted file mode 100644
index 50eb5d1..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafJaasAuthenticator.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.ssh;
-
-import java.io.IOException;
-import java.security.Principal;
-import java.security.PublicKey;
-
-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.karaf.jaas.modules.publickey.PublickeyCallback;
-import org.apache.sshd.common.Session;
-import org.apache.sshd.server.PasswordAuthenticator;
-import org.apache.sshd.server.PublickeyAuthenticator;
-import org.apache.sshd.server.session.ServerSession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class KarafJaasAuthenticator implements PasswordAuthenticator, PublickeyAuthenticator {
-
-    public static final Session.AttributeKey<Subject> SUBJECT_ATTRIBUTE_KEY = new Session.AttributeKey<Subject>();
-    private final Logger LOGGER = LoggerFactory.getLogger(KarafJaasAuthenticator.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.boot.principal.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;
-        }
-    }
-
-    public boolean authenticate(final String username, final PublicKey key, 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 PublickeyCallback) {
-                            ((PublickeyCallback) callback).setPublicKey(key);
-                        } else {
-                            throw new UnsupportedCallbackException(callback);
-                        }
-                    }
-                }
-            });
-            loginContext.login();
-            if (role != null && role.length() > 0) {
-                String clazz = "org.apache.karaf.jaas.boot.principal.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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafSshFile.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafSshFile.java
deleted file mode 100644
index fed7c91..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/KarafSshFile.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java
deleted file mode 100644
index 2790731..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellCommandFactory.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.ssh;
-
-import java.io.*;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.util.Map;
-import javax.security.auth.Subject;
-
-import org.apache.felix.gogo.commands.CommandException;
-import org.apache.felix.gogo.runtime.CommandNotFoundException;
-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.jline.Console;
-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;
-import org.fusesource.jansi.Ansi;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ShellCommandFactory implements CommandFactory {
-
-    public static final String SHELL_INIT_SCRIPT = "karaf.shell.init.script";
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ShellCommandFactory.class);
-
-    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:*");
-                session.put("APPLICATION", System.getProperty("karaf.name", "root"));
-                for (Map.Entry<String,String> e : env.getEnv().entrySet()) {
-                    session.put(e.getKey(), e.getValue());
-                }
-                try {
-                    Subject subject = this.session != null ? this.session.getAttribute(KarafJaasAuthenticator.SUBJECT_ATTRIBUTE_KEY) : null;
-                    Object result;
-                    if (subject != null) {
-                        try {
-                            String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT);
-                            executeScript(scriptFileName, session);
-                            result = Subject.doAs(subject, new PrivilegedExceptionAction<Object>() {
-                                public Object run() throws Exception {
-                                    return session.execute(command);
-                                }
-                            });
-                        } catch (PrivilegedActionException e) {
-                            throw e.getException();
-                        }
-                    } else {
-                        String scriptFileName = System.getProperty(SHELL_INIT_SCRIPT);
-                        executeScript(scriptFileName, session);
-                        result = session.execute(command);
-                    }
-                    if (result != null)
-                    {
-                        session.getConsole().println(session.format(result, Converter.INSPECT));
-                    }
-                } catch (Throwable t) {
-                    try {
-                        if (t instanceof CommandNotFoundException) {
-                            LOGGER.debug("Unknown command entered", t);
-                        } else {
-                            LOGGER.info("Exception caught while executing command", t);
-                        }
-                        session.put(Console.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(session, Console.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());
-                        }
-                        session.getConsole().flush();
-                    } catch (Exception ignore) {
-                        // ignore
-                    }
-                }
-            } catch (Exception e) {
-                throw (IOException) new IOException("Unable to start shell").initCause(e);
-            } finally {
-                close(in, out, err);
-                callback.onExit(0);
-            }
-        }
-
-        public void destroy() {
-		}
-
-        protected boolean getBoolean(CommandSession session, 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());
-        }
-
-    }
-
-    private static void close(Closeable... closeables) {
-        for (Closeable c : closeables) {
-            try {
-                c.close();
-            } catch (IOException e) {
-                // Ignore
-            }
-        }
-    }
-
-    private void executeScript(String scriptFileName, CommandSession session) {
-        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);
-            } finally {
-                if (r != null) {
-                    try {
-                        r.close();
-                    } catch (IOException e) {
-                        // Ignore
-                    }
-                }
-            }
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
deleted file mode 100644
index 8a274fa..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/ShellFactoryImpl.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.
- */
-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);
-                String encoding = env.getEnv().get("LC_CTYPE");
-                if (encoding != null && encoding.indexOf('.') > 0) {
-                    encoding = encoding.substring(encoding.indexOf('.') + 1);
-                }
-                Console console = new Console(commandProcessor,
-                                              in,
-                                              new PrintStream(new LfToCrLfFilterOutputStream(out), true),
-                                              new PrintStream(new LfToCrLfFilterOutputStream(err), true),
-                                              terminal,
-                                              encoding,
-                                              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(KarafJaasAuthenticator.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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
deleted file mode 100644
index aedd3fd..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshAction.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.ssh;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.List;
-
-import jline.Terminal;
-
-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.agent.SshAgent;
-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.
- */
-@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={"--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 {
-
-        if (hostname.indexOf('@') >= 0) {
-            if (username == null) {
-                username = hostname.substring(0, hostname.indexOf('@'));
-            }
-            hostname = hostname.substring(hostname.indexOf('@') + 1, hostname.length());
-        }
-
-        System.out.println("Connecting to host " + hostname + " on port " + port);
-
-        // If not specified, assume the current user name
-        if (username == null) {
-            username = (String) this.session.get("USER");
-        }
-        // If the username was not configured via cli, then prompt the user for the values
-        if (username == null) {
-            log.debug("Prompting user for login");
-            if (username == null) {
-                username = readLine("Login: ");
-            }
-        }
-
-        // Create the client from prototype
-        SshClient client = (SshClient) container.getComponentInstance(sshClientId);
-        log.debug("Created client: {}", client);
-        client.start();
-
-        String agentSocket = null;
-        if (this.session.get(SshAgent.SSH_AUTHSOCKET_ENV_NAME) != null) {
-            agentSocket = this.session.get(SshAgent.SSH_AUTHSOCKET_ENV_NAME).toString();
-            client.getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME,agentSocket);
-        }
-
-        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");
-
-                boolean authed = false;
-                if (agentSocket != null) {
-                    sshSession.authAgent(username);
-                    int ret = sshSession.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
-                    if ((ret & ClientSession.AUTHED) == 0) {
-                        System.err.println("Agent authentication failed, falling back to password authentication.");
-                    } else {
-                        authed = true;
-                    }
-                }
-                if (!authed) {
-                    log.debug("Prompting user for password");
-                    String password = readLine("Password: ");
-                    sshSession.authPassword(username, password);
-                    int ret = sshSession.waitFor(ClientSession.WAIT_AUTH | ClientSession.CLOSED | ClientSession.AUTHED, 0);
-                    if ((ret & ClientSession.AUTHED) == 0) {
-                        System.err.println("Password authentication failed");
-                    } else {
-                        authed = true;
-                    }
-                }
-                if (!authed) {
-                    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).setPtyColumns(getTermWidth());
-                    ((ChannelShell) channel).setupSensibleDefaultPty();
-                    ((ChannelShell) channel).setAgentForwarding(true);
-                    Object ctype = session.get("LC_CTYPE");
-                    if (ctype != null) {
-                        ((ChannelShell) channel).setEnv("LC_CTYPE", ctype.toString());
-                    }
-                }
-                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;
-    }
-
-    private int getTermWidth() {
-        Terminal term = (Terminal) session.get(".jline.terminal");
-        return term != null ? term.getWidth() : 80;
-    }
-
-    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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerAction.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerAction.java
deleted file mode 100644
index fab86f9..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerAction.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.
- */
-@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;
-
-    @Option(name = "-i", aliases = { "--idle-timeout" }, description = "The session idle timeout (Default: 1800000ms)", required = false, multiValued = false)
-    private long idleTimeout = 1800000;
-
-    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);
-
-        // port number
-        server.setPort(port);
-
-        // idle timeout
-        server.getProperties().put(SshServer.IDLE_TIMEOUT, new Long(idleTimeout).toString());
-
-        // starting the SSHd server
-        server.start();
-
-        System.out.println("SSH server listening on port " + port + " (idle timeout " + idleTimeout + "ms)");
-
-        if (!background) {
-            synchronized (this) {
-                log.debug("Waiting for server to shutdown");
-
-                wait();
-            }
-
-            server.stop();
-        }
-
-        return null;
-    }
-}
diff --git a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerFactory.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerFactory.java
deleted file mode 100644
index 4789669..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshServerFactory.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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 long idleTimeout;
-    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 long getIdleTimeout() {
-        return idleTimeout;
-    }
-
-    public void setIdleTimeout(long idleTimeout) {
-        this.idleTimeout = idleTimeout;
-    }
-
-    public void start() {
-        if (start) {
-            try {
-                server.getProperties().put(SshServer.IDLE_TIMEOUT, new Long(idleTimeout).toString());
-                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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshTerminal.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshTerminal.java
deleted file mode 100644
index 5a3aad1..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/SshTerminal.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java b/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
deleted file mode 100644
index 17fea15..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/UserAuthFactoriesFactory.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml b/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
deleted file mode 100644
index 09ba36f..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/blueprint/shell-ssh.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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="sshIdleTimeout" value="1800000"/>
-            <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:property name="keySize" value="1024"/>
-            <cm:property name="algorithm" value="DSA"/>
-        </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">
-        <property name="agentFactory" ref="agentFactory" />
-    </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="authenticator"/>
-        <property name="publickeyAuthenticator" ref="authenticator"/>
-        <property name="fileSystemFactory">
-            <bean class="org.apache.karaf.shell.ssh.KarafFileSystemFactory"/>
-        </property>
-        <property name="userAuthFactories">
-            <bean factory-ref="userAuthFactoriesFactory" factory-method="getFactories"/>
-        </property>
-        <property name="agentFactory" ref="agentFactory" />
-    </bean>
-
-    <bean id="agentFactory" class="org.apache.karaf.shell.ssh.KarafAgentFactory" />
-    <reference-list id="agents" interface="org.apache.sshd.agent.SshAgent" availability="optional" activation="eager">
-        <reference-listener ref="agentFactory" bind-method="registerAgent" unbind-method="unregisterAgent" />
-    </reference-list>
-
-    <bean id="keyPairProvider" class="org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider">
-        <property name="path" value="${hostKey}"/>
-        <property name="keySize" value="${keySize}"/>
-        <property name="algorithm" value="${algorithm}"/>
-    </bean>
-    <bean id="authenticator" class="org.apache.karaf.shell.ssh.KarafJaasAuthenticator">
-        <property name="realm" value="${sshRealm}"/>
-        <property name="role" value="${sshRole}"/>
-    </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]"/>
-        <property name="idleTimeout" value="${sshIdleTimeout}"/>
-    </bean>
-
-    <reference id="commandProcessor" interface="org.apache.felix.service.command.CommandProcessor">
-    </reference>
-
-</blueprint>
\ No newline at end of file
diff --git a/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 964f9b1..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,16 +0,0 @@
-\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.3.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index c4090b5..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-#
-# 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
-
-keySize.name = Key size
-keySize.description = Secret key size in 1024, 2048, 3072, or 4096
-
-algorithm.name = Key algorithm
-algorithm.description = Host key algorithm in DSA, RSA, etc
\ No newline at end of file
diff --git a/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index 68c5da3..0000000
--- a/karaf-2.3.x/shell/ssh/src/main/resources/OSGI-INF/metatype/metatype.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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"/>
-        <AD id="keySize" type="integer" default="1024" name="%keySize.name" description="%keySize.description"/>
-        <AD id="algorithm" type="String" default="DSA" name="%algorithm.name" description="%algorithm.description"/>
-    </OCD>
-    <Designate pid="org.apache.karaf.shell">
-        <Object ocdref="org.apache.karaf.shell"/>
-    </Designate>
-</metatype:MetaData>
diff --git a/karaf-2.3.x/shell/ssh/src/test/resources/org/apache/karaf/shell/ssh/authorized_keys b/karaf-2.3.x/shell/ssh/src/test/resources/org/apache/karaf/shell/ssh/authorized_keys
deleted file mode 100644
index 11bd351..0000000
--- a/karaf-2.3.x/shell/ssh/src/test/resources/org/apache/karaf/shell/ssh/authorized_keys
+++ /dev/null
@@ -1,20 +0,0 @@
-################################################################
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-################################################################
-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.3.x/shell/web/NOTICE b/karaf-2.3.x/shell/web/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/web/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/web/pom.xml b/karaf-2.3.x/shell/web/pom.xml
deleted file mode 100644
index 2cd30a4..0000000
--- a/karaf-2.3.x/shell/web/pom.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?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.3.1</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.gogo.runtime</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;-split-package:=merge-first,
-                            org.apache.felix.utils.manifest;-split-package:=merge-first,
-                            !*
-                        </Private-Package>
-                        <_versionpolicy>${bnd.version.policy}</_versionpolicy>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebEventHandler.java b/karaf-2.3.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebEventHandler.java
deleted file mode 100644
index ed1332d..0000000
--- a/karaf-2.3.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebEventHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebListCommand.java b/karaf-2.3.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebListCommand.java
deleted file mode 100644
index 4104642..0000000
--- a/karaf-2.3.x/shell/web/src/main/java/org/apache/karaf/shell/web/WebListCommand.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/web/src/main/resources/OSGI-INF/blueprint/shell-web.xml b/karaf-2.3.x/shell/web/src/main/resources/OSGI-INF/blueprint/shell-web.xml
deleted file mode 100644
index 078fb5a..0000000
--- a/karaf-2.3.x/shell/web/src/main/resources/OSGI-INF/blueprint/shell-web.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/web/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/web/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 8daf53b..0000000
--- a/karaf-2.3.x/shell/web/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,16 +0,0 @@
-\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.3.x/shell/wrapper/NOTICE b/karaf-2.3.x/shell/wrapper/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/shell/wrapper/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/shell/wrapper/pom.xml b/karaf-2.3.x/shell/wrapper/pom.xml
deleted file mode 100644
index 2e19f08..0000000
--- a/karaf-2.3.x/shell/wrapper/pom.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?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.3.1</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>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.gogo.runtime</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;-split-package:=merge-first
-                        </Private-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java b/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
deleted file mode 100644
index 203b171..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.AbstractAction;
-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.
- */
-@Command(scope = "wrapper", name = "install", description = "Install the container as a system service in the OS.")
-public class InstallCommand extends AbstractAction {
-
-    @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("${java.home}", System.getProperty("java.home"));
-            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");
-                    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.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");
-                    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.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");
-                    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"), "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");
-                    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"), "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");
-                    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"), "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");
-                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.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.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java b/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java
deleted file mode 100644
index 82e738c..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/Main.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java b/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
deleted file mode 100644
index 80e64e1..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.wrapper;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * Copies standard output and error of children streams to standard output and error of the parent.
- */
-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.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java b/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
deleted file mode 100644
index e4e26a4..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.wrapper;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * Copies all data from an input stream to an output stream.
- */
-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.3.x/shell/wrapper/src/main/resources/META-INF/services/org/apache/karaf/shell/commands b/karaf-2.3.x/shell/wrapper/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
deleted file mode 100644
index e637744..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
+++ /dev/null
@@ -1,17 +0,0 @@
-##---------------------------------------------------------------------------
-##  Licensed to the Apache Software Foundation (ASF) under one or more
-##  contributor license agreements.  See the NOTICE file distributed with
-##  this work for additional information regarding copyright ownership.
-##  The ASF licenses this file to You under the Apache License, Version 2.0
-##  (the "License"); you may not use this file except in compliance with
-##  the License.  You may obtain a copy of the License at
-##
-##     http://www.apache.org/licenses/LICENSE-2.0
-##
-##  Unless required by applicable law or agreed to in writing, software
-##  distributed under the License is distributed on an "AS IS" BASIS,
-##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-##  See the License for the specific language governing permissions and
-##  limitations under the License.
-##---------------------------------------------------------------------------
-org.apache.karaf.shell.wrapper.InstallCommand
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml b/karaf-2.3.x/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml
deleted file mode 100644
index d994639..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/OSGI-INF/blueprint/shell-wrapper.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/shell/wrapper/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/shell/wrapper/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 6d0c282..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/karaf-wrapper
deleted file mode 100755
index 5215c2e..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/libwrapper.a b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/libwrapper.a
deleted file mode 100755
index 4bcc342..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc32/libwrapper.a
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/karaf-wrapper
deleted file mode 100755
index 6ba0351..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/libwrapper.a b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/libwrapper.a
deleted file mode 100755
index b569e3f..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/aix/ppc64/libwrapper.a
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/all/karaf-wrapper.jar b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/all/karaf-wrapper.jar
deleted file mode 100755
index 4db355b..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/all/karaf-wrapper.jar
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/karaf-wrapper
deleted file mode 100755
index ad883d7..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/libwrapper.sl b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/libwrapper.sl
deleted file mode 100755
index 08adc52..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/hpux/parisc64/libwrapper.sl
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/karaf-wrapper
deleted file mode 100644
index 7e00645..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/libwrapper.so b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/libwrapper.so
deleted file mode 100644
index 2cc4ab3..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux/libwrapper.so
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/karaf-wrapper
deleted file mode 100755
index 3128b95..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/libwrapper.so b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/libwrapper.so
deleted file mode 100755
index 24197bf..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/linux64/libwrapper.so
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/karaf-wrapper
deleted file mode 100644
index 0165db0..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/libwrapper.jnilib b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/libwrapper.jnilib
deleted file mode 100644
index 6356705..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/macosx/libwrapper.jnilib
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/karaf-wrapper
deleted file mode 100755
index 7cac208..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/libwrapper.so b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/libwrapper.so
deleted file mode 100755
index 4093262..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc32/libwrapper.so
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/karaf-wrapper
deleted file mode 100755
index 91257c6..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/libwrapper.so b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/libwrapper.so
deleted file mode 100755
index 008bef6..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/sparc64/libwrapper.so
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/karaf-wrapper b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/karaf-wrapper
deleted file mode 100755
index bdec254..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/karaf-wrapper
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/libwrapper.so b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/libwrapper.so
deleted file mode 100755
index 963ff49..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/solaris/x86/libwrapper.so
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-service b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-service
deleted file mode 100755
index a9a741d..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-service
+++ /dev/null
@@ -1,552 +0,0 @@
-#! /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.
-# ------------------------------------------------------------------------
-
-# If not set, try to determine the JAVA_HOME using the JDK and fall back to JRE
-if [ `command -v readlink` ]; then
-  [ -z $JAVA_HOME ] && [ -x /usr/bin/javac ] && export JAVA_HOME="$(readlink -f /usr/bin/javac | sed 's:/bin/javac::')"
-  [ -z $JAVA_HOME ] && [ -x /usr/bin/java ] && export JAVA_HOME="$(readlink -f /usr/bin/java | sed 's:/bin/java::')"
-fi
-
-# 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 -s /bin/sh -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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-wrapper.conf b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-wrapper.conf
deleted file mode 100644
index 262756c..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/unix/karaf-wrapper.conf
+++ /dev/null
@@ -1,130 +0,0 @@
-# ------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ------------------------------------------------------------------------
-
-#********************************************************************
-# Wrapper Properties
-#********************************************************************
-set.default.JAVA_HOME=${java.home}
-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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-service.bat b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-service.bat
deleted file mode 100644
index f29dccd..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-service.bat
+++ /dev/null
@@ -1,50 +0,0 @@
-@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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.conf b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.conf
deleted file mode 100644
index 70c56d9..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.conf
+++ /dev/null
@@ -1,130 +0,0 @@
-# ------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ------------------------------------------------------------------------
-
-#********************************************************************
-# Wrapper Properties
-#********************************************************************
-set.default.JAVA_HOME=${java.home}
-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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.exe b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.exe
deleted file mode 100644
index b4cfc55..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/karaf-wrapper.exe
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/wrapper.dll b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/wrapper.dll
deleted file mode 100644
index cb553c1..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows/wrapper.dll
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-service.bat b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-service.bat
deleted file mode 100644
index f29dccd..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-service.bat
+++ /dev/null
@@ -1,50 +0,0 @@
-@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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.conf b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.conf
deleted file mode 100644
index 70c56d9..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.conf
+++ /dev/null
@@ -1,130 +0,0 @@
-# ------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ------------------------------------------------------------------------
-
-#********************************************************************
-# Wrapper Properties
-#********************************************************************
-set.default.JAVA_HOME=${java.home}
-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.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.exe b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.exe
deleted file mode 100755
index db2ddda..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/karaf-wrapper.exe
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/wrapper.dll b/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/wrapper.dll
deleted file mode 100644
index f07fc9e..0000000
--- a/karaf-2.3.x/shell/wrapper/src/main/resources/org/apache/karaf/shell/wrapper/windows64/wrapper.dll
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/tooling/cmdhelp-maven-plugin/NOTICE b/karaf-2.3.x/tooling/cmdhelp-maven-plugin/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/tooling/cmdhelp-maven-plugin/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/tooling/cmdhelp-maven-plugin/pom.xml b/karaf-2.3.x/tooling/cmdhelp-maven-plugin/pom.xml
deleted file mode 100644
index 388ad6a..0000000
--- a/karaf-2.3.x/tooling/cmdhelp-maven-plugin/pom.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?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.3.1</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.3.x/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/karaf/tooling/cmdhelp/CmdHelpMojo.java b/karaf-2.3.x/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/karaf/tooling/cmdhelp/CmdHelpMojo.java
deleted file mode 100644
index 1d8d91b..0000000
--- a/karaf-2.3.x/tooling/cmdhelp-maven-plugin/src/main/java/org/apache/karaf/tooling/cmdhelp/CmdHelpMojo.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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
- *
- * @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.3.x/tooling/exam/container/NOTICE b/karaf-2.3.x/tooling/exam/container/NOTICE
deleted file mode 100644
index d08156c..0000000
--- a/karaf-2.3.x/tooling/exam/container/NOTICE
+++ /dev/null
@@ -1,48 +0,0 @@
-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.3.x/tooling/exam/container/pom.xml b/karaf-2.3.x/tooling/exam/container/pom.xml
deleted file mode 100644
index 5555b49..0000000
--- a/karaf-2.3.x/tooling/exam/container/pom.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?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.exam</groupId>
-        <artifactId>exam</artifactId>
-        <version>2.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.tooling.exam</groupId>
-    <artifactId>org.apache.karaf.tooling.exam.container</artifactId>
-    <packaging>jar</packaging>
-    <name>Apache Karaf :: Tooling :: Exam Testing Framework :: Container</name>
-
-    <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.exam</groupId>
-            <artifactId>pax-exam</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-extender-service</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-rbc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-invoker-junit</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-remote</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-spi</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-rbc-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.url</groupId>
-            <artifactId>pax-url-mvn</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.base</groupId>
-            <artifactId>ops4j-base-lang</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.base</groupId>
-            <artifactId>ops4j-base-net</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-atinject_1.0_spec</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-inject</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.karaf.tooling.exam</groupId>
-            <artifactId>org.apache.karaf.tooling.exam.options</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <filtering>true</filtering>
-            </resource>
-        </resources>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/Constants.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/Constants.java
deleted file mode 100644
index 41ba179..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/Constants.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-public interface Constants {
-
-    static final String FEATURES_CFG_LOCATION = "/etc/org.apache.karaf.features.cfg";
-
-    static final int SYSTEM_BUNDLE = 0;
-
-    static final int DEFAULT_START_LEVEL = 5;
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/ExamFeaturesFile.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/ExamFeaturesFile.java
deleted file mode 100644
index ee77f8a..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/ExamFeaturesFile.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-import org.apache.commons.io.FileUtils;
-import org.ops4j.pax.exam.Info;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-public class ExamFeaturesFile {
-
-    private String featuresXml;
-
-    public ExamFeaturesFile() {
-        this("", Constants.DEFAULT_START_LEVEL);
-    }
-
-    public ExamFeaturesFile(String featuresXml) {
-        this(featuresXml, Constants.DEFAULT_START_LEVEL);
-    }
-
-    public ExamFeaturesFile(String extension, int startLevel) {
-        featuresXml =
-                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-                        + "<features name=\"pax-exam-features-"
-                        + Info.getPaxExamVersion()
-                        + "\">\n"
-                        + "<feature name=\"exam\" version=\""
-                        + Info.getPaxExamVersion()
-                        + "\">\n"
-                        + extension + "\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-lang/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-monitors/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-net/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-store/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-io/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-spi/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.base/ops4j-base-util-property/"
-                        + Info.getOps4jBaseVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.swissbox/pax-swissbox-core/"
-                        + Info.getPaxSwissboxVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.swissbox/pax-swissbox-extender/"
-                        + Info.getPaxSwissboxVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.swissbox/pax-swissbox-lifecycle/"
-                        + Info.getPaxSwissboxVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.swissbox/pax-swissbox-framework/"
-                        + Info.getPaxSwissboxVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.exam/pax-exam/"
-                        + Info.getPaxExamVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.exam/pax-exam-extender-service/"
-                        + Info.getPaxExamVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.exam/pax-exam-container-rbc/"
-                        + Info.getPaxExamVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>wrap:mvn:junit/junit/" + getJunitVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.exam/pax-exam-invoker-junit/"
-                        + Info.getPaxExamVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel
-                        + "'>mvn:org.apache.karaf.tooling.exam/org.apache.karaf.tooling.exam.options/"
-                        + getOptionsVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel
-                        + "'>mvn:org.apache.geronimo.specs/geronimo-atinject_1.0_spec/" + getInjectionVersion()
-                        + "</bundle>\n"
-                        + "<bundle start-level='" + startLevel + "'>mvn:org.ops4j.pax.exam/pax-exam-inject/"
-                        + Info.getPaxExamVersion() + "</bundle>\n"
-                        + "</feature>\n"
-                        + "</features>";
-    }
-
-    private String getJunitVersion() {
-        return getNamedVersion("junit.version");
-    }
-
-    private String getInjectionVersion() {
-        return getNamedVersion("injection.version");
-    }
-
-    private String getOptionsVersion() {
-        return getNamedVersion("options.version");
-    }
-
-    private String getNamedVersion(String name) {
-        String optionsVersion = "";
-        try {
-            final InputStream is = ExamFeaturesFile.class.getClassLoader().getResourceAsStream(
-                    "META-INF/versions.properties"
-            );
-            if (is != null) {
-                final Properties properties = new Properties();
-                properties.load(is);
-                optionsVersion = properties.getProperty(name, "").trim();
-            }
-        } catch (Exception ignore) {
-            // use default versions
-        }
-        return optionsVersion;
-    }
-
-    public void writeToFile(File featuresXmlFile) throws IOException {
-        FileUtils.writeStringToFile(featuresXmlFile, featuresXml);
-    }
-
-    public void adaptDistributionToStartExam(File karafHome, File featuresXmlFile) throws IOException {
-        KarafPropertiesFile karafPropertiesFile = new KarafPropertiesFile(karafHome, Constants.FEATURES_CFG_LOCATION);
-        karafPropertiesFile.load();
-        String finalFilePath = ",file:" + featuresXmlFile.toString().replaceAll("\\\\", "/").replaceAll(" ", "%20");
-        karafPropertiesFile.extend("featuresRepositories", finalFilePath);
-        karafPropertiesFile.extend("featuresBoot", ",exam");
-        karafPropertiesFile.store();
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/InternalKarafDistributionConfigurationOption.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/InternalKarafDistributionConfigurationOption.java
deleted file mode 100644
index b14e39d..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/InternalKarafDistributionConfigurationOption.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-import org.apache.karaf.tooling.exam.options.KarafDistributionBaseConfigurationOption;
-import org.apache.karaf.tooling.exam.options.KarafDistributionConfigurationOption;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.Properties;
-
-/**
- * Extends the {@link KarafDistributionConfigurationOption} to add functionality to store those values also in a
- * distribution.info file in the distirbution.
- */
-public class InternalKarafDistributionConfigurationOption extends KarafDistributionConfigurationOption {
-
-    private static final String NAME = "name";
-    private static final String KARAF_VERSION = "karafVersion";
-
-    private File distributionInfo;
-
-    public InternalKarafDistributionConfigurationOption(
-            KarafDistributionBaseConfigurationOption distributionConfigurationOption, File distributionInfo) {
-        super(distributionConfigurationOption);
-        this.distributionInfo = distributionInfo;
-    }
-
-    @Override
-    public String getKarafVersion() {
-        String internalVersion = super.getKarafVersion();
-        if (internalVersion != null && internalVersion.length() != 0) {
-            return internalVersion;
-        }
-        if (!distributionInfo.exists()) {
-            throw new IllegalStateException(
-                    "Either distribution.info or the property itself has to define a karaf version.");
-        }
-        String retrieveProperty = retrieveProperty(KARAF_VERSION);
-        if (retrieveProperty == null || retrieveProperty.length() == 0) {
-            throw new IllegalStateException(
-                    "Either distribution.info or the property itself has to define a karaf version.");
-        }
-        return retrieveProperty;
-    }
-
-    @Override
-    public String getName() {
-        String internalName = super.getName();
-        if (internalName != null && internalName.length() != 0) {
-            return internalName;
-        }
-        if (!distributionInfo.exists()) {
-            throw new IllegalStateException(
-                    "Either distribution.info or the property itself has to define a name for the distribution..");
-        }
-        String retrieveProperty = retrieveProperty(NAME);
-        if (retrieveProperty == null || retrieveProperty.length() == 0) {
-            throw new IllegalStateException(
-                    "Either distribution.info or the property itself has to define a name for the distribution..");
-        }
-        return retrieveProperty;
-    }
-
-    private String retrieveProperty(String key) {
-        try {
-            FileInputStream fileInputStream = new FileInputStream(distributionInfo);
-            try {
-                Properties props = new Properties();
-                props.load(fileInputStream);
-                return props.getProperty(key);
-            } finally {
-                fileInputStream.close();
-            }
-        } catch (Exception e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafPropertiesFile.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafPropertiesFile.java
deleted file mode 100644
index 700c5b6..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafPropertiesFile.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-import org.apache.commons.io.FileUtils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-public class KarafPropertiesFile {
-
-    private final Properties properties;
-    private final File propertyFile;
-
-    public KarafPropertiesFile(File karafHome, String location) {
-        if (location.startsWith("/")) {
-            propertyFile = new File(karafHome + location);
-        } else {
-            propertyFile = new File(karafHome + "/" + location);
-        }
-        properties = new Properties();
-    }
-
-    public void load() throws IOException {
-        if (!propertyFile.exists()) {
-            return;
-        }
-        properties.load(new FileInputStream(propertyFile));
-    }
-
-    public void put(String key, String value) {
-        properties.put(key, value);
-    }
-
-    public void extend(String key, String value) {
-        if (properties.get(key) == null) {
-            properties.put(key, value);
-            return;
-        }
-        properties.put(key, properties.get(key) + value);
-    }
-
-    public String get(String key) {
-        return properties.getProperty(key);
-    }
-
-    public void store() throws IOException {
-        properties.store(new FileOutputStream(propertyFile), "Modified by paxexam");
-    }
-
-    public void replace(File source) {
-        try {
-            FileUtils.copyFile(source, propertyFile);
-        } catch (IOException e) {
-            throw new IllegalStateException("It is required to replace propertyFile");
-        }
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafTestContainer.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafTestContainer.java
deleted file mode 100644
index 70da410..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafTestContainer.java
+++ /dev/null
@@ -1,622 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-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.commons.io.filefilter.WildcardFileFilter;
-import org.apache.karaf.tooling.exam.container.internal.adaptions.KarafManipulator;
-import org.apache.karaf.tooling.exam.container.internal.adaptions.KarafManipulatorFactory;
-import org.apache.karaf.tooling.exam.container.internal.runner.Runner;
-import org.apache.karaf.tooling.exam.options.*;
-import org.apache.karaf.tooling.exam.options.configs.CustomProperties;
-import org.apache.karaf.tooling.exam.options.configs.FeaturesCfg;
-import org.ops4j.pax.exam.*;
-import org.ops4j.pax.exam.container.remote.RBCRemoteTarget;
-import org.ops4j.pax.exam.options.*;
-import org.ops4j.pax.exam.options.extra.FeaturesScannerProvisionOption;
-import org.ops4j.pax.exam.options.extra.VMOption;
-import org.ops4j.pax.exam.rbc.client.RemoteBundleContextClient;
-import org.osgi.framework.Bundle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.*;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.*;
-
-import static org.apache.karaf.tooling.exam.options.KarafDistributionOption.editConfigurationFileExtend;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import static org.ops4j.pax.exam.rbc.Constants.*;
-
-public class KarafTestContainer implements TestContainer {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(KarafTestContainer.class);
-
-    private static final String KARAF_TEST_CONTAINER = "KarafTestContainer.start";
-    private static final String EXAM_INVOKER_PROPERTY = "pax.exam.invoker";
-    private static final String EXAM_INJECT_PROPERTY = "pax.exam.inject";
-
-    private final Runner runner;
-    private final RMIRegistry registry;
-    private final ExamSystem system;
-    private KarafDistributionBaseConfigurationOption framework;
-    @SuppressWarnings("unused")
-    private KarafManipulator versionAdaptions;
-
-    private boolean deleteRuntime = true;
-    private boolean started = false;
-    private RBCRemoteTarget target;
-
-    private File targetFolder;
-
-    public KarafTestContainer(ExamSystem system, RMIRegistry registry,
-                              KarafDistributionBaseConfigurationOption framework, Runner runner) {
-        this.framework = framework;
-        this.registry = registry;
-        this.system = system;
-        this.runner = runner;
-    }
-
-    @Override
-    public synchronized TestContainer start() {
-        try {
-            String name = system.createID(KARAF_TEST_CONTAINER);
-
-            KarafExamSystemConfigurationOption[] internalConfigurationOptions =
-                    system.getOptions(KarafExamSystemConfigurationOption.class);
-            Option invokerConfiguration = systemProperty("pax.exam.invoker").value("junit");
-            if (internalConfigurationOptions != null && internalConfigurationOptions.length != 0) {
-                invokerConfiguration =
-                        systemProperty("pax.exam.invoker").value(internalConfigurationOptions[0].getInvoker());
-            }
-
-            ExamSystem subsystem = system.fork(
-                    options(
-                            systemProperty(RMI_HOST_PROPERTY).value(registry.getHost()),
-                            systemProperty(RMI_PORT_PROPERTY).value("" + registry.getPort()),
-                            systemProperty(RMI_NAME_PROPERTY).value(name),
-                            invokerConfiguration,
-                            systemProperty(EXAM_INJECT_PROPERTY).value("true"),
-                            editConfigurationFileExtend("etc/system.properties", "jline.shutdownhook", "true")
-                    ));
-            target = new RBCRemoteTarget(name, registry.getPort(), subsystem.getTimeout());
-
-            System.setProperty("java.protocol.handler.pkgs", "org.ops4j.pax.url");
-
-            URL sourceDistribution = new URL(framework.getFrameworkURL());
-
-            KeepRuntimeFolderOption[] keepRuntimeFolder = subsystem.getOptions(KeepRuntimeFolderOption.class);
-            if (keepRuntimeFolder != null && keepRuntimeFolder.length != 0) {
-                deleteRuntime = false;
-            }
-
-            targetFolder = retrieveFinalTargetFolder(subsystem);
-            extractKarafDistribution(sourceDistribution, targetFolder);
-
-            File javaHome = new File(System.getProperty("java.home"));
-            File karafBase = searchKarafBase(targetFolder);
-            File distributionInfo = new File(karafBase + "/etc/distribution.info");
-            File karafBin = new File(karafBase + "/bin");
-            File featuresXmlFile = new File(targetFolder + "/examfeatures.xml");
-            File karafHome = karafBase;
-            File deploy = new File(karafBase + "/deploy");
-            String karafData = karafHome + "/data";
-
-            framework = new InternalKarafDistributionConfigurationOption(framework, distributionInfo);
-            versionAdaptions = KarafManipulatorFactory.createManipulator(framework.getKarafVersion());
-
-            ArrayList<String> javaOpts = Lists.newArrayList();
-            appendVmSettingsFromSystem(javaOpts, subsystem);
-            String[] javaEndorsedDirs =
-                    new String[]{javaHome + "/jre/lib/endorsed", javaHome + "/lib/endorsed", karafHome + "/lib/endorsed"};
-            String[] javaExtDirs =
-                    new String[]{javaHome + "/jre/lib/ext", javaHome + "/lib/ext", javaHome + "/lib/ext"};
-            String[] karafOpts = new String[]{};
-            ArrayList<String> opts =
-                    Lists.newArrayList("-Dkaraf.startLocalConsole=" + shouldLocalConsoleBeStarted(subsystem),
-                            "-Dkaraf.startRemoteShell=" + shouldRemoteShellBeStarted(subsystem));
-
-            String[] classPath = buildKarafClasspath(karafHome);
-            String main = "org.apache.karaf.main.Main";
-            String options = "";
-            String[] environment = new String[]{};
-            String[] fileEndings = new String[]{"jar", "war", "zip", "kar", "xml"};
-
-            updateLogProperties(karafHome, subsystem);
-            updateUserSetProperties(karafHome, subsystem);
-            copyBootClasspathLibraries(karafHome, subsystem);
-            setupExamProperties(karafHome, subsystem);
-            makeScriptsInBinExec(karafBin);
-
-            int startLevel = Constants.DEFAULT_START_LEVEL;
-            ExamBundlesStartLevel examBundlesStartLevel = system.getSingleOption(ExamBundlesStartLevel.class);
-            if (examBundlesStartLevel != null) {
-                startLevel = examBundlesStartLevel.getStartLevel();
-            }
-
-            ExamFeaturesFile examFeaturesFile;
-            if (framework.isUseDeployFolder()) {
-                copyReferencedArtifactsToDeployFolder(deploy, subsystem, fileEndings);
-                examFeaturesFile = new ExamFeaturesFile("", startLevel);
-            } else {
-                StringBuilder extension = extractExtensionString(subsystem);
-                examFeaturesFile = new ExamFeaturesFile(extension.toString(), startLevel);
-            }
-            examFeaturesFile.writeToFile(featuresXmlFile);
-
-            examFeaturesFile.adaptDistributionToStartExam(karafHome, featuresXmlFile);
-
-            long startedAt = System.currentTimeMillis();
-
-            runner.exec(environment, karafBase, javaHome.toString(), javaOpts.toArray(new String[]{}),
-                    javaEndorsedDirs, javaExtDirs, karafHome.toString(), karafData, karafOpts,
-                    opts.toArray(new String[]{}), classPath, main, options);
-
-            LOGGER.debug("Test Container started in " + (System.currentTimeMillis() - startedAt) + " millis");
-            LOGGER.info("Wait for test container to finish its initialization " + subsystem.getTimeout());
-
-            if (subsystem.getOptions(ServerModeOption.class).length == 0) {
-                waitForState(org.apache.karaf.tooling.exam.container.internal.Constants.SYSTEM_BUNDLE,
-                        Bundle.ACTIVE, subsystem.getTimeout());
-            } else {
-                LOGGER
-                        .info("System runs in Server Mode. Which means, no Test facility bundles available on target system.");
-            }
-
-            started = true;
-        } catch (IOException e) {
-            throw new RuntimeException("Problem starting container", e);
-        }
-        return this;
-    }
-
-    private void copyBootClasspathLibraries(File karafHome, ExamSystem subsystem) throws MalformedURLException,
-            IOException {
-        BootClasspathLibraryOption[] bootClasspathLibraryOptions =
-                subsystem.getOptions(BootClasspathLibraryOption.class);
-        for (BootClasspathLibraryOption bootClasspathLibraryOption : bootClasspathLibraryOptions) {
-            UrlReference libraryUrl = bootClasspathLibraryOption.getLibraryUrl();
-            FileUtils.copyURLToFile(
-                    new URL(libraryUrl.getURL()),
-                    createFileNameWithRandomPrefixFromUrlAtTarget(libraryUrl.getURL(), new File(karafHome + "/lib"),
-                            new String[]{"jar"}));
-        }
-    }
-
-    @SuppressWarnings("rawtypes")
-    private StringBuilder extractExtensionString(ExamSystem subsystem) {
-        ProvisionOption[] provisionOptions = subsystem.getOptions(ProvisionOption.class);
-        StringBuilder extension = new StringBuilder();
-        for (ProvisionOption provisionOption : provisionOptions) {
-            if (provisionOption.getURL().startsWith("link") || provisionOption.getURL().startsWith("scan-features")) {
-                // well those we've already handled at another location...
-                continue;
-            }
-            extension.append("<bundle>").append(provisionOption.getURL()).append("</bundle>\n");
-        }
-        return extension;
-    }
-
-    private String shouldRemoteShellBeStarted(ExamSystem subsystem) {
-        KarafDistributionConfigurationConsoleOption[] consoleOptions =
-                subsystem.getOptions(KarafDistributionConfigurationConsoleOption.class);
-        if (consoleOptions == null) {
-            return "true";
-        }
-        for (KarafDistributionConfigurationConsoleOption consoleOption : consoleOptions) {
-            if (consoleOption.getStartRemoteShell() != null) {
-                return consoleOption.getStartRemoteShell() ? "true" : "false";
-            }
-        }
-        return "true";
-    }
-
-    private String shouldLocalConsoleBeStarted(ExamSystem subsystem) {
-        KarafDistributionConfigurationConsoleOption[] consoleOptions =
-                subsystem.getOptions(KarafDistributionConfigurationConsoleOption.class);
-        if (consoleOptions == null) {
-            return "true";
-        }
-        for (KarafDistributionConfigurationConsoleOption consoleOption : consoleOptions) {
-            if (consoleOption.getStartLocalConsole() != null) {
-                return consoleOption.getStartLocalConsole() ? "true" : "false";
-            }
-        }
-        return "true";
-    }
-
-    private void makeScriptsInBinExec(File karafBin) {
-        if (!karafBin.exists()) {
-            return;
-        }
-        File[] files = karafBin.listFiles();
-        for (File file : files) {
-            file.setExecutable(true);
-        }
-    }
-
-    private File retrieveFinalTargetFolder(ExamSystem subsystem) {
-        if (framework.getUnpackDirectory() == null) {
-            return subsystem.getConfigFolder();
-        } else {
-            File target = new File(framework.getUnpackDirectory() + "/" + UUID.randomUUID().toString());
-            target = transformToAbsolutePath(target);
-            target.mkdirs();
-            return target;
-        }
-    }
-
-    private File transformToAbsolutePath(File file) {
-        return new File(file.getAbsolutePath());
-    }
-
-    private void appendVmSettingsFromSystem(ArrayList<String> opts, ExamSystem subsystem) {
-        VMOption[] options = subsystem.getOptions(VMOption.class);
-        for (VMOption option : options) {
-            opts.add(option.getOption());
-        }
-    }
-
-    @SuppressWarnings("rawtypes")
-    private void copyReferencedArtifactsToDeployFolder(File deploy, ExamSystem subsystem, String[] fileEndings) {
-        ProvisionOption[] options = subsystem.getOptions(ProvisionOption.class);
-        for (ProvisionOption option : options) {
-            try {
-                FileUtils.copyURLToFile(new URL(option.getURL()),
-                        createFileNameWithRandomPrefixFromUrlAtTarget(option.getURL(), deploy, fileEndings));
-            } catch (Exception e) {
-                // well, this can happen...
-            }
-        }
-    }
-
-    private File createFileNameWithRandomPrefixFromUrlAtTarget(String url, File deploy, String[] fileEndings) {
-        String prefix = UUID.randomUUID().toString();
-        String realEnding = extractPossibleFileEndingIfMavenArtifact(url, fileEndings);
-        String fileName = new File(url).getName();
-        return new File(deploy + "/" + prefix + "_" + fileName + "." + realEnding);
-    }
-
-    private String extractPossibleFileEndingIfMavenArtifact(String url, String[] fileEndings) {
-        String realEnding = "jar";
-        for (String ending : fileEndings) {
-            if (url.indexOf("/" + ending + "/") > 0) {
-                realEnding = ending;
-                break;
-            }
-        }
-        return realEnding;
-    }
-
-    private void updateUserSetProperties(File karafHome, ExamSystem subsystem) throws IOException {
-        List<KarafDistributionConfigurationFileOption> options = Lists.newArrayList(
-                subsystem.getOptions(KarafDistributionConfigurationFileOption.class));
-        options.addAll(extractFileOptionsBasedOnFeaturesScannerOptions(subsystem));
-        options.addAll(configureBootDelegation(subsystem));
-        options.addAll(configureSystemBundles(subsystem));
-        HashMap<String, HashMap<String, List<KarafDistributionConfigurationFileOption>>> optionMap = Maps.newHashMap();
-        for (KarafDistributionConfigurationFileOption option : options) {
-            if (!optionMap.containsKey(option.getConfigurationFilePath())) {
-                optionMap.put(option.getConfigurationFilePath(),
-                        new HashMap<String, List<KarafDistributionConfigurationFileOption>>());
-            }
-            HashMap<String, List<KarafDistributionConfigurationFileOption>> optionEntries =
-                    optionMap.get(option.getConfigurationFilePath());
-            if (!optionEntries.containsKey(option.getKey())) {
-                optionEntries.put(option.getKey(), new ArrayList<KarafDistributionConfigurationFileOption>());
-            } else {
-                // if special file warn, replace and continue
-                if (!option.getConfigurationFilePath().equals(FeaturesCfg.FILE_PATH)) {
-                    LOGGER.warn("you're trying to add an additional value to a config file; you're current " +
-                            "value will be replaced.");
-                    optionEntries.put(option.getKey(), new ArrayList<KarafDistributionConfigurationFileOption>());
-                }
-            }
-            optionEntries.get(option.getKey()).add(option);
-        }
-        Set<String> configFiles = optionMap.keySet();
-        for (String configFile : configFiles) {
-
-            KarafPropertiesFile karafPropertiesFile = new KarafPropertiesFile(karafHome, configFile);
-            karafPropertiesFile.load();
-            Collection<List<KarafDistributionConfigurationFileOption>> optionsToApply =
-                    optionMap.get(configFile).values();
-            boolean store = true;
-            for (List<KarafDistributionConfigurationFileOption> optionListToApply : optionsToApply) {
-                for (KarafDistributionConfigurationFileOption optionToApply : optionListToApply) {
-                    if (optionToApply instanceof KarafDistributionConfigurationFilePutOption) {
-                        karafPropertiesFile.put(optionToApply.getKey(), optionToApply.getValue());
-                    } else if (optionToApply instanceof KarafDistributionConfigurationFileReplacementOption) {
-                        karafPropertiesFile
-                                .replace(((KarafDistributionConfigurationFileReplacementOption) optionToApply)
-                                        .getSource());
-                        store = false;
-                        break;
-                    } else {
-                        karafPropertiesFile.extend(optionToApply.getKey(), optionToApply.getValue());
-                    }
-                }
-                if (!store) {
-                    break;
-                }
-            }
-            if (store) {
-                karafPropertiesFile.store();
-            }
-        }
-    }
-
-    private Collection<? extends KarafDistributionConfigurationFileOption> configureSystemBundles(ExamSystem subsystem) {
-        SystemPackageOption[] systemPackageOptions = subsystem.getOptions(SystemPackageOption.class);
-        String systemPackageString = "";
-        for (SystemPackageOption systemPackageOption : systemPackageOptions) {
-            if (!systemPackageString.equals("")) {
-                systemPackageString += ",";
-            }
-            systemPackageString += systemPackageOption.getValue();
-        }
-        if (systemPackageString.equals("")) {
-            return Lists.newArrayList();
-        }
-        return Lists.newArrayList(new KarafDistributionConfigurationFileExtendOption(
-                CustomProperties.SYSTEM_PACKAGES_EXTRA, systemPackageString));
-    }
-
-    private Collection<? extends KarafDistributionConfigurationFileOption>
-    configureBootDelegation(ExamSystem subsystem) {
-        BootDelegationOption[] bootDelegationOptions = subsystem.getOptions(BootDelegationOption.class);
-        String bootDelegationString = "";
-        for (BootDelegationOption bootDelegationOption : bootDelegationOptions) {
-            bootDelegationString += ",";
-            bootDelegationString += bootDelegationOption.getValue();
-        }
-        return Lists.newArrayList(new KarafDistributionConfigurationFileExtendOption(CustomProperties.BOOTDELEGATION,
-                bootDelegationString));
-    }
-
-    private Collection<? extends KarafDistributionConfigurationFileOption>
-    extractFileOptionsBasedOnFeaturesScannerOptions(ExamSystem subsystem) {
-        ArrayList<KarafDistributionConfigurationFileOption> retVal = Lists.newArrayList();
-        FeaturesScannerProvisionOption[] features = subsystem.getOptions(FeaturesScannerProvisionOption.class);
-        for (FeaturesScannerProvisionOption feature : features) {
-            String fullFeatureUrl = feature.getURL();
-            String[] split = fullFeatureUrl.split("\\!/");
-            String url = split[0].replaceAll("scan-features:", "");
-            retVal.add(new KarafDistributionConfigurationFileExtendOption(FeaturesCfg.REPOSITORIES, "," + url));
-            retVal.add(new KarafDistributionConfigurationFileExtendOption(FeaturesCfg.BOOT, "," + split[1]));
-        }
-        return retVal;
-    }
-
-    private void setupExamProperties(File karafHome, ExamSystem system) throws IOException {
-        File customPropertiesFile = new File(karafHome + "/etc/system.properties");
-        SystemPropertyOption[] customProps = system.getOptions(SystemPropertyOption.class);
-        Properties karafPropertyFile = new Properties();
-        karafPropertyFile.load(new FileInputStream(customPropertiesFile));
-        for (SystemPropertyOption systemPropertyOption : customProps) {
-            karafPropertyFile.put(systemPropertyOption.getKey(), systemPropertyOption.getValue());
-        }
-        karafPropertyFile.store(new FileOutputStream(customPropertiesFile), "updated by pax-exam");
-    }
-
-    private void updateLogProperties(File karafHome, ExamSystem system) throws IOException {
-        DoNotModifyLogOption[] modifyLog = system.getOptions(DoNotModifyLogOption.class);
-        if (modifyLog != null && modifyLog.length != 0) {
-            LOGGER.info("Log file should not be modified by the test framework");
-            return;
-        }
-        String realLogLevel = retrieveRealLogLevel(system);
-        File customPropertiesFile = new File(karafHome + "/etc/org.ops4j.pax.logging.cfg");
-        Properties karafPropertyFile = new Properties();
-        karafPropertyFile.load(new FileInputStream(customPropertiesFile));
-        karafPropertyFile.put("log4j.rootLogger", realLogLevel + ", out, stdout, osgi:*");
-        karafPropertyFile.store(new FileOutputStream(customPropertiesFile), "updated by pax-exam");
-    }
-
-    private String retrieveRealLogLevel(ExamSystem system) {
-        LogLevelOption[] logLevelOptions = system.getOptions(LogLevelOption.class);
-        return logLevelOptions != null && logLevelOptions.length != 0 ? logLevelOptions[0].getLogLevel().toString()
-                : "WARN";
-    }
-
-    private String[] buildKarafClasspath(File karafHome) {
-        List<String> cp = new ArrayList<String>();
-        File[] jars = new File(karafHome + "/lib").listFiles((FileFilter) new WildcardFileFilter("*.jar"));
-        for (File jar : jars) {
-            cp.add(jar.toString());
-        }
-        return cp.toArray(new String[]{});
-    }
-
-    /**
-     * Since we might get quite deep use a simple breath first search algorithm
-     */
-    private File searchKarafBase(File targetFolder) {
-        Queue<File> searchNext = new LinkedList<File>();
-        searchNext.add(targetFolder);
-        while (!searchNext.isEmpty()) {
-            File head = searchNext.poll();
-            if (!head.isDirectory()) {
-                continue;
-            }
-            boolean system = false;
-            boolean etc = false;
-            for (File file : head.listFiles()) {
-                if (file.isDirectory() && file.getName().equals("system")) {
-                    system = true;
-                }
-                if (file.isDirectory() && file.getName().equals("etc")) {
-                    etc = true;
-                }
-            }
-            if (system && etc) {
-                return head;
-            }
-            searchNext.addAll(Arrays.asList(head.listFiles()));
-        }
-        throw new IllegalStateException("No karaf base dir found in extracted distribution.");
-    }
-
-    private void extractKarafDistribution(URL sourceDistribution, File targetFolder) throws IOException {
-        if (sourceDistribution.getProtocol().equals("file")) {
-            if (sourceDistribution.getFile().indexOf(".zip") > 0) {
-                extractZipDistribution(sourceDistribution, targetFolder);
-            } else if (sourceDistribution.getFile().indexOf(".tar.gz") > 0) {
-                extractTarGzDistribution(sourceDistribution, targetFolder);
-            } else {
-                throw new IllegalStateException(
-                        "Unknow packaging of distribution; only zip or tar.gz could be handled.");
-            }
-            return;
-        }
-        if (sourceDistribution.toExternalForm().indexOf("/zip") > 0) {
-            extractZipDistribution(sourceDistribution, targetFolder);
-        } else if (sourceDistribution.toExternalForm().indexOf("/tar.gz") > 0) {
-            extractTarGzDistribution(sourceDistribution, targetFolder);
-        } else {
-            throw new IllegalStateException(
-                    "Unknow packaging of distribution; only zip or tar.gz could be handled.");
-        }
-    }
-
-    private void extractTarGzDistribution(URL sourceDistribution, File targetFolder) throws IOException,
-            FileNotFoundException {
-        File uncompressedFile = File.createTempFile("uncompressedTarGz-", ".tar");
-        extractGzArchive(sourceDistribution.openStream(), uncompressedFile);
-        extract(new TarArchiveInputStream(new FileInputStream(uncompressedFile)), targetFolder);
-        FileUtils.forceDelete(uncompressedFile);
-    }
-
-    private void extractZipDistribution(URL sourceDistribution, File targetFolder) throws IOException {
-        extract(new ZipArchiveInputStream(sourceDistribution.openStream()), targetFolder);
-    }
-
-    private void extractGzArchive(InputStream tarGz, File tar) throws IOException {
-        BufferedInputStream in = new BufferedInputStream(tarGz);
-        FileOutputStream out = new FileOutputStream(tar);
-        GzipCompressorInputStream gzIn = new GzipCompressorInputStream(in);
-        final byte[] buffer = new byte[1000];
-        int n = 0;
-        while (-1 != (n = gzIn.read(buffer))) {
-            out.write(buffer, 0, n);
-        }
-        out.close();
-        gzIn.close();
-    }
-
-    private 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();
-        }
-    }
-
-    @Override
-    public synchronized TestContainer stop() {
-        LOGGER.debug("Shutting down the test container (Pax Runner)");
-        try {
-            if (started) {
-                target.stop();
-                RemoteBundleContextClient remoteBundleContextClient = target.getClientRBC();
-                if (remoteBundleContextClient != null) {
-                    remoteBundleContextClient.stop();
-
-                }
-                if (runner != null) {
-                    runner.shutdown();
-                }
-            } else {
-                throw new RuntimeException("Container never came up");
-            }
-        } finally {
-            started = false;
-            target = null;
-            if (deleteRuntime) {
-                system.clear();
-                try {
-                    FileUtils.forceDelete(targetFolder);
-                } catch (IOException e) {
-                    LOGGER.info("Can't remove runtime system; shedule it for exit of the jvm.");
-                    try {
-                        FileUtils.forceDeleteOnExit(targetFolder);
-                    } catch (IOException e1) {
-                        LOGGER.error("Well, this should simply not happen...");
-                    }
-                }
-            }
-        }
-        return this;
-    }
-
-    private void waitForState(final long bundleId, final int state, final RelativeTimeout timeout)
-            throws TimeoutException {
-        target.getClientRBC().waitForState(bundleId, state, timeout);
-    }
-
-    @Override
-    public synchronized void call(TestAddress address) {
-        target.call(address);
-    }
-
-    @Override
-    public synchronized long install(InputStream stream) {
-        return install("local", stream);
-    }
-
-    @Override
-    public synchronized long install(String location, InputStream stream) {
-        return target.install(location, stream);
-    }
-
-    @Override
-    public String toString() {
-        return "KarafTestContainer{" + framework.getFrameworkURL() + "}";
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafTestContainerFactory.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafTestContainerFactory.java
deleted file mode 100644
index 6754d2f..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/KarafTestContainerFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-import org.apache.karaf.tooling.exam.container.internal.runner.KarafJavaRunner;
-import org.apache.karaf.tooling.exam.container.internal.runner.NixRunner;
-import org.apache.karaf.tooling.exam.container.internal.runner.WindowsRunner;
-import org.apache.karaf.tooling.exam.options.KarafDistributionBaseConfigurationOption;
-import org.apache.karaf.tooling.exam.options.KarafDistributionConfigurationOption;
-import org.apache.karaf.tooling.exam.options.KarafDistributionKitConfigurationOption;
-import org.apache.karaf.tooling.exam.options.KarafDistributionKitConfigurationOption.Platform;
-import org.ops4j.pax.exam.ExamSystem;
-import org.ops4j.pax.exam.TestContainer;
-import org.ops4j.pax.exam.TestContainerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class KarafTestContainerFactory implements TestContainerFactory {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(KarafTestContainer.class);
-    private static final int DEFAULTPORT = 21412;
-    private static final boolean IS_WINDOWS_OS = System.getProperty("os.name").toLowerCase().contains("windows");
-
-    private RMIRegistry m_rmiRegistry;
-
-    public KarafTestContainerFactory() {
-        m_rmiRegistry = new RMIRegistry(DEFAULTPORT, DEFAULTPORT + 1, DEFAULTPORT + 99).selectGracefully();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public TestContainer[] create(ExamSystem system) {
-        List<TestContainer> containers = new ArrayList<TestContainer>();
-        KarafDistributionKitConfigurationOption[] kitOptions =
-                system.getOptions(KarafDistributionKitConfigurationOption.class);
-        for (KarafDistributionKitConfigurationOption kitOption : kitOptions) {
-            if (kitOption.getPlatform().equals(Platform.WINDOWS)) {
-                if (IS_WINDOWS_OS) {
-                    containers.add(new KarafTestContainer(system, m_rmiRegistry, kitOption, new WindowsRunner(kitOption
-                            .getMakeExec(), kitOption.getExec())));
-                    continue;
-                }
-                LOGGER.info("Ignore windows settings on non windows platforms");
-            } else {
-                if (!IS_WINDOWS_OS) {
-                    containers.add(new KarafTestContainer(system, m_rmiRegistry, kitOption, new NixRunner(kitOption
-                            .getMakeExec(), kitOption.getExec())));
-                    continue;
-                }
-                LOGGER.info("Ignore non windows settings on windows platforms");
-            }
-        }
-        KarafDistributionBaseConfigurationOption[] options =
-                system.getOptions(KarafDistributionConfigurationOption.class);
-        for (KarafDistributionBaseConfigurationOption testContainer : options) {
-            containers.add(new KarafTestContainer(system, m_rmiRegistry, testContainer, new KarafJavaRunner()));
-        }
-        return containers.toArray(new TestContainer[containers.size()]);
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/RMIRegistry.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/RMIRegistry.java
deleted file mode 100644
index bd42993..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/RMIRegistry.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal;
-
-import org.ops4j.net.FreePort;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.rmi.registry.LocateRegistry;
-import java.rmi.registry.Registry;
-
-/**
- * Graceful RMI registry creation/reuse. Tries to reuse an existing one but is fine with creating one on another port.
- */
-public class RMIRegistry {
-
-    private static final Logger LOG = LoggerFactory.getLogger(RMIRegistry.class);
-
-    @SuppressWarnings("unused")
-    private final Integer m_defaultPort;
-
-    private static final int UNSELECTED = -1;
-
-    final private String m_host;
-    private Integer m_port = UNSELECTED;
-    private Integer m_altMin;
-    private Integer m_altTo;
-    private static final int TREASURE = 30;
-
-    public RMIRegistry(Integer defaultPort, Integer alternativeRangeFrom, Integer alternativeRangeTo)
-
-    {
-        try {
-            m_host = InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException e) {
-            throw new IllegalStateException("Cannot select localhost. That usually not a good sign for networking..");
-        }
-        m_defaultPort = defaultPort;
-        m_altMin = alternativeRangeFrom;
-        m_altTo = alternativeRangeTo;
-    }
-
-    /**
-     * This will make sure a registry exists and is valid m_port. If its not available or does not work for some reason,
-     * it will select another port. This should really not happen usually. But it can.
-     *
-     * @return this for fluent API. Or IllegalStateException if a port has not been detected successfully.
-     */
-    public synchronized RMIRegistry selectGracefully() {
-        // if( ( m_port = select( m_defaultPort ) ) == UNSELECTED ) {
-        int alternativePort = new FreePort(m_altMin, m_altTo).getPort();
-        if ((m_port = select(alternativePort)) == UNSELECTED) {
-            throw new IllegalStateException("No port found for RMI at all. Even though " + alternativePort
-                    + " should have worked. Thats.. not. good. at. all.");
-        }
-        printTakenStatus();
-        // }
-
-        return this;
-    }
-
-    private void printTakenStatus() {
-
-        int in_use = m_port - m_altMin + 1; // the one we just took
-        int max = m_altTo - m_altMin;
-        String info =
-                "Currently " + in_use + " out of " + max + " ports are in use. Port range is from " + m_altMin + " up to "
-                        + m_altTo;
-
-        if (in_use + TREASURE > max) {
-            LOG.warn("--------------");
-            LOG.warn("BEWARE !!! " + info);
-            LOG.warn("--------------");
-        } else {
-            LOG.debug(info);
-        }
-    }
-
-    /**
-     * This contains basically two paths: 1. check if the given port already is valid rmi registry. Use that one if
-     * possible 2. make a new one at that port otherwise. Must also be validated.
-     *
-     * @param port to select.
-     * @return input port if successful or UNSELECTED
-     */
-    private Integer select(int port) {
-        if (reuseRegistry(port)) {
-            LOG.debug("Reuse Registry on " + port);
-            return port;
-
-        } else if (createNewRegistry(port)) {
-            LOG.debug("Created Registry on " + port);
-            return port;
-        }
-        // fail
-        return UNSELECTED;
-
-    }
-
-    private boolean createNewRegistry(int port) {
-        try {
-            Registry registry = LocateRegistry.createRegistry(port);
-
-            return verifyRegistry(registry);
-
-        } catch (Exception e) {
-            //
-        }
-
-        return false;
-    }
-
-    private boolean reuseRegistry(int port) {
-        Registry reg = null;
-        try {
-            reg = LocateRegistry.getRegistry(port);
-            return verifyRegistry(reg);
-
-        } catch (Exception e) {
-            // exception? then its not a fine registry.
-        }
-        return false;
-
-    }
-
-    private boolean verifyRegistry(Registry reg) {
-        if (reg != null) {
-            // test:
-            try {
-                String[] objectsRemote = reg.list();
-
-                for (String r : objectsRemote) {
-                    LOG.info("-- Remotely available already: " + r);
-                }
-                return true;
-
-            } catch (Exception ex) {
-                // exception? then its not a fine registry.
-            }
-        }
-        return false;
-    }
-
-    public String getHost() {
-        return m_host;
-    }
-
-    public int getPort() {
-        return m_port;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulator.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulator.java
deleted file mode 100644
index 6d1be5c..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.adaptions;
-
-/**
- * Core interface defining which functions need to be supported by which Karaf manipulators.
- */
-public interface KarafManipulator {
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulatorFactory.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulatorFactory.java
deleted file mode 100644
index 9440411..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulatorFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.adaptions;
-
-import org.osgi.framework.Version;
-
-/**
- * Factory returning the correct version of the manipulator depending on the added Karaf version.
- */
-public final class KarafManipulatorFactory {
-
-    private KarafManipulatorFactory() {
-        // not required for a final class
-    }
-
-    public static KarafManipulator createManipulator(String karafVersion) {
-        int dots = 0;
-        int i = 0;
-        while ((i = karafVersion.indexOf('.', i)) != -1) {
-            dots++;
-            i++;
-        }
-        Version version;
-        if (dots < 3) {           
-            version = new Version(karafVersion.replaceFirst("-", "."));
-        } else {
-            version = new Version(karafVersion);
-        }        
-        if (version.getMajor() < 2 || version.getMajor() == 2 && version.getMinor() < 2) {
-            throw new IllegalArgumentException("Karaf versions < 2.2.0 are not supported");
-        }
-        return new KarafManipulatorStartingFrom220();
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulatorStartingFrom220.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulatorStartingFrom220.java
deleted file mode 100644
index 9cdd4a6..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/adaptions/KarafManipulatorStartingFrom220.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.adaptions;
-
-/**
- * This manipulator is currently valid for all Karaf versions starting from 2.2.0 and above. In case that a higher
- * version is not supported any more an additional manipulator will be added.
- */
-public class KarafManipulatorStartingFrom220 implements KarafManipulator {
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/BaseScriptRunner.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/BaseScriptRunner.java
deleted file mode 100644
index 6eb928a..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/BaseScriptRunner.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Abstract implementation of the script runner containging the entire self repeating code.
- */
-public abstract class BaseScriptRunner implements Runner {
-
-    protected InternalRunner runner;
-    protected List<String> makeExec = new ArrayList<String>();
-    protected String exec;
-
-    public BaseScriptRunner(List<String> makeExec, String exec) {
-        this.makeExec = makeExec;
-        this.exec = exec;
-        runner = new InternalRunner();
-    }
-
-    @Override
-    public void exec(final String[] environment, final File karafBase, String javaHome, String[] javaOpts,
-                     String[] javaEndorsedDirs, String[] javaExtDirs, String karafHome,
-                     String karafData, String[] karafOpts, String[] opts, String[] classPath, String main, String options) {
-        makeEnvironmentExecutable(karafBase);
-        startSystem(environment, karafBase);
-    }
-
-    private void startSystem(final String[] environment, final File karafBase) {
-        new Thread("KarafJavaRunner") {
-            @Override
-            public void run() {
-                CommandLineBuilder commandLine = createCommandLine(environment, karafBase);
-                runner.exec(commandLine, karafBase, environment);
-            }
-        }.start();
-    }
-
-    protected abstract CommandLineBuilder createCommandLine(final String[] environment, final File karafBase);
-
-    private void makeEnvironmentExecutable(final File karafBase) {
-        new File(karafBase, exec).setExecutable(true);
-        for (String execEntry : makeExec) {
-            new File(karafBase, execEntry).setExecutable(true);
-        }
-    }
-
-    @Override
-    public void shutdown() {
-        runner.shutdown();
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/CommandLineBuilder.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/CommandLineBuilder.java
deleted file mode 100644
index d2a03c8..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/CommandLineBuilder.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-public class CommandLineBuilder {
-
-    /**
-     * The command line array.
-     */
-    private String[] m_commandLine;
-
-    /**
-     * Creates a new command line builder.
-     */
-    public CommandLineBuilder() {
-        m_commandLine = new String[0];
-    }
-
-    /**
-     * Appends an array of strings to command line.
-     *
-     * @param segments array to append
-     * @return CommandLineBuilder for fluent api
-     */
-    public CommandLineBuilder append(final String[] segments) {
-        if (segments != null && segments.length > 0) {
-            final String[] command = new String[m_commandLine.length + segments.length];
-            System.arraycopy(m_commandLine, 0, command, 0, m_commandLine.length);
-            System.arraycopy(segments, 0, command, m_commandLine.length, segments.length);
-            m_commandLine = command;
-        }
-        return this;
-    }
-
-    /**
-     * Appends a string to command line.
-     *
-     * @param segment string to append
-     * @return CommandLineBuilder for fluent api
-     */
-    public CommandLineBuilder append(final String segment) {
-        if (segment != null && !segment.isEmpty()) {
-            return append(new String[]{segment});
-        }
-        return this;
-    }
-
-    /**
-     * Returns the command line.
-     *
-     * @return command line
-     */
-    public String[] toArray() {
-        return m_commandLine;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/InternalRunner.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/InternalRunner.java
deleted file mode 100644
index 814493b..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/InternalRunner.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-import org.ops4j.io.Pipe;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class InternalRunner {
-
-    private Process m_frameworkProcess;
-    private Thread m_shutdownHook;
-
-    public synchronized void exec(CommandLineBuilder commandLine, final File workingDirectory,
-                                  final String[] envOptions) {
-        if (m_frameworkProcess != null) {
-            throw new IllegalStateException("Platform already started");
-        }
-
-        try {
-            m_frameworkProcess =
-                    Runtime.getRuntime().exec(commandLine.toArray(), createEnvironmentVars(envOptions),
-                            workingDirectory);
-        } catch (IOException e) {
-            throw new IllegalStateException("Could not start up the process", e);
-        }
-
-        m_shutdownHook = createShutdownHook(m_frameworkProcess);
-        Runtime.getRuntime().addShutdownHook(m_shutdownHook);
-
-        waitForExit();
-    }
-
-    private String[] createEnvironmentVars(String[] envOptions) {
-        List<String> env = new ArrayList<String>();
-        Map<String, String> getenv = System.getenv();
-        for (String key : getenv.keySet()) {
-            env.add(key + "=" + getenv.get(key));
-        }
-        if (envOptions != null) {
-            Collections.addAll(env, envOptions);
-        }
-        return env.toArray(new String[env.size()]);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void shutdown() {
-        try {
-            if (m_shutdownHook != null) {
-                synchronized (m_shutdownHook) {
-                    if (m_shutdownHook != null) {
-                        Runtime.getRuntime().removeShutdownHook(m_shutdownHook);
-                        m_frameworkProcess = null;
-                        m_shutdownHook.run();
-                        m_shutdownHook = null;
-                    }
-                }
-            }
-        } catch (IllegalStateException ignore) {
-            // just ignore
-        }
-    }
-
-    /**
-     * Wait till the framework process exits.
-     */
-    public void waitForExit() {
-        synchronized (m_frameworkProcess) {
-            try {
-                m_frameworkProcess.waitFor();
-                shutdown();
-            } catch (Throwable e) {
-                shutdown();
-            }
-        }
-    }
-
-    /**
-     * Create helper thread to safely shutdown the external framework process
-     *
-     * @param process framework process
-     * @return stream handler
-     */
-    private Thread createShutdownHook(final Process process) {
-        final Pipe errPipe = new Pipe(process.getErrorStream(), System.err).start("Error pipe");
-        final Pipe outPipe = new Pipe(process.getInputStream(), System.out).start("Out pipe");
-        final Pipe inPipe = new Pipe(process.getOutputStream(), System.in).start("In pipe");
-
-        return new Thread(
-                new Runnable() {
-                    @Override
-                    public void run() {
-                        inPipe.stop();
-                        outPipe.stop();
-                        errPipe.stop();
-
-                        try {
-                            process.destroy();
-                        } catch (Exception e) {
-                            // ignore if already shutting down
-                        }
-                    }
-                },
-                "Pax-Runner shutdown hook");
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/KarafJavaRunner.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/KarafJavaRunner.java
deleted file mode 100644
index 8de2ff9..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/KarafJavaRunner.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-import java.io.File;
-
-/**
- * Very simple asynchronous implementation of Java Runner. Exec is being invoked in a fresh Thread.
- */
-public class KarafJavaRunner implements Runner {
-
-    private InternalRunner runner;
-
-    public KarafJavaRunner() {
-        runner = new InternalRunner();
-    }
-
-    @Override
-    public synchronized void
-    exec(final String[] environment, final File karafBase, final String javaHome, final String[] javaOpts,
-         final String[] javaEndorsedDirs,
-         final String[] javaExtDirs, final String karafHome, final String karafData, final String[] karafOpts,
-         final String[] opts, final String[] classPath, final String main, final String options) {
-        new Thread("KarafJavaRunner") {
-            @Override
-            public void run() {
-                String cp = buildCmdSeparatedString(classPath);
-                String endDirs = buildCmdSeparatedString(javaEndorsedDirs);
-                String extDirs = buildCmdSeparatedString(javaExtDirs);
-                final CommandLineBuilder commandLine = new CommandLineBuilder()
-                        .append(getJavaExecutable(javaHome))
-                        .append(javaOpts)
-                        .append("-Djava.endorsed.dirs=" + endDirs)
-                        .append("-Djava.ext.dirs=" + extDirs)
-                        .append("-Dkaraf.instances=" + karafHome + "/instances")
-                        .append("-Dkaraf.home=" + karafHome)
-                        .append("-Dkaraf.base=" + karafBase)
-                        .append("-Dkaraf.data=" + karafData)
-                        .append("-Djava.util.logging.config.file=" + karafBase + "/etc/java.util.logging.properties")
-                        .append(karafOpts)
-                        .append(opts)
-                        .append("-cp")
-                        .append(cp)
-                        .append(main)
-                        .append(options);
-                runner.exec(commandLine, karafBase, environment);
-            }
-
-            private String buildCmdSeparatedString(final String[] splitted) {
-                final StringBuilder together = new StringBuilder();
-                for (String path : splitted) {
-                    if (together.length() != 0) {
-                        together.append(File.pathSeparator);
-                    }
-                    together.append(path);
-                }
-                return together.toString();
-            }
-
-            private String getJavaExecutable(final String javaHome) {
-                if (javaHome == null) {
-                    throw new IllegalStateException("JAVA_HOME is not set.");
-                }
-                return javaHome + "/bin/java";
-            }
-        }.start();
-    }
-
-    @Override
-    public synchronized void shutdown() {
-        runner.shutdown();
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/NixRunner.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/NixRunner.java
deleted file mode 100644
index 83157c3..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/NixRunner.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * Runner implementation starting karaf based distributions no unix based systems like linux, mac, ...
- */
-public class NixRunner extends BaseScriptRunner {
-
-    public NixRunner(List<String> makeExec, String exec) {
-        super(makeExec, exec);
-    }
-
-    @Override
-    protected CommandLineBuilder createCommandLine(String[] environment, File karafBase) {
-        CommandLineBuilder commandLine = new CommandLineBuilder()
-                .append("/bin/sh")
-                .append(new File(karafBase, exec).getAbsolutePath());
-        return commandLine;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/Runner.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/Runner.java
deleted file mode 100644
index 5433397..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/Runner.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-import java.io.File;
-
-/**
- * Abstracts the runner to be able to add different runners easier.
- */
-public interface Runner {
-
-    /**
-     * Starts the environment in the specific environment.
-     */
-    public abstract void
-    exec(final String[] environment, final File karafBase, final String javaHome, final String[] javaOpts,
-         final String[] javaEndorsedDirs,
-         final String[] javaExtDirs, final String karafHome, final String karafData, final String[] karafOpts,
-         final String[] opts, final String[] classPath, final String main, final String options);
-
-    /**
-     * Shutsdown the runner again.
-     */
-    public abstract void shutdown();
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/WindowsRunner.java b/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/WindowsRunner.java
deleted file mode 100644
index 0bdf27d..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/java/org/apache/karaf/tooling/exam/container/internal/runner/WindowsRunner.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.container.internal.runner;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * Runner to start the Karaf platform on microsoft windows systems.
- */
-public class WindowsRunner extends BaseScriptRunner {
-
-    public WindowsRunner(List<String> makeExec, String exec) {
-        super(makeExec, exec);
-    }
-
-    @Override
-    protected CommandLineBuilder createCommandLine(String[] environment, File karafBase) {
-        CommandLineBuilder commandLine = new CommandLineBuilder()
-                .append("cmd.exe")
-                .append("/c")
-                .append(new File(karafBase, exec).getAbsolutePath());
-        return commandLine;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/resources/META-INF/services/org.ops4j.pax.exam.TestContainerFactory b/karaf-2.3.x/tooling/exam/container/src/main/resources/META-INF/services/org.ops4j.pax.exam.TestContainerFactory
deleted file mode 100644
index f700718..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/resources/META-INF/services/org.ops4j.pax.exam.TestContainerFactory
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.karaf.tooling.exam.container.internal.KarafTestContainerFactory
\ No newline at end of file
diff --git a/karaf-2.3.x/tooling/exam/container/src/main/resources/META-INF/versions.properties b/karaf-2.3.x/tooling/exam/container/src/main/resources/META-INF/versions.properties
deleted file mode 100644
index d5133f1..0000000
--- a/karaf-2.3.x/tooling/exam/container/src/main/resources/META-INF/versions.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-################################################################################
-#
-#    Licensed to the Apache Software Foundation (ASF) under one or more
-#    contributor license agreements.  See the NOTICE file distributed with
-#    this work for additional information regarding copyright ownership.
-#    The ASF licenses this file to You under the Apache License, Version 2.0
-#    (the "License"); you may not use this file except in compliance with
-#    the License.  You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#    Unless required by applicable law or agreed to in writing, software
-#    distributed under the License is distributed on an "AS IS" BASIS,
-#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#    See the License for the specific language governing permissions and
-#    limitations under the License.
-#
-################################################################################
-options.version=${project.version}
-junit.version=${junit.version}
-injection.version=${injection.bundle.version}
\ No newline at end of file
diff --git a/karaf-2.3.x/tooling/exam/options/NOTICE b/karaf-2.3.x/tooling/exam/options/NOTICE
deleted file mode 100644
index d08156c..0000000
--- a/karaf-2.3.x/tooling/exam/options/NOTICE
+++ /dev/null
@@ -1,48 +0,0 @@
-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.3.x/tooling/exam/options/pom.xml b/karaf-2.3.x/tooling/exam/options/pom.xml
deleted file mode 100644
index d2e53bc..0000000
--- a/karaf-2.3.x/tooling/exam/options/pom.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?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.exam</groupId>
-        <artifactId>exam</artifactId>
-        <version>2.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.tooling.exam</groupId>
-    <artifactId>org.apache.karaf.tooling.exam.options</artifactId>
-    <packaging>bundle</packaging>
-    <name>Apache Karaf :: Tooling :: Exam Testing Framework :: Options</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
-                        <Bundle-Version>${project.version}</Bundle-Version>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/ConfigurationPointer.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/ConfigurationPointer.java
deleted file mode 100644
index 37c303e..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/ConfigurationPointer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-/**
- * Bundled configuration for making it easily static accessible via classes.
- */
-public class ConfigurationPointer {
-
-    private String configurationFilePath;
-    private String key;
-
-    public ConfigurationPointer(String configurationFilePath, String key) {
-        this.configurationFilePath = configurationFilePath;
-        this.key = key;
-    }
-
-    public String getConfigurationFilePath() {
-        return configurationFilePath;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/DoNotModifyLogOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/DoNotModifyLogOption.java
deleted file mode 100644
index 5e69e60..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/DoNotModifyLogOption.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * The karaf pax-logging configuration is typically not a file manipulated very often. Therefore we take the freedom of
- * adding a console logger and changing the log level directly. IF you like to configure the file manually (or had so in
- * your distribution) add this option to avoid any automatic modifications to this file!
- */
-public class DoNotModifyLogOption implements Option {
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/ExamBundlesStartLevel.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/ExamBundlesStartLevel.java
deleted file mode 100644
index b98c8ef..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/ExamBundlesStartLevel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * This option allows to configure the start level of the bundles in the exam features descriptor.
- */
-public class ExamBundlesStartLevel implements Option {
-
-    private final int startLevel;
-
-    /**
-     * Sets the start level of the bundles in the generated exam features descriptor.
-     */
-    public ExamBundlesStartLevel(int startLevel) {
-        this.startLevel = startLevel;
-    }
-
-    public int getStartLevel() {
-        return startLevel;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionBaseConfigurationOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionBaseConfigurationOption.java
deleted file mode 100644
index b7d755d..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionBaseConfigurationOption.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.options.MavenUrlReference;
-
-import java.io.File;
-
-public class KarafDistributionBaseConfigurationOption implements Option {
-
-    protected String frameworkURL;
-    protected MavenUrlReference frameworkURLReference;
-    protected String name;
-    protected String karafVersion;
-    protected File unpackDirectory;
-    protected boolean useDeployFolder = true;
-
-    public KarafDistributionBaseConfigurationOption() {
-        frameworkURL = null;
-        frameworkURLReference = null;
-        name = null;
-        karafVersion = null;
-    }
-
-    public KarafDistributionBaseConfigurationOption(String frameworkURL, String name, String karafVersion) {
-        this.frameworkURL = frameworkURL;
-        frameworkURLReference = null;
-        this.name = name;
-        this.karafVersion = karafVersion;
-    }
-
-    public KarafDistributionBaseConfigurationOption(MavenUrlReference frameworkURLReference, String name,
-                                                    String karafVersion) {
-        frameworkURL = null;
-        this.frameworkURLReference = frameworkURLReference;
-        this.name = name;
-        this.karafVersion = karafVersion;
-    }
-
-    public KarafDistributionBaseConfigurationOption(MavenUrlReference frameworkURLReference) {
-        frameworkURL = null;
-        this.frameworkURLReference = frameworkURLReference;
-    }
-
-    /**
-     * Simply clones the insterted {@link KarafDistributionConfigurationOption}
-     */
-    public KarafDistributionBaseConfigurationOption(KarafDistributionBaseConfigurationOption base) {
-        frameworkURL = base.frameworkURL;
-        frameworkURLReference = base.frameworkURLReference;
-        name = base.name;
-        karafVersion = base.karafVersion;
-        unpackDirectory = base.unpackDirectory;
-        useDeployFolder = base.useDeployFolder;
-    }
-
-    /**
-     * Sets the URL of the framework as a String (for example a file).
-     */
-    public KarafDistributionBaseConfigurationOption frameworkUrl(String frameworkURL) {
-        this.frameworkURL = frameworkURL;
-        return this;
-    }
-
-    /**
-     * Sets the URL of the frameworks as a maven reference.
-     */
-    public KarafDistributionBaseConfigurationOption frameworkUrl(MavenUrlReference frameworkURL) {
-        frameworkURLReference = frameworkURL;
-        return this;
-    }
-
-    /**
-     * Set's the name of the framework. This is only used for logging.
-     */
-    public KarafDistributionBaseConfigurationOption name(String name) {
-        this.name = name;
-        return this;
-    }
-
-    /**
-     * The version of karaf used by the framework. That one is required since there is the high possibility that
-     * configuration is different between various karaf versions.
-     */
-    public KarafDistributionBaseConfigurationOption karafVersion(String karafVersion) {
-        this.karafVersion = karafVersion;
-        return this;
-    }
-
-    /**
-     * Define the unpack directory for the karaf distribution. In this directory a UUID named directory will be created
-     * for each environment.
-     */
-    public KarafDistributionBaseConfigurationOption unpackDirectory(File unpackDirectory) {
-        this.unpackDirectory = unpackDirectory;
-        return this;
-    }
-
-    /**
-     * Per default the framework simply copies all referenced artifacts (via Pax Exam DistributionOption) to the deploy
-     * folder of the karaf (based) distribution. If you don't have such a folder (for any reason) you can set this
-     * option to false. PaxExam Karaf will then try to add those deployment urls directly to a features xml instead of
-     * copying those files to the deploy folder.
-     */
-    public KarafDistributionBaseConfigurationOption useDeployFolder(boolean useDeployFolder) {
-        this.useDeployFolder = useDeployFolder;
-        return this;
-    }
-
-    public String getFrameworkURL() {
-        if (frameworkURL == null && frameworkURLReference == null) {
-            throw new IllegalStateException("Either frameworkurl or frameworkUrlReference need to be set.");
-        }
-        return frameworkURL != null ? frameworkURL : frameworkURLReference.getURL();
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getKarafVersion() {
-        return karafVersion;
-    }
-
-    public File getUnpackDirectory() {
-        return unpackDirectory;
-    }
-
-    public boolean isUseDeployFolder() {
-        return useDeployFolder;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationConsoleOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationConsoleOption.java
deleted file mode 100644
index bcc80f4..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationConsoleOption.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * Option to configure the Karaf -Dkaraf.startLocalConsole and -Dkaraf.startRemoteShell options. Per default both are
- * started automatically. If you like to change this behavior simply add this option to your container configuration.
- */
-public class KarafDistributionConfigurationConsoleOption implements Option {
-
-    private Boolean startLocalConsole;
-    private Boolean startRemoteShell;
-
-    public KarafDistributionConfigurationConsoleOption(Boolean startLocalConsole, Boolean startRemoteShell) {
-        this.startLocalConsole = startLocalConsole;
-        this.startRemoteShell = startRemoteShell;
-    }
-
-    /**
-     * Sets the -Dkaraf.startLocalConsole to true
-     */
-    public KarafDistributionConfigurationConsoleOption startLocalConsole() {
-        startLocalConsole = true;
-        return this;
-    }
-
-    /**
-     * Sets the -Dkaraf.startLocalConsole to false
-     */
-    public KarafDistributionConfigurationConsoleOption ignoreLocalConsole() {
-        startLocalConsole = false;
-        return this;
-    }
-
-    /**
-     * Sets the -Dkaraf.startRemoteShell to true
-     */
-    public KarafDistributionConfigurationConsoleOption startRemoteShell() {
-        startRemoteShell = true;
-        return this;
-    }
-
-    /**
-     * Sets the -Dkaraf.startRemoteShell to false
-     */
-    public KarafDistributionConfigurationConsoleOption ignoreRemoteShell() {
-        startRemoteShell = false;
-        return this;
-    }
-
-    public Boolean getStartLocalConsole() {
-        return startLocalConsole;
-    }
-
-    public Boolean getStartRemoteShell() {
-        return startRemoteShell;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileExtendOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileExtendOption.java
deleted file mode 100644
index 9569680..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileExtendOption.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-/**
- * This option allows to extend configurations in each configuration file based on the karaf.home location. The value
- * extends the current value (e.g. a=b to a=a,b) instead of replacing it. If there is no current value it is added.
- * <p/>
- * If you would like to have add or replace functionality please use the
- * {@link KarafDistributionConfigurationFilePutOption} instead.
- */
-public class KarafDistributionConfigurationFileExtendOption extends KarafDistributionConfigurationFileOption {
-
-    public KarafDistributionConfigurationFileExtendOption(String configurationFilePath, String key, String value) {
-        super(configurationFilePath, key, value);
-    }
-
-    public KarafDistributionConfigurationFileExtendOption(ConfigurationPointer pointer, String value) {
-        super(pointer, value);
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileOption.java
deleted file mode 100644
index f9d7aa3..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileOption.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * Abstract configuration file option. This one should not used directly but rather via
- * {@link KarafDistributionConfigurationFileExtendOption} or {@link KarafDistributionConfigurationFilePutOption}.
- */
-public abstract class KarafDistributionConfigurationFileOption implements Option {
-
-    private String configurationFilePath;
-    private String key;
-    private String value;
-
-    public KarafDistributionConfigurationFileOption(ConfigurationPointer pointer, String value) {
-        this(pointer.getConfigurationFilePath(), pointer.getKey(), value);
-    }
-
-    public KarafDistributionConfigurationFileOption(String configurationFilePath, String key, String value) {
-        this.configurationFilePath = configurationFilePath;
-        this.key = key;
-        this.value = value;
-    }
-
-    public KarafDistributionConfigurationFileOption(String configurationFilePath) {
-        this.configurationFilePath = configurationFilePath;
-    }
-
-    public String getConfigurationFilePath() {
-        return configurationFilePath;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFilePutOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFilePutOption.java
deleted file mode 100644
index 8325e91..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFilePutOption.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-/**
- * This option allows to configure each configuration fille based on the karaf.home location. The value is "put". Which
- * means it is either replaced or added.
- * <p/>
- * If you like to extend an option (e.g. make a=b to a=b,c) please make use of the
- * {@link KarafDistributionConfigurationFileExtendOption}.
- */
-public class KarafDistributionConfigurationFilePutOption extends KarafDistributionConfigurationFileOption {
-
-    public KarafDistributionConfigurationFilePutOption(String configurationFilePath, String key, String value) {
-        super(configurationFilePath, key, value);
-    }
-
-    public KarafDistributionConfigurationFilePutOption(ConfigurationPointer pointer, String value) {
-        super(pointer, value);
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileReplacementOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileReplacementOption.java
deleted file mode 100644
index ef61b9f..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationFileReplacementOption.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import java.io.File;
-
-/**
- * If you do not want to replace (or extend) values in a file but rather simply want to replace a configuration file
- * "brute force" this option is the one of your choice. It simply removes the original file and replaces it with the one
- * configured here.
- */
-public class KarafDistributionConfigurationFileReplacementOption extends KarafDistributionConfigurationFileOption {
-
-    private File source;
-
-    public KarafDistributionConfigurationFileReplacementOption(String configurationFilePath, File source) {
-        super(configurationFilePath);
-        this.source = source;
-    }
-
-    public File getSource() {
-        return source;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationOption.java
deleted file mode 100644
index 3b3175b..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionConfigurationOption.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.options.MavenUrlReference;
-
-/**
- * Option describing the karaf distribution to use. Without this option no karaf based distribution can be used in exam
- * tests.
- */
-public class KarafDistributionConfigurationOption extends KarafDistributionBaseConfigurationOption {
-
-    public KarafDistributionConfigurationOption() {
-        super();
-    }
-
-    public KarafDistributionConfigurationOption(KarafDistributionBaseConfigurationOption base) {
-        super(base);
-    }
-
-    public KarafDistributionConfigurationOption(MavenUrlReference frameworkURLReference, String name,
-                                                String karafVersion) {
-        super(frameworkURLReference, name, karafVersion);
-    }
-
-    public KarafDistributionConfigurationOption(String frameworkURL, String name, String karafVersion) {
-        super(frameworkURL, name, karafVersion);
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionKitConfigurationOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionKitConfigurationOption.java
deleted file mode 100644
index f2304ee..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionKitConfigurationOption.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.options.MavenUrlReference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Option describing the karaf distribution to use; This option uses the specified scripts to run the environment
- * depending on the platform. If a platform is defined and run on another platform it is simply ignored.
- */
-public class KarafDistributionKitConfigurationOption extends KarafDistributionBaseConfigurationOption {
-
-    public enum Platform {
-        WINDOWS, NIX
-    }
-
-    private Platform platform;
-    private List<String> makeExec = new ArrayList<String>();
-    private String exec;
-
-    public KarafDistributionKitConfigurationOption(KarafDistributionBaseConfigurationOption base,
-                                                   Platform platform) {
-        super(base);
-        setPlatform(platform);
-    }
-
-    public KarafDistributionKitConfigurationOption(MavenUrlReference frameworkURLReference, String name,
-                                                   String karafVersion, Platform platform) {
-        super(frameworkURLReference, name, karafVersion);
-        setPlatform(platform);
-    }
-
-    public KarafDistributionKitConfigurationOption(MavenUrlReference frameworkURLReference, Platform platform) {
-        super(frameworkURLReference);
-        setPlatform(platform);
-    }
-
-    public KarafDistributionKitConfigurationOption(String frameworkURL, String name, String karafVersion,
-                                                   Platform platform) {
-        super(frameworkURL, name, karafVersion);
-        setPlatform(platform);
-    }
-
-    private void setPlatform(Platform platform) {
-        this.platform = platform;
-        if (platform.equals(Platform.WINDOWS)) {
-            exec = "bin\\karaf.bat";
-        } else {
-            exec = "bin/karaf";
-        }
-    }
-
-    public KarafDistributionKitConfigurationOption filesToMakeExecutable(String... platformRelativeFilePath) {
-        for (String platformRelativePath : platformRelativeFilePath) {
-            makeExec.add(platformRelativePath);
-        }
-        return this;
-    }
-
-    public KarafDistributionKitConfigurationOption executable(String platformRelativeFilePath) {
-        exec = platformRelativeFilePath;
-        return this;
-    }
-
-    public Platform getPlatform() {
-        return platform;
-    }
-
-    public List<String> getMakeExec() {
-        return makeExec;
-    }
-
-    public String getExec() {
-        return exec;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionOption.java
deleted file mode 100644
index 355f96c..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafDistributionOption.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import static java.lang.String.format;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
-import org.apache.karaf.tooling.exam.options.LogLevelOption.LogLevel;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.options.extra.VMOption;
-
-/**
- * Final class to provide an easy and intuitive way to configure the specific karaf distribution options.
- */
-public final class KarafDistributionOption {
-
-    /**
-     * Per default the folder pax-exam is deleting the test directories after a test is over. If you want to keep those
-     * directories (for later evaluation) simply set this option.
-     */
-    public static Option keepRuntimeFolder() {
-        return new KeepRuntimeFolderOption();
-    }
-
-    /**
-     * Provides an option to configure the internals of the PaxExamKaraf subsystem runner.
-     */
-    public static Option useOwnKarafExamSystemConfiguration(String invoker) {
-        return new KarafExamSystemConfigurationOption(invoker);
-    }
-
-    /**
-     * The karaf pax-logging configuration is typically not a file manipulated very often. Therefore we take the freedom
-     * of adding a console logger and changing the log level directly. IF you like to configure the file manually (or
-     * had so in your distribution) add this option to avoid any automatic modifications to this file!
-     */
-    public static Option doNotModifyLogConfiguration() {
-        return new DoNotModifyLogOption();
-    }
-
-    /**
-     * This option allows to configure the start level of the bundles in the exam features descriptor.
-     */
-    public static Option useOwnExamBundlesStartLevel(int startLevel) {
-        return new ExamBundlesStartLevel(startLevel);
-    }
-
-    /**
-     * Returns an option object which can be used to configure the -Dkaraf.startLocalConsole and
-     * -Dkaraf.startRemoteShell options. By default both are true.
-     */
-    public static KarafDistributionConfigurationConsoleOption configureConsole() {
-        return new KarafDistributionConfigurationConsoleOption(null, null);
-    }
-
-    /**
-     * Configures which distribution options to use. Relevant are the frameworkURL, the frameworkName and the Karaf
-     * version since all of those params are relevant to decide which wrapper configurations to use.
-     */
-    public static KarafDistributionBaseConfigurationOption karafDistributionConfiguration(String frameworkURL,
-                                                                                          String name,
-                                                                                          String karafVersion) {
-        return new KarafDistributionConfigurationOption(frameworkURL, name, karafVersion);
-    }
-
-    /**
-     * Configures which distribution options to use. Relevant are the frameworkURL, the frameworkName and the Karaf
-     * version since all of those params are relevant to decide which wrapper configurations to use.
-     */
-    public static KarafDistributionBaseConfigurationOption karafDistributionConfiguration() {
-        return new KarafDistributionConfigurationOption();
-    }
-
-    /**
-     * This option allows to configure each configuration fille based on the karaf.home location. The value is "put".
-     * Which means it is either replaced or added.
-     *
-     * If you like to extend an option (e.g. make a=b to a=b,c) please make use of the
-     * {@link KarafDistributionConfigurationFileExtendOption}.
-     */
-    public static Option editConfigurationFilePut(String configurationFilePath, String key, String value) {
-        return new KarafDistributionConfigurationFilePutOption(configurationFilePath, key, value);
-    }
-
-    /**
-     * This option allows to configure each configuration fille based on the karaf.home location. The value is "put".
-     * Which means it is either replaced or added.
-     *
-     * If you like to extend an option (e.g. make a=b to a=b,c) please make use of the
-     * {@link KarafDistributionConfigurationFileExtendOption}.
-     */
-    public static Option editConfigurationFilePut(ConfigurationPointer configurationPointer, String value) {
-        return new KarafDistributionConfigurationFilePutOption(configurationPointer, value);
-    }
-
-    /**
-     * This option allows to configure each configuration file based on the karaf.home location. The value is "put"
-     * which means it is either replaced or added. For simpler configuration you can add a file source. If you want to
-     * put all values from this file do not configure any keysToUseFromSource; otherwise define them to use only those
-     * specific values.
-     */
-    public static Option[] editConfigurationFilePut(final String configurationFilePath,
-                                                    File source, String... keysToUseFromSource) {
-        return createOptionListFromFile(source, new FileOptionFactory() {
-            @Override
-            public Option createOption(String key, String value) {
-                return new KarafDistributionConfigurationFilePutOption(configurationFilePath, key, value);
-            }
-        }, keysToUseFromSource);
-    }
-
-    private static interface FileOptionFactory {
-        Option createOption(String key, String value);
-    }
-
-    private static Option[] createOptionListFromFile(File source, FileOptionFactory optionFactory,
-                                                     String... keysToUseFromSource) {
-        Properties props = new Properties();
-        try {
-            props.load(new FileInputStream(source));
-        } catch (FileNotFoundException e) {
-            throw new IllegalStateException(e);
-        } catch (IOException e) {
-            throw new IllegalStateException(e);
-        }
-        List<Option> options =
-                new ArrayList<Option>();
-        if (keysToUseFromSource == null || keysToUseFromSource.length == 0) {
-            Set<Object> keySet = props.keySet();
-            for (Object key : keySet) {
-                Object value = props.get(key);
-                options.add(optionFactory.createOption((String) key, (String) value));
-            }
-        } else {
-            for (String key : keysToUseFromSource) {
-                Object value = props.get(key);
-                options.add(optionFactory.createOption(key, (String) value));
-            }
-        }
-        return options.toArray(new Option[]{});
-    }
-
-    /**
-     * This option allows to extend configurations in each configuration file based on the karaf.home location. The
-     * value extends the current value (e.g. a=b to a=a,b) instead of replacing it. If there is no current value it is
-     * added.
-     *
-     * If you would like to have add or replace functionality please use the
-     * {@link KarafDistributionConfigurationFilePutOption} instead.
-     */
-    public static Option editConfigurationFileExtend(String configurationFilePath, String key, String value) {
-        return new KarafDistributionConfigurationFileExtendOption(configurationFilePath, key, value);
-    }
-
-    /**
-     * This option allows to extend configurations in each configuration file based on the karaf.home location. The
-     * value extends the current value (e.g. a=b to a=a,b) instead of replacing it. If there is no current value it is
-     * added.
-     *
-     * If you would like to have add or replace functionality please use the
-     * {@link KarafDistributionConfigurationFilePutOption} instead.
-     */
-    public static Option editConfigurationFileExtend(ConfigurationPointer configurationPointer, String value) {
-        return new KarafDistributionConfigurationFileExtendOption(configurationPointer, value);
-    }
-
-    /**
-     * This option allows to configure each configuration file based on the karaf.home location. The value is "extend"
-     * which means it is either replaced or added. For simpler configuration you can add a file source. If you want to
-     * put all values from this file do not configure any keysToUseFromSource; otherwise define them to use only those
-     * specific values.
-     */
-    public static Option[] editConfigurationFileExtend(final String configurationFilePath, File source,
-                                                       String... keysToUseFromSource) {
-        return createOptionListFromFile(source, new FileOptionFactory() {
-            @Override
-            public Option createOption(String key, String value) {
-                return new KarafDistributionConfigurationFileExtendOption(configurationFilePath, key, value);
-            }
-        }, keysToUseFromSource);
-    }
-
-    /**
-     * This option allows to simply replace an entire configuration file with your own one. Simply point to the
-     * configuration file you would like to have replaced and add the source file which should replace it.
-     */
-    public static Option replaceConfigurationFile(String configurationFilePath, File source) {
-        return new KarafDistributionConfigurationFileReplacementOption(configurationFilePath, source);
-    }
-
-    /**
-     * Activates debugging on the embedded Karaf container using the standard 5005 port and holds the vm till you've
-     * attached the debugger.
-     */
-    public static Option debugConfiguration() {
-        return debugConfiguration("5005", true);
-    }
-
-    /**
-     * A very simple and convinient method to set a specific log level without the need of configure the specific option
-     * itself.
-     */
-    public static Option logLevel(LogLevel logLevel) {
-        return new LogLevelOption(logLevel);
-    }
-
-    /**
-     * A very simple and convinient method to set a specific log level without the need of configure the specific option
-     * itself.
-     */
-    public static LogLevelOption logLevel() {
-        return new LogLevelOption();
-    }
-
-    /**
-     * Returns an easy option to activate and configure remote debugging for the Karaf container.
-     */
-    public static Option debugConfiguration(String port, boolean hold) {
-        return new VMOption(format("-Xrunjdwp:transport=dt_socket,server=y,suspend=%s,address=%s", hold ? "y" : "n",
-                port));
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafExamSystemConfigurationOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafExamSystemConfigurationOption.java
deleted file mode 100644
index 70cfee4..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KarafExamSystemConfigurationOption.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * Option to configure the internal invoker for integration tests to be used.
- */
-public class KarafExamSystemConfigurationOption implements Option {
-
-    private String invoker;
-
-    /**
-     * define the pax.exam.invoker property as system property in the environment during creating the subproject.
-     */
-    public KarafExamSystemConfigurationOption(String invoker) {
-        this.invoker = invoker;
-    }
-
-    public String getInvoker() {
-        return invoker;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KeepRuntimeFolderOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KeepRuntimeFolderOption.java
deleted file mode 100644
index 70c5dd6..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/KeepRuntimeFolderOption.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * Per default the folder pax-exam is deleting the test directories after a test is over. If you want to keep those
- * directories (for later evaluation) simply set this option.
- */
-public class KeepRuntimeFolderOption implements Option {
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/LogLevelOption.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/LogLevelOption.java
deleted file mode 100644
index 3196e2a..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/LogLevelOption.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options;
-
-import org.ops4j.pax.exam.Option;
-
-/**
- * While the log-level could also be configured using the config options in the configuration files we also provide a
- * more easy option here.
- */
-public class LogLevelOption implements Option {
-
-    public static enum LogLevel {
-        TRACE, DEBUG, INFO, WARN, ERROR
-    }
-
-    private LogLevel logLevel;
-
-    public LogLevelOption() {
-    }
-
-    public LogLevelOption(LogLevel logLevel) {
-        this.logLevel = logLevel;
-    }
-
-    public LogLevelOption logLevel(LogLevel logLevel) {
-        this.logLevel = logLevel;
-        return this;
-    }
-
-    public LogLevel getLogLevel() {
-        return logLevel;
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/CustomProperties.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/CustomProperties.java
deleted file mode 100644
index 0ff49f1..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/CustomProperties.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/custom.properties.
- */
-public interface CustomProperties {
-
-    static final String FILE_PATH = "etc/config.properties";
-
-    /**
-     * Possible values here are felix or equinox
-     */
-    static final ConfigurationPointer KARAF_FRAMEWORK = new CustomPropertiesPointer("karaf.framework");
-
-    static final ConfigurationPointer SYSTEM_PACKAGES_EXTRA = new CustomPropertiesPointer(
-            "org.osgi.framework.system.packages.extra");
-
-    static final ConfigurationPointer BOOTDELEGATION = new CustomPropertiesPointer("org.osgi.framework.bootdelegation");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/FeaturesCfg.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/FeaturesCfg.java
deleted file mode 100644
index de40aa5..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/FeaturesCfg.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/org.apache.karaf.features.cfg.
- */
-public interface FeaturesCfg {
-
-    static final String FILE_PATH = "etc/org.apache.karaf.features.cfg";
-
-    static final ConfigurationPointer REPOSITORIES = new CustomPropertiesPointer("featuresRepositories");
-    static final ConfigurationPointer BOOT = new CustomPropertiesPointer("featuresBoot");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/JreProperties.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/JreProperties.java
deleted file mode 100644
index 4c01be4..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/JreProperties.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/jre.properties.
- */
-public interface JreProperties {
-
-    static final String FILE_PATH = "etc/jre.properties";
-
-    static final ConfigurationPointer JRE15 = new CustomPropertiesPointer("jre-1.5");
-    static final ConfigurationPointer JRE16 = new CustomPropertiesPointer("jre-1.6");
-    static final ConfigurationPointer JRE17 = new CustomPropertiesPointer("jre-1.7");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/LoggingCfg.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/LoggingCfg.java
deleted file mode 100644
index 87efe67..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/LoggingCfg.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/org.ops4j.pax.logging.cfg.
- */
-public interface LoggingCfg {
-
-    static final String FILE_PATH = "etc/org.ops4j.pax.logging.cfg";
-
-    static final ConfigurationPointer ROOT_LOGGER = new CustomPropertiesPointer("log4j.rootLogger");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/ManagementCfg.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/ManagementCfg.java
deleted file mode 100644
index 4ceabc1..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/ManagementCfg.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/org.apache.karaf.management.cfg.
- */
-public interface ManagementCfg {
-
-    static final String FILE_PATH = "etc/org.apache.karaf.management.cfg";
-
-    /**
-     * Port of the registry for the exported RMI service
-     */
-    static final ConfigurationPointer RMI_REGISTRY_PORT = new CustomPropertiesPointer("rmiRegistryPort");
-
-    /**
-     * Port of the registry for the exported RMI service
-     */
-    static final ConfigurationPointer RMI_SERVER_PORT = new CustomPropertiesPointer("rmiServerPort");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/SystemProperties.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/SystemProperties.java
deleted file mode 100644
index 9a910e5..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/SystemProperties.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/system.properties..
- */
-public interface SystemProperties {
-
-    static final String FILE_PATH = "etc/system.properties";
-
-    static final ConfigurationPointer KARAF_NAME = new CustomPropertiesPointer("karaf.name");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/UsersProperties.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/UsersProperties.java
deleted file mode 100644
index 8e2527c..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/UsersProperties.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/users.properties.
- */
-public interface UsersProperties {
-
-    static final String FILE_PATH = "etc/users.properties";
-
-    static final ConfigurationPointer KARAF_USER = new CustomPropertiesPointer("karaf");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/WebCfg.java b/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/WebCfg.java
deleted file mode 100644
index f992722..0000000
--- a/karaf-2.3.x/tooling/exam/options/src/main/java/org/apache/karaf/tooling/exam/options/configs/WebCfg.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.exam.options.configs;
-
-import org.apache.karaf.tooling.exam.options.ConfigurationPointer;
-
-/**
- * Pre configured property file pointers to the most commonly used properties in /etc/config.properties and
- * /etc/org.ops4j.pax.web.cfg.
- */
-public interface WebCfg {
-
-    static final String FILE_PATH = "etc/org.ops4j.pax.web.cfg";
-
-    static final ConfigurationPointer HTTP_PORT = new CustomPropertiesPointer("org.osgi.service.http.port");
-
-    static class CustomPropertiesPointer extends ConfigurationPointer {
-
-        public CustomPropertiesPointer(String key) {
-            super(FILE_PATH, key);
-        }
-
-    }
-
-}
diff --git a/karaf-2.3.x/tooling/exam/pom.xml b/karaf-2.3.x/tooling/exam/pom.xml
deleted file mode 100644
index b9c8ce6..0000000
--- a/karaf-2.3.x/tooling/exam/pom.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?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.3.1</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.apache.karaf.tooling.exam</groupId>
-    <artifactId>exam</artifactId>
-    <packaging>pom</packaging>
-    <name>Apache Karaf :: Tooling :: Exam Testing Framework</name>
-
-    <properties>
-        <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
-    </properties>
-
-    <modules>
-        <module>options</module>
-        <module>container</module>
-    </modules>
-
-</project>
\ No newline at end of file
diff --git a/karaf-2.3.x/tooling/features-maven-plugin/NOTICE b/karaf-2.3.x/tooling/features-maven-plugin/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/tooling/features-maven-plugin/pom.xml b/karaf-2.3.x/tooling/features-maven-plugin/pom.xml
deleted file mode 100644
index a27664a..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/pom.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?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.3.1</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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
deleted file mode 100644
index eb67a07..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojo.java
+++ /dev/null
@@ -1,516 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-
-/**
- * Add Features necessary bundles into system folder Repo
- *
- * @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 expression="${project.build.directory}/features-repo"
-     */
-    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().trim());
-                }
-            } 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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/BlueprintURLHandler.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/BlueprintURLHandler.java
deleted file mode 100644
index aa8ab1b..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/BlueprintURLHandler.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CopyFileBasedDescriptor.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CopyFileBasedDescriptor.java
deleted file mode 100644
index 857adfd..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CopyFileBasedDescriptor.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CreateKarMojo.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CreateKarMojo.java
deleted file mode 100644
index 59488ca..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CreateKarMojo.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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
-        projectHelper.attachArtifact(project, "kar", null, archive);
-    }
-
-    /**
-     * 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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CustomBundleURLStreamHandlerFactory.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CustomBundleURLStreamHandlerFactory.java
deleted file mode 100644
index b06c08b..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/CustomBundleURLStreamHandlerFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/FeatureURLHandler.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/FeatureURLHandler.java
deleted file mode 100644
index 33e8d08..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/FeatureURLHandler.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojo.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojo.java
deleted file mode 100644
index a82f1d0..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojo.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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
- *
- * @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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java
deleted file mode 100644
index 1891884..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojo.java
+++ /dev/null
@@ -1,617 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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
- *
- * @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;
-
-    /**
-     * Installation mode. If present, generate "feature.install" attribute:
-     *
-     * <a href="http://karaf.apache.org/xmlns/features/v1.1.0">Installation mode</a>
-     *
-     * 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 feature:install command or as part of the etc/org.apache.karaf.features.cfg file.
-     *
-     * @parameter
-     */
-    protected String installMode;
-
-    /**
-     * 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());
-    }
-
-    /*package*/ class Feature {
-
-        private Stack<Artifact> artifacts = new Stack<Artifact>();
-        private final Artifact artifact;
-        
-        /*package*/ 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;
-        }
-        
-        private String writeAttr(String name, String value){
-        	return " " + name + "=" + "'" + value + "'" + " ";
-        }
-
-        public void write(PrintStream out) {
-        	
-            out.print(
-				" <feature " +
-				writeAttr("name", artifact.getArtifactId()) + 
-				writeAttr("version", artifact.getBaseVersion()) +
-				" "
-				);
-
-            if(installMode != null){
-                out.print(writeAttr("install", installMode));
-            }
-            
-            out.println(" > ");
-            
-            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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GraphArtifactCollector.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GraphArtifactCollector.java
deleted file mode 100644
index d7f256f..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/GraphArtifactCollector.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-
-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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
deleted file mode 100644
index c9062e8..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.tooling.features;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.lang.Exception;
-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
- *
- * @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/system"
-     * @required
-     */
-    protected String systemRepoDirectory;
-
-    public void execute() throws MojoExecutionException, MojoFailureException {
-        KarArtifactInstaller installer = new KarArtifactInstaller();
-        installer.setBasePath(workDirectory);
-        installer.setLocalRepoPath(systemRepoDirectory);
-        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 addRepository(URI url, boolean install) throws Exception {
-            addRepository(url);
-        }
-
-        public void removeRepository(URI url) {
-        }
-
-        public void removeRepository(URI url, boolean uninstall) {
-        }
-
-        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, EnumSet<Option> options) 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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ManifestUtils.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ManifestUtils.java
deleted file mode 100644
index ef265a9..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ManifestUtils.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MojoSupport.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MojoSupport.java
deleted file mode 100644
index 1726f2a..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/MojoSupport.java
+++ /dev/null
@@ -1,447 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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;
-
-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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/Node.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/Node.java
deleted file mode 100644
index 86e296b..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/Node.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.features;
-
-import java.util.Set;
-import java.util.HashSet;
-
-import org.apache.maven.artifact.Artifact;
-
-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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ResolutionListenerImpl.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ResolutionListenerImpl.java
deleted file mode 100644
index 3e61254..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ResolutionListenerImpl.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/SpringURLHandler.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/SpringURLHandler.java
deleted file mode 100644
index 1597680..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/SpringURLHandler.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ValidateFeaturesMojo.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ValidateFeaturesMojo.java
deleted file mode 100644
index 8c43826..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/ValidateFeaturesMojo.java
+++ /dev/null
@@ -1,676 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.features;
-
-import org.apache.felix.utils.manifest.Clause;
-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.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;
-
-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 static org.apache.karaf.tooling.features.ManifestUtils.*;
-
-/**
- * Validates a features XML file
- *
- * @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()) {
-            info("    scanning feature %s for exports", feature.getName());
-            Set<Clause> exports = new HashSet<Clause>();
-            for (String bundle : getBundleLocations(feature)) {
-                exports.addAll(getExports(getManifest(bundle, bundles.get(bundle))));
-            }
-            // add the dependency feature exports
-            exports.addAll(getDependencyFeatureExports(feature));
-            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);
-            }
-        }
-    }
-
-    private Set<Clause> getDependencyFeatureExports(Feature feature) throws Exception {
-        Set<Clause> exports = new HashSet<Clause>();
-
-        for (Feature dependency : feature.getDependencies()) {
-            if (featureExports.containsKey(dependency.getName())) {
-                exports.addAll(featureExports.get(dependency.getName()));
-            } else {
-                validateImportsExports(dependency);
-                exports.addAll(featureExports.get(dependency.getName()));
-            }
-            exports.addAll(getDependencyFeatureExports(dependency));
-        }
-
-        // add the export of the feature
-        for (String bundle : getBundleLocations(feature)) {
-            Manifest meta = manifests.get(bundles.get(bundle));
-            exports.addAll(getExports(meta));
-        }
-        return exports;
-    }
-
-    /*
-     * 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())) {
-                validateImportsExports(features.get(dependency.getName(), dependency.getVersion()));
-            }
-        }
-        // add the exports for dependency feature
-        exports.addAll(getDependencyFeatureExports(feature));
-
-        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.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/WarURLHandler.java b/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/WarURLHandler.java
deleted file mode 100644
index 867634c..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/WarURLHandler.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/main/resources/config.properties b/karaf-2.3.x/tooling/features-maven-plugin/src/main/resources/config.properties
deleted file mode 100644
index 870e83c..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/resources/config.properties
+++ /dev/null
@@ -1,144 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-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.3.x/tooling/features-maven-plugin/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0-ordered.xsd b/karaf-2.3.x/tooling/features-maven-plugin/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0-ordered.xsd
deleted file mode 100644
index 4ced416..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/main/resources/org/apache/karaf/features/karaf-features-1.0.0-ordered.xsd
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements. See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License. You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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: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[
-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: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.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojoTest.java b/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojoTest.java
deleted file mode 100644
index 3734a88..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/AddFeaturesToRepoMojoTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.apache.karaf.tooling.features;
-
-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;
-
-import java.lang.reflect.Field;
-import java.net.URL;
-import java.util.HashMap;
-
-public class AddFeaturesToRepoMojoTest extends MojoSupport {
-
-    public AddFeaturesToRepoMojoTest() 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 {
-        URL in = getClass().getClassLoader().getResource("input-repository.xml");
-        AddFeaturesToRepoMojo.Repository repo = new AddFeaturesToRepoMojo.Repository(in.toURI());
-
-        String[] repos = repo.getDefinedRepositories();
-
-        assert repos.length == 1;
-        assert repos[0].equals("http://foo.org");
-    }
-}
diff --git a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/BundleToArtifactTest.java b/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/BundleToArtifactTest.java
deleted file mode 100644
index 1b5530c..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/BundleToArtifactTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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;
-
-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.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojoTest.java b/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojoTest.java
deleted file mode 100644
index bed0b2d..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesFileMojoTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java b/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java
deleted file mode 100644
index 21846d5..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/GenerateFeaturesXmlMojoTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.tooling.features;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-import java.io.StringWriter;
-
-import org.apache.karaf.tooling.features.GenerateFeaturesXmlMojo.Feature;
-import org.apache.maven.artifact.Artifact;
-import org.codehaus.plexus.util.FileUtils;
-import org.easymock.EasyMock;
-
-import static org.easymock.EasyMock.*;
-
-import junit.framework.TestCase;
-
-/**
- * Test cases for {@link GenerateFeaturesXmlMojo}
- */
-public class GenerateFeaturesXmlMojoTest extends TestCase {
-    
-    private GenerateFeaturesXmlMojo mojo;
-    
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mojo = new GenerateFeaturesXmlMojo();
-    }
-
-    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));
-    } 
-
-    public void testInstallMode() throws Exception {
-    	
-        Artifact artifact = EasyMock.createMock(Artifact.class);
-
-        expect(artifact.getGroupId()).andReturn("org.apache.karaf.test").anyTimes();
-        expect(artifact.getArtifactId()).andReturn("test-artifact").anyTimes();
-        expect(artifact.getBaseVersion()).andReturn("1.2.3").anyTimes();
-        expect(artifact.getVersion()).andReturn("1.2.3").anyTimes();
-        expect(artifact.getType()).andReturn("jar").anyTimes();
-        
-        replay(artifact);
-        
-        mojo.installMode="auto";
-        
-        Feature feature = mojo.new Feature(artifact);
-        
-        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
-        
-        PrintStream out = new PrintStream(byteStream);
-        
-		feature.write(out);
-		
-		String source = byteStream.toString("UTF-8");
-		
-		System.out.println(source);
-		
-		String target = FileUtils.fileRead("./src/test/resources/features-01.xml", "UTF-8");
-		
-		assertTrue(target.contains(source));
-        
-    } 
-
-}
diff --git a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/ManifestUtilsTest.java b/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/ManifestUtilsTest.java
deleted file mode 100644
index f380995..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/java/org/apache/karaf/tooling/features/ManifestUtilsTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/tooling/features-maven-plugin/src/test/resources/features-01.xml b/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/features-01.xml
deleted file mode 100644
index 2f9ea50..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/features-01.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT 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 xmlns="http://karaf.apache.org/xmlns/features/v1.0.0" name="test-repo">
-
- <feature  name='test-artifact'  version='1.2.3'   install='auto'  > 
-    <bundle>mvn:org.apache.karaf.test/test-artifact/1.2.3</bundle>
- </feature>
- 
-</features>
diff --git a/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/input-features.xml b/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/input-features.xml
deleted file mode 100644
index 17854c0..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/input-features.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT 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 xmlns="http://karaf.apache.org/xmlns/features/v1.0.0" name="geronimo-transaction">
-    <repository>http://foo.org</repository>
-
-</features>
diff --git a/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/input-repository.xml b/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/input-repository.xml
deleted file mode 100644
index fa5d4b4..0000000
--- a/karaf-2.3.x/tooling/features-maven-plugin/src/test/resources/input-repository.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT 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 xmlns="http://karaf.apache.org/xmlns/features/v1.0.0" name="geronimo-transaction">
-    <repository>
-        http://foo.org
-    </repository>
-</features>
diff --git a/karaf-2.3.x/tooling/pom.xml b/karaf-2.3.x/tooling/pom.xml
deleted file mode 100644
index 4af6ff1..0000000
--- a/karaf-2.3.x/tooling/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.3.1</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>exam</module>
-    </modules>
-
-</project>
diff --git a/karaf-2.3.x/util/NOTICE b/karaf-2.3.x/util/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/util/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/util/pom.xml b/karaf-2.3.x/util/pom.xml
deleted file mode 100644
index 177b30e..0000000
--- a/karaf-2.3.x/util/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?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.3.1</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>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/DeployerUtils.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/DeployerUtils.java
deleted file mode 100644
index b0870a0..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/DeployerUtils.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/util/src/main/java/org/apache/karaf/util/InterpolationHelper.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/InterpolationHelper.java
deleted file mode 100644
index 6fb64b9..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/InterpolationHelper.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.osgi.framework.BundleContext;
-
-/**
- * Enhancement of the standard <code>Properties</code>
- * managing the maintain of comments, etc.
- */
-public class InterpolationHelper {
-
-    private InterpolationHelper() {
-    }
-
-    private static final char ESCAPE_CHAR = '\\';
-    private static final String DELIM_START = "${";
-    private static final String DELIM_STOP = "}";
-
-
-    /**
-     * Callback for substitution
-     */
-    public interface SubstitutionCallback {
-
-        public String getValue(String key);
-
-    }
-
-    /**
-     * Perform substitution on a property set
-     *
-     * @param properties the property set to perform substitution on
-     */
-    public static void performSubstitution(Map<String, String> properties) {
-        performSubstitution(properties, (BundleContext) null);
-    }
-
-    /**
-     * Perform substitution on a property set
-     *
-     * @param properties the property set to perform substitution on
-     */
-    public static void performSubstitution(Map<String, String> properties, final BundleContext context) {
-        performSubstitution(properties, new SubstitutionCallback() {
-            public String getValue(String key) {
-                String value = null;
-                if (context != null) {
-                    value = context.getProperty(key);
-                }
-                if (value == null) {
-                    value = System.getProperty(value, "");
-                }
-                return value;
-            }
-        });
-    }
-
-    /**
-     * Perform substitution on a property set
-     *
-     * @param properties the property set to perform substitution on
-     */
-    public static void performSubstitution(Map<String, String> properties, SubstitutionCallback callback) {
-        for (String name : properties.keySet()) {
-            String value = properties.get(name);
-            properties.put(name, substVars(value, name, null, properties, callback));
-        }
-    }
-
-
-    /**
-     * <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.
-     * @param callback    the callback to obtain substitution values
-     * @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,
-                                   SubstitutionCallback callback)
-            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) {
-            if (variable.length() <= 0) {
-                substValue = "";
-            } else {
-                if (callback != null) {
-                    substValue = callback.getValue(variable);
-                }
-                if (substValue == null) {
-                    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, callback);
-
-        // 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;
-    }
-
-}
diff --git a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/MvnUtils.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/MvnUtils.java
deleted file mode 100644
index 85610dd..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/MvnUtils.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.karaf.util;
-
-import java.net.URL;
-
-public class MvnUtils {
-
-    private MvnUtils() { }
-
-
-    /**
-     * Compute the path of url, expanding it if the url uses the mvn protocol.
-     *
-     * @param url the url
-     * @return the path
-     */
-    public static String getMvnPath(URL url) {
-        if (url.getProtocol().equals("mvn")) {
-            String[] parts = url.toExternalForm().substring(4).split("/");
-            String groupId;
-            String artifactId;
-            String version;
-            String type;
-            String qualifier;
-            if (parts.length < 3 || parts.length > 5) {
-                return url.getPath();
-            }
-            groupId = parts[0];
-            artifactId = parts[1];
-            version = parts[2];
-            type = (parts.length >= 4) ?  "." + parts[3] : ".jar";
-            qualifier = (parts.length >= 5) ? "-" + parts[4] :  "";
-            return groupId.replace('.', '/') + "/" + artifactId + "/"
-                    + version + "/" + artifactId + "-" + version + qualifier + type;
-        }
-        return url.getPath();
-    }
-}
diff --git a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/StringEscapeUtils.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/StringEscapeUtils.java
deleted file mode 100644
index ac0c984..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/StringEscapeUtils.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/util/src/main/java/org/apache/karaf/util/collections/CopyOnWriteArrayIdentityList.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/collections/CopyOnWriteArrayIdentityList.java
deleted file mode 100644
index 9b34352..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/collections/CopyOnWriteArrayIdentityList.java
+++ /dev/null
@@ -1,1170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.karaf.util.collections;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.NoSuchElementException;
-import java.util.RandomAccess;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * Implements a {@link java.util.ArrayList} variant that is thread-safe. All
- * write operation result in a new copy of the underlying data being created.
- * Iterators reflect the state of the CopyOnWriteArrayIdentityList at the time they were
- * created. They are not updated to reflect subsequent changes to the list. In
- * addition, these iterators cannot be used for modifying the underlying
- * CopyOnWriteArrayIdentityList.
- *
- * In addition, elements are compared based on reference equality instead of
- * object equality when comparing values.
- *
- * @param <E> the element type
- */
-public class CopyOnWriteArrayIdentityList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
-
-    private static final long serialVersionUID = 8673264195747942595L;
-
-    private transient volatile E[] arr;
-
-    /**
-     * Lock for the queue write methods
-     */
-    private final transient ReentrantLock lock = new ReentrantLock();
-
-    /**
-     * Creates a new, empty instance of CopyOnWriteArrayList.
-     */
-    public CopyOnWriteArrayIdentityList() {
-    }
-
-    /**
-     * Creates a new instance of CopyOnWriteArrayList and fills it with the
-     * contents of a given Collection.
-     *
-     * @param c     the collection the elements of which are to be copied into
-     *              the new instance.
-     */
-    public CopyOnWriteArrayIdentityList(Collection<? extends E> c) {
-        this((E[]) c.toArray());
-    }
-
-    /**
-     * Creates a new instance of CopyOnWriteArrayList and fills it with the
-     * contents of a given array.
-     *
-     * @param array the array the elements of which are to be copied into the
-     *              new instance.
-     */
-    public CopyOnWriteArrayIdentityList(E[] array) {
-        int size = array.length;
-        E[] data = newElementArray(size);
-        for (int i = 0; i < size; i++) {
-            data[i] = array[i];
-        }
-        arr = data;
-    }
-
-    public boolean add(E e) {
-        lock.lock();
-        try {
-            E[] data;
-            E[] old = getData();
-            int size = old.length;
-            data = newElementArray(size + 1);
-            System.arraycopy(old, 0, data, 0, size);
-            data[size] = e;
-            setData(data);
-            return true;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public void add(int index, E e) {
-        lock.lock();
-        try {
-            E[] data;
-            E[] old = getData();
-            int size = old.length;
-            checkIndexInclusive(index, size);
-            data = newElementArray(size+1);
-            System.arraycopy(old, 0, data, 0, index);
-            data[index] = e;
-            if (size > index) {
-                System.arraycopy(old, index, data, index + 1, size - index);
-            }
-            setData(data);
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public boolean addAll(Collection<? extends E> c) {
-        Iterator it = c.iterator();
-        int ssize = c.size();
-        lock.lock();
-        try {
-            int size = size();
-            E[] data;
-            E[] old = getData();
-            int nSize = size + ssize;
-            data = newElementArray(nSize);
-            System.arraycopy(old, 0, data, 0, size);
-            while (it.hasNext()) {
-                data[size++] = (E) it.next();
-            }
-            setData(data);
-        } finally {
-            lock.unlock();
-        }
-        return true;
-    }
-
-    public boolean addAll(int index, Collection<? extends E> c) {
-        Iterator it = c.iterator();
-        int ssize = c.size();
-        lock.lock();
-        try {
-            int size = size();
-            checkIndexInclusive(index, size);
-            E[] data;
-            E[] old = getData();
-            int nSize = size + ssize;
-            data = newElementArray(nSize);
-            System.arraycopy(old, 0, data, 0, index);
-            int i = index;
-            while (it.hasNext()) {
-                data[i++] = (E) it.next();
-            }
-            if (size > index) {
-                System.arraycopy(old, index, data, index + ssize, size - index);
-            }
-            setData(data);
-        } finally {
-            lock.unlock();
-        }
-        return true;
-    }
-
-    /**
-     * Adds to this CopyOnWriteArrayList all those elements from a given
-     * collection that are not yet part of the list.
-     *
-     * @param c     the collection from which the potential new elements are
-     *              taken.
-     *
-     * @return the number of elements actually added to this list.
-     */
-    public int addAllAbsent(Collection<? extends E> c) {
-        if (c.size() == 0) {
-            return 0;
-        }
-        lock.lock();
-        try {
-            E[] old = getData();
-            int size = old.length;
-            E[] toAdd = newElementArray(c.size());
-            int i = 0;
-            for (Iterator it = c.iterator(); it.hasNext();) {
-                E o = (E) it.next();
-                if (indexOf(o) < 0) {
-                    toAdd[i++] = o;
-                }
-            }
-            E[] data = newElementArray(size + i);
-            System.arraycopy(old, 0, data, 0, size);
-            System.arraycopy(toAdd, 0, data, size, i);
-            setData(data);
-            return i;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    /**
-     * Adds to this CopyOnWriteArrayList another element, given that this
-     * element is not yet part of the list.
-     *
-     * @param e     the potential new element.
-     *
-     * @return true if the element was added, or false otherwise.
-     */
-    public boolean addIfAbsent(E e) {
-        lock.lock();
-        try {
-            E[] data;
-            E[] old = getData();
-            int size = old.length;
-            if (size != 0) {
-                if (indexOf(e) >= 0) {
-                    return false;
-                }
-            }
-            data = newElementArray(size + 1);
-            System.arraycopy(old, 0, data, 0, size);
-            data[size] = e;
-            setData(data);
-            return true;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public void clear() {
-        lock.lock();
-        try {
-            setData(newElementArray(0));
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    @Override
-    public Object clone() {
-        try {
-            CopyOnWriteArrayIdentityList thisClone = (CopyOnWriteArrayIdentityList) super.clone();
-            thisClone.setData(this.getData());
-            return thisClone;
-        } catch (CloneNotSupportedException e) {
-            throw new RuntimeException("CloneNotSupportedException is not expected here");
-        }
-    }
-
-    public boolean contains(Object o) {
-        return indexOf(o) >= 0;
-    }
-
-    public boolean containsAll(Collection<?> c) {
-        E[] data = getData();
-        return containsAll(c, data, 0, data.length);
-    }
-
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (!(o instanceof List)) {
-            return false;
-        }
-        List l = (List) o;
-        Iterator it = l.listIterator();
-        Iterator ourIt = listIterator();
-        while (it.hasNext()) {
-            if (!ourIt.hasNext()) {
-                return false;
-            }
-            Object thisListElem = it.next();
-            Object anotherListElem = ourIt.next();
-            if (thisListElem != anotherListElem) {
-                return false;
-            }
-        }
-        if (ourIt.hasNext()) {
-            return false;
-        }
-        return true;
-    }
-
-    public E get(int index) {
-        E[] data = getData();
-        return data[index];
-    }
-
-    public int hashCode() {
-        int hashCode = 1;
-        Iterator it = listIterator();
-        while (it.hasNext()) {
-            Object obj = it.next();
-            hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode());
-        }
-        return hashCode;
-    }
-
-    /**
-     * Returns the index of a given element, starting the search from a given
-     * position in the list.
-     *
-     * @param e     the element to search.
-     * @param index the index at which to start the search.
-     *
-     * @return the index of the element or null, if the element has not been
-     * found at or beyond the given start index.
-     */
-    public int indexOf(E e, int index) {
-        E[] data = getData();
-        return indexOf(e, data, index, data.length - index);
-    }
-
-    public int indexOf(Object o) {
-        E[] data = getData();
-        return indexOf(o, data, 0, data.length);
-    }
-
-    public boolean isEmpty() {
-        return size() == 0;
-    }
-
-    public Iterator<E> iterator() {
-        return new ListIteratorImpl(getData(), 0);
-    }
-
-    /**
-     * Returns the last index of a given element, starting the search from
-     * a given position in the list and going backwards.
-     *
-     * @param e     the element to search.
-     * @param index the index at which to start the search.
-     *
-     * @return the index of the element or null, if the element has not been
-     * found at or before the given start index.
-     */
-    public int lastIndexOf(E e, int index) {
-        E[] data = getData();
-        return lastIndexOf(e, data, 0, index);
-    }
-
-    public int lastIndexOf(Object o) {
-        E[] data = getData();
-        return lastIndexOf(o, data, 0, data.length);
-    }
-
-    public ListIterator<E> listIterator() {
-        return new ListIteratorImpl(getData(), 0);
-    }
-
-    public ListIterator<E> listIterator(int index) {
-        E[] data = getData();
-        checkIndexInclusive(index, data.length);
-        return new ListIteratorImpl(data, index);
-    }
-
-    public E remove(int index) {
-        return removeRange(index, 1);
-    }
-
-    public boolean remove(Object o) {
-        lock.lock();
-        try {
-            int index = indexOf(o);
-            if (index == -1) {
-                return false;
-            }
-            remove(index);
-            return true;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public boolean removeAll(Collection<?> c) {
-        lock.lock();
-        try {
-            return removeAll(c, 0, getData().length) != 0;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public boolean retainAll(Collection<?> c) {
-        if (c == null) {
-            throw new NullPointerException();
-        }
-        lock.lock();
-        try {
-            return retainAll(c, 0, getData().length) != 0;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public E set(int index, E e) {
-        lock.lock();
-        try {
-            int size = size();
-            checkIndexExlusive(index, size);
-            E[] data;
-            data = newElementArray(size);
-            E[] oldArr = getData();
-            System.arraycopy(oldArr, 0, data, 0, size);
-            E old = data[index];
-            data[index] = e;
-            setData(data);
-            return old;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    public int size() {
-        return getData().length;
-    }
-
-    public List<E> subList(int fromIndex, int toIndex) {
-        return new SubList(this, fromIndex, toIndex);
-    }
-
-    public Object[] toArray() {
-        E[] data = getData();
-        return toArray(data, 0, data.length);
-    }
-
-    public <T> T[] toArray(T[] a) {
-        E[] data = getData();
-        return (T[]) toArray(a, data, 0, data.length);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("[");
-
-        Iterator it = listIterator();
-        while (it.hasNext()) {
-            sb.append(String.valueOf(it.next()));
-            sb.append(", ");
-        }
-        if (sb.length() > 1) {
-            sb.setLength(sb.length() - 2);
-        }
-        sb.append("]");
-        return sb.toString();
-    }
-
-    // private and package private methods
-
-    @SuppressWarnings("unchecked")
-    private final E[] newElementArray(int size) {
-        return (E[])new Object[size];
-    }
-
-    /**
-     * sets the internal data array
-     *
-     * @param data array to set
-     */
-    private final void setData(E[] data) {
-        arr = data;
-    }
-
-    /**
-     * gets the internal data array (or a new array if it is null)
-     *
-     * @return the data array
-     */
-    final E[] getData() {
-        if (arr == null) {
-            return newElementArray(0);
-        }
-        return arr;
-    }
-
-    /**
-     * Removes from the specified range of this list
-     * all the elements that are contained in the specified collection
-     * <p/>
-     * !should be called under lock
-     *
-     * @return Returns the number of removed elements
-     */
-    final int removeAll(Collection c, int start, int size) {
-        int ssize = c.size();
-        if (ssize == 0) {
-            return 0;
-        }
-        Object[] old = getData();
-        int arrsize = old.length;
-        if (arrsize == 0) {
-            return 0;
-        }
-        Object[] data = new Object[size];
-        int j = 0;
-        for (int i = start; i < (start + size); i++) {
-            if (!c.contains(old[i])) {
-                data[j++] = old[i];
-            }
-        }
-        if (j != size) {
-            E[] result = newElementArray(arrsize - (size - j));
-            System.arraycopy(old, 0, result, 0, start);
-            System.arraycopy(data, 0, result, start, j);
-            System.arraycopy(old, start + size, result, start + j, arrsize
-                    - (start + size));
-            setData(result);
-            return (size - j);
-        }
-        return 0;
-    }
-
-    /**
-     * Retains only the elements in the specified range of this list
-     * that are contained in the specified collection
-     *
-     * @return Returns the number of removed elements
-     */
-    // should be called under lock
-    int retainAll(Collection c, int start, int size) {
-        Object[] old = getData();
-        if (size == 0) {
-            return 0;
-        }
-        if (c.size() == 0) {
-            E[] data;
-            if (size == old.length) {
-                data = newElementArray(0);
-            } else {
-                data = newElementArray(old.length - size);
-                System.arraycopy(old, 0, data, 0, start);
-                System.arraycopy(old, start + size, data, start, old.length
-                        - start - size);
-            }
-            setData(data);
-            return size;
-        }
-        Object[] temp = new Object[size];
-        int pos = 0;
-        for (int i = start; i < (start + size); i++) {
-            if (c.contains(old[i])) {
-                temp[pos++] = old[i];
-            }
-        }
-        if (pos == size) {
-            return 0;
-        }
-        E[] data = newElementArray(pos + old.length - size);
-        System.arraycopy(old, 0, data, 0, start);
-        System.arraycopy(temp, 0, data, start, pos);
-        System.arraycopy(old, start + size, data, start + pos, old.length
-                - start - size);
-        setData(data);
-        return (size - pos);
-    }
-
-    /**
-     * Removes specified range from this list
-     */
-    E removeRange(int start, int size) {
-        lock.lock();
-        try {
-            int sizeArr = size();
-            checkIndexExlusive(start, sizeArr);
-            checkIndexInclusive(start + size, sizeArr);
-            E[] data;
-            data = newElementArray(sizeArr - size);
-            E[] oldArr = getData();
-            System.arraycopy(oldArr, 0, data, 0, start);
-            E old = oldArr[start];
-            if (sizeArr > (start + size)) {
-                System.arraycopy(oldArr, start + size, data, start, sizeArr
-                        - (start + size));
-            }
-            setData(data);
-            return old;
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    // some util static functions to use by iterators and methods
-    /**
-     * Returns an array containing all of the elements
-     * in the specified range of the array in proper sequence
-     */
-    static Object[] toArray(Object[] data, int start, int size) {
-        Object[] result = new Object[size];
-        System.arraycopy(data, start, result, 0, size);
-        return result;
-    }
-
-    /**
-     * Returns an array containing all of the elements
-     * in the specified range of the array in proper sequence,
-     * stores the result in the array, specified by first parameter
-     * (as for public instance method toArray(Object[] to)
-     */
-    static Object[] toArray(Object[] to, Object[] data, int start, int size) {
-        int l = data.length;
-        if (to.length < l) {
-            to = (Object[]) Array.newInstance(to.getClass().getComponentType(),
-                    l);
-        } else {
-            if (to.length > l) {
-                to[l] = null;
-            }
-        }
-        System.arraycopy(data, start, to, 0, size);
-        return to;
-    }
-
-    /**
-     * Checks if the specified range of the
-     * array contains all of the elements in the collection
-     *
-     * @param c     collection with elements
-     * @param data  array where to search the elements
-     * @param start start index
-     * @param size  size of the range
-     */
-    static final boolean containsAll(Collection c, Object[] data, int start,
-                                     int size) {
-        if (size == 0) {
-            return false;
-        }
-        Iterator it = c.iterator();
-        while (it.hasNext()) {
-            Object next = it.next();
-            if (indexOf(next, data, start, size) < 0) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Returns the index in the specified range of the data array
-     * of the last occurrence of the specified element
-     *
-     * @param o     element to search
-     * @param data  array where to search
-     * @param start start index
-     * @param size  size of the range
-     * @return
-     */
-    static final int lastIndexOf(Object o, Object[] data, int start, int size) {
-        if (size == 0) {
-            return -1;
-        }
-        for (int i = start + size - 1; i > start - 1; i--) {
-            if (data[i] == o) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * Returns the index in the specified range of the data array
-     * of the first occurrence of the specified element
-     *
-     * @param o     element to search
-     * @param data  array where to search
-     * @param start start index
-     * @param size  end index
-     * @return
-     */
-    static final int indexOf(Object o, Object[] data, int start, int size) {
-        if (size == 0) {
-            return -1;
-        }
-        for (int i = start; i < start + size; i++) {
-            if (data[i] == o) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * Throws <code>IndexOutOfBoundsException</code> if <code>index</code>
-     * is out of the list bounds.
-     *
-     * @param index element index to check.
-     */
-    static final void checkIndexInclusive(int index, int size) {
-        if (index < 0 || index > size) {
-            throw new IndexOutOfBoundsException("Index is " + index + ", size is " + size);
-        }
-    }
-
-    /**
-     * Throws <code>IndexOutOfBoundsException</code> if <code>index</code>
-     * is out of the list bounds. Excluding the last element.
-     *
-     * @param index element index to check.
-     */
-    static final void checkIndexExlusive(int index, int size) {
-        if (index < 0 || index >= size) {
-            throw new IndexOutOfBoundsException("Index is " + index + ", size is " + size);
-        }
-    }
-
-    /**
-     * gets the internal data array
-     *
-     * @return the data array
-     */
-    final E[] getArray() {
-        return arr;
-    }
-
-    /**
-     * list iterator implementation,
-     * when created gets snapshot of the list,
-     * so never throws ConcurrentModificationException
-     */
-    private static class ListIteratorImpl implements ListIterator {
-        private final Object[] arr;
-
-        private int current;
-
-        private final int size;
-
-        final int size() {
-            return size;
-        }
-
-        public ListIteratorImpl(Object[] data, int current) {
-            this.current = current;
-            arr = data;
-            size = data.length;
-        }
-
-        public void add(Object o) {
-            throw new UnsupportedOperationException("Unsupported operation add");
-        }
-
-        public boolean hasNext() {
-            if (current < size) {
-                return true;
-            }
-            return false;
-        }
-
-        public boolean hasPrevious() {
-            return current > 0;
-        }
-
-        public Object next() {
-            if (hasNext()) {
-                return arr[current++];
-            }
-            throw new NoSuchElementException("pos is " + current + ", size is " + size);
-        }
-
-        public int nextIndex() {
-            return current;
-        }
-
-        public Object previous() {
-            if (hasPrevious()) {
-                return arr[--current];
-            }
-            throw new NoSuchElementException("pos is " + (current-1) + ", size is " + size);
-        }
-
-        public int previousIndex() {
-            return current - 1;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException("Unsupported operation remove");
-        }
-
-        public void set(Object o) {
-            throw new UnsupportedOperationException("Unsupported operation set");
-        }
-
-    }
-
-    /**
-     * Keeps a state of sublist implementation,
-     * size and array declared as final,
-     * so we'll never get the unconsistent state
-     */
-    static final class SubListReadData {
-        final int size;
-
-        final Object[] data;
-
-        SubListReadData(int size, Object[] data) {
-            this.size = size;
-            this.data = data;
-        }
-    }
-
-    /**
-     * Represents a list returned by <code>sublist()</code>.
-     */
-    static class SubList implements List {
-        private final CopyOnWriteArrayIdentityList list;
-
-        private volatile SubListReadData read;
-
-        private final int start;
-
-        /**
-         * Sublist constructor.
-         *
-         * @param list    backing list.
-         * @param fromIdx startingIndex, inclusive
-         * @param toIdx   endIndex, exclusive
-         */
-        public SubList(CopyOnWriteArrayIdentityList list, int fromIdx, int toIdx) {
-            this.list = list;
-            Object[] data = list.getData();
-            int size = toIdx - fromIdx;
-            checkIndexExlusive(fromIdx, data.length);
-            checkIndexInclusive(toIdx, data.length);
-            read = new SubListReadData(size, list.getData());
-            start = fromIdx;
-        }
-
-        /**
-         * throws ConcurrentModificationException when the list
-         * is structurally modified in the other way other than via this subList
-         * <p/>
-         * Should be called under lock!
-         */
-        private void checkModifications() {
-            if (read.data != list.getData()) {
-                throw new ConcurrentModificationException();
-            }
-        }
-
-        /**
-         * @see java.util.List#listIterator(int)
-         */
-        public ListIterator listIterator(int startIdx) {
-            return new SubListIterator(startIdx, read);
-        }
-
-        /**
-         * @see java.util.List#set(int, java.lang.Object)
-         */
-        public Object set(int index, Object obj) {
-            list.lock.lock();
-            try {
-                checkIndexExlusive(index, read.size);
-                checkModifications();
-                Object result = list.set(index + start, obj);
-                read = new SubListReadData(read.size, list.getData());
-                return result;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        /**
-         * @see java.util.List#get(int)
-         */
-        public Object get(int index) {
-            SubListReadData data = read;
-            if (data.data != list.getData()) {
-                list.lock.lock();
-                try {
-                    data = read;
-                    if (data.data != list.getData()) {
-                        throw new ConcurrentModificationException();
-                    }
-                } finally {
-                    list.lock.unlock();
-                }
-            }
-            checkIndexExlusive(index, data.size);
-            return data.data[index + start];
-        }
-
-        /**
-         * @see java.util.Collection#size()
-         */
-        public int size() {
-            return read.size;
-        }
-
-        /**
-         * @see java.util.List#remove(int)
-         */
-        public Object remove(int index) {
-            list.lock.lock();
-            try {
-                checkIndexExlusive(index, read.size);
-                checkModifications();
-                Object obj = list.remove(index + start);
-                read = new SubListReadData(read.size - 1, list.getData());
-                return obj;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        /**
-         * @see java.util.List#add(int, java.lang.Object)
-         */
-        public void add(int index, Object object) {
-            list.lock.lock();
-            try {
-                checkIndexInclusive(index, read.size);
-                checkModifications();
-                list.add(index + start, object);
-                read = new SubListReadData(read.size + 1, list.getData());
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        public boolean add(Object o) {
-            list.lock.lock();
-            try {
-                checkModifications();
-                list.add(start + read.size, o);
-                read = new SubListReadData(read.size + 1, list.getData());
-                return true;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        public boolean addAll(Collection c) {
-            list.lock.lock();
-            try {
-                checkModifications();
-                int d = list.size();
-                list.addAll(start + read.size, c);
-                read = new SubListReadData(read.size + (list.size() - d), list
-                        .getData());
-                return true;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        public void clear() {
-            list.lock.lock();
-            try {
-                checkModifications();
-                list.removeRange(start, read.size);
-                read = new SubListReadData(0, list.getData());
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        public boolean contains(Object o) {
-            return indexOf(o) != -1;
-        }
-
-        public boolean containsAll(Collection c) {
-            SubListReadData b = read;
-            return CopyOnWriteArrayIdentityList.containsAll(c, b.data, start, b.size);
-        }
-
-        public int indexOf(Object o) {
-            SubListReadData b = read;
-            int ind = CopyOnWriteArrayIdentityList.indexOf(o, b.data, start, b.size)
-                    - start;
-            return ind < 0 ? -1 : ind;
-        }
-
-        public boolean isEmpty() {
-            return read.size == 0;
-        }
-
-        public Iterator iterator() {
-            return new SubListIterator(0, read);
-        }
-
-        public int lastIndexOf(Object o) {
-            SubListReadData b = read;
-            int ind = CopyOnWriteArrayIdentityList
-                    .lastIndexOf(o, b.data, start, b.size)
-                    - start;
-            return ind < 0 ? -1 : ind;
-        }
-
-        public ListIterator listIterator() {
-            return new SubListIterator(0, read);
-        }
-
-        public boolean remove(Object o) {
-            list.lock.lock();
-            try {
-                checkModifications();
-                int i = indexOf(o);
-                if (i == -1) {
-                    return false;
-                }
-                boolean result = list.remove(i + start) != null;
-                if (result) {
-                    read = new SubListReadData(read.size - 1, list.getData());
-                }
-                return result;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        public boolean removeAll(Collection c) {
-            list.lock.lock();
-            try {
-                checkModifications();
-                int removed = list.removeAll(c, start, read.size);
-                if (removed > 0) {
-                    read = new SubListReadData(read.size - removed, list
-                            .getData());
-                    return true;
-                }
-            } finally {
-                list.lock.unlock();
-            }
-            return false;
-        }
-
-        public boolean retainAll(Collection c) {
-            list.lock.lock();
-            try {
-                checkModifications();
-                int removed = list.retainAll(c, start, read.size);
-                if (removed > 0) {
-                    read = new SubListReadData(read.size - removed, list
-                            .getData());
-                    return true;
-                }
-                return false;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        public List subList(int fromIndex, int toIndex) {
-            return new SubList(list, start + fromIndex, start + toIndex);
-        }
-
-        public Object[] toArray() {
-            SubListReadData r = read;
-            return CopyOnWriteArrayIdentityList.toArray(r.data, start, r.size);
-        }
-
-        public Object[] toArray(Object[] a) {
-            SubListReadData r = read;
-            return CopyOnWriteArrayIdentityList.toArray(a, r.data, start, r.size);
-        }
-
-        /**
-         * @see java.util.List#addAll(int, java.util.Collection)
-         */
-        public boolean addAll(int index, Collection collection) {
-            list.lock.lock();
-            try {
-                checkIndexInclusive(index, read.size);
-                checkModifications();
-                int d = list.size();
-                boolean rt = list.addAll(index + start, collection);
-                read = new SubListReadData(read.size + list.size() - d, list
-                        .getData());
-                return rt;
-            } finally {
-                list.lock.unlock();
-            }
-        }
-
-        /**
-         * Implementation of <code>ListIterator</code> for the
-         * <code>SubList</code>
-         * gets a snapshot of the sublist,
-         * never throws ConcurrentModificationException
-         */
-        private class SubListIterator extends ListIteratorImpl {
-            private final SubListReadData dataR;
-
-            /**
-             * Constructs an iterator starting with the given index
-             *
-             * @param index index of the first element to iterate.
-             */
-            private SubListIterator(int index, SubListReadData d) {
-                super(d.data, index + start);
-                this.dataR = d;
-            }
-
-            /**
-             * @see java.util.ListIterator#nextIndex()
-             */
-            public int nextIndex() {
-                return super.nextIndex() - start;
-            }
-
-            /**
-             * @see java.util.ListIterator#previousIndex()
-             */
-            public int previousIndex() {
-                return super.previousIndex() - start;
-            }
-
-            /**
-             * @see java.util.Iterator#hasNext()
-             */
-            public boolean hasNext() {
-                return nextIndex() < dataR.size;
-            }
-
-            /**
-             * @see java.util.ListIterator#hasPrevious()
-             */
-            public boolean hasPrevious() {
-                return previousIndex() > -1;
-            }
-        }
-
-    }
-
-    //serialization support
-    /**
-     * Writes the object state to the ObjectOutputStream.
-     *
-     * @param oos ObjectOutputStream to write object to.
-     * @throws IOException if an I/O error occur.
-     */
-    private void writeObject(ObjectOutputStream oos) throws IOException {
-        E[] back = getData();
-        int size = back.length;
-        oos.defaultWriteObject();
-        oos.writeInt(size);
-        for (int i = 0; i < size; i++) {
-            oos.writeObject(back[i]);
-        }
-    }
-
-    /**
-     * Reads the object state from the ObjectOutputStream.
-     *
-     * @param ois ObjectInputStream to read object from.
-     * @throws IOException if an I/O error occur.
-     */
-    private void readObject(ObjectInputStream ois) throws IOException,
-            ClassNotFoundException {
-        ois.defaultReadObject();
-        int length = ois.readInt();
-        if (length == 0) {
-            setData(newElementArray(0));
-        } else {
-            E[] back = newElementArray(length);
-            for (int i = 0; i < back.length; i++) {
-                back[i] = (E) ois.readObject();
-            }
-            setData(back);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/process/PumpStreamHandler.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/process/PumpStreamHandler.java
deleted file mode 100644
index ff43312..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/process/PumpStreamHandler.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.util.process;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * Copies standard output and error of children streams to standard output and error of the parent.
- */
-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.3.x/util/src/main/java/org/apache/karaf/util/process/StreamPumper.java b/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/process/StreamPumper.java
deleted file mode 100644
index c12034a..0000000
--- a/karaf-2.3.x/util/src/main/java/org/apache/karaf/util/process/StreamPumper.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.util.process;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * Copies all data from an input stream to an output stream.
- */
-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.3.x/util/src/test/java/org/apache/karaf/util/DeployerUtilsTest.java b/karaf-2.3.x/util/src/test/java/org/apache/karaf/util/DeployerUtilsTest.java
deleted file mode 100644
index 6783790..0000000
--- a/karaf-2.3.x/util/src/test/java/org/apache/karaf/util/DeployerUtilsTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/webconsole/admin/NOTICE b/karaf-2.3.x/webconsole/admin/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/webconsole/admin/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/webconsole/admin/pom.xml b/karaf-2.3.x/webconsole/admin/pom.xml
deleted file mode 100644
index 8588095..0000000
--- a/karaf-2.3.x/webconsole/admin/pom.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?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.3.1</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>
-                            org.apache.felix.webconsole*;version="[3,5)",
-                            org.apache.karaf.admin;resolution:=optional,
-                            *
-                        </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.3.x/webconsole/admin/src/main/java/org/apache/karaf/webconsole/admin/AdminPlugin.java b/karaf-2.3.x/webconsole/admin/src/main/java/org/apache/karaf/webconsole/admin/AdminPlugin.java
deleted file mode 100644
index dd4b140..0000000
--- a/karaf-2.3.x/webconsole/admin/src/main/java/org/apache/karaf/webconsole/admin/AdminPlugin.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- *  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.3.x/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml b/karaf-2.3.x/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
deleted file mode 100644
index dec11cd..0000000
--- a/karaf-2.3.x/webconsole/admin/src/main/resources/OSGI-INF/blueprint/webconsole-admin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/webconsole/admin/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/webconsole/admin/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 158ad6d..0000000
--- a/karaf-2.3.x/webconsole/admin/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,14 +0,0 @@
-\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.3.x/webconsole/admin/src/main/resources/res/ui/admin.js b/karaf-2.3.x/webconsole/admin/src/main/resources/res/ui/admin.js
deleted file mode 100644
index 7489865..0000000
--- a/karaf-2.3.x/webconsole/admin/src/main/resources/res/ui/admin.js
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/webconsole/admin/src/test/java/org/apache/karaf/webconsole/admin/AdminPluginTest.java b/karaf-2.3.x/webconsole/admin/src/test/java/org/apache/karaf/webconsole/admin/AdminPluginTest.java
deleted file mode 100644
index 7b777de..0000000
--- a/karaf-2.3.x/webconsole/admin/src/test/java/org/apache/karaf/webconsole/admin/AdminPluginTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/webconsole/branding/NOTICE b/karaf-2.3.x/webconsole/branding/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/webconsole/branding/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/webconsole/branding/pom.xml b/karaf-2.3.x/webconsole/branding/pom.xml
deleted file mode 100644
index 18d7302..0000000
--- a/karaf-2.3.x/webconsole/branding/pom.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<?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.3.1</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.3.x/webconsole/branding/src/main/java/org/apache/karaf/webconsole/JaasSecurityProvider.java b/karaf-2.3.x/webconsole/branding/src/main/java/org/apache/karaf/webconsole/JaasSecurityProvider.java
deleted file mode 100644
index ee8e30c..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/java/org/apache/karaf/webconsole/JaasSecurityProvider.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.boot.principal.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.3.x/webconsole/branding/src/main/resources/META-INF/webconsole.properties b/karaf-2.3.x/webconsole/branding/src/main/resources/META-INF/webconsole.properties
deleted file mode 100644
index afdb30e..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/META-INF/webconsole.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-
-#
-# 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.3.x/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml b/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml
deleted file mode 100644
index cf5abad..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/blueprint/webconsole.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/webconsole/branding/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index ee2c5bd..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,15 +0,0 @@
-\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.3.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties b/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties
deleted file mode 100644
index f2fddfb..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing,
-#  software distributed under the License is distributed on an
-#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-#  specific language governing permissions and limitations
-#  under the License.
-#
-
-#
-# 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.3.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml b/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml
deleted file mode 100644
index f6abcfd..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/OSGI-INF/metatype/metatype.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico b/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico
deleted file mode 100644
index cb02612..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/imgs/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png b/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png
deleted file mode 100644
index 066ab86..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/imgs/logo.png
+++ /dev/null
Binary files differ
diff --git a/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css b/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css
deleted file mode 100644
index a31e6bc..0000000
--- a/karaf-2.3.x/webconsole/branding/src/main/resources/res/karaf/ui/webconsole.css
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * The 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.3.x/webconsole/console/NOTICE b/karaf-2.3.x/webconsole/console/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/webconsole/console/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/webconsole/console/pom.xml b/karaf-2.3.x/webconsole/console/pom.xml
deleted file mode 100644
index fc72eaf..0000000
--- a/karaf-2.3.x/webconsole/console/pom.xml
+++ /dev/null
@@ -1,174 +0,0 @@
-<?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.3.1</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.2.2</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.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.osgi.service.metatype;version=1.0,
-                            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.3.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManager.java b/karaf-2.3.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManager.java
deleted file mode 100644
index 5b40d56..0000000
--- a/karaf-2.3.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManagerActivator.java b/karaf-2.3.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManagerActivator.java
deleted file mode 100644
index 2d4b49e..0000000
--- a/karaf-2.3.x/webconsole/console/src/main/java/org/apache/felix/webconsole/internal/KarafOsgiManagerActivator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.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.3.x/webconsole/console/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/webconsole/console/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index 48a3e63..0000000
--- a/karaf-2.3.x/webconsole/console/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,14 +0,0 @@
-\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.3.x/webconsole/features/NOTICE b/karaf-2.3.x/webconsole/features/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/webconsole/features/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/webconsole/features/pom.xml b/karaf-2.3.x/webconsole/features/pom.xml
deleted file mode 100644
index e3b590f..0000000
--- a/karaf-2.3.x/webconsole/features/pom.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?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.3.1</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>
-                            org.apache.felix.webconsole*;version="[3,5)",
-                            *
-                        </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.3.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java b/karaf-2.3.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
deleted file mode 100644
index 8cac6f9..0000000
--- a/karaf-2.3.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/ExtendedFeature.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/FeaturesPlugin.java b/karaf-2.3.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/FeaturesPlugin.java
deleted file mode 100644
index 640d0fa..0000000
--- a/karaf-2.3.x/webconsole/features/src/main/java/org/apache/karaf/webconsole/features/FeaturesPlugin.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml b/karaf-2.3.x/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml
deleted file mode 100644
index 7589531..0000000
--- a/karaf-2.3.x/webconsole/features/src/main/resources/OSGI-INF/blueprint/webconsole-features.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/webconsole/features/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/webconsole/features/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index e8bbb2e..0000000
--- a/karaf-2.3.x/webconsole/features/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,13 +0,0 @@
-\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.3.x/webconsole/features/src/main/resources/res/ui/features.js b/karaf-2.3.x/webconsole/features/src/main/resources/res/ui/features.js
deleted file mode 100644
index c9af6ec..0000000
--- a/karaf-2.3.x/webconsole/features/src/main/resources/res/ui/features.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-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.3.x/webconsole/gogo/NOTICE b/karaf-2.3.x/webconsole/gogo/NOTICE
deleted file mode 100644
index 9df772d..0000000
--- a/karaf-2.3.x/webconsole/gogo/NOTICE
+++ /dev/null
@@ -1,71 +0,0 @@
-Apache Karaf
-Copyright 2010-2013 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 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 includes software developed at
-OW2 (http://www.ow2.org/).
-Licensed under the BSD License.
-
-This product includes software developed at
-OPS4J (http://www.ops4j.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software developed at
-Eclipse Foundation (http://www.eclipse.org/).
-Licensed under the EPL.
-
-This product includes software written by
-Antony Lesuisse.
-Licensed under Public Domain.
-
-
-II. Used Software
-
-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
-AOP Alliance (http://aopalliance.sourceforge.net/).
-Licensed under Public Domain.
-
-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
-Jasypt (http://jasypt.sourceforge.net/).
-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 uses software developed at
-SpringSource (http://www.springsource.org/).
-Licensed under the Apache License 2.0.
-
-This product includes software from http://www.json.org.
-Copyright (c) 2002 JSON.org
-
-
-III. License Summary
-- Apache License 2.0
-- BSD License
-- EPL License
-- MIT License
diff --git a/karaf-2.3.x/webconsole/gogo/pom.xml b/karaf-2.3.x/webconsole/gogo/pom.xml
deleted file mode 100644
index a7eb6bb..0000000
--- a/karaf-2.3.x/webconsole/gogo/pom.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?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.3.1</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.gogo.runtime</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>
-                            org.apache.felix.webconsole*;version="[3,5)",
-                            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.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java b/karaf-2.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
deleted file mode 100644
index 79829cf..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/GogoPlugin.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * 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,
-                                      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.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/Terminal.java b/karaf-2.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/Terminal.java
deleted file mode 100644
index 3318482..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/Terminal.java
+++ /dev/null
@@ -1,1502 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * 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.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/WebTerminal.java b/karaf-2.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/WebTerminal.java
deleted file mode 100644
index 325664d..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/java/org/apache/karaf/webconsole/gogo/WebTerminal.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.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.3.x/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml b/karaf-2.3.x/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
deleted file mode 100644
index e66919e..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/resources/OSGI-INF/blueprint/webconsole-gogo.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-
--->
-<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.3.x/webconsole/gogo/src/main/resources/OSGI-INF/bundle.info b/karaf-2.3.x/webconsole/gogo/src/main/resources/OSGI-INF/bundle.info
deleted file mode 100644
index f87818a..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/resources/OSGI-INF/bundle.info
+++ /dev/null
@@ -1,13 +0,0 @@
-\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.3.x/webconsole/gogo/src/main/resources/res/ui/gogo.css b/karaf-2.3.x/webconsole/gogo/src/main/resources/res/ui/gogo.css
deleted file mode 100644
index b15ece8..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/resources/res/ui/gogo.css
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * 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.3.x/webconsole/gogo/src/main/resources/res/ui/gogo.js b/karaf-2.3.x/webconsole/gogo/src/main/resources/res/ui/gogo.js
deleted file mode 100644
index b951a6f..0000000
--- a/karaf-2.3.x/webconsole/gogo/src/main/resources/res/ui/gogo.js
+++ /dev/null
@@ -1,245 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-//
-// 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.3.x/webconsole/pom.xml b/karaf-2.3.x/webconsole/pom.xml
deleted file mode 100644
index 29dd7a2..0000000
--- a/karaf-2.3.x/webconsole/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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.3.1</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>
